This source file includes following definitions.
- el1_probe
- el1_probe1
- el_open
- el_start_xmit
- el_interrupt
- el_receive
- el_reset
- el1_close
- el1_get_stats
- set_multicast_list
- init_module
- cleanup_module
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 static const char *version =
79 "3c501.c: 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov).\n";
80
81
82
83
84
85
86 #include <linux/module.h>
87
88 #include <linux/kernel.h>
89 #include <linux/sched.h>
90 #include <linux/ptrace.h>
91 #include <linux/fcntl.h>
92 #include <linux/ioport.h>
93 #include <linux/interrupt.h>
94 #include <linux/malloc.h>
95 #include <linux/string.h>
96 #include <linux/ioport.h>
97 #include <linux/errno.h>
98 #include <linux/config.h>
99
100 #include <asm/bitops.h>
101 #include <asm/io.h>
102
103 #include <linux/netdevice.h>
104 #include <linux/etherdevice.h>
105 #include <linux/skbuff.h>
106
107
108
109 static unsigned int netcard_portlist[] =
110 { 0x280, 0x300, 0};
111
112
113
114
115
116
117 int el1_probe(struct device *dev);
118 static int el1_probe1(struct device *dev, int ioaddr);
119 static int el_open(struct device *dev);
120 static int el_start_xmit(struct sk_buff *skb, struct device *dev);
121 static void el_interrupt(int irq, struct pt_regs *regs);
122 static void el_receive(struct device *dev);
123 static void el_reset(struct device *dev);
124 static int el1_close(struct device *dev);
125 static struct enet_statistics *el1_get_stats(struct device *dev);
126 static void set_multicast_list(struct device *dev);
127
128 #define EL1_IO_EXTENT 16
129
130 #ifndef EL_DEBUG
131 #define EL_DEBUG 2
132 #endif
133 static int el_debug = EL_DEBUG;
134
135
136
137
138
139 struct net_local
140 {
141 struct enet_statistics stats;
142 int tx_pkt_start;
143 int collisions;
144 int loading;
145 };
146
147
148 #define RX_STATUS (ioaddr + 0x06)
149 #define RX_CMD RX_STATUS
150 #define TX_STATUS (ioaddr + 0x07)
151 #define TX_CMD TX_STATUS
152 #define GP_LOW (ioaddr + 0x08)
153 #define GP_HIGH (ioaddr + 0x09)
154 #define RX_BUF_CLR (ioaddr + 0x0A)
155 #define RX_LOW (ioaddr + 0x0A)
156 #define RX_HIGH (ioaddr + 0x0B)
157 #define SAPROM (ioaddr + 0x0C)
158 #define AX_STATUS (ioaddr + 0x0E)
159 #define AX_CMD AX_STATUS
160 #define DATAPORT (ioaddr + 0x0F)
161 #define TX_RDY 0x08
162
163 #define EL1_DATAPTR 0x08
164 #define EL1_RXPTR 0x0A
165 #define EL1_SAPROM 0x0C
166 #define EL1_DATAPORT 0x0f
167
168
169
170
171
172 #define AX_OFF 0x00
173 #define AX_SYS 0x40
174 #define AX_XMIT 0x44
175 #define AX_RX 0x48
176 #define AX_LOOP 0x0C
177 #define AX_RESET 0x80
178
179
180
181
182
183
184 #define RX_NORM 0xA8
185 #define RX_PROM 0x68
186 #define RX_MULT 0xE8
187 #define TX_NORM 0x0A
188
189
190
191
192
193 #define TX_COLLISION 0x02
194 #define TX_16COLLISIONS 0x04
195 #define TX_READY 0x08
196
197 #define RX_RUNT 0x08
198 #define RX_MISSED 0x01
199 #define RX_GOOD 0x30
200
201
202
203
204
205
206 #ifdef HAVE_DEVLIST
207 struct netdev_entry el1_drv = {"3c501", el1_probe1, EL1_IO_EXTENT, netcard_portlist};
208 #else
209
210 int el1_probe(struct device *dev)
211 {
212 int i;
213 int base_addr = dev ? dev->base_addr : 0;
214
215 if (base_addr > 0x1ff)
216 return el1_probe1(dev, base_addr);
217 else if (base_addr != 0)
218 return ENXIO;
219
220 for (i = 0; netcard_portlist[i]; i++)
221 {
222 int ioaddr = netcard_portlist[i];
223 if (check_region(ioaddr, EL1_IO_EXTENT))
224 continue;
225 if (el1_probe1(dev, ioaddr) == 0)
226 return 0;
227 }
228
229 return ENODEV;
230 }
231 #endif
232
233
234
235
236
237 static int el1_probe1(struct device *dev, int ioaddr)
238 {
239 #ifndef MODULE
240
241 const char *mname;
242 unsigned char station_addr[6];
243 int autoirq = 0;
244 int i;
245
246
247
248
249
250 for (i = 0; i < 6; i++)
251 {
252 outw(i, ioaddr + EL1_DATAPTR);
253 station_addr[i] = inb(ioaddr + EL1_SAPROM);
254 }
255
256
257
258
259
260 if (station_addr[0] == 0x02 && station_addr[1] == 0x60
261 && station_addr[2] == 0x8c)
262 {
263 mname = "3c501";
264 } else if (station_addr[0] == 0x00 && station_addr[1] == 0x80
265 && station_addr[2] == 0xC8)
266 {
267 mname = "NP943";
268 }
269 else
270 return ENODEV;
271
272
273
274
275
276 request_region(ioaddr, EL1_IO_EXTENT,"3c501");
277
278
279
280
281
282
283 if (dev->irq < 2)
284 {
285 autoirq_setup(2);
286 inb(RX_STATUS);
287 inb(TX_STATUS);
288 outb(AX_LOOP + 1, AX_CMD);
289
290 outb(0x00, AX_CMD);
291
292 autoirq = autoirq_report(1);
293
294 if (autoirq == 0)
295 {
296 printk("%s probe at %#x failed to detect IRQ line.\n",
297 mname, ioaddr);
298 return EAGAIN;
299 }
300 }
301
302 outb(AX_RESET+AX_LOOP, AX_CMD);
303 dev->base_addr = ioaddr;
304 memcpy(dev->dev_addr, station_addr, ETH_ALEN);
305
306 if (dev->mem_start & 0xf)
307 el_debug = dev->mem_start & 0x7;
308 if (autoirq)
309 dev->irq = autoirq;
310
311 printk("%s: %s EtherLink at %#lx, using %sIRQ %d.\n", dev->name, mname, dev->base_addr,
312 autoirq ? "auto":"assigned ", dev->irq);
313
314 #ifdef CONFIG_IP_MULTICAST
315 printk("WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
316 #endif
317
318 if (el_debug)
319 printk("%s", version);
320
321
322
323
324
325 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
326 if (dev->priv == NULL)
327 return -ENOMEM;
328 memset(dev->priv, 0, sizeof(struct net_local));
329
330
331
332
333
334 dev->open = &el_open;
335 dev->hard_start_xmit = &el_start_xmit;
336 dev->stop = &el1_close;
337 dev->get_stats = &el1_get_stats;
338 dev->set_multicast_list = &set_multicast_list;
339
340
341
342
343
344 ether_setup(dev);
345
346 #endif
347
348 return 0;
349 }
350
351
352
353
354
355 static int el_open(struct device *dev)
356 {
357 int ioaddr = dev->base_addr;
358
359 if (el_debug > 2)
360 printk("%s: Doing el_open()...", dev->name);
361
362 if (request_irq(dev->irq, &el_interrupt, 0, "3c501"))
363 return -EAGAIN;
364
365 irq2dev_map[dev->irq] = dev;
366 el_reset(dev);
367
368 dev->start = 1;
369
370 outb(AX_RX, AX_CMD);
371 MOD_INC_USE_COUNT;
372 return 0;
373 }
374
375 static int el_start_xmit(struct sk_buff *skb, struct device *dev)
376 {
377 struct net_local *lp = (struct net_local *)dev->priv;
378 int ioaddr = dev->base_addr;
379 unsigned long flags;
380
381 if (dev->tbusy)
382 {
383 if (jiffies - dev->trans_start < 20)
384 {
385 if (el_debug > 2)
386 printk(" transmitter busy, deferred.\n");
387 return 1;
388 }
389 if (el_debug)
390 printk ("%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
391 dev->name, inb(TX_STATUS), inb(AX_STATUS), inb(RX_STATUS));
392 lp->stats.tx_errors++;
393 outb(TX_NORM, TX_CMD);
394 outb(RX_NORM, RX_CMD);
395 outb(AX_OFF, AX_CMD);
396 outb(AX_RX, AX_CMD);
397 dev->tbusy = 0;
398 dev->trans_start = jiffies;
399 }
400
401 if (skb == NULL)
402 {
403 dev_tint(dev);
404 return 0;
405 }
406
407 save_flags(flags);
408
409
410
411
412
413
414
415 cli();
416
417
418
419
420
421 if (set_bit(0, (void*)&dev->tbusy) != 0)
422 {
423 restore_flags(flags);
424 printk("%s: Transmitter access conflict.\n", dev->name);
425 }
426 else
427 {
428 int gp_start = 0x800 - (ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN);
429 unsigned char *buf = skb->data;
430
431 load_it_again_sam:
432 lp->tx_pkt_start = gp_start;
433 lp->collisions = 0;
434
435
436
437
438
439
440 outb(AX_SYS, AX_CMD);
441 inb(RX_STATUS);
442 inb(TX_STATUS);
443
444 lp->loading=1;
445
446
447
448
449
450
451 restore_flags(flags);
452 outw(0x00, RX_BUF_CLR);
453 outw(gp_start, GP_LOW);
454 outsb(DATAPORT,buf,skb->len);
455 outw(gp_start, GP_LOW);
456 if(lp->loading==2)
457 {
458 if(el_debug>2)
459 printk("%s: burped during tx load.\n", dev->name);
460 goto load_it_again_sam;
461 }
462 outb(AX_XMIT, AX_CMD);
463 dev->trans_start = jiffies;
464 }
465
466 if (el_debug > 2)
467 printk(" queued xmit.\n");
468 dev_kfree_skb (skb, FREE_WRITE);
469 return 0;
470 }
471
472
473
474
475
476
477
478 static void el_interrupt(int irq, struct pt_regs *regs)
479 {
480 struct device *dev = (struct device *)(irq2dev_map[irq]);
481 struct net_local *lp;
482 int ioaddr;
483 int axsr;
484
485 if (dev == NULL || dev->irq != irq)
486 {
487 printk ("3c501 driver: irq %d for unknown device.\n", irq);
488 return;
489 }
490
491 ioaddr = dev->base_addr;
492 lp = (struct net_local *)dev->priv;
493
494
495
496
497
498 axsr = inb(AX_STATUS);
499
500
501
502
503
504 if (el_debug > 3)
505 printk("%s: el_interrupt() aux=%#02x", dev->name, axsr);
506 if (dev->interrupt)
507 printk("%s: Reentering the interrupt driver!\n", dev->name);
508 dev->interrupt = 1;
509
510 lp->loading=2;
511
512 if (dev->tbusy)
513 {
514
515
516
517
518
519 int txsr = inb(TX_STATUS);
520
521 if (el_debug > 6)
522 printk(" txsr=%02x gp=%04x rp=%04x", txsr, inw(GP_LOW),inw(RX_LOW));
523
524 if ((axsr & 0x80) && (txsr & TX_READY) == 0)
525 {
526
527
528
529
530 printk("%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x"
531 " gp=%03x rp=%03x.\n", dev->name, txsr, axsr,
532 inw(ioaddr + EL1_DATAPTR), inw(ioaddr + EL1_RXPTR));
533 dev->tbusy = 0;
534 mark_bh(NET_BH);
535 }
536 else if (txsr & TX_16COLLISIONS)
537 {
538
539
540
541 if (el_debug)
542 printk("%s: Transmit failed 16 times, ethernet jammed?\n",dev->name);
543 outb(AX_SYS, AX_CMD);
544 lp->stats.tx_aborted_errors++;
545 }
546 else if (txsr & TX_COLLISION)
547 {
548
549
550
551
552 if (el_debug > 6)
553 printk(" retransmitting after a collision.\n");
554
555
556
557
558 outb(AX_SYS, AX_CMD);
559 outw(lp->tx_pkt_start, GP_LOW);
560 outb(AX_XMIT, AX_CMD);
561 lp->stats.collisions++;
562 dev->interrupt = 0;
563 return;
564 }
565 else
566 {
567
568
569
570 lp->stats.tx_packets++;
571 if (el_debug > 6)
572 printk(" Tx succeeded %s\n",
573 (txsr & TX_RDY) ? "." : "but tx is busy!");
574
575
576
577
578 dev->tbusy = 0;
579 mark_bh(NET_BH);
580 }
581 }
582 else
583 {
584
585
586
587
588 int rxsr = inb(RX_STATUS);
589 if (el_debug > 5)
590 printk(" rxsr=%02x txsr=%02x rp=%04x", rxsr, inb(TX_STATUS),inw(RX_LOW));
591
592
593
594 if (rxsr & RX_MISSED)
595 lp->stats.rx_missed_errors++;
596 if (rxsr & RX_RUNT)
597 {
598 lp->stats.rx_length_errors++;
599 if (el_debug > 5)
600 printk(" runt.\n");
601 }
602 else if (rxsr & RX_GOOD)
603 {
604
605
606
607 el_receive(dev);
608 }
609 else
610 {
611
612
613
614 if (el_debug > 2)
615 printk("%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
616 dev->name, rxsr);
617 el_reset(dev);
618 }
619 if (el_debug > 3)
620 printk(".\n");
621 }
622
623
624
625
626
627 outb(AX_RX, AX_CMD);
628 outw(0x00, RX_BUF_CLR);
629 inb(RX_STATUS);
630 inb(TX_STATUS);
631 dev->interrupt = 0;
632 return;
633 }
634
635
636
637
638
639
640
641 static void el_receive(struct device *dev)
642 {
643 struct net_local *lp = (struct net_local *)dev->priv;
644 int ioaddr = dev->base_addr;
645 int pkt_len;
646 struct sk_buff *skb;
647
648 pkt_len = inw(RX_LOW);
649
650 if (el_debug > 4)
651 printk(" el_receive %d.\n", pkt_len);
652
653 if ((pkt_len < 60) || (pkt_len > 1536))
654 {
655 if (el_debug)
656 printk("%s: bogus packet, length=%d\n", dev->name, pkt_len);
657 lp->stats.rx_over_errors++;
658 return;
659 }
660
661
662
663
664
665 outb(AX_SYS, AX_CMD);
666 skb = dev_alloc_skb(pkt_len+2);
667
668
669
670
671
672 outw(0x00, GP_LOW);
673 if (skb == NULL)
674 {
675 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
676 lp->stats.rx_dropped++;
677 return;
678 }
679 else
680 {
681 skb_reserve(skb,2);
682 skb->dev = dev;
683
684
685
686
687
688 insb(DATAPORT, skb_put(skb,pkt_len), pkt_len);
689 skb->protocol=eth_type_trans(skb,dev);
690 netif_rx(skb);
691 lp->stats.rx_packets++;
692 }
693 return;
694 }
695
696 static void el_reset(struct device *dev)
697 {
698 int ioaddr = dev->base_addr;
699
700 if (el_debug> 2)
701 printk("3c501 reset...");
702 outb(AX_RESET, AX_CMD);
703 outb(AX_LOOP, AX_CMD);
704 {
705 int i;
706 for (i = 0; i < 6; i++)
707 outb(dev->dev_addr[i], ioaddr + i);
708 }
709
710 outw(0, RX_BUF_CLR);
711 cli();
712 outb(TX_NORM, TX_CMD);
713 outb(RX_NORM, RX_CMD);
714 inb(RX_STATUS);
715 inb(TX_STATUS);
716 dev->interrupt = 0;
717 dev->tbusy = 0;
718 sti();
719 }
720
721 static int el1_close(struct device *dev)
722 {
723 int ioaddr = dev->base_addr;
724
725 if (el_debug > 2)
726 printk("%s: Shutting down ethercard at %#x.\n", dev->name, ioaddr);
727
728 dev->tbusy = 1;
729 dev->start = 0;
730
731
732
733
734
735 free_irq(dev->irq);
736 outb(AX_RESET, AX_CMD);
737 irq2dev_map[dev->irq] = 0;
738
739 MOD_DEC_USE_COUNT;
740 return 0;
741 }
742
743 static struct enet_statistics *el1_get_stats(struct device *dev)
744 {
745 struct net_local *lp = (struct net_local *)dev->priv;
746 return &lp->stats;
747 }
748
749
750
751
752
753
754 static void set_multicast_list(struct device *dev)
755 {
756 int ioaddr = dev->base_addr;
757
758 if(dev->flags&IFF_PROMISC)
759 {
760 outb(RX_PROM, RX_CMD);
761 inb(RX_STATUS);
762 }
763 else if (dev->mc_list || dev->flags&IFF_ALLMULTI)
764 {
765 outb(RX_MULT, RX_CMD);
766 inb(RX_STATUS);
767 }
768 else
769 {
770 outb(RX_NORM, RX_CMD);
771 inb(RX_STATUS);
772 }
773 }
774
775 #ifdef MODULE
776
777 static char devicename[9] = { 0, };
778
779 static struct device dev_3c501 =
780 {
781 devicename,
782 0, 0, 0, 0,
783 0x280, 5,
784 0, 0, 0, NULL, el1_probe
785 };
786
787 static int io=0x280;
788 static int irq=5;
789
790 int init_module(void)
791 {
792 dev_3c501.irq=irq;
793 dev_3c501.base_addr=io;
794 if (register_netdev(&dev_3c501) != 0)
795 return -EIO;
796 return 0;
797 }
798
799 void cleanup_module(void)
800 {
801
802
803
804
805 unregister_netdev(&dev_3c501);
806
807
808
809
810
811 kfree(dev_3c501.priv);
812 dev_3c501.priv = NULL;
813
814
815
816
817 release_region(dev_3c501.base_addr, EL1_IO_EXTENT);
818 }
819
820 #endif
821
822
823
824
825
826
827