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