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