1/*
2 * ks8842.c timberdale KS8842 ethernet driver
3 * Copyright (c) 2009 Intel Corporation
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19/* Supports:
20 * The Micrel KS8842 behind the timberdale FPGA
21 * The genuine Micrel KS8841/42 device with ISA 16/32bit bus interface
22 */
23
24#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
25
26#include <linux/interrupt.h>
27#include <linux/kernel.h>
28#include <linux/module.h>
29#include <linux/platform_device.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/ethtool.h>
33#include <linux/ks8842.h>
34#include <linux/dmaengine.h>
35#include <linux/dma-mapping.h>
36#include <linux/scatterlist.h>
37
38#define DRV_NAME "ks8842"
39
40/* Timberdale specific Registers */
41#define REG_TIMB_RST		0x1c
42#define REG_TIMB_FIFO		0x20
43#define REG_TIMB_ISR		0x24
44#define REG_TIMB_IER		0x28
45#define REG_TIMB_IAR		0x2C
46#define REQ_TIMB_DMA_RESUME	0x30
47
48/* KS8842 registers */
49
50#define REG_SELECT_BANK 0x0e
51
52/* bank 0 registers */
53#define REG_QRFCR	0x04
54
55/* bank 2 registers */
56#define REG_MARL	0x00
57#define REG_MARM	0x02
58#define REG_MARH	0x04
59
60/* bank 3 registers */
61#define REG_GRR		0x06
62
63/* bank 16 registers */
64#define REG_TXCR	0x00
65#define REG_TXSR	0x02
66#define REG_RXCR	0x04
67#define REG_TXMIR	0x08
68#define REG_RXMIR	0x0A
69
70/* bank 17 registers */
71#define REG_TXQCR	0x00
72#define REG_RXQCR	0x02
73#define REG_TXFDPR	0x04
74#define REG_RXFDPR	0x06
75#define REG_QMU_DATA_LO 0x08
76#define REG_QMU_DATA_HI 0x0A
77
78/* bank 18 registers */
79#define REG_IER		0x00
80#define IRQ_LINK_CHANGE	0x8000
81#define IRQ_TX		0x4000
82#define IRQ_RX		0x2000
83#define IRQ_RX_OVERRUN	0x0800
84#define IRQ_TX_STOPPED	0x0200
85#define IRQ_RX_STOPPED	0x0100
86#define IRQ_RX_ERROR	0x0080
87#define ENABLED_IRQS	(IRQ_LINK_CHANGE | IRQ_TX | IRQ_RX | IRQ_RX_STOPPED | \
88		IRQ_TX_STOPPED | IRQ_RX_OVERRUN | IRQ_RX_ERROR)
89/* When running via timberdale in DMA mode, the RX interrupt should be
90   enabled in the KS8842, but not in the FPGA IP, since the IP handles
91   RX DMA internally.
92   TX interrupts are not needed it is handled by the FPGA the driver is
93   notified via DMA callbacks.
94*/
95#define ENABLED_IRQS_DMA_IP	(IRQ_LINK_CHANGE | IRQ_RX_STOPPED | \
96	IRQ_TX_STOPPED | IRQ_RX_OVERRUN | IRQ_RX_ERROR)
97#define ENABLED_IRQS_DMA	(ENABLED_IRQS_DMA_IP | IRQ_RX)
98#define REG_ISR		0x02
99#define REG_RXSR	0x04
100#define RXSR_VALID	0x8000
101#define RXSR_BROADCAST	0x80
102#define RXSR_MULTICAST	0x40
103#define RXSR_UNICAST	0x20
104#define RXSR_FRAMETYPE	0x08
105#define RXSR_TOO_LONG	0x04
106#define RXSR_RUNT	0x02
107#define RXSR_CRC_ERROR	0x01
108#define RXSR_ERROR	(RXSR_TOO_LONG | RXSR_RUNT | RXSR_CRC_ERROR)
109
110/* bank 32 registers */
111#define REG_SW_ID_AND_ENABLE	0x00
112#define REG_SGCR1		0x02
113#define REG_SGCR2		0x04
114#define REG_SGCR3		0x06
115
116/* bank 39 registers */
117#define REG_MACAR1		0x00
118#define REG_MACAR2		0x02
119#define REG_MACAR3		0x04
120
121/* bank 45 registers */
122#define REG_P1MBCR		0x00
123#define REG_P1MBSR		0x02
124
125/* bank 46 registers */
126#define REG_P2MBCR		0x00
127#define REG_P2MBSR		0x02
128
129/* bank 48 registers */
130#define REG_P1CR2		0x02
131
132/* bank 49 registers */
133#define REG_P1CR4		0x02
134#define REG_P1SR		0x04
135
136/* flags passed by platform_device for configuration */
137#define	MICREL_KS884X		0x01	/* 0=Timeberdale(FPGA), 1=Micrel */
138#define	KS884X_16BIT		0x02	/*  1=16bit, 0=32bit */
139
140#define DMA_BUFFER_SIZE		2048
141
142struct ks8842_tx_dma_ctl {
143	struct dma_chan *chan;
144	struct dma_async_tx_descriptor *adesc;
145	void *buf;
146	struct scatterlist sg;
147	int channel;
148};
149
150struct ks8842_rx_dma_ctl {
151	struct dma_chan *chan;
152	struct dma_async_tx_descriptor *adesc;
153	struct sk_buff  *skb;
154	struct scatterlist sg;
155	struct tasklet_struct tasklet;
156	int channel;
157};
158
159#define KS8842_USE_DMA(adapter) (((adapter)->dma_tx.channel != -1) && \
160	 ((adapter)->dma_rx.channel != -1))
161
162struct ks8842_adapter {
163	void __iomem	*hw_addr;
164	int		irq;
165	unsigned long	conf_flags;	/* copy of platform_device config */
166	struct tasklet_struct	tasklet;
167	spinlock_t	lock; /* spinlock to be interrupt safe */
168	struct work_struct timeout_work;
169	struct net_device *netdev;
170	struct device *dev;
171	struct ks8842_tx_dma_ctl	dma_tx;
172	struct ks8842_rx_dma_ctl	dma_rx;
173};
174
175static void ks8842_dma_rx_cb(void *data);
176static void ks8842_dma_tx_cb(void *data);
177
178static inline void ks8842_resume_dma(struct ks8842_adapter *adapter)
179{
180	iowrite32(1, adapter->hw_addr + REQ_TIMB_DMA_RESUME);
181}
182
183static inline void ks8842_select_bank(struct ks8842_adapter *adapter, u16 bank)
184{
185	iowrite16(bank, adapter->hw_addr + REG_SELECT_BANK);
186}
187
188static inline void ks8842_write8(struct ks8842_adapter *adapter, u16 bank,
189	u8 value, int offset)
190{
191	ks8842_select_bank(adapter, bank);
192	iowrite8(value, adapter->hw_addr + offset);
193}
194
195static inline void ks8842_write16(struct ks8842_adapter *adapter, u16 bank,
196	u16 value, int offset)
197{
198	ks8842_select_bank(adapter, bank);
199	iowrite16(value, adapter->hw_addr + offset);
200}
201
202static inline void ks8842_enable_bits(struct ks8842_adapter *adapter, u16 bank,
203	u16 bits, int offset)
204{
205	u16 reg;
206	ks8842_select_bank(adapter, bank);
207	reg = ioread16(adapter->hw_addr + offset);
208	reg |= bits;
209	iowrite16(reg, adapter->hw_addr + offset);
210}
211
212static inline void ks8842_clear_bits(struct ks8842_adapter *adapter, u16 bank,
213	u16 bits, int offset)
214{
215	u16 reg;
216	ks8842_select_bank(adapter, bank);
217	reg = ioread16(adapter->hw_addr + offset);
218	reg &= ~bits;
219	iowrite16(reg, adapter->hw_addr + offset);
220}
221
222static inline void ks8842_write32(struct ks8842_adapter *adapter, u16 bank,
223	u32 value, int offset)
224{
225	ks8842_select_bank(adapter, bank);
226	iowrite32(value, adapter->hw_addr + offset);
227}
228
229static inline u8 ks8842_read8(struct ks8842_adapter *adapter, u16 bank,
230	int offset)
231{
232	ks8842_select_bank(adapter, bank);
233	return ioread8(adapter->hw_addr + offset);
234}
235
236static inline u16 ks8842_read16(struct ks8842_adapter *adapter, u16 bank,
237	int offset)
238{
239	ks8842_select_bank(adapter, bank);
240	return ioread16(adapter->hw_addr + offset);
241}
242
243static inline u32 ks8842_read32(struct ks8842_adapter *adapter, u16 bank,
244	int offset)
245{
246	ks8842_select_bank(adapter, bank);
247	return ioread32(adapter->hw_addr + offset);
248}
249
250static void ks8842_reset(struct ks8842_adapter *adapter)
251{
252	if (adapter->conf_flags & MICREL_KS884X) {
253		ks8842_write16(adapter, 3, 1, REG_GRR);
254		msleep(10);
255		iowrite16(0, adapter->hw_addr + REG_GRR);
256	} else {
257		/* The KS8842 goes haywire when doing softare reset
258		* a work around in the timberdale IP is implemented to
259		* do a hardware reset instead
260		ks8842_write16(adapter, 3, 1, REG_GRR);
261		msleep(10);
262		iowrite16(0, adapter->hw_addr + REG_GRR);
263		*/
264		iowrite32(0x1, adapter->hw_addr + REG_TIMB_RST);
265		msleep(20);
266	}
267}
268
269static void ks8842_update_link_status(struct net_device *netdev,
270	struct ks8842_adapter *adapter)
271{
272	/* check the status of the link */
273	if (ks8842_read16(adapter, 45, REG_P1MBSR) & 0x4) {
274		netif_carrier_on(netdev);
275		netif_wake_queue(netdev);
276	} else {
277		netif_stop_queue(netdev);
278		netif_carrier_off(netdev);
279	}
280}
281
282static void ks8842_enable_tx(struct ks8842_adapter *adapter)
283{
284	ks8842_enable_bits(adapter, 16, 0x01, REG_TXCR);
285}
286
287static void ks8842_disable_tx(struct ks8842_adapter *adapter)
288{
289	ks8842_clear_bits(adapter, 16, 0x01, REG_TXCR);
290}
291
292static void ks8842_enable_rx(struct ks8842_adapter *adapter)
293{
294	ks8842_enable_bits(adapter, 16, 0x01, REG_RXCR);
295}
296
297static void ks8842_disable_rx(struct ks8842_adapter *adapter)
298{
299	ks8842_clear_bits(adapter, 16, 0x01, REG_RXCR);
300}
301
302static void ks8842_reset_hw(struct ks8842_adapter *adapter)
303{
304	/* reset the HW */
305	ks8842_reset(adapter);
306
307	/* Enable QMU Transmit flow control / transmit padding / Transmit CRC */
308	ks8842_write16(adapter, 16, 0x000E, REG_TXCR);
309
310	/* enable the receiver, uni + multi + broadcast + flow ctrl
311		+ crc strip */
312	ks8842_write16(adapter, 16, 0x8 | 0x20 | 0x40 | 0x80 | 0x400,
313		REG_RXCR);
314
315	/* TX frame pointer autoincrement */
316	ks8842_write16(adapter, 17, 0x4000, REG_TXFDPR);
317
318	/* RX frame pointer autoincrement */
319	ks8842_write16(adapter, 17, 0x4000, REG_RXFDPR);
320
321	/* RX 2 kb high watermark */
322	ks8842_write16(adapter, 0, 0x1000, REG_QRFCR);
323
324	/* aggressive back off in half duplex */
325	ks8842_enable_bits(adapter, 32, 1 << 8, REG_SGCR1);
326
327	/* enable no excessive collison drop */
328	ks8842_enable_bits(adapter, 32, 1 << 3, REG_SGCR2);
329
330	/* Enable port 1 force flow control / back pressure / transmit / recv */
331	ks8842_write16(adapter, 48, 0x1E07, REG_P1CR2);
332
333	/* restart port auto-negotiation */
334	ks8842_enable_bits(adapter, 49, 1 << 13, REG_P1CR4);
335
336	/* Enable the transmitter */
337	ks8842_enable_tx(adapter);
338
339	/* Enable the receiver */
340	ks8842_enable_rx(adapter);
341
342	/* clear all interrupts */
343	ks8842_write16(adapter, 18, 0xffff, REG_ISR);
344
345	/* enable interrupts */
346	if (KS8842_USE_DMA(adapter)) {
347		/* When running in DMA Mode the RX interrupt is not enabled in
348		   timberdale because RX data is received by DMA callbacks
349		   it must still be enabled in the KS8842 because it indicates
350		   to timberdale when there is RX data for it's DMA FIFOs */
351		iowrite16(ENABLED_IRQS_DMA_IP, adapter->hw_addr + REG_TIMB_IER);
352		ks8842_write16(adapter, 18, ENABLED_IRQS_DMA, REG_IER);
353	} else {
354		if (!(adapter->conf_flags & MICREL_KS884X))
355			iowrite16(ENABLED_IRQS,
356				adapter->hw_addr + REG_TIMB_IER);
357		ks8842_write16(adapter, 18, ENABLED_IRQS, REG_IER);
358	}
359	/* enable the switch */
360	ks8842_write16(adapter, 32, 0x1, REG_SW_ID_AND_ENABLE);
361}
362
363static void ks8842_read_mac_addr(struct ks8842_adapter *adapter, u8 *dest)
364{
365	int i;
366	u16 mac;
367
368	for (i = 0; i < ETH_ALEN; i++)
369		dest[ETH_ALEN - i - 1] = ks8842_read8(adapter, 2, REG_MARL + i);
370
371	if (adapter->conf_flags & MICREL_KS884X) {
372		/*
373		the sequence of saving mac addr between MAC and Switch is
374		different.
375		*/
376
377		mac = ks8842_read16(adapter, 2, REG_MARL);
378		ks8842_write16(adapter, 39, mac, REG_MACAR3);
379		mac = ks8842_read16(adapter, 2, REG_MARM);
380		ks8842_write16(adapter, 39, mac, REG_MACAR2);
381		mac = ks8842_read16(adapter, 2, REG_MARH);
382		ks8842_write16(adapter, 39, mac, REG_MACAR1);
383	} else {
384
385		/* make sure the switch port uses the same MAC as the QMU */
386		mac = ks8842_read16(adapter, 2, REG_MARL);
387		ks8842_write16(adapter, 39, mac, REG_MACAR1);
388		mac = ks8842_read16(adapter, 2, REG_MARM);
389		ks8842_write16(adapter, 39, mac, REG_MACAR2);
390		mac = ks8842_read16(adapter, 2, REG_MARH);
391		ks8842_write16(adapter, 39, mac, REG_MACAR3);
392	}
393}
394
395static void ks8842_write_mac_addr(struct ks8842_adapter *adapter, u8 *mac)
396{
397	unsigned long flags;
398	unsigned i;
399
400	spin_lock_irqsave(&adapter->lock, flags);
401	for (i = 0; i < ETH_ALEN; i++) {
402		ks8842_write8(adapter, 2, mac[ETH_ALEN - i - 1], REG_MARL + i);
403		if (!(adapter->conf_flags & MICREL_KS884X))
404			ks8842_write8(adapter, 39, mac[ETH_ALEN - i - 1],
405				REG_MACAR1 + i);
406	}
407
408	if (adapter->conf_flags & MICREL_KS884X) {
409		/*
410		the sequence of saving mac addr between MAC and Switch is
411		different.
412		*/
413
414		u16 mac;
415
416		mac = ks8842_read16(adapter, 2, REG_MARL);
417		ks8842_write16(adapter, 39, mac, REG_MACAR3);
418		mac = ks8842_read16(adapter, 2, REG_MARM);
419		ks8842_write16(adapter, 39, mac, REG_MACAR2);
420		mac = ks8842_read16(adapter, 2, REG_MARH);
421		ks8842_write16(adapter, 39, mac, REG_MACAR1);
422	}
423	spin_unlock_irqrestore(&adapter->lock, flags);
424}
425
426static inline u16 ks8842_tx_fifo_space(struct ks8842_adapter *adapter)
427{
428	return ks8842_read16(adapter, 16, REG_TXMIR) & 0x1fff;
429}
430
431static int ks8842_tx_frame_dma(struct sk_buff *skb, struct net_device *netdev)
432{
433	struct ks8842_adapter *adapter = netdev_priv(netdev);
434	struct ks8842_tx_dma_ctl *ctl = &adapter->dma_tx;
435	u8 *buf = ctl->buf;
436
437	if (ctl->adesc) {
438		netdev_dbg(netdev, "%s: TX ongoing\n", __func__);
439		/* transfer ongoing */
440		return NETDEV_TX_BUSY;
441	}
442
443	sg_dma_len(&ctl->sg) = skb->len + sizeof(u32);
444
445	/* copy data to the TX buffer */
446	/* the control word, enable IRQ, port 1 and the length */
447	*buf++ = 0x00;
448	*buf++ = 0x01; /* Port 1 */
449	*buf++ = skb->len & 0xff;
450	*buf++ = (skb->len >> 8) & 0xff;
451	skb_copy_from_linear_data(skb, buf, skb->len);
452
453	dma_sync_single_range_for_device(adapter->dev,
454		sg_dma_address(&ctl->sg), 0, sg_dma_len(&ctl->sg),
455		DMA_TO_DEVICE);
456
457	/* make sure the length is a multiple of 4 */
458	if (sg_dma_len(&ctl->sg) % 4)
459		sg_dma_len(&ctl->sg) += 4 - sg_dma_len(&ctl->sg) % 4;
460
461	ctl->adesc = dmaengine_prep_slave_sg(ctl->chan,
462		&ctl->sg, 1, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT);
463	if (!ctl->adesc)
464		return NETDEV_TX_BUSY;
465
466	ctl->adesc->callback_param = netdev;
467	ctl->adesc->callback = ks8842_dma_tx_cb;
468	ctl->adesc->tx_submit(ctl->adesc);
469
470	netdev->stats.tx_bytes += skb->len;
471
472	dev_kfree_skb(skb);
473
474	return NETDEV_TX_OK;
475}
476
477static int ks8842_tx_frame(struct sk_buff *skb, struct net_device *netdev)
478{
479	struct ks8842_adapter *adapter = netdev_priv(netdev);
480	int len = skb->len;
481
482	netdev_dbg(netdev, "%s: len %u head %p data %p tail %p end %p\n",
483		__func__, skb->len, skb->head, skb->data,
484		skb_tail_pointer(skb), skb_end_pointer(skb));
485
486	/* check FIFO buffer space, we need space for CRC and command bits */
487	if (ks8842_tx_fifo_space(adapter) < len + 8)
488		return NETDEV_TX_BUSY;
489
490	if (adapter->conf_flags & KS884X_16BIT) {
491		u16 *ptr16 = (u16 *)skb->data;
492		ks8842_write16(adapter, 17, 0x8000 | 0x100, REG_QMU_DATA_LO);
493		ks8842_write16(adapter, 17, (u16)len, REG_QMU_DATA_HI);
494		netdev->stats.tx_bytes += len;
495
496		/* copy buffer */
497		while (len > 0) {
498			iowrite16(*ptr16++, adapter->hw_addr + REG_QMU_DATA_LO);
499			iowrite16(*ptr16++, adapter->hw_addr + REG_QMU_DATA_HI);
500			len -= sizeof(u32);
501		}
502	} else {
503
504		u32 *ptr = (u32 *)skb->data;
505		u32 ctrl;
506		/* the control word, enable IRQ, port 1 and the length */
507		ctrl = 0x8000 | 0x100 | (len << 16);
508		ks8842_write32(adapter, 17, ctrl, REG_QMU_DATA_LO);
509
510		netdev->stats.tx_bytes += len;
511
512		/* copy buffer */
513		while (len > 0) {
514			iowrite32(*ptr, adapter->hw_addr + REG_QMU_DATA_LO);
515			len -= sizeof(u32);
516			ptr++;
517		}
518	}
519
520	/* enqueue packet */
521	ks8842_write16(adapter, 17, 1, REG_TXQCR);
522
523	dev_kfree_skb(skb);
524
525	return NETDEV_TX_OK;
526}
527
528static void ks8842_update_rx_err_counters(struct net_device *netdev, u32 status)
529{
530	netdev_dbg(netdev, "RX error, status: %x\n", status);
531
532	netdev->stats.rx_errors++;
533	if (status & RXSR_TOO_LONG)
534		netdev->stats.rx_length_errors++;
535	if (status & RXSR_CRC_ERROR)
536		netdev->stats.rx_crc_errors++;
537	if (status & RXSR_RUNT)
538		netdev->stats.rx_frame_errors++;
539}
540
541static void ks8842_update_rx_counters(struct net_device *netdev, u32 status,
542	int len)
543{
544	netdev_dbg(netdev, "RX packet, len: %d\n", len);
545
546	netdev->stats.rx_packets++;
547	netdev->stats.rx_bytes += len;
548	if (status & RXSR_MULTICAST)
549		netdev->stats.multicast++;
550}
551
552static int __ks8842_start_new_rx_dma(struct net_device *netdev)
553{
554	struct ks8842_adapter *adapter = netdev_priv(netdev);
555	struct ks8842_rx_dma_ctl *ctl = &adapter->dma_rx;
556	struct scatterlist *sg = &ctl->sg;
557	int err;
558
559	ctl->skb = netdev_alloc_skb(netdev, DMA_BUFFER_SIZE);
560	if (ctl->skb) {
561		sg_init_table(sg, 1);
562		sg_dma_address(sg) = dma_map_single(adapter->dev,
563			ctl->skb->data, DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
564		err = dma_mapping_error(adapter->dev, sg_dma_address(sg));
565		if (unlikely(err)) {
566			sg_dma_address(sg) = 0;
567			goto out;
568		}
569
570		sg_dma_len(sg) = DMA_BUFFER_SIZE;
571
572		ctl->adesc = dmaengine_prep_slave_sg(ctl->chan,
573			sg, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
574
575		if (!ctl->adesc)
576			goto out;
577
578		ctl->adesc->callback_param = netdev;
579		ctl->adesc->callback = ks8842_dma_rx_cb;
580		ctl->adesc->tx_submit(ctl->adesc);
581	} else {
582		err = -ENOMEM;
583		sg_dma_address(sg) = 0;
584		goto out;
585	}
586
587	return err;
588out:
589	if (sg_dma_address(sg))
590		dma_unmap_single(adapter->dev, sg_dma_address(sg),
591			DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
592	sg_dma_address(sg) = 0;
593	if (ctl->skb)
594		dev_kfree_skb(ctl->skb);
595
596	ctl->skb = NULL;
597
598	printk(KERN_ERR DRV_NAME": Failed to start RX DMA: %d\n", err);
599	return err;
600}
601
602static void ks8842_rx_frame_dma_tasklet(unsigned long arg)
603{
604	struct net_device *netdev = (struct net_device *)arg;
605	struct ks8842_adapter *adapter = netdev_priv(netdev);
606	struct ks8842_rx_dma_ctl *ctl = &adapter->dma_rx;
607	struct sk_buff *skb = ctl->skb;
608	dma_addr_t addr = sg_dma_address(&ctl->sg);
609	u32 status;
610
611	ctl->adesc = NULL;
612
613	/* kick next transfer going */
614	__ks8842_start_new_rx_dma(netdev);
615
616	/* now handle the data we got */
617	dma_unmap_single(adapter->dev, addr, DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
618
619	status = *((u32 *)skb->data);
620
621	netdev_dbg(netdev, "%s - rx_data: status: %x\n",
622		__func__, status & 0xffff);
623
624	/* check the status */
625	if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {
626		int len = (status >> 16) & 0x7ff;
627
628		ks8842_update_rx_counters(netdev, status, len);
629
630		/* reserve 4 bytes which is the status word */
631		skb_reserve(skb, 4);
632		skb_put(skb, len);
633
634		skb->protocol = eth_type_trans(skb, netdev);
635		netif_rx(skb);
636	} else {
637		ks8842_update_rx_err_counters(netdev, status);
638		dev_kfree_skb(skb);
639	}
640}
641
642static void ks8842_rx_frame(struct net_device *netdev,
643	struct ks8842_adapter *adapter)
644{
645	u32 status;
646	int len;
647
648	if (adapter->conf_flags & KS884X_16BIT) {
649		status = ks8842_read16(adapter, 17, REG_QMU_DATA_LO);
650		len = ks8842_read16(adapter, 17, REG_QMU_DATA_HI);
651		netdev_dbg(netdev, "%s - rx_data: status: %x\n",
652			   __func__, status);
653	} else {
654		status = ks8842_read32(adapter, 17, REG_QMU_DATA_LO);
655		len = (status >> 16) & 0x7ff;
656		status &= 0xffff;
657		netdev_dbg(netdev, "%s - rx_data: status: %x\n",
658			   __func__, status);
659	}
660
661	/* check the status */
662	if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {
663		struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len + 3);
664
665		if (skb) {
666
667			ks8842_update_rx_counters(netdev, status, len);
668
669			if (adapter->conf_flags & KS884X_16BIT) {
670				u16 *data16 = (u16 *)skb_put(skb, len);
671				ks8842_select_bank(adapter, 17);
672				while (len > 0) {
673					*data16++ = ioread16(adapter->hw_addr +
674						REG_QMU_DATA_LO);
675					*data16++ = ioread16(adapter->hw_addr +
676						REG_QMU_DATA_HI);
677					len -= sizeof(u32);
678				}
679			} else {
680				u32 *data = (u32 *)skb_put(skb, len);
681
682				ks8842_select_bank(adapter, 17);
683				while (len > 0) {
684					*data++ = ioread32(adapter->hw_addr +
685						REG_QMU_DATA_LO);
686					len -= sizeof(u32);
687				}
688			}
689			skb->protocol = eth_type_trans(skb, netdev);
690			netif_rx(skb);
691		} else
692			netdev->stats.rx_dropped++;
693	} else
694		ks8842_update_rx_err_counters(netdev, status);
695
696	/* set high watermark to 3K */
697	ks8842_clear_bits(adapter, 0, 1 << 12, REG_QRFCR);
698
699	/* release the frame */
700	ks8842_write16(adapter, 17, 0x01, REG_RXQCR);
701
702	/* set high watermark to 2K */
703	ks8842_enable_bits(adapter, 0, 1 << 12, REG_QRFCR);
704}
705
706static void ks8842_handle_rx(struct net_device *netdev,
707	struct ks8842_adapter *adapter)
708{
709	u16 rx_data = ks8842_read16(adapter, 16, REG_RXMIR) & 0x1fff;
710	netdev_dbg(netdev, "%s Entry - rx_data: %d\n", __func__, rx_data);
711	while (rx_data) {
712		ks8842_rx_frame(netdev, adapter);
713		rx_data = ks8842_read16(adapter, 16, REG_RXMIR) & 0x1fff;
714	}
715}
716
717static void ks8842_handle_tx(struct net_device *netdev,
718	struct ks8842_adapter *adapter)
719{
720	u16 sr = ks8842_read16(adapter, 16, REG_TXSR);
721	netdev_dbg(netdev, "%s - entry, sr: %x\n", __func__, sr);
722	netdev->stats.tx_packets++;
723	if (netif_queue_stopped(netdev))
724		netif_wake_queue(netdev);
725}
726
727static void ks8842_handle_rx_overrun(struct net_device *netdev,
728	struct ks8842_adapter *adapter)
729{
730	netdev_dbg(netdev, "%s: entry\n", __func__);
731	netdev->stats.rx_errors++;
732	netdev->stats.rx_fifo_errors++;
733}
734
735static void ks8842_tasklet(unsigned long arg)
736{
737	struct net_device *netdev = (struct net_device *)arg;
738	struct ks8842_adapter *adapter = netdev_priv(netdev);
739	u16 isr;
740	unsigned long flags;
741	u16 entry_bank;
742
743	/* read current bank to be able to set it back */
744	spin_lock_irqsave(&adapter->lock, flags);
745	entry_bank = ioread16(adapter->hw_addr + REG_SELECT_BANK);
746	spin_unlock_irqrestore(&adapter->lock, flags);
747
748	isr = ks8842_read16(adapter, 18, REG_ISR);
749	netdev_dbg(netdev, "%s - ISR: 0x%x\n", __func__, isr);
750
751	/* when running in DMA mode, do not ack RX interrupts, it is handled
752	   internally by timberdale, otherwise it's DMA FIFO:s would stop
753	*/
754	if (KS8842_USE_DMA(adapter))
755		isr &= ~IRQ_RX;
756
757	/* Ack */
758	ks8842_write16(adapter, 18, isr, REG_ISR);
759
760	if (!(adapter->conf_flags & MICREL_KS884X))
761		/* Ack in the timberdale IP as well */
762		iowrite32(0x1, adapter->hw_addr + REG_TIMB_IAR);
763
764	if (!netif_running(netdev))
765		return;
766
767	if (isr & IRQ_LINK_CHANGE)
768		ks8842_update_link_status(netdev, adapter);
769
770	/* should not get IRQ_RX when running DMA mode */
771	if (isr & (IRQ_RX | IRQ_RX_ERROR) && !KS8842_USE_DMA(adapter))
772		ks8842_handle_rx(netdev, adapter);
773
774	/* should only happen when in PIO mode */
775	if (isr & IRQ_TX)
776		ks8842_handle_tx(netdev, adapter);
777
778	if (isr & IRQ_RX_OVERRUN)
779		ks8842_handle_rx_overrun(netdev, adapter);
780
781	if (isr & IRQ_TX_STOPPED) {
782		ks8842_disable_tx(adapter);
783		ks8842_enable_tx(adapter);
784	}
785
786	if (isr & IRQ_RX_STOPPED) {
787		ks8842_disable_rx(adapter);
788		ks8842_enable_rx(adapter);
789	}
790
791	/* re-enable interrupts, put back the bank selection register */
792	spin_lock_irqsave(&adapter->lock, flags);
793	if (KS8842_USE_DMA(adapter))
794		ks8842_write16(adapter, 18, ENABLED_IRQS_DMA, REG_IER);
795	else
796		ks8842_write16(adapter, 18, ENABLED_IRQS, REG_IER);
797	iowrite16(entry_bank, adapter->hw_addr + REG_SELECT_BANK);
798
799	/* Make sure timberdale continues DMA operations, they are stopped while
800	   we are handling the ks8842 because we might change bank */
801	if (KS8842_USE_DMA(adapter))
802		ks8842_resume_dma(adapter);
803
804	spin_unlock_irqrestore(&adapter->lock, flags);
805}
806
807static irqreturn_t ks8842_irq(int irq, void *devid)
808{
809	struct net_device *netdev = devid;
810	struct ks8842_adapter *adapter = netdev_priv(netdev);
811	u16 isr;
812	u16 entry_bank = ioread16(adapter->hw_addr + REG_SELECT_BANK);
813	irqreturn_t ret = IRQ_NONE;
814
815	isr = ks8842_read16(adapter, 18, REG_ISR);
816	netdev_dbg(netdev, "%s - ISR: 0x%x\n", __func__, isr);
817
818	if (isr) {
819		if (KS8842_USE_DMA(adapter))
820			/* disable all but RX IRQ, since the FPGA relies on it*/
821			ks8842_write16(adapter, 18, IRQ_RX, REG_IER);
822		else
823			/* disable IRQ */
824			ks8842_write16(adapter, 18, 0x00, REG_IER);
825
826		/* schedule tasklet */
827		tasklet_schedule(&adapter->tasklet);
828
829		ret = IRQ_HANDLED;
830	}
831
832	iowrite16(entry_bank, adapter->hw_addr + REG_SELECT_BANK);
833
834	/* After an interrupt, tell timberdale to continue DMA operations.
835	   DMA is disabled while we are handling the ks8842 because we might
836	   change bank */
837	ks8842_resume_dma(adapter);
838
839	return ret;
840}
841
842static void ks8842_dma_rx_cb(void *data)
843{
844	struct net_device	*netdev = data;
845	struct ks8842_adapter	*adapter = netdev_priv(netdev);
846
847	netdev_dbg(netdev, "RX DMA finished\n");
848	/* schedule tasklet */
849	if (adapter->dma_rx.adesc)
850		tasklet_schedule(&adapter->dma_rx.tasklet);
851}
852
853static void ks8842_dma_tx_cb(void *data)
854{
855	struct net_device		*netdev = data;
856	struct ks8842_adapter		*adapter = netdev_priv(netdev);
857	struct ks8842_tx_dma_ctl	*ctl = &adapter->dma_tx;
858
859	netdev_dbg(netdev, "TX DMA finished\n");
860
861	if (!ctl->adesc)
862		return;
863
864	netdev->stats.tx_packets++;
865	ctl->adesc = NULL;
866
867	if (netif_queue_stopped(netdev))
868		netif_wake_queue(netdev);
869}
870
871static void ks8842_stop_dma(struct ks8842_adapter *adapter)
872{
873	struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;
874	struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;
875
876	tx_ctl->adesc = NULL;
877	if (tx_ctl->chan)
878		dmaengine_terminate_all(tx_ctl->chan);
879
880	rx_ctl->adesc = NULL;
881	if (rx_ctl->chan)
882		dmaengine_terminate_all(rx_ctl->chan);
883
884	if (sg_dma_address(&rx_ctl->sg))
885		dma_unmap_single(adapter->dev, sg_dma_address(&rx_ctl->sg),
886			DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
887	sg_dma_address(&rx_ctl->sg) = 0;
888
889	dev_kfree_skb(rx_ctl->skb);
890	rx_ctl->skb = NULL;
891}
892
893static void ks8842_dealloc_dma_bufs(struct ks8842_adapter *adapter)
894{
895	struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;
896	struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;
897
898	ks8842_stop_dma(adapter);
899
900	if (tx_ctl->chan)
901		dma_release_channel(tx_ctl->chan);
902	tx_ctl->chan = NULL;
903
904	if (rx_ctl->chan)
905		dma_release_channel(rx_ctl->chan);
906	rx_ctl->chan = NULL;
907
908	tasklet_kill(&rx_ctl->tasklet);
909
910	if (sg_dma_address(&tx_ctl->sg))
911		dma_unmap_single(adapter->dev, sg_dma_address(&tx_ctl->sg),
912			DMA_BUFFER_SIZE, DMA_TO_DEVICE);
913	sg_dma_address(&tx_ctl->sg) = 0;
914
915	kfree(tx_ctl->buf);
916	tx_ctl->buf = NULL;
917}
918
919static bool ks8842_dma_filter_fn(struct dma_chan *chan, void *filter_param)
920{
921	return chan->chan_id == (long)filter_param;
922}
923
924static int ks8842_alloc_dma_bufs(struct net_device *netdev)
925{
926	struct ks8842_adapter *adapter = netdev_priv(netdev);
927	struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;
928	struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;
929	int err;
930
931	dma_cap_mask_t mask;
932
933	dma_cap_zero(mask);
934	dma_cap_set(DMA_SLAVE, mask);
935	dma_cap_set(DMA_PRIVATE, mask);
936
937	sg_init_table(&tx_ctl->sg, 1);
938
939	tx_ctl->chan = dma_request_channel(mask, ks8842_dma_filter_fn,
940					   (void *)(long)tx_ctl->channel);
941	if (!tx_ctl->chan) {
942		err = -ENODEV;
943		goto err;
944	}
945
946	/* allocate DMA buffer */
947	tx_ctl->buf = kmalloc(DMA_BUFFER_SIZE, GFP_KERNEL);
948	if (!tx_ctl->buf) {
949		err = -ENOMEM;
950		goto err;
951	}
952
953	sg_dma_address(&tx_ctl->sg) = dma_map_single(adapter->dev,
954		tx_ctl->buf, DMA_BUFFER_SIZE, DMA_TO_DEVICE);
955	err = dma_mapping_error(adapter->dev,
956		sg_dma_address(&tx_ctl->sg));
957	if (err) {
958		sg_dma_address(&tx_ctl->sg) = 0;
959		goto err;
960	}
961
962	rx_ctl->chan = dma_request_channel(mask, ks8842_dma_filter_fn,
963					   (void *)(long)rx_ctl->channel);
964	if (!rx_ctl->chan) {
965		err = -ENODEV;
966		goto err;
967	}
968
969	tasklet_init(&rx_ctl->tasklet, ks8842_rx_frame_dma_tasklet,
970		(unsigned long)netdev);
971
972	return 0;
973err:
974	ks8842_dealloc_dma_bufs(adapter);
975	return err;
976}
977
978/* Netdevice operations */
979
980static int ks8842_open(struct net_device *netdev)
981{
982	struct ks8842_adapter *adapter = netdev_priv(netdev);
983	int err;
984
985	netdev_dbg(netdev, "%s - entry\n", __func__);
986
987	if (KS8842_USE_DMA(adapter)) {
988		err = ks8842_alloc_dma_bufs(netdev);
989
990		if (!err) {
991			/* start RX dma */
992			err = __ks8842_start_new_rx_dma(netdev);
993			if (err)
994				ks8842_dealloc_dma_bufs(adapter);
995		}
996
997		if (err) {
998			printk(KERN_WARNING DRV_NAME
999				": Failed to initiate DMA, running PIO\n");
1000			ks8842_dealloc_dma_bufs(adapter);
1001			adapter->dma_rx.channel = -1;
1002			adapter->dma_tx.channel = -1;
1003		}
1004	}
1005
1006	/* reset the HW */
1007	ks8842_reset_hw(adapter);
1008
1009	ks8842_write_mac_addr(adapter, netdev->dev_addr);
1010
1011	ks8842_update_link_status(netdev, adapter);
1012
1013	err = request_irq(adapter->irq, ks8842_irq, IRQF_SHARED, DRV_NAME,
1014		netdev);
1015	if (err) {
1016		pr_err("Failed to request IRQ: %d: %d\n", adapter->irq, err);
1017		return err;
1018	}
1019
1020	return 0;
1021}
1022
1023static int ks8842_close(struct net_device *netdev)
1024{
1025	struct ks8842_adapter *adapter = netdev_priv(netdev);
1026
1027	netdev_dbg(netdev, "%s - entry\n", __func__);
1028
1029	cancel_work_sync(&adapter->timeout_work);
1030
1031	if (KS8842_USE_DMA(adapter))
1032		ks8842_dealloc_dma_bufs(adapter);
1033
1034	/* free the irq */
1035	free_irq(adapter->irq, netdev);
1036
1037	/* disable the switch */
1038	ks8842_write16(adapter, 32, 0x0, REG_SW_ID_AND_ENABLE);
1039
1040	return 0;
1041}
1042
1043static netdev_tx_t ks8842_xmit_frame(struct sk_buff *skb,
1044				     struct net_device *netdev)
1045{
1046	int ret;
1047	struct ks8842_adapter *adapter = netdev_priv(netdev);
1048
1049	netdev_dbg(netdev, "%s: entry\n", __func__);
1050
1051	if (KS8842_USE_DMA(adapter)) {
1052		unsigned long flags;
1053		ret = ks8842_tx_frame_dma(skb, netdev);
1054		/* for now only allow one transfer at the time */
1055		spin_lock_irqsave(&adapter->lock, flags);
1056		if (adapter->dma_tx.adesc)
1057			netif_stop_queue(netdev);
1058		spin_unlock_irqrestore(&adapter->lock, flags);
1059		return ret;
1060	}
1061
1062	ret = ks8842_tx_frame(skb, netdev);
1063
1064	if (ks8842_tx_fifo_space(adapter) <  netdev->mtu + 8)
1065		netif_stop_queue(netdev);
1066
1067	return ret;
1068}
1069
1070static int ks8842_set_mac(struct net_device *netdev, void *p)
1071{
1072	struct ks8842_adapter *adapter = netdev_priv(netdev);
1073	struct sockaddr *addr = p;
1074	char *mac = (u8 *)addr->sa_data;
1075
1076	netdev_dbg(netdev, "%s: entry\n", __func__);
1077
1078	if (!is_valid_ether_addr(addr->sa_data))
1079		return -EADDRNOTAVAIL;
1080
1081	memcpy(netdev->dev_addr, mac, netdev->addr_len);
1082
1083	ks8842_write_mac_addr(adapter, mac);
1084	return 0;
1085}
1086
1087static void ks8842_tx_timeout_work(struct work_struct *work)
1088{
1089	struct ks8842_adapter *adapter =
1090		container_of(work, struct ks8842_adapter, timeout_work);
1091	struct net_device *netdev = adapter->netdev;
1092	unsigned long flags;
1093
1094	netdev_dbg(netdev, "%s: entry\n", __func__);
1095
1096	spin_lock_irqsave(&adapter->lock, flags);
1097
1098	if (KS8842_USE_DMA(adapter))
1099		ks8842_stop_dma(adapter);
1100
1101	/* disable interrupts */
1102	ks8842_write16(adapter, 18, 0, REG_IER);
1103	ks8842_write16(adapter, 18, 0xFFFF, REG_ISR);
1104
1105	netif_stop_queue(netdev);
1106
1107	spin_unlock_irqrestore(&adapter->lock, flags);
1108
1109	ks8842_reset_hw(adapter);
1110
1111	ks8842_write_mac_addr(adapter, netdev->dev_addr);
1112
1113	ks8842_update_link_status(netdev, adapter);
1114
1115	if (KS8842_USE_DMA(adapter))
1116		__ks8842_start_new_rx_dma(netdev);
1117}
1118
1119static void ks8842_tx_timeout(struct net_device *netdev)
1120{
1121	struct ks8842_adapter *adapter = netdev_priv(netdev);
1122
1123	netdev_dbg(netdev, "%s: entry\n", __func__);
1124
1125	schedule_work(&adapter->timeout_work);
1126}
1127
1128static const struct net_device_ops ks8842_netdev_ops = {
1129	.ndo_open		= ks8842_open,
1130	.ndo_stop		= ks8842_close,
1131	.ndo_start_xmit		= ks8842_xmit_frame,
1132	.ndo_set_mac_address	= ks8842_set_mac,
1133	.ndo_tx_timeout 	= ks8842_tx_timeout,
1134	.ndo_validate_addr	= eth_validate_addr
1135};
1136
1137static const struct ethtool_ops ks8842_ethtool_ops = {
1138	.get_link		= ethtool_op_get_link,
1139};
1140
1141static int ks8842_probe(struct platform_device *pdev)
1142{
1143	int err = -ENOMEM;
1144	struct resource *iomem;
1145	struct net_device *netdev;
1146	struct ks8842_adapter *adapter;
1147	struct ks8842_platform_data *pdata = dev_get_platdata(&pdev->dev);
1148	u16 id;
1149	unsigned i;
1150
1151	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1152	if (!request_mem_region(iomem->start, resource_size(iomem), DRV_NAME))
1153		goto err_mem_region;
1154
1155	netdev = alloc_etherdev(sizeof(struct ks8842_adapter));
1156	if (!netdev)
1157		goto err_alloc_etherdev;
1158
1159	SET_NETDEV_DEV(netdev, &pdev->dev);
1160
1161	adapter = netdev_priv(netdev);
1162	adapter->netdev = netdev;
1163	INIT_WORK(&adapter->timeout_work, ks8842_tx_timeout_work);
1164	adapter->hw_addr = ioremap(iomem->start, resource_size(iomem));
1165	adapter->conf_flags = iomem->flags;
1166
1167	if (!adapter->hw_addr)
1168		goto err_ioremap;
1169
1170	adapter->irq = platform_get_irq(pdev, 0);
1171	if (adapter->irq < 0) {
1172		err = adapter->irq;
1173		goto err_get_irq;
1174	}
1175
1176	adapter->dev = (pdev->dev.parent) ? pdev->dev.parent : &pdev->dev;
1177
1178	/* DMA is only supported when accessed via timberdale */
1179	if (!(adapter->conf_flags & MICREL_KS884X) && pdata &&
1180		(pdata->tx_dma_channel != -1) &&
1181		(pdata->rx_dma_channel != -1)) {
1182		adapter->dma_rx.channel = pdata->rx_dma_channel;
1183		adapter->dma_tx.channel = pdata->tx_dma_channel;
1184	} else {
1185		adapter->dma_rx.channel = -1;
1186		adapter->dma_tx.channel = -1;
1187	}
1188
1189	tasklet_init(&adapter->tasklet, ks8842_tasklet, (unsigned long)netdev);
1190	spin_lock_init(&adapter->lock);
1191
1192	netdev->netdev_ops = &ks8842_netdev_ops;
1193	netdev->ethtool_ops = &ks8842_ethtool_ops;
1194
1195	/* Check if a mac address was given */
1196	i = netdev->addr_len;
1197	if (pdata) {
1198		for (i = 0; i < netdev->addr_len; i++)
1199			if (pdata->macaddr[i] != 0)
1200				break;
1201
1202		if (i < netdev->addr_len)
1203			/* an address was passed, use it */
1204			memcpy(netdev->dev_addr, pdata->macaddr,
1205				netdev->addr_len);
1206	}
1207
1208	if (i == netdev->addr_len) {
1209		ks8842_read_mac_addr(adapter, netdev->dev_addr);
1210
1211		if (!is_valid_ether_addr(netdev->dev_addr))
1212			eth_hw_addr_random(netdev);
1213	}
1214
1215	id = ks8842_read16(adapter, 32, REG_SW_ID_AND_ENABLE);
1216
1217	strcpy(netdev->name, "eth%d");
1218	err = register_netdev(netdev);
1219	if (err)
1220		goto err_register;
1221
1222	platform_set_drvdata(pdev, netdev);
1223
1224	pr_info("Found chip, family: 0x%x, id: 0x%x, rev: 0x%x\n",
1225		(id >> 8) & 0xff, (id >> 4) & 0xf, (id >> 1) & 0x7);
1226
1227	return 0;
1228
1229err_register:
1230err_get_irq:
1231	iounmap(adapter->hw_addr);
1232err_ioremap:
1233	free_netdev(netdev);
1234err_alloc_etherdev:
1235	release_mem_region(iomem->start, resource_size(iomem));
1236err_mem_region:
1237	return err;
1238}
1239
1240static int ks8842_remove(struct platform_device *pdev)
1241{
1242	struct net_device *netdev = platform_get_drvdata(pdev);
1243	struct ks8842_adapter *adapter = netdev_priv(netdev);
1244	struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1245
1246	unregister_netdev(netdev);
1247	tasklet_kill(&adapter->tasklet);
1248	iounmap(adapter->hw_addr);
1249	free_netdev(netdev);
1250	release_mem_region(iomem->start, resource_size(iomem));
1251	return 0;
1252}
1253
1254
1255static struct platform_driver ks8842_platform_driver = {
1256	.driver = {
1257		.name	= DRV_NAME,
1258	},
1259	.probe		= ks8842_probe,
1260	.remove		= ks8842_remove,
1261};
1262
1263module_platform_driver(ks8842_platform_driver);
1264
1265MODULE_DESCRIPTION("Timberdale KS8842 ethernet driver");
1266MODULE_AUTHOR("Mocean Laboratories <info@mocean-labs.com>");
1267MODULE_LICENSE("GPL v2");
1268MODULE_ALIAS("platform:ks8842");
1269
1270