1 // SPDX-License-Identifier: GPL-2.0-only
3 * ks8842.c timberdale KS8842 ethernet driver
4 * Copyright (c) 2009 Intel Corporation
8 * The Micrel KS8842 behind the timberdale FPGA
9 * The genuine Micrel KS8841/42 device with ISA 16/32bit bus interface
12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 #include <linux/interrupt.h>
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/netdevice.h>
19 #include <linux/etherdevice.h>
20 #include <linux/ethtool.h>
21 #include <linux/ks8842.h>
22 #include <linux/dmaengine.h>
23 #include <linux/dma-mapping.h>
24 #include <linux/scatterlist.h>
26 #define DRV_NAME "ks8842"
28 /* Timberdale specific Registers */
29 #define REG_TIMB_RST 0x1c
30 #define REG_TIMB_FIFO 0x20
31 #define REG_TIMB_ISR 0x24
32 #define REG_TIMB_IER 0x28
33 #define REG_TIMB_IAR 0x2C
34 #define REQ_TIMB_DMA_RESUME 0x30
36 /* KS8842 registers */
38 #define REG_SELECT_BANK 0x0e
40 /* bank 0 registers */
41 #define REG_QRFCR 0x04
43 /* bank 2 registers */
48 /* bank 3 registers */
51 /* bank 16 registers */
55 #define REG_TXMIR 0x08
56 #define REG_RXMIR 0x0A
58 /* bank 17 registers */
59 #define REG_TXQCR 0x00
60 #define REG_RXQCR 0x02
61 #define REG_TXFDPR 0x04
62 #define REG_RXFDPR 0x06
63 #define REG_QMU_DATA_LO 0x08
64 #define REG_QMU_DATA_HI 0x0A
66 /* bank 18 registers */
68 #define IRQ_LINK_CHANGE 0x8000
71 #define IRQ_RX_OVERRUN 0x0800
72 #define IRQ_TX_STOPPED 0x0200
73 #define IRQ_RX_STOPPED 0x0100
74 #define IRQ_RX_ERROR 0x0080
75 #define ENABLED_IRQS (IRQ_LINK_CHANGE | IRQ_TX | IRQ_RX | IRQ_RX_STOPPED | \
76 IRQ_TX_STOPPED | IRQ_RX_OVERRUN | IRQ_RX_ERROR)
77 /* When running via timberdale in DMA mode, the RX interrupt should be
78 enabled in the KS8842, but not in the FPGA IP, since the IP handles
80 TX interrupts are not needed it is handled by the FPGA the driver is
81 notified via DMA callbacks.
83 #define ENABLED_IRQS_DMA_IP (IRQ_LINK_CHANGE | IRQ_RX_STOPPED | \
84 IRQ_TX_STOPPED | IRQ_RX_OVERRUN | IRQ_RX_ERROR)
85 #define ENABLED_IRQS_DMA (ENABLED_IRQS_DMA_IP | IRQ_RX)
88 #define RXSR_VALID 0x8000
89 #define RXSR_BROADCAST 0x80
90 #define RXSR_MULTICAST 0x40
91 #define RXSR_UNICAST 0x20
92 #define RXSR_FRAMETYPE 0x08
93 #define RXSR_TOO_LONG 0x04
94 #define RXSR_RUNT 0x02
95 #define RXSR_CRC_ERROR 0x01
96 #define RXSR_ERROR (RXSR_TOO_LONG | RXSR_RUNT | RXSR_CRC_ERROR)
98 /* bank 32 registers */
99 #define REG_SW_ID_AND_ENABLE 0x00
100 #define REG_SGCR1 0x02
101 #define REG_SGCR2 0x04
102 #define REG_SGCR3 0x06
104 /* bank 39 registers */
105 #define REG_MACAR1 0x00
106 #define REG_MACAR2 0x02
107 #define REG_MACAR3 0x04
109 /* bank 45 registers */
110 #define REG_P1MBCR 0x00
111 #define REG_P1MBSR 0x02
113 /* bank 46 registers */
114 #define REG_P2MBCR 0x00
115 #define REG_P2MBSR 0x02
117 /* bank 48 registers */
118 #define REG_P1CR2 0x02
120 /* bank 49 registers */
121 #define REG_P1CR4 0x02
122 #define REG_P1SR 0x04
124 /* flags passed by platform_device for configuration */
125 #define MICREL_KS884X 0x01 /* 0=Timeberdale(FPGA), 1=Micrel */
126 #define KS884X_16BIT 0x02 /* 1=16bit, 0=32bit */
128 #define DMA_BUFFER_SIZE 2048
130 struct ks8842_tx_dma_ctl {
131 struct dma_chan *chan;
132 struct dma_async_tx_descriptor *adesc;
134 struct scatterlist sg;
138 struct ks8842_rx_dma_ctl {
139 struct dma_chan *chan;
140 struct dma_async_tx_descriptor *adesc;
142 struct scatterlist sg;
143 struct tasklet_struct tasklet;
147 #define KS8842_USE_DMA(adapter) (((adapter)->dma_tx.channel != -1) && \
148 ((adapter)->dma_rx.channel != -1))
150 struct ks8842_adapter {
151 void __iomem *hw_addr;
153 unsigned long conf_flags; /* copy of platform_device config */
154 struct tasklet_struct tasklet;
155 spinlock_t lock; /* spinlock to be interrupt safe */
156 struct work_struct timeout_work;
157 struct net_device *netdev;
159 struct ks8842_tx_dma_ctl dma_tx;
160 struct ks8842_rx_dma_ctl dma_rx;
163 static void ks8842_dma_rx_cb(void *data);
164 static void ks8842_dma_tx_cb(void *data);
166 static inline void ks8842_resume_dma(struct ks8842_adapter *adapter)
168 iowrite32(1, adapter->hw_addr + REQ_TIMB_DMA_RESUME);
171 static inline void ks8842_select_bank(struct ks8842_adapter *adapter, u16 bank)
173 iowrite16(bank, adapter->hw_addr + REG_SELECT_BANK);
176 static inline void ks8842_write8(struct ks8842_adapter *adapter, u16 bank,
177 u8 value, int offset)
179 ks8842_select_bank(adapter, bank);
180 iowrite8(value, adapter->hw_addr + offset);
183 static inline void ks8842_write16(struct ks8842_adapter *adapter, u16 bank,
184 u16 value, int offset)
186 ks8842_select_bank(adapter, bank);
187 iowrite16(value, adapter->hw_addr + offset);
190 static inline void ks8842_enable_bits(struct ks8842_adapter *adapter, u16 bank,
191 u16 bits, int offset)
194 ks8842_select_bank(adapter, bank);
195 reg = ioread16(adapter->hw_addr + offset);
197 iowrite16(reg, adapter->hw_addr + offset);
200 static inline void ks8842_clear_bits(struct ks8842_adapter *adapter, u16 bank,
201 u16 bits, int offset)
204 ks8842_select_bank(adapter, bank);
205 reg = ioread16(adapter->hw_addr + offset);
207 iowrite16(reg, adapter->hw_addr + offset);
210 static inline void ks8842_write32(struct ks8842_adapter *adapter, u16 bank,
211 u32 value, int offset)
213 ks8842_select_bank(adapter, bank);
214 iowrite32(value, adapter->hw_addr + offset);
217 static inline u8 ks8842_read8(struct ks8842_adapter *adapter, u16 bank,
220 ks8842_select_bank(adapter, bank);
221 return ioread8(adapter->hw_addr + offset);
224 static inline u16 ks8842_read16(struct ks8842_adapter *adapter, u16 bank,
227 ks8842_select_bank(adapter, bank);
228 return ioread16(adapter->hw_addr + offset);
231 static inline u32 ks8842_read32(struct ks8842_adapter *adapter, u16 bank,
234 ks8842_select_bank(adapter, bank);
235 return ioread32(adapter->hw_addr + offset);
238 static void ks8842_reset(struct ks8842_adapter *adapter)
240 if (adapter->conf_flags & MICREL_KS884X) {
241 ks8842_write16(adapter, 3, 1, REG_GRR);
243 iowrite16(0, adapter->hw_addr + REG_GRR);
245 /* The KS8842 goes haywire when doing softare reset
246 * a work around in the timberdale IP is implemented to
247 * do a hardware reset instead
248 ks8842_write16(adapter, 3, 1, REG_GRR);
250 iowrite16(0, adapter->hw_addr + REG_GRR);
252 iowrite32(0x1, adapter->hw_addr + REG_TIMB_RST);
257 static void ks8842_update_link_status(struct net_device *netdev,
258 struct ks8842_adapter *adapter)
260 /* check the status of the link */
261 if (ks8842_read16(adapter, 45, REG_P1MBSR) & 0x4) {
262 netif_carrier_on(netdev);
263 netif_wake_queue(netdev);
265 netif_stop_queue(netdev);
266 netif_carrier_off(netdev);
270 static void ks8842_enable_tx(struct ks8842_adapter *adapter)
272 ks8842_enable_bits(adapter, 16, 0x01, REG_TXCR);
275 static void ks8842_disable_tx(struct ks8842_adapter *adapter)
277 ks8842_clear_bits(adapter, 16, 0x01, REG_TXCR);
280 static void ks8842_enable_rx(struct ks8842_adapter *adapter)
282 ks8842_enable_bits(adapter, 16, 0x01, REG_RXCR);
285 static void ks8842_disable_rx(struct ks8842_adapter *adapter)
287 ks8842_clear_bits(adapter, 16, 0x01, REG_RXCR);
290 static void ks8842_reset_hw(struct ks8842_adapter *adapter)
293 ks8842_reset(adapter);
295 /* Enable QMU Transmit flow control / transmit padding / Transmit CRC */
296 ks8842_write16(adapter, 16, 0x000E, REG_TXCR);
298 /* enable the receiver, uni + multi + broadcast + flow ctrl
300 ks8842_write16(adapter, 16, 0x8 | 0x20 | 0x40 | 0x80 | 0x400,
303 /* TX frame pointer autoincrement */
304 ks8842_write16(adapter, 17, 0x4000, REG_TXFDPR);
306 /* RX frame pointer autoincrement */
307 ks8842_write16(adapter, 17, 0x4000, REG_RXFDPR);
309 /* RX 2 kb high watermark */
310 ks8842_write16(adapter, 0, 0x1000, REG_QRFCR);
312 /* aggressive back off in half duplex */
313 ks8842_enable_bits(adapter, 32, 1 << 8, REG_SGCR1);
315 /* enable no excessive collison drop */
316 ks8842_enable_bits(adapter, 32, 1 << 3, REG_SGCR2);
318 /* Enable port 1 force flow control / back pressure / transmit / recv */
319 ks8842_write16(adapter, 48, 0x1E07, REG_P1CR2);
321 /* restart port auto-negotiation */
322 ks8842_enable_bits(adapter, 49, 1 << 13, REG_P1CR4);
324 /* Enable the transmitter */
325 ks8842_enable_tx(adapter);
327 /* Enable the receiver */
328 ks8842_enable_rx(adapter);
330 /* clear all interrupts */
331 ks8842_write16(adapter, 18, 0xffff, REG_ISR);
333 /* enable interrupts */
334 if (KS8842_USE_DMA(adapter)) {
335 /* When running in DMA Mode the RX interrupt is not enabled in
336 timberdale because RX data is received by DMA callbacks
337 it must still be enabled in the KS8842 because it indicates
338 to timberdale when there is RX data for it's DMA FIFOs */
339 iowrite16(ENABLED_IRQS_DMA_IP, adapter->hw_addr + REG_TIMB_IER);
340 ks8842_write16(adapter, 18, ENABLED_IRQS_DMA, REG_IER);
342 if (!(adapter->conf_flags & MICREL_KS884X))
343 iowrite16(ENABLED_IRQS,
344 adapter->hw_addr + REG_TIMB_IER);
345 ks8842_write16(adapter, 18, ENABLED_IRQS, REG_IER);
347 /* enable the switch */
348 ks8842_write16(adapter, 32, 0x1, REG_SW_ID_AND_ENABLE);
351 static void ks8842_read_mac_addr(struct ks8842_adapter *adapter, u8 *dest)
356 for (i = 0; i < ETH_ALEN; i++)
357 dest[ETH_ALEN - i - 1] = ks8842_read8(adapter, 2, REG_MARL + i);
359 if (adapter->conf_flags & MICREL_KS884X) {
361 the sequence of saving mac addr between MAC and Switch is
365 mac = ks8842_read16(adapter, 2, REG_MARL);
366 ks8842_write16(adapter, 39, mac, REG_MACAR3);
367 mac = ks8842_read16(adapter, 2, REG_MARM);
368 ks8842_write16(adapter, 39, mac, REG_MACAR2);
369 mac = ks8842_read16(adapter, 2, REG_MARH);
370 ks8842_write16(adapter, 39, mac, REG_MACAR1);
373 /* make sure the switch port uses the same MAC as the QMU */
374 mac = ks8842_read16(adapter, 2, REG_MARL);
375 ks8842_write16(adapter, 39, mac, REG_MACAR1);
376 mac = ks8842_read16(adapter, 2, REG_MARM);
377 ks8842_write16(adapter, 39, mac, REG_MACAR2);
378 mac = ks8842_read16(adapter, 2, REG_MARH);
379 ks8842_write16(adapter, 39, mac, REG_MACAR3);
383 static void ks8842_write_mac_addr(struct ks8842_adapter *adapter, u8 *mac)
388 spin_lock_irqsave(&adapter->lock, flags);
389 for (i = 0; i < ETH_ALEN; i++) {
390 ks8842_write8(adapter, 2, mac[ETH_ALEN - i - 1], REG_MARL + i);
391 if (!(adapter->conf_flags & MICREL_KS884X))
392 ks8842_write8(adapter, 39, mac[ETH_ALEN - i - 1],
396 if (adapter->conf_flags & MICREL_KS884X) {
398 the sequence of saving mac addr between MAC and Switch is
404 mac = ks8842_read16(adapter, 2, REG_MARL);
405 ks8842_write16(adapter, 39, mac, REG_MACAR3);
406 mac = ks8842_read16(adapter, 2, REG_MARM);
407 ks8842_write16(adapter, 39, mac, REG_MACAR2);
408 mac = ks8842_read16(adapter, 2, REG_MARH);
409 ks8842_write16(adapter, 39, mac, REG_MACAR1);
411 spin_unlock_irqrestore(&adapter->lock, flags);
414 static inline u16 ks8842_tx_fifo_space(struct ks8842_adapter *adapter)
416 return ks8842_read16(adapter, 16, REG_TXMIR) & 0x1fff;
419 static int ks8842_tx_frame_dma(struct sk_buff *skb, struct net_device *netdev)
421 struct ks8842_adapter *adapter = netdev_priv(netdev);
422 struct ks8842_tx_dma_ctl *ctl = &adapter->dma_tx;
426 netdev_dbg(netdev, "%s: TX ongoing\n", __func__);
427 /* transfer ongoing */
428 return NETDEV_TX_BUSY;
431 sg_dma_len(&ctl->sg) = skb->len + sizeof(u32);
433 /* copy data to the TX buffer */
434 /* the control word, enable IRQ, port 1 and the length */
436 *buf++ = 0x01; /* Port 1 */
437 *buf++ = skb->len & 0xff;
438 *buf++ = (skb->len >> 8) & 0xff;
439 skb_copy_from_linear_data(skb, buf, skb->len);
441 dma_sync_single_range_for_device(adapter->dev,
442 sg_dma_address(&ctl->sg), 0, sg_dma_len(&ctl->sg),
445 /* make sure the length is a multiple of 4 */
446 if (sg_dma_len(&ctl->sg) % 4)
447 sg_dma_len(&ctl->sg) += 4 - sg_dma_len(&ctl->sg) % 4;
449 ctl->adesc = dmaengine_prep_slave_sg(ctl->chan,
450 &ctl->sg, 1, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT);
452 return NETDEV_TX_BUSY;
454 ctl->adesc->callback_param = netdev;
455 ctl->adesc->callback = ks8842_dma_tx_cb;
456 ctl->adesc->tx_submit(ctl->adesc);
458 netdev->stats.tx_bytes += skb->len;
465 static int ks8842_tx_frame(struct sk_buff *skb, struct net_device *netdev)
467 struct ks8842_adapter *adapter = netdev_priv(netdev);
470 netdev_dbg(netdev, "%s: len %u head %p data %p tail %p end %p\n",
471 __func__, skb->len, skb->head, skb->data,
472 skb_tail_pointer(skb), skb_end_pointer(skb));
474 /* check FIFO buffer space, we need space for CRC and command bits */
475 if (ks8842_tx_fifo_space(adapter) < len + 8)
476 return NETDEV_TX_BUSY;
478 if (adapter->conf_flags & KS884X_16BIT) {
479 u16 *ptr16 = (u16 *)skb->data;
480 ks8842_write16(adapter, 17, 0x8000 | 0x100, REG_QMU_DATA_LO);
481 ks8842_write16(adapter, 17, (u16)len, REG_QMU_DATA_HI);
482 netdev->stats.tx_bytes += len;
486 iowrite16(*ptr16++, adapter->hw_addr + REG_QMU_DATA_LO);
487 iowrite16(*ptr16++, adapter->hw_addr + REG_QMU_DATA_HI);
492 u32 *ptr = (u32 *)skb->data;
494 /* the control word, enable IRQ, port 1 and the length */
495 ctrl = 0x8000 | 0x100 | (len << 16);
496 ks8842_write32(adapter, 17, ctrl, REG_QMU_DATA_LO);
498 netdev->stats.tx_bytes += len;
502 iowrite32(*ptr, adapter->hw_addr + REG_QMU_DATA_LO);
509 ks8842_write16(adapter, 17, 1, REG_TXQCR);
516 static void ks8842_update_rx_err_counters(struct net_device *netdev, u32 status)
518 netdev_dbg(netdev, "RX error, status: %x\n", status);
520 netdev->stats.rx_errors++;
521 if (status & RXSR_TOO_LONG)
522 netdev->stats.rx_length_errors++;
523 if (status & RXSR_CRC_ERROR)
524 netdev->stats.rx_crc_errors++;
525 if (status & RXSR_RUNT)
526 netdev->stats.rx_frame_errors++;
529 static void ks8842_update_rx_counters(struct net_device *netdev, u32 status,
532 netdev_dbg(netdev, "RX packet, len: %d\n", len);
534 netdev->stats.rx_packets++;
535 netdev->stats.rx_bytes += len;
536 if (status & RXSR_MULTICAST)
537 netdev->stats.multicast++;
540 static int __ks8842_start_new_rx_dma(struct net_device *netdev)
542 struct ks8842_adapter *adapter = netdev_priv(netdev);
543 struct ks8842_rx_dma_ctl *ctl = &adapter->dma_rx;
544 struct scatterlist *sg = &ctl->sg;
547 ctl->skb = netdev_alloc_skb(netdev, DMA_BUFFER_SIZE);
549 sg_init_table(sg, 1);
550 sg_dma_address(sg) = dma_map_single(adapter->dev,
551 ctl->skb->data, DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
552 if (dma_mapping_error(adapter->dev, sg_dma_address(sg))) {
554 sg_dma_address(sg) = 0;
558 sg_dma_len(sg) = DMA_BUFFER_SIZE;
560 ctl->adesc = dmaengine_prep_slave_sg(ctl->chan,
561 sg, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
568 ctl->adesc->callback_param = netdev;
569 ctl->adesc->callback = ks8842_dma_rx_cb;
570 ctl->adesc->tx_submit(ctl->adesc);
573 sg_dma_address(sg) = 0;
579 if (sg_dma_address(sg))
580 dma_unmap_single(adapter->dev, sg_dma_address(sg),
581 DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
582 sg_dma_address(sg) = 0;
584 dev_kfree_skb(ctl->skb);
588 printk(KERN_ERR DRV_NAME": Failed to start RX DMA: %d\n", err);
592 static void ks8842_rx_frame_dma_tasklet(unsigned long arg)
594 struct net_device *netdev = (struct net_device *)arg;
595 struct ks8842_adapter *adapter = netdev_priv(netdev);
596 struct ks8842_rx_dma_ctl *ctl = &adapter->dma_rx;
597 struct sk_buff *skb = ctl->skb;
598 dma_addr_t addr = sg_dma_address(&ctl->sg);
603 /* kick next transfer going */
604 __ks8842_start_new_rx_dma(netdev);
606 /* now handle the data we got */
607 dma_unmap_single(adapter->dev, addr, DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
609 status = *((u32 *)skb->data);
611 netdev_dbg(netdev, "%s - rx_data: status: %x\n",
612 __func__, status & 0xffff);
614 /* check the status */
615 if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {
616 int len = (status >> 16) & 0x7ff;
618 ks8842_update_rx_counters(netdev, status, len);
620 /* reserve 4 bytes which is the status word */
624 skb->protocol = eth_type_trans(skb, netdev);
627 ks8842_update_rx_err_counters(netdev, status);
632 static void ks8842_rx_frame(struct net_device *netdev,
633 struct ks8842_adapter *adapter)
638 if (adapter->conf_flags & KS884X_16BIT) {
639 status = ks8842_read16(adapter, 17, REG_QMU_DATA_LO);
640 len = ks8842_read16(adapter, 17, REG_QMU_DATA_HI);
641 netdev_dbg(netdev, "%s - rx_data: status: %x\n",
644 status = ks8842_read32(adapter, 17, REG_QMU_DATA_LO);
645 len = (status >> 16) & 0x7ff;
647 netdev_dbg(netdev, "%s - rx_data: status: %x\n",
651 /* check the status */
652 if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) {
653 struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len + 3);
657 ks8842_update_rx_counters(netdev, status, len);
659 if (adapter->conf_flags & KS884X_16BIT) {
660 u16 *data16 = skb_put(skb, len);
661 ks8842_select_bank(adapter, 17);
663 *data16++ = ioread16(adapter->hw_addr +
665 *data16++ = ioread16(adapter->hw_addr +
670 u32 *data = skb_put(skb, len);
672 ks8842_select_bank(adapter, 17);
674 *data++ = ioread32(adapter->hw_addr +
679 skb->protocol = eth_type_trans(skb, netdev);
682 netdev->stats.rx_dropped++;
684 ks8842_update_rx_err_counters(netdev, status);
686 /* set high watermark to 3K */
687 ks8842_clear_bits(adapter, 0, 1 << 12, REG_QRFCR);
689 /* release the frame */
690 ks8842_write16(adapter, 17, 0x01, REG_RXQCR);
692 /* set high watermark to 2K */
693 ks8842_enable_bits(adapter, 0, 1 << 12, REG_QRFCR);
696 static void ks8842_handle_rx(struct net_device *netdev,
697 struct ks8842_adapter *adapter)
699 u16 rx_data = ks8842_read16(adapter, 16, REG_RXMIR) & 0x1fff;
700 netdev_dbg(netdev, "%s Entry - rx_data: %d\n", __func__, rx_data);
702 ks8842_rx_frame(netdev, adapter);
703 rx_data = ks8842_read16(adapter, 16, REG_RXMIR) & 0x1fff;
707 static void ks8842_handle_tx(struct net_device *netdev,
708 struct ks8842_adapter *adapter)
710 u16 sr = ks8842_read16(adapter, 16, REG_TXSR);
711 netdev_dbg(netdev, "%s - entry, sr: %x\n", __func__, sr);
712 netdev->stats.tx_packets++;
713 if (netif_queue_stopped(netdev))
714 netif_wake_queue(netdev);
717 static void ks8842_handle_rx_overrun(struct net_device *netdev,
718 struct ks8842_adapter *adapter)
720 netdev_dbg(netdev, "%s: entry\n", __func__);
721 netdev->stats.rx_errors++;
722 netdev->stats.rx_fifo_errors++;
725 static void ks8842_tasklet(unsigned long arg)
727 struct net_device *netdev = (struct net_device *)arg;
728 struct ks8842_adapter *adapter = netdev_priv(netdev);
733 /* read current bank to be able to set it back */
734 spin_lock_irqsave(&adapter->lock, flags);
735 entry_bank = ioread16(adapter->hw_addr + REG_SELECT_BANK);
736 spin_unlock_irqrestore(&adapter->lock, flags);
738 isr = ks8842_read16(adapter, 18, REG_ISR);
739 netdev_dbg(netdev, "%s - ISR: 0x%x\n", __func__, isr);
741 /* when running in DMA mode, do not ack RX interrupts, it is handled
742 internally by timberdale, otherwise it's DMA FIFO:s would stop
744 if (KS8842_USE_DMA(adapter))
748 ks8842_write16(adapter, 18, isr, REG_ISR);
750 if (!(adapter->conf_flags & MICREL_KS884X))
751 /* Ack in the timberdale IP as well */
752 iowrite32(0x1, adapter->hw_addr + REG_TIMB_IAR);
754 if (!netif_running(netdev))
757 if (isr & IRQ_LINK_CHANGE)
758 ks8842_update_link_status(netdev, adapter);
760 /* should not get IRQ_RX when running DMA mode */
761 if (isr & (IRQ_RX | IRQ_RX_ERROR) && !KS8842_USE_DMA(adapter))
762 ks8842_handle_rx(netdev, adapter);
764 /* should only happen when in PIO mode */
766 ks8842_handle_tx(netdev, adapter);
768 if (isr & IRQ_RX_OVERRUN)
769 ks8842_handle_rx_overrun(netdev, adapter);
771 if (isr & IRQ_TX_STOPPED) {
772 ks8842_disable_tx(adapter);
773 ks8842_enable_tx(adapter);
776 if (isr & IRQ_RX_STOPPED) {
777 ks8842_disable_rx(adapter);
778 ks8842_enable_rx(adapter);
781 /* re-enable interrupts, put back the bank selection register */
782 spin_lock_irqsave(&adapter->lock, flags);
783 if (KS8842_USE_DMA(adapter))
784 ks8842_write16(adapter, 18, ENABLED_IRQS_DMA, REG_IER);
786 ks8842_write16(adapter, 18, ENABLED_IRQS, REG_IER);
787 iowrite16(entry_bank, adapter->hw_addr + REG_SELECT_BANK);
789 /* Make sure timberdale continues DMA operations, they are stopped while
790 we are handling the ks8842 because we might change bank */
791 if (KS8842_USE_DMA(adapter))
792 ks8842_resume_dma(adapter);
794 spin_unlock_irqrestore(&adapter->lock, flags);
797 static irqreturn_t ks8842_irq(int irq, void *devid)
799 struct net_device *netdev = devid;
800 struct ks8842_adapter *adapter = netdev_priv(netdev);
802 u16 entry_bank = ioread16(adapter->hw_addr + REG_SELECT_BANK);
803 irqreturn_t ret = IRQ_NONE;
805 isr = ks8842_read16(adapter, 18, REG_ISR);
806 netdev_dbg(netdev, "%s - ISR: 0x%x\n", __func__, isr);
809 if (KS8842_USE_DMA(adapter))
810 /* disable all but RX IRQ, since the FPGA relies on it*/
811 ks8842_write16(adapter, 18, IRQ_RX, REG_IER);
814 ks8842_write16(adapter, 18, 0x00, REG_IER);
816 /* schedule tasklet */
817 tasklet_schedule(&adapter->tasklet);
822 iowrite16(entry_bank, adapter->hw_addr + REG_SELECT_BANK);
824 /* After an interrupt, tell timberdale to continue DMA operations.
825 DMA is disabled while we are handling the ks8842 because we might
827 ks8842_resume_dma(adapter);
832 static void ks8842_dma_rx_cb(void *data)
834 struct net_device *netdev = data;
835 struct ks8842_adapter *adapter = netdev_priv(netdev);
837 netdev_dbg(netdev, "RX DMA finished\n");
838 /* schedule tasklet */
839 if (adapter->dma_rx.adesc)
840 tasklet_schedule(&adapter->dma_rx.tasklet);
843 static void ks8842_dma_tx_cb(void *data)
845 struct net_device *netdev = data;
846 struct ks8842_adapter *adapter = netdev_priv(netdev);
847 struct ks8842_tx_dma_ctl *ctl = &adapter->dma_tx;
849 netdev_dbg(netdev, "TX DMA finished\n");
854 netdev->stats.tx_packets++;
857 if (netif_queue_stopped(netdev))
858 netif_wake_queue(netdev);
861 static void ks8842_stop_dma(struct ks8842_adapter *adapter)
863 struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;
864 struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;
866 tx_ctl->adesc = NULL;
868 dmaengine_terminate_all(tx_ctl->chan);
870 rx_ctl->adesc = NULL;
872 dmaengine_terminate_all(rx_ctl->chan);
874 if (sg_dma_address(&rx_ctl->sg))
875 dma_unmap_single(adapter->dev, sg_dma_address(&rx_ctl->sg),
876 DMA_BUFFER_SIZE, DMA_FROM_DEVICE);
877 sg_dma_address(&rx_ctl->sg) = 0;
879 dev_kfree_skb(rx_ctl->skb);
883 static void ks8842_dealloc_dma_bufs(struct ks8842_adapter *adapter)
885 struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;
886 struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;
888 ks8842_stop_dma(adapter);
891 dma_release_channel(tx_ctl->chan);
895 dma_release_channel(rx_ctl->chan);
898 tasklet_kill(&rx_ctl->tasklet);
900 if (sg_dma_address(&tx_ctl->sg))
901 dma_unmap_single(adapter->dev, sg_dma_address(&tx_ctl->sg),
902 DMA_BUFFER_SIZE, DMA_TO_DEVICE);
903 sg_dma_address(&tx_ctl->sg) = 0;
909 static bool ks8842_dma_filter_fn(struct dma_chan *chan, void *filter_param)
911 return chan->chan_id == (long)filter_param;
914 static int ks8842_alloc_dma_bufs(struct net_device *netdev)
916 struct ks8842_adapter *adapter = netdev_priv(netdev);
917 struct ks8842_tx_dma_ctl *tx_ctl = &adapter->dma_tx;
918 struct ks8842_rx_dma_ctl *rx_ctl = &adapter->dma_rx;
924 dma_cap_set(DMA_SLAVE, mask);
925 dma_cap_set(DMA_PRIVATE, mask);
927 sg_init_table(&tx_ctl->sg, 1);
929 tx_ctl->chan = dma_request_channel(mask, ks8842_dma_filter_fn,
930 (void *)(long)tx_ctl->channel);
936 /* allocate DMA buffer */
937 tx_ctl->buf = kmalloc(DMA_BUFFER_SIZE, GFP_KERNEL);
943 sg_dma_address(&tx_ctl->sg) = dma_map_single(adapter->dev,
944 tx_ctl->buf, DMA_BUFFER_SIZE, DMA_TO_DEVICE);
945 if (dma_mapping_error(adapter->dev, sg_dma_address(&tx_ctl->sg))) {
947 sg_dma_address(&tx_ctl->sg) = 0;
951 rx_ctl->chan = dma_request_channel(mask, ks8842_dma_filter_fn,
952 (void *)(long)rx_ctl->channel);
958 tasklet_init(&rx_ctl->tasklet, ks8842_rx_frame_dma_tasklet,
959 (unsigned long)netdev);
963 ks8842_dealloc_dma_bufs(adapter);
967 /* Netdevice operations */
969 static int ks8842_open(struct net_device *netdev)
971 struct ks8842_adapter *adapter = netdev_priv(netdev);
974 netdev_dbg(netdev, "%s - entry\n", __func__);
976 if (KS8842_USE_DMA(adapter)) {
977 err = ks8842_alloc_dma_bufs(netdev);
981 err = __ks8842_start_new_rx_dma(netdev);
983 ks8842_dealloc_dma_bufs(adapter);
987 printk(KERN_WARNING DRV_NAME
988 ": Failed to initiate DMA, running PIO\n");
989 ks8842_dealloc_dma_bufs(adapter);
990 adapter->dma_rx.channel = -1;
991 adapter->dma_tx.channel = -1;
996 ks8842_reset_hw(adapter);
998 ks8842_write_mac_addr(adapter, netdev->dev_addr);
1000 ks8842_update_link_status(netdev, adapter);
1002 err = request_irq(adapter->irq, ks8842_irq, IRQF_SHARED, DRV_NAME,
1005 pr_err("Failed to request IRQ: %d: %d\n", adapter->irq, err);
1012 static int ks8842_close(struct net_device *netdev)
1014 struct ks8842_adapter *adapter = netdev_priv(netdev);
1016 netdev_dbg(netdev, "%s - entry\n", __func__);
1018 cancel_work_sync(&adapter->timeout_work);
1020 if (KS8842_USE_DMA(adapter))
1021 ks8842_dealloc_dma_bufs(adapter);
1024 free_irq(adapter->irq, netdev);
1026 /* disable the switch */
1027 ks8842_write16(adapter, 32, 0x0, REG_SW_ID_AND_ENABLE);
1032 static netdev_tx_t ks8842_xmit_frame(struct sk_buff *skb,
1033 struct net_device *netdev)
1036 struct ks8842_adapter *adapter = netdev_priv(netdev);
1038 netdev_dbg(netdev, "%s: entry\n", __func__);
1040 if (KS8842_USE_DMA(adapter)) {
1041 unsigned long flags;
1042 ret = ks8842_tx_frame_dma(skb, netdev);
1043 /* for now only allow one transfer at the time */
1044 spin_lock_irqsave(&adapter->lock, flags);
1045 if (adapter->dma_tx.adesc)
1046 netif_stop_queue(netdev);
1047 spin_unlock_irqrestore(&adapter->lock, flags);
1051 ret = ks8842_tx_frame(skb, netdev);
1053 if (ks8842_tx_fifo_space(adapter) < netdev->mtu + 8)
1054 netif_stop_queue(netdev);
1059 static int ks8842_set_mac(struct net_device *netdev, void *p)
1061 struct ks8842_adapter *adapter = netdev_priv(netdev);
1062 struct sockaddr *addr = p;
1063 char *mac = (u8 *)addr->sa_data;
1065 netdev_dbg(netdev, "%s: entry\n", __func__);
1067 if (!is_valid_ether_addr(addr->sa_data))
1068 return -EADDRNOTAVAIL;
1070 memcpy(netdev->dev_addr, mac, netdev->addr_len);
1072 ks8842_write_mac_addr(adapter, mac);
1076 static void ks8842_tx_timeout_work(struct work_struct *work)
1078 struct ks8842_adapter *adapter =
1079 container_of(work, struct ks8842_adapter, timeout_work);
1080 struct net_device *netdev = adapter->netdev;
1081 unsigned long flags;
1083 netdev_dbg(netdev, "%s: entry\n", __func__);
1085 spin_lock_irqsave(&adapter->lock, flags);
1087 if (KS8842_USE_DMA(adapter))
1088 ks8842_stop_dma(adapter);
1090 /* disable interrupts */
1091 ks8842_write16(adapter, 18, 0, REG_IER);
1092 ks8842_write16(adapter, 18, 0xFFFF, REG_ISR);
1094 netif_stop_queue(netdev);
1096 spin_unlock_irqrestore(&adapter->lock, flags);
1098 ks8842_reset_hw(adapter);
1100 ks8842_write_mac_addr(adapter, netdev->dev_addr);
1102 ks8842_update_link_status(netdev, adapter);
1104 if (KS8842_USE_DMA(adapter))
1105 __ks8842_start_new_rx_dma(netdev);
1108 static void ks8842_tx_timeout(struct net_device *netdev)
1110 struct ks8842_adapter *adapter = netdev_priv(netdev);
1112 netdev_dbg(netdev, "%s: entry\n", __func__);
1114 schedule_work(&adapter->timeout_work);
1117 static const struct net_device_ops ks8842_netdev_ops = {
1118 .ndo_open = ks8842_open,
1119 .ndo_stop = ks8842_close,
1120 .ndo_start_xmit = ks8842_xmit_frame,
1121 .ndo_set_mac_address = ks8842_set_mac,
1122 .ndo_tx_timeout = ks8842_tx_timeout,
1123 .ndo_validate_addr = eth_validate_addr
1126 static const struct ethtool_ops ks8842_ethtool_ops = {
1127 .get_link = ethtool_op_get_link,
1130 static int ks8842_probe(struct platform_device *pdev)
1133 struct resource *iomem;
1134 struct net_device *netdev;
1135 struct ks8842_adapter *adapter;
1136 struct ks8842_platform_data *pdata = dev_get_platdata(&pdev->dev);
1140 iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1141 if (!request_mem_region(iomem->start, resource_size(iomem), DRV_NAME))
1142 goto err_mem_region;
1144 netdev = alloc_etherdev(sizeof(struct ks8842_adapter));
1146 goto err_alloc_etherdev;
1148 SET_NETDEV_DEV(netdev, &pdev->dev);
1150 adapter = netdev_priv(netdev);
1151 adapter->netdev = netdev;
1152 INIT_WORK(&adapter->timeout_work, ks8842_tx_timeout_work);
1153 adapter->hw_addr = ioremap(iomem->start, resource_size(iomem));
1154 adapter->conf_flags = iomem->flags;
1156 if (!adapter->hw_addr)
1159 adapter->irq = platform_get_irq(pdev, 0);
1160 if (adapter->irq < 0) {
1165 adapter->dev = (pdev->dev.parent) ? pdev->dev.parent : &pdev->dev;
1167 /* DMA is only supported when accessed via timberdale */
1168 if (!(adapter->conf_flags & MICREL_KS884X) && pdata &&
1169 (pdata->tx_dma_channel != -1) &&
1170 (pdata->rx_dma_channel != -1)) {
1171 adapter->dma_rx.channel = pdata->rx_dma_channel;
1172 adapter->dma_tx.channel = pdata->tx_dma_channel;
1174 adapter->dma_rx.channel = -1;
1175 adapter->dma_tx.channel = -1;
1178 tasklet_init(&adapter->tasklet, ks8842_tasklet, (unsigned long)netdev);
1179 spin_lock_init(&adapter->lock);
1181 netdev->netdev_ops = &ks8842_netdev_ops;
1182 netdev->ethtool_ops = &ks8842_ethtool_ops;
1184 /* Check if a mac address was given */
1185 i = netdev->addr_len;
1187 for (i = 0; i < netdev->addr_len; i++)
1188 if (pdata->macaddr[i] != 0)
1191 if (i < netdev->addr_len)
1192 /* an address was passed, use it */
1193 memcpy(netdev->dev_addr, pdata->macaddr,
1197 if (i == netdev->addr_len) {
1198 ks8842_read_mac_addr(adapter, netdev->dev_addr);
1200 if (!is_valid_ether_addr(netdev->dev_addr))
1201 eth_hw_addr_random(netdev);
1204 id = ks8842_read16(adapter, 32, REG_SW_ID_AND_ENABLE);
1206 strcpy(netdev->name, "eth%d");
1207 err = register_netdev(netdev);
1211 platform_set_drvdata(pdev, netdev);
1213 pr_info("Found chip, family: 0x%x, id: 0x%x, rev: 0x%x\n",
1214 (id >> 8) & 0xff, (id >> 4) & 0xf, (id >> 1) & 0x7);
1220 iounmap(adapter->hw_addr);
1222 free_netdev(netdev);
1224 release_mem_region(iomem->start, resource_size(iomem));
1229 static int ks8842_remove(struct platform_device *pdev)
1231 struct net_device *netdev = platform_get_drvdata(pdev);
1232 struct ks8842_adapter *adapter = netdev_priv(netdev);
1233 struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1235 unregister_netdev(netdev);
1236 tasklet_kill(&adapter->tasklet);
1237 iounmap(adapter->hw_addr);
1238 free_netdev(netdev);
1239 release_mem_region(iomem->start, resource_size(iomem));
1244 static struct platform_driver ks8842_platform_driver = {
1248 .probe = ks8842_probe,
1249 .remove = ks8842_remove,
1252 module_platform_driver(ks8842_platform_driver);
1254 MODULE_DESCRIPTION("Timberdale KS8842 ethernet driver");
1255 MODULE_AUTHOR("Mocean Laboratories <info@mocean-labs.com>");
1256 MODULE_LICENSE("GPL v2");
1257 MODULE_ALIAS("platform:ks8842");