1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38static const char version1[] =
39"ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)\n";
40static const char version2[] =
41"Last modified Nov 1, 2000 by Paul Gortmaker\n";
42
43
44#include <linux/module.h>
45#include <linux/kernel.h>
46#include <linux/errno.h>
47#include <linux/isapnp.h>
48#include <linux/init.h>
49#include <linux/interrupt.h>
50#include <linux/delay.h>
51#include <linux/netdevice.h>
52#include <linux/etherdevice.h>
53#include <linux/jiffies.h>
54#include <linux/platform_device.h>
55
56#include <asm/io.h>
57
58#include "8390.h"
59
60#define DRV_NAME "ne"
61
62
63
64
65#define SUPPORT_NE_BAD_CLONES
66
67#define BAD 0xbad
68
69#define MAX_NE_CARDS 4
70static struct platform_device *pdev_ne[MAX_NE_CARDS];
71static int io[MAX_NE_CARDS];
72static int irq[MAX_NE_CARDS];
73static int bad[MAX_NE_CARDS];
74static u32 ne_msg_enable;
75
76#ifdef MODULE
77module_param_array(io, int, NULL, 0);
78module_param_array(irq, int, NULL, 0);
79module_param_array(bad, int, NULL, 0);
80module_param_named(msg_enable, ne_msg_enable, uint, (S_IRUSR|S_IRGRP|S_IROTH));
81MODULE_PARM_DESC(io, "I/O base address(es),required");
82MODULE_PARM_DESC(irq, "IRQ number(s)");
83MODULE_PARM_DESC(bad, "Accept card(s) with bad signatures");
84MODULE_PARM_DESC(msg_enable, "Debug message level (see linux/netdevice.h for bitmap)");
85MODULE_DESCRIPTION("NE1000/NE2000 ISA/PnP Ethernet driver");
86MODULE_LICENSE("GPL");
87#endif
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102#if !defined(MODULE) && (defined(CONFIG_ISA) || defined(CONFIG_M32R))
103
104#define NEEDS_PORTLIST
105#endif
106
107
108#ifdef NEEDS_PORTLIST
109static unsigned int netcard_portlist[] __initdata = {
110 0x300, 0x280, 0x320, 0x340, 0x360, 0x380, 0
111};
112#endif
113
114static struct isapnp_device_id isapnp_clone_list[] __initdata = {
115 { ISAPNP_CARD_ID('A','X','E',0x2011),
116 ISAPNP_VENDOR('A','X','E'), ISAPNP_FUNCTION(0x2011),
117 (long) "NetGear EA201" },
118 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
119 ISAPNP_VENDOR('E','D','I'), ISAPNP_FUNCTION(0x0216),
120 (long) "NN NE2000" },
121 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
122 ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0x80d6),
123 (long) "Generic PNP" },
124 { }
125};
126
127MODULE_DEVICE_TABLE(isapnp, isapnp_clone_list);
128
129#ifdef SUPPORT_NE_BAD_CLONES
130
131static struct { const char *name8, *name16; unsigned char SAprefix[4];}
132bad_clone_list[] __initdata = {
133 {"DE100", "DE200", {0x00, 0xDE, 0x01,}},
134 {"DE120", "DE220", {0x00, 0x80, 0xc8,}},
135 {"DFI1000", "DFI2000", {'D', 'F', 'I',}},
136 {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}},
137 {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}},
138 {"NN1000", "NN2000", {0x08, 0x03, 0x08}},
139 {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}},
140 {"Con-Intl_8", "Con-Intl_16", {0x00, 0x00, 0x24}},
141 {"ET-100","ET-200", {0x00, 0x45, 0x54}},
142 {"COMPEX","COMPEX16",{0x00,0x80,0x48}},
143 {"E-LAN100", "E-LAN200", {0x00, 0x00, 0x5d}},
144 {"PCM-4823", "PCM-4823", {0x00, 0xc0, 0x6c}},
145 {"REALTEK", "RTL8019", {0x00, 0x00, 0xe8}},
146#ifdef CONFIG_MACH_TX49XX
147 {"RBHMA4X00-RTL8019", "RBHMA4X00-RTL8019", {0x00, 0x60, 0x0a}},
148#endif
149 {"LCS-8834", "LCS-8836", {0x04, 0x04, 0x37}},
150 {NULL,}
151};
152#endif
153
154
155
156#define NE_BASE (dev->base_addr)
157#define NE_CMD 0x00
158#define NE_DATAPORT 0x10
159#define NE_RESET 0x1f
160#define NE_IO_EXTENT 0x20
161
162#define NE1SM_START_PG 0x20
163#define NE1SM_STOP_PG 0x40
164#define NESM_START_PG 0x40
165#define NESM_STOP_PG 0x80
166
167#if defined(CONFIG_PLAT_MAPPI)
168# define DCR_VAL 0x4b
169#elif defined(CONFIG_PLAT_OAKS32R) || \
170 defined(CONFIG_MACH_TX49XX)
171# define DCR_VAL 0x48
172#elif defined(CONFIG_ATARI)
173# define DCR_VAL (MACH_IS_ATARI ? 0x48 : 0x49)
174#else
175# define DCR_VAL 0x49
176#endif
177
178static int ne_probe1(struct net_device *dev, unsigned long ioaddr);
179static int ne_probe_isapnp(struct net_device *dev);
180
181static void ne_reset_8390(struct net_device *dev);
182static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
183 int ring_page);
184static void ne_block_input(struct net_device *dev, int count,
185 struct sk_buff *skb, int ring_offset);
186static void ne_block_output(struct net_device *dev, const int count,
187 const unsigned char *buf, const int start_page);
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211static int __init do_ne_probe(struct net_device *dev)
212{
213 unsigned long base_addr = dev->base_addr;
214#ifdef NEEDS_PORTLIST
215 int orig_irq = dev->irq;
216#endif
217
218
219 if (base_addr > 0x1ff) {
220 int ret = ne_probe1(dev, base_addr);
221 if (ret)
222 netdev_warn(dev, "ne.c: No NE*000 card found at "
223 "i/o = %#lx\n", base_addr);
224 return ret;
225 }
226 else if (base_addr != 0)
227 return -ENXIO;
228
229
230 if (isapnp_present() && (ne_probe_isapnp(dev) == 0))
231 return 0;
232
233#ifdef NEEDS_PORTLIST
234
235 for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
236 int ioaddr = netcard_portlist[base_addr];
237 dev->irq = orig_irq;
238 if (ne_probe1(dev, ioaddr) == 0)
239 return 0;
240 }
241#endif
242
243 return -ENODEV;
244}
245
246static int __init ne_probe_isapnp(struct net_device *dev)
247{
248 int i;
249
250 for (i = 0; isapnp_clone_list[i].vendor != 0; i++) {
251 struct pnp_dev *idev = NULL;
252
253 while ((idev = pnp_find_dev(NULL,
254 isapnp_clone_list[i].vendor,
255 isapnp_clone_list[i].function,
256 idev))) {
257
258 if (pnp_device_attach(idev) < 0)
259 continue;
260 if (pnp_activate_dev(idev) < 0) {
261 pnp_device_detach(idev);
262 continue;
263 }
264
265 if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0)) {
266 pnp_device_detach(idev);
267 continue;
268 }
269
270 dev->base_addr = pnp_port_start(idev, 0);
271 dev->irq = pnp_irq(idev, 0);
272 netdev_info(dev,
273 "ne.c: ISAPnP reports %s at i/o %#lx, irq %d.\n",
274 (char *) isapnp_clone_list[i].driver_data,
275 dev->base_addr, dev->irq);
276 if (ne_probe1(dev, dev->base_addr) != 0) {
277 netdev_err(dev,
278 "ne.c: Probe of ISAPnP card at %#lx failed.\n",
279 dev->base_addr);
280 pnp_device_detach(idev);
281 return -ENXIO;
282 }
283 ei_status.priv = (unsigned long)idev;
284 break;
285 }
286 if (!idev)
287 continue;
288 return 0;
289 }
290
291 return -ENODEV;
292}
293
294static int __init ne_probe1(struct net_device *dev, unsigned long ioaddr)
295{
296 int i;
297 unsigned char SA_prom[32];
298 int wordlength = 2;
299 const char *name = NULL;
300 int start_page, stop_page;
301 int neX000, ctron, copam, bad_card;
302 int reg0, ret;
303 static unsigned version_printed;
304 struct ei_device *ei_local = netdev_priv(dev);
305
306 if (!request_region(ioaddr, NE_IO_EXTENT, DRV_NAME))
307 return -EBUSY;
308
309 reg0 = inb_p(ioaddr);
310 if (reg0 == 0xFF) {
311 ret = -ENODEV;
312 goto err_out;
313 }
314
315
316 {
317 int regd;
318 outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
319 regd = inb_p(ioaddr + 0x0d);
320 outb_p(0xff, ioaddr + 0x0d);
321 outb_p(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
322 inb_p(ioaddr + EN0_COUNTER0);
323 if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
324 outb_p(reg0, ioaddr);
325 outb_p(regd, ioaddr + 0x0d);
326 ret = -ENODEV;
327 goto err_out;
328 }
329 }
330
331 if ((ne_msg_enable & NETIF_MSG_DRV) && (version_printed++ == 0))
332 netdev_info(dev, "%s%s", version1, version2);
333
334 netdev_info(dev, "NE*000 ethercard probe at %#3lx:", ioaddr);
335
336
337
338
339
340
341
342 bad_card = ((dev->base_addr != 0) && (dev->mem_end == BAD));
343
344
345
346 {
347 unsigned long reset_start_time = jiffies;
348
349
350 outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
351
352 while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
353 if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
354 if (bad_card) {
355 pr_cont(" (warning: no reset ack)");
356 break;
357 } else {
358 pr_cont(" not found (no reset ack).\n");
359 ret = -ENODEV;
360 goto err_out;
361 }
362 }
363
364 outb_p(0xff, ioaddr + EN0_ISR);
365 }
366
367
368
369
370
371 {
372 struct {unsigned char value, offset; } program_seq[] =
373 {
374 {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD},
375 {0x48, EN0_DCFG},
376 {0x00, EN0_RCNTLO},
377 {0x00, EN0_RCNTHI},
378 {0x00, EN0_IMR},
379 {0xFF, EN0_ISR},
380 {E8390_RXOFF, EN0_RXCR},
381 {E8390_TXOFF, EN0_TXCR},
382 {32, EN0_RCNTLO},
383 {0x00, EN0_RCNTHI},
384 {0x00, EN0_RSARLO},
385 {0x00, EN0_RSARHI},
386 {E8390_RREAD+E8390_START, E8390_CMD},
387 };
388
389 for (i = 0; i < ARRAY_SIZE(program_seq); i++)
390 outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
391
392 }
393 for(i = 0; i < 32 ; i+=2) {
394 SA_prom[i] = inb(ioaddr + NE_DATAPORT);
395 SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
396 if (SA_prom[i] != SA_prom[i+1])
397 wordlength = 1;
398 }
399
400 if (wordlength == 2)
401 {
402 for (i = 0; i < 16; i++)
403 SA_prom[i] = SA_prom[i+i];
404
405 outb_p(DCR_VAL, ioaddr + EN0_DCFG);
406 start_page = NESM_START_PG;
407
408
409
410
411
412
413
414 if ((DCR_VAL & 0x01) == 0 &&
415 inb(ioaddr + EN0_RCNTLO) == 0x50 &&
416 inb(ioaddr + EN0_RCNTHI) == 0x70)
417 stop_page = 0x60;
418 else
419 stop_page = NESM_STOP_PG;
420 } else {
421 start_page = NE1SM_START_PG;
422 stop_page = NE1SM_STOP_PG;
423 }
424
425#if defined(CONFIG_PLAT_MAPPI) || defined(CONFIG_PLAT_OAKS32R)
426 neX000 = ((SA_prom[14] == 0x57 && SA_prom[15] == 0x57)
427 || (SA_prom[14] == 0x42 && SA_prom[15] == 0x42));
428#else
429 neX000 = (SA_prom[14] == 0x57 && SA_prom[15] == 0x57);
430#endif
431 ctron = (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
432 copam = (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);
433
434
435 if (neX000 || bad_card || copam) {
436 name = (wordlength == 2) ? "NE2000" : "NE1000";
437 }
438 else if (ctron)
439 {
440 name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";
441 start_page = 0x01;
442 stop_page = (wordlength == 2) ? 0x40 : 0x20;
443 }
444 else
445 {
446#ifdef SUPPORT_NE_BAD_CLONES
447
448
449 for (i = 0; bad_clone_list[i].name8; i++)
450 {
451 if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
452 SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
453 SA_prom[2] == bad_clone_list[i].SAprefix[2])
454 {
455 if (wordlength == 2)
456 {
457 name = bad_clone_list[i].name16;
458 } else {
459 name = bad_clone_list[i].name8;
460 }
461 break;
462 }
463 }
464 if (bad_clone_list[i].name8 == NULL)
465 {
466 pr_cont(" not found (invalid signature %2.2x %2.2x).\n",
467 SA_prom[14], SA_prom[15]);
468 ret = -ENXIO;
469 goto err_out;
470 }
471#else
472 pr_cont(" not found.\n");
473 ret = -ENXIO;
474 goto err_out;
475#endif
476 }
477
478 if (dev->irq < 2)
479 {
480 unsigned long cookie = probe_irq_on();
481 outb_p(0x50, ioaddr + EN0_IMR);
482 outb_p(0x00, ioaddr + EN0_RCNTLO);
483 outb_p(0x00, ioaddr + EN0_RCNTHI);
484 outb_p(E8390_RREAD+E8390_START, ioaddr);
485 mdelay(10);
486 outb_p(0x00, ioaddr + EN0_IMR);
487 dev->irq = probe_irq_off(cookie);
488 if (netif_msg_probe(ei_local))
489 pr_cont(" autoirq is %d", dev->irq);
490 } else if (dev->irq == 2)
491
492
493 dev->irq = 9;
494
495 if (! dev->irq) {
496 pr_cont(" failed to detect IRQ line.\n");
497 ret = -EAGAIN;
498 goto err_out;
499 }
500
501
502
503 ret = request_irq(dev->irq, eip_interrupt, 0, name, dev);
504 if (ret) {
505 pr_cont(" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);
506 goto err_out;
507 }
508
509 dev->base_addr = ioaddr;
510
511#ifdef CONFIG_PLAT_MAPPI
512 outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP,
513 ioaddr + E8390_CMD);
514 for (i = 0; i < ETH_ALEN; i++) {
515 dev->dev_addr[i] = SA_prom[i]
516 = inb_p(ioaddr + EN1_PHYS_SHIFT(i));
517 }
518#else
519 for (i = 0; i < ETH_ALEN; i++) {
520 dev->dev_addr[i] = SA_prom[i];
521 }
522#endif
523
524 pr_cont("%pM\n", dev->dev_addr);
525
526 ei_status.name = name;
527 ei_status.tx_start_page = start_page;
528 ei_status.stop_page = stop_page;
529
530
531 ei_status.word16 = (wordlength == 2 && (DCR_VAL & 0x01));
532
533 ei_status.rx_start_page = start_page + TX_PAGES;
534#ifdef PACKETBUF_MEMSIZE
535
536 ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
537#endif
538
539 ei_status.reset_8390 = &ne_reset_8390;
540 ei_status.block_input = &ne_block_input;
541 ei_status.block_output = &ne_block_output;
542 ei_status.get_8390_hdr = &ne_get_8390_hdr;
543 ei_status.priv = 0;
544
545 dev->netdev_ops = &eip_netdev_ops;
546 NS8390p_init(dev, 0);
547
548 ei_local->msg_enable = ne_msg_enable;
549 ret = register_netdev(dev);
550 if (ret)
551 goto out_irq;
552 netdev_info(dev, "%s found at %#lx, using IRQ %d.\n",
553 name, ioaddr, dev->irq);
554 return 0;
555
556out_irq:
557 free_irq(dev->irq, dev);
558err_out:
559 release_region(ioaddr, NE_IO_EXTENT);
560 return ret;
561}
562
563
564
565
566static void ne_reset_8390(struct net_device *dev)
567{
568 unsigned long reset_start_time = jiffies;
569 struct ei_device *ei_local = netdev_priv(dev);
570
571 netif_dbg(ei_local, hw, dev, "resetting the 8390 t=%ld...\n", jiffies);
572
573
574 outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
575
576 ei_status.txing = 0;
577 ei_status.dmaing = 0;
578
579
580 while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
581 if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
582 netdev_err(dev, "ne_reset_8390() did not complete.\n");
583 break;
584 }
585 outb_p(ENISR_RESET, NE_BASE + EN0_ISR);
586}
587
588
589
590
591
592static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
593{
594 int nic_base = dev->base_addr;
595
596
597
598 if (ei_status.dmaing)
599 {
600 netdev_err(dev, "DMAing conflict in ne_get_8390_hdr "
601 "[DMAstat:%d][irqlock:%d].\n",
602 ei_status.dmaing, ei_status.irqlock);
603 return;
604 }
605
606 ei_status.dmaing |= 0x01;
607 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
608 outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
609 outb_p(0, nic_base + EN0_RCNTHI);
610 outb_p(0, nic_base + EN0_RSARLO);
611 outb_p(ring_page, nic_base + EN0_RSARHI);
612 outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
613
614 if (ei_status.word16)
615 insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
616 else
617 insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
618
619 outb_p(ENISR_RDC, nic_base + EN0_ISR);
620 ei_status.dmaing &= ~0x01;
621
622 le16_to_cpus(&hdr->count);
623}
624
625
626
627
628
629
630static void ne_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
631{
632#ifdef NE_SANITY_CHECK
633 int xfer_count = count;
634 struct ei_device *ei_local = netdev_priv(dev);
635#endif
636 int nic_base = dev->base_addr;
637 char *buf = skb->data;
638
639
640 if (ei_status.dmaing)
641 {
642 netdev_err(dev, "DMAing conflict in ne_block_input "
643 "[DMAstat:%d][irqlock:%d].\n",
644 ei_status.dmaing, ei_status.irqlock);
645 return;
646 }
647 ei_status.dmaing |= 0x01;
648 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
649 outb_p(count & 0xff, nic_base + EN0_RCNTLO);
650 outb_p(count >> 8, nic_base + EN0_RCNTHI);
651 outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
652 outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
653 outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
654 if (ei_status.word16)
655 {
656 insw(NE_BASE + NE_DATAPORT,buf,count>>1);
657 if (count & 0x01)
658 {
659 buf[count-1] = inb(NE_BASE + NE_DATAPORT);
660#ifdef NE_SANITY_CHECK
661 xfer_count++;
662#endif
663 }
664 } else {
665 insb(NE_BASE + NE_DATAPORT, buf, count);
666 }
667
668#ifdef NE_SANITY_CHECK
669
670
671
672
673
674 if (netif_msg_rx_status(ei_local))
675 {
676
677 int addr, tries = 20;
678 do {
679
680
681 int high = inb_p(nic_base + EN0_RSARHI);
682 int low = inb_p(nic_base + EN0_RSARLO);
683 addr = (high << 8) + low;
684 if (((ring_offset + xfer_count) & 0xff) == low)
685 break;
686 } while (--tries > 0);
687 if (tries <= 0)
688 netdev_warn(dev, "RX transfer address mismatch,"
689 "%#4.4x (expected) vs. %#4.4x (actual).\n",
690 ring_offset + xfer_count, addr);
691 }
692#endif
693 outb_p(ENISR_RDC, nic_base + EN0_ISR);
694 ei_status.dmaing &= ~0x01;
695}
696
697static void ne_block_output(struct net_device *dev, int count,
698 const unsigned char *buf, const int start_page)
699{
700 int nic_base = NE_BASE;
701 unsigned long dma_start;
702#ifdef NE_SANITY_CHECK
703 int retries = 0;
704 struct ei_device *ei_local = netdev_priv(dev);
705#endif
706
707
708
709
710
711 if (ei_status.word16 && (count & 0x01))
712 count++;
713
714
715 if (ei_status.dmaing)
716 {
717 netdev_err(dev, "DMAing conflict in ne_block_output."
718 "[DMAstat:%d][irqlock:%d]\n",
719 ei_status.dmaing, ei_status.irqlock);
720 return;
721 }
722 ei_status.dmaing |= 0x01;
723
724 outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
725
726#ifdef NE_SANITY_CHECK
727retry:
728#endif
729
730#ifdef NE8390_RW_BUGFIX
731
732
733
734
735
736 outb_p(0x42, nic_base + EN0_RCNTLO);
737 outb_p(0x00, nic_base + EN0_RCNTHI);
738 outb_p(0x42, nic_base + EN0_RSARLO);
739 outb_p(0x00, nic_base + EN0_RSARHI);
740 outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
741
742 udelay(6);
743#endif
744
745 outb_p(ENISR_RDC, nic_base + EN0_ISR);
746
747
748 outb_p(count & 0xff, nic_base + EN0_RCNTLO);
749 outb_p(count >> 8, nic_base + EN0_RCNTHI);
750 outb_p(0x00, nic_base + EN0_RSARLO);
751 outb_p(start_page, nic_base + EN0_RSARHI);
752
753 outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
754 if (ei_status.word16) {
755 outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
756 } else {
757 outsb(NE_BASE + NE_DATAPORT, buf, count);
758 }
759
760 dma_start = jiffies;
761
762#ifdef NE_SANITY_CHECK
763
764
765
766 if (netif_msg_tx_queued(ei_local))
767 {
768
769 int addr, tries = 20;
770 do {
771 int high = inb_p(nic_base + EN0_RSARHI);
772 int low = inb_p(nic_base + EN0_RSARLO);
773 addr = (high << 8) + low;
774 if ((start_page << 8) + count == addr)
775 break;
776 } while (--tries > 0);
777
778 if (tries <= 0)
779 {
780 netdev_warn(dev, "Tx packet transfer address mismatch,"
781 "%#4.4x (expected) vs. %#4.4x (actual).\n",
782 (start_page << 8) + count, addr);
783 if (retries++ == 0)
784 goto retry;
785 }
786 }
787#endif
788
789 while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
790 if (time_after(jiffies, dma_start + 2*HZ/100)) {
791 netdev_warn(dev, "timeout waiting for Tx RDC.\n");
792 ne_reset_8390(dev);
793 NS8390p_init(dev, 1);
794 break;
795 }
796
797 outb_p(ENISR_RDC, nic_base + EN0_ISR);
798 ei_status.dmaing &= ~0x01;
799}
800
801static int __init ne_drv_probe(struct platform_device *pdev)
802{
803 struct net_device *dev;
804 int err, this_dev = pdev->id;
805 struct resource *res;
806
807 dev = alloc_eip_netdev();
808 if (!dev)
809 return -ENOMEM;
810
811
812
813
814
815 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
816 if (res) {
817 dev->base_addr = res->start;
818 dev->irq = platform_get_irq(pdev, 0);
819 } else {
820 if (this_dev < 0 || this_dev >= MAX_NE_CARDS) {
821 free_netdev(dev);
822 return -EINVAL;
823 }
824 dev->base_addr = io[this_dev];
825 dev->irq = irq[this_dev];
826 dev->mem_end = bad[this_dev];
827 }
828 SET_NETDEV_DEV(dev, &pdev->dev);
829 err = do_ne_probe(dev);
830 if (err) {
831 free_netdev(dev);
832 return err;
833 }
834 platform_set_drvdata(pdev, dev);
835
836
837
838
839 if (!res) {
840 io[this_dev] = dev->base_addr;
841 irq[this_dev] = dev->irq;
842 }
843 return 0;
844}
845
846static int ne_drv_remove(struct platform_device *pdev)
847{
848 struct net_device *dev = platform_get_drvdata(pdev);
849
850 if (dev) {
851 struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
852 netif_device_detach(dev);
853 unregister_netdev(dev);
854 if (idev)
855 pnp_device_detach(idev);
856
857
858
859
860 ei_status.priv = 0;
861 free_irq(dev->irq, dev);
862 release_region(dev->base_addr, NE_IO_EXTENT);
863 free_netdev(dev);
864 }
865 return 0;
866}
867
868
869static void ne_loop_rm_unreg(int all)
870{
871 int this_dev;
872 struct platform_device *pdev;
873 for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
874 pdev = pdev_ne[this_dev];
875
876 if (pdev && (!platform_get_drvdata(pdev) || all)) {
877 ne_drv_remove(pdev);
878 platform_device_unregister(pdev);
879 pdev_ne[this_dev] = NULL;
880 }
881 }
882}
883
884#ifdef CONFIG_PM
885static int ne_drv_suspend(struct platform_device *pdev, pm_message_t state)
886{
887 struct net_device *dev = platform_get_drvdata(pdev);
888
889 if (netif_running(dev)) {
890 struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
891 netif_device_detach(dev);
892 if (idev)
893 pnp_stop_dev(idev);
894 }
895 return 0;
896}
897
898static int ne_drv_resume(struct platform_device *pdev)
899{
900 struct net_device *dev = platform_get_drvdata(pdev);
901
902 if (netif_running(dev)) {
903 struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
904 if (idev)
905 pnp_start_dev(idev);
906 ne_reset_8390(dev);
907 NS8390p_init(dev, 1);
908 netif_device_attach(dev);
909 }
910 return 0;
911}
912#else
913#define ne_drv_suspend NULL
914#define ne_drv_resume NULL
915#endif
916
917static struct platform_driver ne_driver = {
918 .remove = ne_drv_remove,
919 .suspend = ne_drv_suspend,
920 .resume = ne_drv_resume,
921 .driver = {
922 .name = DRV_NAME,
923 },
924};
925
926static void __init ne_add_devices(void)
927{
928 int this_dev;
929 struct platform_device *pdev;
930
931 for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
932 if (pdev_ne[this_dev])
933 continue;
934 pdev = platform_device_register_simple(
935 DRV_NAME, this_dev, NULL, 0);
936 if (IS_ERR(pdev))
937 continue;
938 pdev_ne[this_dev] = pdev;
939 }
940}
941
942#ifdef MODULE
943int __init init_module(void)
944{
945 int retval;
946 ne_add_devices();
947 retval = platform_driver_probe(&ne_driver, ne_drv_probe);
948 if (retval) {
949 if (io[0] == 0)
950 pr_notice("ne.c: You must supply \"io=0xNNN\""
951 " value(s) for ISA cards.\n");
952 ne_loop_rm_unreg(1);
953 return retval;
954 }
955
956
957 ne_loop_rm_unreg(0);
958 return retval;
959}
960#else
961static int __init ne_init(void)
962{
963 int retval = platform_driver_probe(&ne_driver, ne_drv_probe);
964
965
966 ne_loop_rm_unreg(0);
967 return retval;
968}
969module_init(ne_init);
970
971struct net_device * __init ne_probe(int unit)
972{
973 int this_dev;
974 struct net_device *dev;
975
976
977 this_dev = 0;
978 while ((pdev_ne[this_dev] && platform_get_drvdata(pdev_ne[this_dev])) ||
979 io[this_dev]) {
980 if (++this_dev == MAX_NE_CARDS)
981 return ERR_PTR(-ENOMEM);
982 }
983
984
985 dev = alloc_eip_netdev();
986 if (!dev)
987 return ERR_PTR(-ENOMEM);
988
989 sprintf(dev->name, "eth%d", unit);
990 netdev_boot_setup_check(dev);
991
992 io[this_dev] = dev->base_addr;
993 irq[this_dev] = dev->irq;
994 bad[this_dev] = dev->mem_end;
995
996 free_netdev(dev);
997
998 ne_add_devices();
999
1000
1001 for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
1002 if (pdev_ne[this_dev]) {
1003 dev = platform_get_drvdata(pdev_ne[this_dev]);
1004 if (dev)
1005 return dev;
1006 }
1007 }
1008
1009 return ERR_PTR(-ENODEV);
1010}
1011#endif
1012
1013static void __exit ne_exit(void)
1014{
1015 platform_driver_unregister(&ne_driver);
1016 ne_loop_rm_unreg(1);
1017}
1018module_exit(ne_exit);
1019