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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102#define DRV_NAME "3c501"
103#define DRV_VERSION "2002/10/09"
104
105
106static const char version[] =
107 DRV_NAME ".c: " DRV_VERSION " Alan Cox (alan@lxorguk.ukuu.org.uk).\n";
108
109
110
111
112
113
114#include <linux/module.h>
115
116#include <linux/kernel.h>
117#include <linux/fcntl.h>
118#include <linux/ioport.h>
119#include <linux/interrupt.h>
120#include <linux/slab.h>
121#include <linux/string.h>
122#include <linux/errno.h>
123#include <linux/spinlock.h>
124#include <linux/ethtool.h>
125#include <linux/delay.h>
126#include <linux/bitops.h>
127
128#include <asm/uaccess.h>
129#include <asm/io.h>
130
131#include <linux/netdevice.h>
132#include <linux/etherdevice.h>
133#include <linux/skbuff.h>
134#include <linux/init.h>
135
136#include "3c501.h"
137
138
139
140
141
142static int io = 0x280;
143static int irq = 5;
144static int mem_start;
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159struct net_device * __init el1_probe(int unit)
160{
161 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
162 static unsigned ports[] = { 0x280, 0x300, 0};
163 unsigned *port;
164 int err = 0;
165
166 if (!dev)
167 return ERR_PTR(-ENOMEM);
168
169 if (unit >= 0) {
170 sprintf(dev->name, "eth%d", unit);
171 netdev_boot_setup_check(dev);
172 io = dev->base_addr;
173 irq = dev->irq;
174 mem_start = dev->mem_start & 7;
175 }
176
177 if (io > 0x1ff) {
178 err = el1_probe1(dev, io);
179 } else if (io != 0) {
180 err = -ENXIO;
181 } else {
182 for (port = ports; *port && el1_probe1(dev, *port); port++)
183 ;
184 if (!*port)
185 err = -ENODEV;
186 }
187 if (err)
188 goto out;
189 err = register_netdev(dev);
190 if (err)
191 goto out1;
192 return dev;
193out1:
194 release_region(dev->base_addr, EL1_IO_EXTENT);
195out:
196 free_netdev(dev);
197 return ERR_PTR(err);
198}
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213static int __init el1_probe1(struct net_device *dev, int ioaddr)
214{
215 struct net_local *lp;
216 const char *mname;
217 unsigned char station_addr[6];
218 int autoirq = 0;
219 int i;
220
221
222
223
224
225 if (!request_region(ioaddr, EL1_IO_EXTENT, DRV_NAME))
226 return -ENODEV;
227
228
229
230
231
232 for (i = 0; i < 6; i++) {
233 outw(i, ioaddr + EL1_DATAPTR);
234 station_addr[i] = inb(ioaddr + EL1_SAPROM);
235 }
236
237
238
239
240
241 if (station_addr[0] == 0x02 && station_addr[1] == 0x60
242 && station_addr[2] == 0x8c)
243 mname = "3c501";
244 else if (station_addr[0] == 0x00 && station_addr[1] == 0x80
245 && station_addr[2] == 0xC8)
246 mname = "NP943";
247 else {
248 release_region(ioaddr, EL1_IO_EXTENT);
249 return -ENODEV;
250 }
251
252
253
254
255
256
257 dev->irq = irq;
258
259 if (dev->irq < 2) {
260 unsigned long irq_mask;
261
262 irq_mask = probe_irq_on();
263 inb(RX_STATUS);
264 inb(TX_STATUS);
265 outb(AX_LOOP + 1, AX_CMD);
266
267 outb(0x00, AX_CMD);
268
269 mdelay(20);
270 autoirq = probe_irq_off(irq_mask);
271
272 if (autoirq == 0) {
273 printk(KERN_WARNING "%s probe at %#x failed to detect IRQ line.\n",
274 mname, ioaddr);
275 release_region(ioaddr, EL1_IO_EXTENT);
276 return -EAGAIN;
277 }
278 }
279
280 outb(AX_RESET+AX_LOOP, AX_CMD);
281 dev->base_addr = ioaddr;
282 memcpy(dev->dev_addr, station_addr, ETH_ALEN);
283
284 if (mem_start & 0xf)
285 el_debug = mem_start & 0x7;
286 if (autoirq)
287 dev->irq = autoirq;
288
289 printk(KERN_INFO "%s: %s EtherLink at %#lx, using %sIRQ %d.\n",
290 dev->name, mname, dev->base_addr,
291 autoirq ? "auto":"assigned ", dev->irq);
292
293#ifdef CONFIG_IP_MULTICAST
294 printk(KERN_WARNING "WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
295#endif
296
297 if (el_debug)
298 printk(KERN_DEBUG "%s", version);
299
300 lp = netdev_priv(dev);
301 memset(lp, 0, sizeof(struct net_local));
302 spin_lock_init(&lp->lock);
303
304
305
306
307
308 dev->open = &el_open;
309 dev->hard_start_xmit = &el_start_xmit;
310 dev->tx_timeout = &el_timeout;
311 dev->watchdog_timeo = HZ;
312 dev->stop = &el1_close;
313 dev->set_multicast_list = &set_multicast_list;
314 dev->ethtool_ops = &netdev_ethtool_ops;
315 return 0;
316}
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331static int el_open(struct net_device *dev)
332{
333 int retval;
334 int ioaddr = dev->base_addr;
335 struct net_local *lp = netdev_priv(dev);
336 unsigned long flags;
337
338 if (el_debug > 2)
339 printk(KERN_DEBUG "%s: Doing el_open()...", dev->name);
340
341 retval = request_irq(dev->irq, &el_interrupt, 0, dev->name, dev);
342 if (retval)
343 return retval;
344
345 spin_lock_irqsave(&lp->lock, flags);
346 el_reset(dev);
347 spin_unlock_irqrestore(&lp->lock, flags);
348
349 lp->txing = 0;
350 outb(AX_RX, AX_CMD);
351 netif_start_queue(dev);
352 return 0;
353}
354
355
356
357
358
359
360
361
362
363
364static void el_timeout(struct net_device *dev)
365{
366 struct net_local *lp = netdev_priv(dev);
367 int ioaddr = dev->base_addr;
368
369 if (el_debug)
370 printk(KERN_DEBUG "%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
371 dev->name, inb(TX_STATUS),
372 inb(AX_STATUS), inb(RX_STATUS));
373 dev->stats.tx_errors++;
374 outb(TX_NORM, TX_CMD);
375 outb(RX_NORM, RX_CMD);
376 outb(AX_OFF, AX_CMD);
377 outb(AX_RX, AX_CMD);
378 lp->txing = 0;
379 netif_wake_queue(dev);
380}
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
406{
407 struct net_local *lp = netdev_priv(dev);
408 int ioaddr = dev->base_addr;
409 unsigned long flags;
410
411
412
413
414
415
416
417 spin_lock_irqsave(&lp->lock, flags);
418
419
420
421
422
423 netif_stop_queue(dev);
424
425 do {
426 int len = skb->len;
427 int pad = 0;
428 int gp_start;
429 unsigned char *buf = skb->data;
430
431 if (len < ETH_ZLEN)
432 pad = ETH_ZLEN - len;
433
434 gp_start = 0x800 - (len + pad);
435
436 lp->tx_pkt_start = gp_start;
437 lp->collisions = 0;
438
439 dev->stats.tx_bytes += skb->len;
440
441
442
443
444
445
446 outb_p(AX_SYS, AX_CMD);
447 inb_p(RX_STATUS);
448 inb_p(TX_STATUS);
449
450 lp->loading = 1;
451 lp->txing = 1;
452
453
454
455
456
457
458 spin_unlock_irqrestore(&lp->lock, flags);
459
460
461 outw(0x00, RX_BUF_CLR);
462
463 outw(gp_start, GP_LOW);
464
465 outsb(DATAPORT, buf, len);
466 if (pad) {
467 while (pad--)
468 outb(0, DATAPORT);
469 }
470
471 outw(gp_start, GP_LOW);
472
473 if (lp->loading != 2) {
474
475 outb(AX_XMIT, AX_CMD);
476 lp->loading = 0;
477 dev->trans_start = jiffies;
478 if (el_debug > 2)
479 printk(KERN_DEBUG " queued xmit.\n");
480 dev_kfree_skb(skb);
481 return 0;
482 }
483
484 if (el_debug > 2)
485 printk(KERN_DEBUG "%s: burped during tx load.\n",
486 dev->name);
487 spin_lock_irqsave(&lp->lock, flags);
488 } while (1);
489}
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513static irqreturn_t el_interrupt(int irq, void *dev_id)
514{
515 struct net_device *dev = dev_id;
516 struct net_local *lp;
517 int ioaddr;
518 int axsr;
519
520 ioaddr = dev->base_addr;
521 lp = netdev_priv(dev);
522
523 spin_lock(&lp->lock);
524
525
526
527
528
529 axsr = inb(AX_STATUS);
530
531
532
533
534
535 if (el_debug > 3)
536 printk(KERN_DEBUG "%s: el_interrupt() aux=%#02x",
537 dev->name, axsr);
538
539 if (lp->loading == 1 && !lp->txing)
540 printk(KERN_WARNING "%s: Inconsistent state loading while not in tx\n",
541 dev->name);
542
543 if (lp->txing) {
544
545
546
547
548 int txsr = inb(TX_STATUS);
549
550 if (lp->loading == 1) {
551 if (el_debug > 2) {
552 printk(KERN_DEBUG "%s: Interrupt while loading [",
553 dev->name);
554 printk(" txsr=%02x gp=%04x rp=%04x]\n",
555 txsr, inw(GP_LOW), inw(RX_LOW));
556 }
557
558 lp->loading = 2;
559 spin_unlock(&lp->lock);
560 goto out;
561 }
562 if (el_debug > 6)
563 printk(KERN_DEBUG " txsr=%02x gp=%04x rp=%04x",
564 txsr, inw(GP_LOW), inw(RX_LOW));
565
566 if ((axsr & 0x80) && (txsr & TX_READY) == 0) {
567
568
569
570
571 if (el_debug > 1)
572 printk(KERN_DEBUG "%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x gp=%03x rp=%03x.\n",
573 dev->name, txsr, axsr,
574 inw(ioaddr + EL1_DATAPTR),
575 inw(ioaddr + EL1_RXPTR));
576 lp->txing = 0;
577 netif_wake_queue(dev);
578 } else if (txsr & TX_16COLLISIONS) {
579
580
581
582 if (el_debug)
583 printk(KERN_DEBUG "%s: Transmit failed 16 times, Ethernet jammed?\n", dev->name);
584 outb(AX_SYS, AX_CMD);
585 lp->txing = 0;
586 dev->stats.tx_aborted_errors++;
587 netif_wake_queue(dev);
588 } else if (txsr & TX_COLLISION) {
589
590
591
592
593 if (el_debug > 6)
594 printk(KERN_DEBUG " retransmitting after a collision.\n");
595
596
597
598
599
600 outb(AX_SYS, AX_CMD);
601 outw(lp->tx_pkt_start, GP_LOW);
602 outb(AX_XMIT, AX_CMD);
603 dev->stats.collisions++;
604 spin_unlock(&lp->lock);
605 goto out;
606 } else {
607
608
609
610 dev->stats.tx_packets++;
611 if (el_debug > 6)
612 printk(KERN_DEBUG " Tx succeeded %s\n",
613 (txsr & TX_RDY) ? "." :
614 "but tx is busy!");
615
616
617
618 lp->txing = 0;
619
620 netif_wake_queue(dev);
621 }
622 } else {
623
624
625
626
627 int rxsr = inb(RX_STATUS);
628 if (el_debug > 5)
629 printk(KERN_DEBUG " rxsr=%02x txsr=%02x rp=%04x", rxsr, inb(TX_STATUS), inw(RX_LOW));
630
631
632
633 if (rxsr & RX_MISSED)
634 dev->stats.rx_missed_errors++;
635 else if (rxsr & RX_RUNT) {
636
637 dev->stats.rx_length_errors++;
638 if (el_debug > 5)
639 printk(KERN_DEBUG " runt.\n");
640 } else if (rxsr & RX_GOOD) {
641
642
643
644 el_receive(dev);
645 } else {
646
647
648
649 if (el_debug > 2)
650 printk(KERN_DEBUG "%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
651 dev->name, rxsr);
652 el_reset(dev);
653 }
654 if (el_debug > 3)
655 printk(KERN_DEBUG ".\n");
656 }
657
658
659
660
661
662 outb(AX_RX, AX_CMD);
663 outw(0x00, RX_BUF_CLR);
664 inb(RX_STATUS);
665 inb(TX_STATUS);
666 spin_unlock(&lp->lock);
667out:
668 return IRQ_HANDLED;
669}
670
671
672
673
674
675
676
677
678
679
680
681
682static void el_receive(struct net_device *dev)
683{
684 int ioaddr = dev->base_addr;
685 int pkt_len;
686 struct sk_buff *skb;
687
688 pkt_len = inw(RX_LOW);
689
690 if (el_debug > 4)
691 printk(KERN_DEBUG " el_receive %d.\n", pkt_len);
692
693 if (pkt_len < 60 || pkt_len > 1536) {
694 if (el_debug)
695 printk(KERN_DEBUG "%s: bogus packet, length=%d\n",
696 dev->name, pkt_len);
697 dev->stats.rx_over_errors++;
698 return;
699 }
700
701
702
703
704
705 outb(AX_SYS, AX_CMD);
706 skb = dev_alloc_skb(pkt_len+2);
707
708
709
710
711
712 outw(0x00, GP_LOW);
713 if (skb == NULL) {
714 printk(KERN_INFO "%s: Memory squeeze, dropping packet.\n",
715 dev->name);
716 dev->stats.rx_dropped++;
717 return;
718 } else {
719 skb_reserve(skb, 2);
720
721
722
723
724
725 insb(DATAPORT, skb_put(skb, pkt_len), pkt_len);
726 skb->protocol = eth_type_trans(skb, dev);
727 netif_rx(skb);
728 dev->stats.rx_packets++;
729 dev->stats.rx_bytes += pkt_len;
730 }
731 return;
732}
733
734
735
736
737
738
739
740
741
742
743static void el_reset(struct net_device *dev)
744{
745 struct net_local *lp = netdev_priv(dev);
746 int ioaddr = dev->base_addr;
747
748 if (el_debug > 2)
749 printk(KERN_INFO "3c501 reset...");
750 outb(AX_RESET, AX_CMD);
751
752 outb(AX_LOOP, AX_CMD);
753 {
754 int i;
755 for (i = 0; i < 6; i++)
756 outb(dev->dev_addr[i], ioaddr + i);
757 }
758
759 outw(0, RX_BUF_CLR);
760 outb(TX_NORM, TX_CMD);
761 outb(RX_NORM, RX_CMD);
762 inb(RX_STATUS);
763 inb(TX_STATUS);
764 lp->txing = 0;
765}
766
767
768
769
770
771
772
773
774
775
776
777
778static int el1_close(struct net_device *dev)
779{
780 int ioaddr = dev->base_addr;
781
782 if (el_debug > 2)
783 printk(KERN_INFO "%s: Shutting down Ethernet card at %#x.\n",
784 dev->name, ioaddr);
785
786 netif_stop_queue(dev);
787
788
789
790
791
792 free_irq(dev->irq, dev);
793 outb(AX_RESET, AX_CMD);
794
795 return 0;
796}
797
798
799
800
801
802
803
804
805
806
807
808static void set_multicast_list(struct net_device *dev)
809{
810 int ioaddr = dev->base_addr;
811
812 if (dev->flags & IFF_PROMISC) {
813 outb(RX_PROM, RX_CMD);
814 inb(RX_STATUS);
815 } else if (dev->mc_list || dev->flags & IFF_ALLMULTI) {
816
817 outb(RX_MULT, RX_CMD);
818 inb(RX_STATUS);
819 } else {
820 outb(RX_NORM, RX_CMD);
821 inb(RX_STATUS);
822 }
823}
824
825
826static void netdev_get_drvinfo(struct net_device *dev,
827 struct ethtool_drvinfo *info)
828{
829 strcpy(info->driver, DRV_NAME);
830 strcpy(info->version, DRV_VERSION);
831 sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr);
832}
833
834static u32 netdev_get_msglevel(struct net_device *dev)
835{
836 return debug;
837}
838
839static void netdev_set_msglevel(struct net_device *dev, u32 level)
840{
841 debug = level;
842}
843
844static const struct ethtool_ops netdev_ethtool_ops = {
845 .get_drvinfo = netdev_get_drvinfo,
846 .get_msglevel = netdev_get_msglevel,
847 .set_msglevel = netdev_set_msglevel,
848};
849
850#ifdef MODULE
851
852static struct net_device *dev_3c501;
853
854module_param(io, int, 0);
855module_param(irq, int, 0);
856MODULE_PARM_DESC(io, "EtherLink I/O base address");
857MODULE_PARM_DESC(irq, "EtherLink IRQ number");
858
859
860
861
862
863
864
865
866
867
868
869
870
871int __init init_module(void)
872{
873 dev_3c501 = el1_probe(-1);
874 if (IS_ERR(dev_3c501))
875 return PTR_ERR(dev_3c501);
876 return 0;
877}
878
879
880
881
882
883
884
885
886void __exit cleanup_module(void)
887{
888 struct net_device *dev = dev_3c501;
889 unregister_netdev(dev);
890 release_region(dev->base_addr, EL1_IO_EXTENT);
891 free_netdev(dev);
892}
893
894#endif
895
896MODULE_AUTHOR("Donald Becker, Alan Cox");
897MODULE_DESCRIPTION("Support for the ancient 3Com 3c501 ethernet card");
898MODULE_LICENSE("GPL");
899
900