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