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#define DRV_NAME "3c503"
37#define DRV_VERSION "1.10a"
38#define DRV_RELDATE "11/17/2001"
39
40
41static const char version[] =
42 DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Donald Becker (becker@scyld.com)\n";
43
44#include <linux/module.h>
45
46#include <linux/kernel.h>
47#include <linux/sched.h>
48#include <linux/errno.h>
49#include <linux/string.h>
50#include <linux/delay.h>
51#include <linux/netdevice.h>
52#include <linux/etherdevice.h>
53#include <linux/init.h>
54#include <linux/ethtool.h>
55
56#include <asm/uaccess.h>
57#include <asm/io.h>
58#include <asm/system.h>
59#include <asm/byteorder.h>
60
61#include "8390.h"
62#include "3c503.h"
63#define WRD_COUNT 4
64
65int el2_probe(struct net_device *dev);
66static int el2_pio_probe(struct net_device *dev);
67static int el2_probe1(struct net_device *dev, int ioaddr);
68
69
70static unsigned int netcard_portlist[] __initdata =
71 { 0x300,0x310,0x330,0x350,0x250,0x280,0x2a0,0x2e0,0};
72
73#define EL2_IO_EXTENT 16
74
75static int el2_open(struct net_device *dev);
76static int el2_close(struct net_device *dev);
77static void el2_reset_8390(struct net_device *dev);
78static void el2_init_card(struct net_device *dev);
79static void el2_block_output(struct net_device *dev, int count,
80 const unsigned char *buf, int start_page);
81static void el2_block_input(struct net_device *dev, int count, struct sk_buff *skb,
82 int ring_offset);
83static void el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
84 int ring_page);
85static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd);
86
87
88
89
90
91
92
93
94
95int __init
96el2_probe(struct net_device *dev)
97{
98 int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0};
99 int base_addr = dev->base_addr;
100
101 SET_MODULE_OWNER(dev);
102
103 if (base_addr > 0x1ff)
104 return el2_probe1(dev, base_addr);
105 else if (base_addr != 0)
106 return -ENXIO;
107
108 for (addr = addrs; *addr; addr++) {
109 int i;
110 unsigned int base_bits = isa_readb(*addr);
111
112 for(i = 7; i >= 0; i--, base_bits >>= 1)
113 if (base_bits & 0x1)
114 break;
115 if (base_bits != 1)
116 continue;
117 if (el2_probe1(dev, netcard_portlist[i]) == 0)
118 return 0;
119 }
120#if ! defined(no_probe_nonshared_memory)
121 return el2_pio_probe(dev);
122#else
123 return -ENODEV;
124#endif
125}
126
127
128
129static int __init
130el2_pio_probe(struct net_device *dev)
131{
132 int i;
133 int base_addr = dev ? dev->base_addr : 0;
134
135 if (base_addr > 0x1ff)
136 return el2_probe1(dev, base_addr);
137 else if (base_addr != 0)
138 return -ENXIO;
139
140 for (i = 0; netcard_portlist[i]; i++)
141 if (el2_probe1(dev, netcard_portlist[i]) == 0)
142 return 0;
143
144 return -ENODEV;
145}
146
147
148
149
150static int __init
151el2_probe1(struct net_device *dev, int ioaddr)
152{
153 int i, iobase_reg, membase_reg, saved_406, wordlength, retval;
154 static unsigned version_printed;
155 unsigned long vendor_id;
156
157
158 if (!request_region(ioaddr, EL2_IO_EXTENT, dev->name))
159 return -EBUSY;
160
161
162 if (inb(ioaddr + 0x408) == 0xff) {
163 mdelay(1);
164 retval = -ENODEV;
165 goto out;
166 }
167
168
169
170 iobase_reg = inb(ioaddr+0x403);
171 membase_reg = inb(ioaddr+0x404);
172
173 if ( (iobase_reg & (iobase_reg - 1))
174 || (membase_reg & (membase_reg - 1))) {
175 retval = -ENODEV;
176 goto out;
177 }
178 saved_406 = inb_p(ioaddr + 0x406);
179 outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406);
180 outb_p(ECNTRL_THIN, ioaddr + 0x406);
181
182
183 outb(ECNTRL_SAPROM|ECNTRL_THIN, ioaddr + 0x406);
184 vendor_id = inb(ioaddr)*0x10000 + inb(ioaddr + 1)*0x100 + inb(ioaddr + 2);
185 if ((vendor_id != OLD_3COM_ID) && (vendor_id != NEW_3COM_ID)) {
186
187 outb(saved_406, ioaddr + 0x406);
188 retval = -ENODEV;
189 goto out;
190 }
191
192 if (ei_debug && version_printed++ == 0)
193 printk(version);
194
195 dev->base_addr = ioaddr;
196
197 if (ethdev_init(dev)) {
198 printk ("3c503: unable to allocate memory for dev->priv.\n");
199 retval = -ENOMEM;
200 goto out;
201 }
202
203 printk("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr);
204
205
206 for (i = 0; i < 6; i++)
207 printk(" %2.2x", dev->dev_addr[i] = inb(ioaddr + i));
208
209
210 outb(ECNTRL_THIN, ioaddr + 0x406);
211
212
213 outb_p(E8390_PAGE0, ioaddr + E8390_CMD);
214 outb_p(0, ioaddr + EN0_DCFG);
215 outb_p(E8390_PAGE2, ioaddr + E8390_CMD);
216 wordlength = inb_p(ioaddr + EN0_DCFG) & ENDCFG_WTS;
217 outb_p(E8390_PAGE0, ioaddr + E8390_CMD);
218
219
220 if (ei_debug > 2) printk(" memory jumpers %2.2x ", membase_reg);
221 outb(EGACFR_NORM, ioaddr + 0x405);
222
223
224
225
226
227#if defined(EI8390_THICK) || defined(EL2_AUI)
228 ei_status.interface_num = 1;
229#else
230 ei_status.interface_num = dev->mem_end & 0xf;
231#endif
232 printk(", using %sternal xcvr.\n", ei_status.interface_num == 0 ? "in" : "ex");
233
234 if ((membase_reg & 0xf0) == 0) {
235 dev->mem_start = 0;
236 ei_status.name = "3c503-PIO";
237 } else {
238 dev->mem_start = ((membase_reg & 0xc0) ? 0xD8000 : 0xC8000) +
239 ((membase_reg & 0xA0) ? 0x4000 : 0);
240
241#define EL2_MEMSIZE (EL2_MB1_STOP_PG - EL2_MB1_START_PG)*256
242#ifdef EL2MEMTEST
243
244
245
246 {
247 unsigned long mem_base = dev->mem_start;
248 unsigned int test_val = 0xbbadf00d;
249 isa_writel(0xba5eba5e, mem_base);
250 for (i = sizeof(test_val); i < EL2_MEMSIZE; i+=sizeof(test_val)) {
251 isa_writel(test_val, mem_base + i);
252 if (isa_readl(mem_base) != 0xba5eba5e
253 || isa_readl(mem_base + i) != test_val) {
254 printk("3c503: memory failure or memory address conflict.\n");
255 dev->mem_start = 0;
256 ei_status.name = "3c503-PIO";
257 break;
258 }
259 test_val += 0x55555555;
260 isa_writel(0, mem_base + i);
261 }
262 }
263#endif
264
265 if (dev->mem_start)
266 dev->mem_end = ei_status.rmem_end = dev->mem_start + EL2_MEMSIZE;
267
268 if (wordlength) {
269 ei_status.rmem_start = dev->mem_start;
270 ei_status.name = "3c503/16";
271 } else {
272 ei_status.rmem_start = TX_PAGES*256 + dev->mem_start;
273 ei_status.name = "3c503";
274 }
275 }
276
277
278
279
280
281
282
283
284
285 if (wordlength) {
286 ei_status.tx_start_page = EL2_MB0_START_PG;
287 ei_status.rx_start_page = EL2_MB1_START_PG;
288 } else {
289 ei_status.tx_start_page = EL2_MB1_START_PG;
290 ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES;
291 }
292
293
294 ei_status.stop_page = EL2_MB1_STOP_PG;
295 ei_status.word16 = wordlength;
296 ei_status.reset_8390 = &el2_reset_8390;
297 ei_status.get_8390_hdr = &el2_get_8390_hdr;
298 ei_status.block_input = &el2_block_input;
299 ei_status.block_output = &el2_block_output;
300
301 if (dev->irq == 2)
302 dev->irq = 9;
303 else if (dev->irq > 5 && dev->irq != 9) {
304 printk("3c503: configured interrupt %d invalid, will use autoIRQ.\n",
305 dev->irq);
306 dev->irq = 0;
307 }
308
309 ei_status.saved_irq = dev->irq;
310
311 dev->open = &el2_open;
312 dev->stop = &el2_close;
313 dev->do_ioctl = &netdev_ioctl;
314
315 if (dev->mem_start)
316 printk("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n",
317 dev->name, ei_status.name, (wordlength+1)<<3,
318 dev->mem_start, dev->mem_end-1);
319
320 else
321 {
322 ei_status.tx_start_page = EL2_MB1_START_PG;
323 ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES;
324 printk("\n%s: %s, %dkB RAM, using programmed I/O (REJUMPER for SHARED MEMORY).\n",
325 dev->name, ei_status.name, (wordlength+1)<<3);
326 }
327 return 0;
328out:
329 release_region(ioaddr, EL2_IO_EXTENT);
330 return retval;
331}
332
333static int
334el2_open(struct net_device *dev)
335{
336 int retval = -EAGAIN;
337
338 if (dev->irq < 2) {
339 int irqlist[] = {5, 9, 3, 4, 0};
340 int *irqp = irqlist;
341
342 outb(EGACFR_NORM, E33G_GACFR);
343 do {
344 if (request_irq (*irqp, NULL, 0, "bogus", dev) != -EBUSY) {
345
346 unsigned long cookie = probe_irq_on();
347 outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR);
348 outb_p(0x00, E33G_IDCFR);
349 if (*irqp == probe_irq_off(cookie)
350 && ((retval = request_irq(dev->irq = *irqp,
351 ei_interrupt, 0, dev->name, dev)) == 0))
352 break;
353 }
354 } while (*++irqp);
355 if (*irqp == 0) {
356 outb(EGACFR_IRQOFF, E33G_GACFR);
357 return retval;
358 }
359 } else {
360 if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
361 return retval;
362 }
363 }
364
365 el2_init_card(dev);
366 ei_open(dev);
367 return 0;
368}
369
370static int
371el2_close(struct net_device *dev)
372{
373 free_irq(dev->irq, dev);
374 dev->irq = ei_status.saved_irq;
375 outb(EGACFR_IRQOFF, E33G_GACFR);
376
377 ei_close(dev);
378 return 0;
379}
380
381
382
383
384
385static void
386el2_reset_8390(struct net_device *dev)
387{
388 if (ei_debug > 1) {
389 printk("%s: Resetting the 3c503 board...", dev->name);
390 printk("%#lx=%#02x %#lx=%#02x %#lx=%#02x...", E33G_IDCFR, inb(E33G_IDCFR),
391 E33G_CNTRL, inb(E33G_CNTRL), E33G_GACFR, inb(E33G_GACFR));
392 }
393 outb_p(ECNTRL_RESET|ECNTRL_THIN, E33G_CNTRL);
394 ei_status.txing = 0;
395 outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
396 el2_init_card(dev);
397 if (ei_debug > 1) printk("done\n");
398}
399
400
401static void
402el2_init_card(struct net_device *dev)
403{
404
405 outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
406
407
408
409 outb(ei_status.rx_start_page, E33G_STARTPG);
410 outb(ei_status.stop_page, E33G_STOPPG);
411
412
413 outb(0xff, E33G_VP2);
414 outb(0xff, E33G_VP1);
415 outb(0x00, E33G_VP0);
416
417 outb_p(0x00, dev->base_addr + EN0_IMR);
418
419 outb(EGACFR_NORM, E33G_GACFR);
420
421
422 outb_p((0x04 << (dev->irq == 9 ? 2 : dev->irq)), E33G_IDCFR);
423 outb_p((WRD_COUNT << 1), E33G_DRQCNT);
424 outb_p(0x20, E33G_DMAAH);
425 outb_p(0x00, E33G_DMAAL);
426 return;
427}
428
429
430
431
432
433static void
434el2_block_output(struct net_device *dev, int count,
435 const unsigned char *buf, int start_page)
436{
437 unsigned short int *wrd;
438 int boguscount;
439 unsigned short word;
440
441 if (ei_status.word16)
442 outb(EGACFR_RSEL|EGACFR_TCM, E33G_GACFR);
443 else
444 outb(EGACFR_NORM, E33G_GACFR);
445
446 if (dev->mem_start) {
447 unsigned long dest_addr = dev->mem_start +
448 ((start_page - ei_status.tx_start_page) << 8);
449 isa_memcpy_toio(dest_addr, buf, count);
450 outb(EGACFR_NORM, E33G_GACFR);
451 return;
452 }
453
454
455
456
457
458
459 word = (unsigned short)start_page;
460 outb(word&0xFF, E33G_DMAAH);
461 outb(word>>8, E33G_DMAAL);
462
463 outb_p((ei_status.interface_num ? ECNTRL_AUI : ECNTRL_THIN ) | ECNTRL_OUTPUT
464 | ECNTRL_START, E33G_CNTRL);
465
466
467
468
469
470
471
472
473
474 wrd = (unsigned short int *) buf;
475 count = (count + 1) >> 1;
476 for(;;)
477 {
478 boguscount = 0x1000;
479 while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
480 {
481 if(!boguscount--)
482 {
483 printk("%s: FIFO blocked in el2_block_output.\n", dev->name);
484 el2_reset_8390(dev);
485 goto blocked;
486 }
487 }
488 if(count > WRD_COUNT)
489 {
490 outsw(E33G_FIFOH, wrd, WRD_COUNT);
491 wrd += WRD_COUNT;
492 count -= WRD_COUNT;
493 }
494 else
495 {
496 outsw(E33G_FIFOH, wrd, count);
497 break;
498 }
499 }
500 blocked:;
501 outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
502 return;
503}
504
505
506static void
507el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
508{
509 int boguscount;
510 unsigned long hdr_start = dev->mem_start + ((ring_page - EL2_MB1_START_PG)<<8);
511 unsigned short word;
512
513 if (dev->mem_start) {
514 isa_memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
515 hdr->count = le16_to_cpu(hdr->count);
516 return;
517 }
518
519
520
521
522
523 word = (unsigned short)ring_page;
524 outb(word&0xFF, E33G_DMAAH);
525 outb(word>>8, E33G_DMAAL);
526
527 outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
528 | ECNTRL_START, E33G_CNTRL);
529 boguscount = 0x1000;
530 while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
531 {
532 if(!boguscount--)
533 {
534 printk("%s: FIFO blocked in el2_get_8390_hdr.\n", dev->name);
535 memset(hdr, 0x00, sizeof(struct e8390_pkt_hdr));
536 el2_reset_8390(dev);
537 goto blocked;
538 }
539 }
540 insw(E33G_FIFOH, hdr, (sizeof(struct e8390_pkt_hdr))>> 1);
541 blocked:;
542 outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
543}
544
545
546static void
547el2_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
548{
549 int boguscount = 0;
550 unsigned short int *buf;
551 unsigned short word;
552
553 int end_of_ring = ei_status.rmem_end;
554
555
556 if (dev->mem_start) {
557 ring_offset -= (EL2_MB1_START_PG<<8);
558 if (dev->mem_start + ring_offset + count > end_of_ring) {
559
560 int semi_count = end_of_ring - (dev->mem_start + ring_offset);
561 isa_memcpy_fromio(skb->data, dev->mem_start + ring_offset, semi_count);
562 count -= semi_count;
563 isa_memcpy_fromio(skb->data + semi_count, ei_status.rmem_start, count);
564 } else {
565
566 isa_eth_io_copy_and_sum(skb, dev->mem_start + ring_offset, count, 0);
567 }
568 return;
569 }
570
571
572
573
574 word = (unsigned short) ring_offset;
575 outb(word>>8, E33G_DMAAH);
576 outb(word&0xFF, E33G_DMAAL);
577
578 outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
579 | ECNTRL_START, E33G_CNTRL);
580
581
582
583
584
585
586
587
588
589
590
591 buf = (unsigned short int *) skb->data;
592 count = (count + 1) >> 1;
593 for(;;)
594 {
595 boguscount = 0x1000;
596 while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
597 {
598 if(!boguscount--)
599 {
600 printk("%s: FIFO blocked in el2_block_input.\n", dev->name);
601 el2_reset_8390(dev);
602 goto blocked;
603 }
604 }
605 if(count > WRD_COUNT)
606 {
607 insw(E33G_FIFOH, buf, WRD_COUNT);
608 buf += WRD_COUNT;
609 count -= WRD_COUNT;
610 }
611 else
612 {
613 insw(E33G_FIFOH, buf, count);
614 break;
615 }
616 }
617 blocked:;
618 outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
619 return;
620}
621
622
623
624
625
626
627
628
629
630static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr)
631{
632 u32 ethcmd;
633
634
635
636
637 if (get_user(ethcmd, (u32 *)useraddr))
638 return -EFAULT;
639
640 switch (ethcmd) {
641
642 case ETHTOOL_GDRVINFO: {
643 struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
644 strcpy (info.driver, DRV_NAME);
645 strcpy (info.version, DRV_VERSION);
646 sprintf(info.bus_info, "ISA 0x%lx", dev->base_addr);
647 if (copy_to_user (useraddr, &info, sizeof (info)))
648 return -EFAULT;
649 return 0;
650 }
651
652 default:
653 break;
654 }
655
656 return -EOPNOTSUPP;
657}
658
659
660
661
662
663
664
665
666
667
668static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
669{
670 int rc = 0;
671
672 switch (cmd) {
673 case SIOCETHTOOL:
674 rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
675 break;
676
677 default:
678 rc = -EOPNOTSUPP;
679 break;
680 }
681
682 return rc;
683}
684
685
686#ifdef MODULE
687#define MAX_EL2_CARDS 4
688
689static struct net_device dev_el2[MAX_EL2_CARDS];
690static int io[MAX_EL2_CARDS];
691static int irq[MAX_EL2_CARDS];
692static int xcvr[MAX_EL2_CARDS];
693MODULE_PARM(io, "1-" __MODULE_STRING(MAX_EL2_CARDS) "i");
694MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_EL2_CARDS) "i");
695MODULE_PARM(xcvr, "1-" __MODULE_STRING(MAX_EL2_CARDS) "i");
696MODULE_PARM_DESC(io, "I/O base address(es)");
697MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
698MODULE_PARM_DESC(xcvr, "tranceiver(s) (0=internal, 1=external)");
699MODULE_DESCRIPTION("3Com ISA EtherLink II, II/16 (3c503, 3c503/16) driver");
700MODULE_LICENSE("GPL");
701
702
703
704int
705init_module(void)
706{
707 int this_dev, found = 0;
708
709 for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
710 struct net_device *dev = &dev_el2[this_dev];
711 dev->irq = irq[this_dev];
712 dev->base_addr = io[this_dev];
713 dev->mem_end = xcvr[this_dev];
714 dev->init = el2_probe;
715 if (io[this_dev] == 0) {
716 if (this_dev != 0) break;
717 printk(KERN_NOTICE "3c503.c: Presently autoprobing (not recommended) for a single card.\n");
718 }
719 if (register_netdev(dev) != 0) {
720 printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]);
721 if (found != 0) {
722 return 0;
723 }
724 return -ENXIO;
725 }
726 found++;
727 }
728 return 0;
729}
730
731void
732cleanup_module(void)
733{
734 int this_dev;
735
736 for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
737 struct net_device *dev = &dev_el2[this_dev];
738 if (dev->priv != NULL) {
739 void *priv = dev->priv;
740
741 release_region(dev->base_addr, EL2_IO_EXTENT);
742 unregister_netdev(dev);
743 kfree(priv);
744 }
745 }
746}
747#endif
748
749
750
751
752
753
754
755
756
757