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