xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/micrel/ks8851_spi.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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