1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /* drivers/net/ethernet/micrel/ks8851.c
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright 2009 Simtec Electronics
5*4882a593Smuzhiyun * http://www.simtec.co.uk/
6*4882a593Smuzhiyun * Ben Dooks <ben@simtec.co.uk>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #define DEBUG
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <linux/interrupt.h>
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/kernel.h>
16*4882a593Smuzhiyun #include <linux/netdevice.h>
17*4882a593Smuzhiyun #include <linux/etherdevice.h>
18*4882a593Smuzhiyun #include <linux/ethtool.h>
19*4882a593Smuzhiyun #include <linux/cache.h>
20*4882a593Smuzhiyun #include <linux/crc32.h>
21*4882a593Smuzhiyun #include <linux/mii.h>
22*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #include <linux/spi/spi.h>
25*4882a593Smuzhiyun #include <linux/gpio.h>
26*4882a593Smuzhiyun #include <linux/of_gpio.h>
27*4882a593Smuzhiyun #include <linux/of_net.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #include "ks8851.h"
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun static int msg_enable;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /**
34*4882a593Smuzhiyun * struct ks8851_net_spi - KS8851 SPI driver private data
35*4882a593Smuzhiyun * @lock: Lock to ensure that the device is not accessed when busy.
36*4882a593Smuzhiyun * @tx_work: Work queue for tx packets
37*4882a593Smuzhiyun * @ks8851: KS8851 driver common private data
38*4882a593Smuzhiyun * @spidev: The spi device we're bound to.
39*4882a593Smuzhiyun * @spi_msg1: pre-setup SPI transfer with one message, @spi_xfer1.
40*4882a593Smuzhiyun * @spi_msg2: pre-setup SPI transfer with two messages, @spi_xfer2.
41*4882a593Smuzhiyun * @spi_xfer1: @spi_msg1 SPI transfer structure
42*4882a593Smuzhiyun * @spi_xfer2: @spi_msg2 SPI transfer structure
43*4882a593Smuzhiyun *
44*4882a593Smuzhiyun * The @lock ensures that the chip is protected when certain operations are
45*4882a593Smuzhiyun * in progress. When the read or write packet transfer is in progress, most
46*4882a593Smuzhiyun * of the chip registers are not ccessible until the transfer is finished and
47*4882a593Smuzhiyun * the DMA has been de-asserted.
48*4882a593Smuzhiyun */
49*4882a593Smuzhiyun struct ks8851_net_spi {
50*4882a593Smuzhiyun struct ks8851_net ks8851;
51*4882a593Smuzhiyun struct mutex lock;
52*4882a593Smuzhiyun struct work_struct tx_work;
53*4882a593Smuzhiyun struct spi_device *spidev;
54*4882a593Smuzhiyun struct spi_message spi_msg1;
55*4882a593Smuzhiyun struct spi_message spi_msg2;
56*4882a593Smuzhiyun struct spi_transfer spi_xfer1;
57*4882a593Smuzhiyun struct spi_transfer spi_xfer2[2];
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun #define to_ks8851_spi(ks) container_of((ks), struct ks8851_net_spi, ks8851)
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun /* SPI frame opcodes */
63*4882a593Smuzhiyun #define KS_SPIOP_RD 0x00
64*4882a593Smuzhiyun #define KS_SPIOP_WR 0x40
65*4882a593Smuzhiyun #define KS_SPIOP_RXFIFO 0x80
66*4882a593Smuzhiyun #define KS_SPIOP_TXFIFO 0xC0
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun /* shift for byte-enable data */
69*4882a593Smuzhiyun #define BYTE_EN(_x) ((_x) << 2)
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun /* turn register number and byte-enable mask into data for start of packet */
72*4882a593Smuzhiyun #define MK_OP(_byteen, _reg) \
73*4882a593Smuzhiyun (BYTE_EN(_byteen) | (_reg) << (8 + 2) | (_reg) >> 6)
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /**
76*4882a593Smuzhiyun * ks8851_lock_spi - register access lock
77*4882a593Smuzhiyun * @ks: The chip state
78*4882a593Smuzhiyun * @flags: Spinlock flags
79*4882a593Smuzhiyun *
80*4882a593Smuzhiyun * Claim chip register access lock
81*4882a593Smuzhiyun */
ks8851_lock_spi(struct ks8851_net * ks,unsigned long * flags)82*4882a593Smuzhiyun static void ks8851_lock_spi(struct ks8851_net *ks, unsigned long *flags)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun mutex_lock(&kss->lock);
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /**
90*4882a593Smuzhiyun * ks8851_unlock_spi - register access unlock
91*4882a593Smuzhiyun * @ks: The chip state
92*4882a593Smuzhiyun * @flags: Spinlock flags
93*4882a593Smuzhiyun *
94*4882a593Smuzhiyun * Release chip register access lock
95*4882a593Smuzhiyun */
ks8851_unlock_spi(struct ks8851_net * ks,unsigned long * flags)96*4882a593Smuzhiyun static void ks8851_unlock_spi(struct ks8851_net *ks, unsigned long *flags)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun mutex_unlock(&kss->lock);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun /* SPI register read/write calls.
104*4882a593Smuzhiyun *
105*4882a593Smuzhiyun * All these calls issue SPI transactions to access the chip's registers. They
106*4882a593Smuzhiyun * all require that the necessary lock is held to prevent accesses when the
107*4882a593Smuzhiyun * chip is busy transferring packet data (RX/TX FIFO accesses).
108*4882a593Smuzhiyun */
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun /**
111*4882a593Smuzhiyun * ks8851_wrreg16_spi - write 16bit register value to chip via SPI
112*4882a593Smuzhiyun * @ks: The chip state
113*4882a593Smuzhiyun * @reg: The register address
114*4882a593Smuzhiyun * @val: The value to write
115*4882a593Smuzhiyun *
116*4882a593Smuzhiyun * Issue a write to put the value @val into the register specified in @reg.
117*4882a593Smuzhiyun */
ks8851_wrreg16_spi(struct ks8851_net * ks,unsigned int reg,unsigned int val)118*4882a593Smuzhiyun static void ks8851_wrreg16_spi(struct ks8851_net *ks, unsigned int reg,
119*4882a593Smuzhiyun unsigned int val)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
122*4882a593Smuzhiyun struct spi_transfer *xfer = &kss->spi_xfer1;
123*4882a593Smuzhiyun struct spi_message *msg = &kss->spi_msg1;
124*4882a593Smuzhiyun __le16 txb[2];
125*4882a593Smuzhiyun int ret;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun txb[0] = cpu_to_le16(MK_OP(reg & 2 ? 0xC : 0x03, reg) | KS_SPIOP_WR);
128*4882a593Smuzhiyun txb[1] = cpu_to_le16(val);
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun xfer->tx_buf = txb;
131*4882a593Smuzhiyun xfer->rx_buf = NULL;
132*4882a593Smuzhiyun xfer->len = 4;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun ret = spi_sync(kss->spidev, msg);
135*4882a593Smuzhiyun if (ret < 0)
136*4882a593Smuzhiyun netdev_err(ks->netdev, "spi_sync() failed\n");
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /**
140*4882a593Smuzhiyun * ks8851_rdreg - issue read register command and return the data
141*4882a593Smuzhiyun * @ks: The device state
142*4882a593Smuzhiyun * @op: The register address and byte enables in message format.
143*4882a593Smuzhiyun * @rxb: The RX buffer to return the result into
144*4882a593Smuzhiyun * @rxl: The length of data expected.
145*4882a593Smuzhiyun *
146*4882a593Smuzhiyun * This is the low level read call that issues the necessary spi message(s)
147*4882a593Smuzhiyun * to read data from the register specified in @op.
148*4882a593Smuzhiyun */
ks8851_rdreg(struct ks8851_net * ks,unsigned int op,u8 * rxb,unsigned int rxl)149*4882a593Smuzhiyun static void ks8851_rdreg(struct ks8851_net *ks, unsigned int op,
150*4882a593Smuzhiyun u8 *rxb, unsigned int rxl)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
153*4882a593Smuzhiyun struct spi_transfer *xfer;
154*4882a593Smuzhiyun struct spi_message *msg;
155*4882a593Smuzhiyun __le16 *txb = (__le16 *)ks->txd;
156*4882a593Smuzhiyun u8 *trx = ks->rxd;
157*4882a593Smuzhiyun int ret;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun txb[0] = cpu_to_le16(op | KS_SPIOP_RD);
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun if (kss->spidev->master->flags & SPI_MASTER_HALF_DUPLEX) {
162*4882a593Smuzhiyun msg = &kss->spi_msg2;
163*4882a593Smuzhiyun xfer = kss->spi_xfer2;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun xfer->tx_buf = txb;
166*4882a593Smuzhiyun xfer->rx_buf = NULL;
167*4882a593Smuzhiyun xfer->len = 2;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun xfer++;
170*4882a593Smuzhiyun xfer->tx_buf = NULL;
171*4882a593Smuzhiyun xfer->rx_buf = trx;
172*4882a593Smuzhiyun xfer->len = rxl;
173*4882a593Smuzhiyun } else {
174*4882a593Smuzhiyun msg = &kss->spi_msg1;
175*4882a593Smuzhiyun xfer = &kss->spi_xfer1;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun xfer->tx_buf = txb;
178*4882a593Smuzhiyun xfer->rx_buf = trx;
179*4882a593Smuzhiyun xfer->len = rxl + 2;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun ret = spi_sync(kss->spidev, msg);
183*4882a593Smuzhiyun if (ret < 0)
184*4882a593Smuzhiyun netdev_err(ks->netdev, "read: spi_sync() failed\n");
185*4882a593Smuzhiyun else if (kss->spidev->master->flags & SPI_MASTER_HALF_DUPLEX)
186*4882a593Smuzhiyun memcpy(rxb, trx, rxl);
187*4882a593Smuzhiyun else
188*4882a593Smuzhiyun memcpy(rxb, trx + 2, rxl);
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /**
192*4882a593Smuzhiyun * ks8851_rdreg16_spi - read 16 bit register from device via SPI
193*4882a593Smuzhiyun * @ks: The chip information
194*4882a593Smuzhiyun * @reg: The register address
195*4882a593Smuzhiyun *
196*4882a593Smuzhiyun * Read a 16bit register from the chip, returning the result
197*4882a593Smuzhiyun */
ks8851_rdreg16_spi(struct ks8851_net * ks,unsigned int reg)198*4882a593Smuzhiyun static unsigned int ks8851_rdreg16_spi(struct ks8851_net *ks, unsigned int reg)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun __le16 rx = 0;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun ks8851_rdreg(ks, MK_OP(reg & 2 ? 0xC : 0x3, reg), (u8 *)&rx, 2);
203*4882a593Smuzhiyun return le16_to_cpu(rx);
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /**
207*4882a593Smuzhiyun * ks8851_rdfifo_spi - read data from the receive fifo via SPI
208*4882a593Smuzhiyun * @ks: The device state.
209*4882a593Smuzhiyun * @buff: The buffer address
210*4882a593Smuzhiyun * @len: The length of the data to read
211*4882a593Smuzhiyun *
212*4882a593Smuzhiyun * Issue an RXQ FIFO read command and read the @len amount of data from
213*4882a593Smuzhiyun * the FIFO into the buffer specified by @buff.
214*4882a593Smuzhiyun */
ks8851_rdfifo_spi(struct ks8851_net * ks,u8 * buff,unsigned int len)215*4882a593Smuzhiyun static void ks8851_rdfifo_spi(struct ks8851_net *ks, u8 *buff, unsigned int len)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
218*4882a593Smuzhiyun struct spi_transfer *xfer = kss->spi_xfer2;
219*4882a593Smuzhiyun struct spi_message *msg = &kss->spi_msg2;
220*4882a593Smuzhiyun u8 txb[1];
221*4882a593Smuzhiyun int ret;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun netif_dbg(ks, rx_status, ks->netdev,
224*4882a593Smuzhiyun "%s: %d@%p\n", __func__, len, buff);
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun /* set the operation we're issuing */
227*4882a593Smuzhiyun txb[0] = KS_SPIOP_RXFIFO;
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun xfer->tx_buf = txb;
230*4882a593Smuzhiyun xfer->rx_buf = NULL;
231*4882a593Smuzhiyun xfer->len = 1;
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun xfer++;
234*4882a593Smuzhiyun xfer->rx_buf = buff;
235*4882a593Smuzhiyun xfer->tx_buf = NULL;
236*4882a593Smuzhiyun xfer->len = len;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun ret = spi_sync(kss->spidev, msg);
239*4882a593Smuzhiyun if (ret < 0)
240*4882a593Smuzhiyun netdev_err(ks->netdev, "%s: spi_sync() failed\n", __func__);
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /**
244*4882a593Smuzhiyun * ks8851_wrfifo_spi - write packet to TX FIFO via SPI
245*4882a593Smuzhiyun * @ks: The device state.
246*4882a593Smuzhiyun * @txp: The sk_buff to transmit.
247*4882a593Smuzhiyun * @irq: IRQ on completion of the packet.
248*4882a593Smuzhiyun *
249*4882a593Smuzhiyun * Send the @txp to the chip. This means creating the relevant packet header
250*4882a593Smuzhiyun * specifying the length of the packet and the other information the chip
251*4882a593Smuzhiyun * needs, such as IRQ on completion. Send the header and the packet data to
252*4882a593Smuzhiyun * the device.
253*4882a593Smuzhiyun */
ks8851_wrfifo_spi(struct ks8851_net * ks,struct sk_buff * txp,bool irq)254*4882a593Smuzhiyun static void ks8851_wrfifo_spi(struct ks8851_net *ks, struct sk_buff *txp,
255*4882a593Smuzhiyun bool irq)
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
258*4882a593Smuzhiyun struct spi_transfer *xfer = kss->spi_xfer2;
259*4882a593Smuzhiyun struct spi_message *msg = &kss->spi_msg2;
260*4882a593Smuzhiyun unsigned int fid = 0;
261*4882a593Smuzhiyun int ret;
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun netif_dbg(ks, tx_queued, ks->netdev, "%s: skb %p, %d@%p, irq %d\n",
264*4882a593Smuzhiyun __func__, txp, txp->len, txp->data, irq);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun fid = ks->fid++;
267*4882a593Smuzhiyun fid &= TXFR_TXFID_MASK;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun if (irq)
270*4882a593Smuzhiyun fid |= TXFR_TXIC; /* irq on completion */
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun /* start header at txb[1] to align txw entries */
273*4882a593Smuzhiyun ks->txh.txb[1] = KS_SPIOP_TXFIFO;
274*4882a593Smuzhiyun ks->txh.txw[1] = cpu_to_le16(fid);
275*4882a593Smuzhiyun ks->txh.txw[2] = cpu_to_le16(txp->len);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun xfer->tx_buf = &ks->txh.txb[1];
278*4882a593Smuzhiyun xfer->rx_buf = NULL;
279*4882a593Smuzhiyun xfer->len = 5;
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun xfer++;
282*4882a593Smuzhiyun xfer->tx_buf = txp->data;
283*4882a593Smuzhiyun xfer->rx_buf = NULL;
284*4882a593Smuzhiyun xfer->len = ALIGN(txp->len, 4);
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun ret = spi_sync(kss->spidev, msg);
287*4882a593Smuzhiyun if (ret < 0)
288*4882a593Smuzhiyun netdev_err(ks->netdev, "%s: spi_sync() failed\n", __func__);
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun /**
292*4882a593Smuzhiyun * ks8851_rx_skb_spi - receive skbuff
293*4882a593Smuzhiyun * @ks: The device state
294*4882a593Smuzhiyun * @skb: The skbuff
295*4882a593Smuzhiyun */
ks8851_rx_skb_spi(struct ks8851_net * ks,struct sk_buff * skb)296*4882a593Smuzhiyun static void ks8851_rx_skb_spi(struct ks8851_net *ks, struct sk_buff *skb)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun netif_rx_ni(skb);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun /**
302*4882a593Smuzhiyun * ks8851_tx_work - process tx packet(s)
303*4882a593Smuzhiyun * @work: The work strucutre what was scheduled.
304*4882a593Smuzhiyun *
305*4882a593Smuzhiyun * This is called when a number of packets have been scheduled for
306*4882a593Smuzhiyun * transmission and need to be sent to the device.
307*4882a593Smuzhiyun */
ks8851_tx_work(struct work_struct * work)308*4882a593Smuzhiyun static void ks8851_tx_work(struct work_struct *work)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun struct ks8851_net_spi *kss;
311*4882a593Smuzhiyun struct ks8851_net *ks;
312*4882a593Smuzhiyun unsigned long flags;
313*4882a593Smuzhiyun struct sk_buff *txb;
314*4882a593Smuzhiyun bool last;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun kss = container_of(work, struct ks8851_net_spi, tx_work);
317*4882a593Smuzhiyun ks = &kss->ks8851;
318*4882a593Smuzhiyun last = skb_queue_empty(&ks->txq);
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun ks8851_lock_spi(ks, &flags);
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun while (!last) {
323*4882a593Smuzhiyun txb = skb_dequeue(&ks->txq);
324*4882a593Smuzhiyun last = skb_queue_empty(&ks->txq);
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun if (txb) {
327*4882a593Smuzhiyun ks8851_wrreg16_spi(ks, KS_RXQCR,
328*4882a593Smuzhiyun ks->rc_rxqcr | RXQCR_SDA);
329*4882a593Smuzhiyun ks8851_wrfifo_spi(ks, txb, last);
330*4882a593Smuzhiyun ks8851_wrreg16_spi(ks, KS_RXQCR, ks->rc_rxqcr);
331*4882a593Smuzhiyun ks8851_wrreg16_spi(ks, KS_TXQCR, TXQCR_METFE);
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun ks8851_done_tx(ks, txb);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun ks8851_unlock_spi(ks, &flags);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun /**
341*4882a593Smuzhiyun * ks8851_flush_tx_work_spi - flush outstanding TX work
342*4882a593Smuzhiyun * @ks: The device state
343*4882a593Smuzhiyun */
ks8851_flush_tx_work_spi(struct ks8851_net * ks)344*4882a593Smuzhiyun static void ks8851_flush_tx_work_spi(struct ks8851_net *ks)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun struct ks8851_net_spi *kss = to_ks8851_spi(ks);
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun flush_work(&kss->tx_work);
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun /**
352*4882a593Smuzhiyun * calc_txlen - calculate size of message to send packet
353*4882a593Smuzhiyun * @len: Length of data
354*4882a593Smuzhiyun *
355*4882a593Smuzhiyun * Returns the size of the TXFIFO message needed to send
356*4882a593Smuzhiyun * this packet.
357*4882a593Smuzhiyun */
calc_txlen(unsigned int len)358*4882a593Smuzhiyun static unsigned int calc_txlen(unsigned int len)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun return ALIGN(len + 4, 4);
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun /**
364*4882a593Smuzhiyun * ks8851_start_xmit_spi - transmit packet using SPI
365*4882a593Smuzhiyun * @skb: The buffer to transmit
366*4882a593Smuzhiyun * @dev: The device used to transmit the packet.
367*4882a593Smuzhiyun *
368*4882a593Smuzhiyun * Called by the network layer to transmit the @skb. Queue the packet for
369*4882a593Smuzhiyun * the device and schedule the necessary work to transmit the packet when
370*4882a593Smuzhiyun * it is free.
371*4882a593Smuzhiyun *
372*4882a593Smuzhiyun * We do this to firstly avoid sleeping with the network device locked,
373*4882a593Smuzhiyun * and secondly so we can round up more than one packet to transmit which
374*4882a593Smuzhiyun * means we can try and avoid generating too many transmit done interrupts.
375*4882a593Smuzhiyun */
ks8851_start_xmit_spi(struct sk_buff * skb,struct net_device * dev)376*4882a593Smuzhiyun static netdev_tx_t ks8851_start_xmit_spi(struct sk_buff *skb,
377*4882a593Smuzhiyun struct net_device *dev)
378*4882a593Smuzhiyun {
379*4882a593Smuzhiyun unsigned int needed = calc_txlen(skb->len);
380*4882a593Smuzhiyun struct ks8851_net *ks = netdev_priv(dev);
381*4882a593Smuzhiyun netdev_tx_t ret = NETDEV_TX_OK;
382*4882a593Smuzhiyun struct ks8851_net_spi *kss;
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun kss = to_ks8851_spi(ks);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun netif_dbg(ks, tx_queued, ks->netdev,
387*4882a593Smuzhiyun "%s: skb %p, %d@%p\n", __func__, skb, skb->len, skb->data);
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun spin_lock(&ks->statelock);
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun if (needed > ks->tx_space) {
392*4882a593Smuzhiyun netif_stop_queue(dev);
393*4882a593Smuzhiyun ret = NETDEV_TX_BUSY;
394*4882a593Smuzhiyun } else {
395*4882a593Smuzhiyun ks->tx_space -= needed;
396*4882a593Smuzhiyun skb_queue_tail(&ks->txq, skb);
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun spin_unlock(&ks->statelock);
400*4882a593Smuzhiyun schedule_work(&kss->tx_work);
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun return ret;
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun
ks8851_probe_spi(struct spi_device * spi)405*4882a593Smuzhiyun static int ks8851_probe_spi(struct spi_device *spi)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun struct device *dev = &spi->dev;
408*4882a593Smuzhiyun struct ks8851_net_spi *kss;
409*4882a593Smuzhiyun struct net_device *netdev;
410*4882a593Smuzhiyun struct ks8851_net *ks;
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun netdev = devm_alloc_etherdev(dev, sizeof(struct ks8851_net_spi));
413*4882a593Smuzhiyun if (!netdev)
414*4882a593Smuzhiyun return -ENOMEM;
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun spi->bits_per_word = 8;
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun ks = netdev_priv(netdev);
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun ks->lock = ks8851_lock_spi;
421*4882a593Smuzhiyun ks->unlock = ks8851_unlock_spi;
422*4882a593Smuzhiyun ks->rdreg16 = ks8851_rdreg16_spi;
423*4882a593Smuzhiyun ks->wrreg16 = ks8851_wrreg16_spi;
424*4882a593Smuzhiyun ks->rdfifo = ks8851_rdfifo_spi;
425*4882a593Smuzhiyun ks->wrfifo = ks8851_wrfifo_spi;
426*4882a593Smuzhiyun ks->start_xmit = ks8851_start_xmit_spi;
427*4882a593Smuzhiyun ks->rx_skb = ks8851_rx_skb_spi;
428*4882a593Smuzhiyun ks->flush_tx_work = ks8851_flush_tx_work_spi;
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun #define STD_IRQ (IRQ_LCI | /* Link Change */ \
431*4882a593Smuzhiyun IRQ_TXI | /* TX done */ \
432*4882a593Smuzhiyun IRQ_RXI | /* RX done */ \
433*4882a593Smuzhiyun IRQ_SPIBEI | /* SPI bus error */ \
434*4882a593Smuzhiyun IRQ_TXPSI | /* TX process stop */ \
435*4882a593Smuzhiyun IRQ_RXPSI) /* RX process stop */
436*4882a593Smuzhiyun ks->rc_ier = STD_IRQ;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun kss = to_ks8851_spi(ks);
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun kss->spidev = spi;
441*4882a593Smuzhiyun mutex_init(&kss->lock);
442*4882a593Smuzhiyun INIT_WORK(&kss->tx_work, ks8851_tx_work);
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun /* initialise pre-made spi transfer messages */
445*4882a593Smuzhiyun spi_message_init(&kss->spi_msg1);
446*4882a593Smuzhiyun spi_message_add_tail(&kss->spi_xfer1, &kss->spi_msg1);
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun spi_message_init(&kss->spi_msg2);
449*4882a593Smuzhiyun spi_message_add_tail(&kss->spi_xfer2[0], &kss->spi_msg2);
450*4882a593Smuzhiyun spi_message_add_tail(&kss->spi_xfer2[1], &kss->spi_msg2);
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun netdev->irq = spi->irq;
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun return ks8851_probe_common(netdev, dev, msg_enable);
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun
ks8851_remove_spi(struct spi_device * spi)457*4882a593Smuzhiyun static int ks8851_remove_spi(struct spi_device *spi)
458*4882a593Smuzhiyun {
459*4882a593Smuzhiyun return ks8851_remove_common(&spi->dev);
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun static const struct of_device_id ks8851_match_table[] = {
463*4882a593Smuzhiyun { .compatible = "micrel,ks8851" },
464*4882a593Smuzhiyun { }
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, ks8851_match_table);
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun static struct spi_driver ks8851_driver = {
469*4882a593Smuzhiyun .driver = {
470*4882a593Smuzhiyun .name = "ks8851",
471*4882a593Smuzhiyun .of_match_table = ks8851_match_table,
472*4882a593Smuzhiyun .pm = &ks8851_pm_ops,
473*4882a593Smuzhiyun },
474*4882a593Smuzhiyun .probe = ks8851_probe_spi,
475*4882a593Smuzhiyun .remove = ks8851_remove_spi,
476*4882a593Smuzhiyun };
477*4882a593Smuzhiyun module_spi_driver(ks8851_driver);
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun MODULE_DESCRIPTION("KS8851 Network driver");
480*4882a593Smuzhiyun MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
481*4882a593Smuzhiyun MODULE_LICENSE("GPL");
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun module_param_named(message, msg_enable, int, 0);
484*4882a593Smuzhiyun MODULE_PARM_DESC(message, "Message verbosity level (0=none, 31=all)");
485*4882a593Smuzhiyun MODULE_ALIAS("spi:ks8851");
486