This source file includes following definitions.
- dec21040_init
- tulip_probe
- tulip_probe1
- tulip_open
- tulip_init_ring
- tulip_start_xmit
- tulip_interrupt
- tulip_rx
- tulip_close
- tulip_get_stats
- set_multicast_list
- set_mac_address
- init_module
- cleanup_module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 static const char *version = "tulip.c:v0.05 1/20/95 becker@cesdis.gsfc.nasa.gov\n";
18
19 #include <linux/module.h>
20
21 #include <linux/kernel.h>
22 #include <linux/sched.h>
23 #include <linux/string.h>
24 #include <linux/ptrace.h>
25 #include <linux/errno.h>
26 #include <linux/ioport.h>
27 #include <linux/malloc.h>
28 #include <linux/interrupt.h>
29 #include <linux/pci.h>
30 #include <linux/bios32.h>
31 #include <asm/bitops.h>
32 #include <asm/io.h>
33 #include <asm/dma.h>
34
35 #include <linux/netdevice.h>
36 #include <linux/etherdevice.h>
37 #include <linux/skbuff.h>
38
39
40
41 #define TULIP_TOTAL_SIZE 0x80
42
43 #ifdef HAVE_DEVLIST
44 struct netdev_entry tulip_drv =
45 {"Tulip", tulip_pci_probe, TULIP_TOTAL_SIZE, NULL};
46 #endif
47
48 #define TULIP_DEBUG 1
49 #ifdef TULIP_DEBUG
50 int tulip_debug = TULIP_DEBUG;
51 #else
52 int tulip_debug = 1;
53 #endif
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
103
104
105
106
107
108
109
110 #define DEC_VENDOR_ID 0x1011
111 #define DEC_21040_ID 0x0002
112
113
114 #define TX_RING_SIZE 4
115 #define RX_RING_SIZE 4
116 #define PKT_BUF_SZ 1536
117
118
119
120 enum tulip_offsets {
121 CSR0=0, CSR1=0x08, CSR2=0x10, CSR3=0x18, CSR4=0x20, CSR5=0x28,
122 CSR6=0x30, CSR7=0x38, CSR8=0x40, CSR9=0x48, CSR10=0x50, CSR11=0x58,
123 CSR12=0x60, CSR13=0x68, CSR14=0x70, CSR15=0x78 };
124
125
126 struct tulip_rx_desc {
127 int status;
128 int length;
129 char *buffer1, *buffer2;
130 };
131
132 struct tulip_tx_desc {
133 int status;
134 int length;
135 char *buffer1, *buffer2;
136 };
137
138 struct tulip_private {
139 char devname[8];
140 struct tulip_rx_desc rx_ring[RX_RING_SIZE];
141 struct tulip_tx_desc tx_ring[TX_RING_SIZE];
142
143 struct sk_buff* tx_skbuff[TX_RING_SIZE];
144 long rx_buffs;
145 struct enet_statistics stats;
146 int setup_frame[48];
147 unsigned int cur_rx, cur_tx;
148 unsigned int dirty_rx, dirty_tx;
149 unsigned int tx_full:1;
150 int pad0, pad1;
151 };
152
153 static void tulip_probe1(int ioaddr, int irq);
154 static int tulip_open(struct device *dev);
155 static void tulip_init_ring(struct device *dev);
156 static int tulip_start_xmit(struct sk_buff *skb, struct device *dev);
157 static int tulip_rx(struct device *dev);
158 static void tulip_interrupt(int irq, void *dev_id, struct pt_regs *regs);
159 static int tulip_close(struct device *dev);
160 static struct enet_statistics *tulip_get_stats(struct device *dev);
161 static void set_multicast_list(struct device *dev);
162 static int set_mac_address(struct device *dev, void *addr);
163
164
165
166 #ifndef MODULE
167
168
169
170
171
172 int dec21040_init(void)
173 {
174
175 if (pcibios_present()) {
176 int pci_index;
177 for (pci_index = 0; pci_index < 8; pci_index++) {
178 unsigned char pci_bus, pci_device_fn, pci_irq_line;
179 unsigned long pci_ioaddr;
180
181 if (pcibios_find_device (DEC_VENDOR_ID, DEC_21040_ID, pci_index,
182 &pci_bus, &pci_device_fn) != 0)
183 break;
184 pcibios_read_config_byte(pci_bus, pci_device_fn,
185 PCI_INTERRUPT_LINE, &pci_irq_line);
186 pcibios_read_config_dword(pci_bus, pci_device_fn,
187 PCI_BASE_ADDRESS_0, &pci_ioaddr);
188
189 pci_ioaddr &= ~3;
190 if (tulip_debug > 2)
191 printk("Found DEC PCI Tulip at I/O %#lx, IRQ %d.\n",
192 pci_ioaddr, pci_irq_line);
193 tulip_probe1(pci_ioaddr, pci_irq_line);
194 }
195 }
196
197 return 0;
198 }
199 #endif
200 #ifdef MODULE
201 static int tulip_probe(struct device *dev)
202 {
203 printk("tulip: This driver does not yet install properly from module!\n");
204 return -1;
205 }
206 #endif
207
208 static void tulip_probe1(int ioaddr, int irq)
209 {
210 static int did_version = 0;
211 struct device *dev;
212 struct tulip_private *tp;
213 int i;
214
215 if (tulip_debug > 0 && did_version++ == 0)
216 printk(version);
217
218 dev = init_etherdev(0, 0);
219
220 printk("%s: DEC 21040 Tulip at %#3x,", dev->name, ioaddr);
221
222
223 outl(inl(ioaddr + CSR6) & ~0x2002, ioaddr + CSR6);
224
225 inl(ioaddr + CSR8) & 0xffff;
226
227
228
229
230
231 outl(0, ioaddr + CSR9);
232 for (i = 0; i < 6; i++) {
233 int value, boguscnt = 100000;
234 do
235 value = inl(ioaddr + CSR9);
236 while (value < 0 && --boguscnt > 0);
237 printk(" %2.2x", dev->dev_addr[i] = value);
238 }
239 printk(", IRQ %d\n", irq);
240
241
242 request_region(ioaddr, TULIP_TOTAL_SIZE, "DEC Tulip Ethernet");
243
244 dev->base_addr = ioaddr;
245 dev->irq = irq;
246
247
248 tp = kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA);
249 dev->priv = tp;
250 tp->rx_buffs = kmalloc(PKT_BUF_SZ*RX_RING_SIZE, GFP_KERNEL | GFP_DMA);
251
252
253 dev->open = &tulip_open;
254 dev->hard_start_xmit = &tulip_start_xmit;
255 dev->stop = &tulip_close;
256 dev->get_stats = &tulip_get_stats;
257 dev->set_multicast_list = &set_multicast_list;
258 dev->set_mac_address = &set_mac_address;
259
260 return;
261 }
262
263
264 static int
265 tulip_open(struct device *dev)
266 {
267 struct tulip_private *tp = (struct tulip_private *)dev->priv;
268 int ioaddr = dev->base_addr;
269
270
271 outl(0xfff80001, ioaddr + CSR0);
272 SLOW_DOWN_IO;
273
274
275
276
277
278
279
280
281 outl(0xfff84800, ioaddr + CSR0);
282
283 if (irq2dev_map[dev->irq] != NULL
284 || (irq2dev_map[dev->irq] = dev) == NULL
285 || dev->irq == 0
286 || request_irq(dev->irq, &tulip_interrupt, 0, "DEC 21040 Tulip", NULL)) {
287 return -EAGAIN;
288 }
289
290 if (tulip_debug > 1)
291 printk("%s: tulip_open() irq %d.\n", dev->name, dev->irq);
292
293 tulip_init_ring(dev);
294
295
296 {
297 unsigned short *eaddrs = (unsigned short *)dev->dev_addr;
298 int *setup_frm = tp->setup_frame, i;
299
300
301 *setup_frm++ = 0xffff;
302 *setup_frm++ = 0xffff;
303 *setup_frm++ = 0xffff;
304
305 for (i = 1; i < 16; i++) {
306 *setup_frm++ = eaddrs[0];
307 *setup_frm++ = eaddrs[1];
308 *setup_frm++ = eaddrs[2];
309 }
310
311 tp->tx_ring[0].length = 0x08000000 | 192;
312 tp->tx_ring[0].buffer1 = (char *)tp->setup_frame;
313 tp->tx_ring[0].buffer2 = 0;
314 tp->tx_ring[0].status = 0x80000000;
315
316 tp->cur_tx++, tp->dirty_tx++;
317 }
318
319 outl((int)tp->rx_ring, ioaddr + CSR3);
320 outl((int)tp->tx_ring, ioaddr + CSR4);
321
322
323 outl(0x00000000, ioaddr + CSR13);
324 outl(0x00000004, ioaddr + CSR13);
325
326
327 outl(0xfffe2002, ioaddr + CSR6);
328
329
330 outl(0, ioaddr + CSR1);
331
332 dev->tbusy = 0;
333 dev->interrupt = 0;
334 dev->start = 1;
335
336
337 outl(0xFFFFFFFF, ioaddr + CSR7);
338
339 if (tulip_debug > 2) {
340 printk("%s: Done tulip_open(), CSR0 %8.8x, CSR13 %8.8x.\n",
341 dev->name, inl(ioaddr + CSR0), inl(ioaddr + CSR13));
342 }
343 MOD_INC_USE_COUNT;
344 return 0;
345 }
346
347
348 static void
349 tulip_init_ring(struct device *dev)
350 {
351 struct tulip_private *tp = (struct tulip_private *)dev->priv;
352 int i;
353
354 tp->tx_full = 0;
355 tp->cur_rx = tp->cur_tx = 0;
356 tp->dirty_rx = tp->dirty_tx = 0;
357
358 for (i = 0; i < RX_RING_SIZE; i++) {
359 tp->rx_ring[i].status = 0x80000000;
360 tp->rx_ring[i].length = PKT_BUF_SZ;
361 tp->rx_ring[i].buffer1 = (char *)(tp->rx_buffs + i*PKT_BUF_SZ);
362 tp->rx_ring[i].buffer2 = (char *)&tp->rx_ring[i+1];
363 }
364
365 tp->rx_ring[i-1].length = PKT_BUF_SZ | 0x02000000;
366 tp->rx_ring[i-1].buffer2 = (char *)&tp->rx_ring[0];
367
368
369
370 for (i = 0; i < TX_RING_SIZE; i++) {
371 tp->tx_ring[i].status = 0x00000000;
372 }
373 }
374
375 static int
376 tulip_start_xmit(struct sk_buff *skb, struct device *dev)
377 {
378 struct tulip_private *tp = (struct tulip_private *)dev->priv;
379 int ioaddr = dev->base_addr;
380 int entry;
381
382
383 if (dev->tbusy) {
384 int tickssofar = jiffies - dev->trans_start;
385 int i;
386 if (tickssofar < 20)
387 return 1;
388 printk("%s: transmit timed out, status %8.8x, SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n",
389 dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12),
390 inl(ioaddr + CSR13), inl(ioaddr + CSR14), inl(ioaddr + CSR15));
391 printk(" Rx ring %8.8x: ", (int)tp->rx_ring);
392 for (i = 0; i < RX_RING_SIZE; i++)
393 printk(" %8.8x", (unsigned int)tp->rx_ring[i].status);
394 printk("\n Tx ring %8.8x: ", (int)tp->tx_ring);
395 for (i = 0; i < TX_RING_SIZE; i++)
396 printk(" %8.8x", (unsigned int)tp->tx_ring[i].status);
397 printk("\n");
398
399 tp->stats.tx_errors++;
400
401 dev->tbusy=0;
402 dev->trans_start = jiffies;
403 return 0;
404 }
405
406 if (skb == NULL || skb->len <= 0) {
407 printk("%s: Obsolete driver layer request made: skbuff==NULL.\n",
408 dev->name);
409 dev_tint(dev);
410 return 0;
411 }
412
413
414
415
416 if (set_bit(0, (void*)&dev->tbusy) != 0) {
417 printk("%s: Transmitter access conflict.\n", dev->name);
418 return 1;
419 }
420
421
422
423
424
425 entry = tp->cur_tx % TX_RING_SIZE;
426
427 tp->tx_full = 1;
428 tp->tx_skbuff[entry] = skb;
429 tp->tx_ring[entry].length = skb->len |
430 (entry == TX_RING_SIZE-1 ? 0xe2000000 : 0xe0000000);
431 tp->tx_ring[entry].buffer1 = skb->data;
432 tp->tx_ring[entry].buffer2 = 0;
433 tp->tx_ring[entry].status = 0x80000000;
434
435 tp->cur_tx++;
436
437
438 outl(0, ioaddr + CSR1);
439
440 dev->trans_start = jiffies;
441
442 return 0;
443 }
444
445
446
447 static void tulip_interrupt(int irq, void *dev_id, struct pt_regs *regs)
448 {
449 struct device *dev = (struct device *)(irq2dev_map[irq]);
450 struct tulip_private *lp;
451 int csr5, ioaddr, boguscnt=10;
452
453 if (dev == NULL) {
454 printk ("tulip_interrupt(): irq %d for unknown device.\n", irq);
455 return;
456 }
457
458 ioaddr = dev->base_addr;
459 lp = (struct tulip_private *)dev->priv;
460 if (dev->interrupt)
461 printk("%s: Re-entering the interrupt handler.\n", dev->name);
462
463 dev->interrupt = 1;
464
465 do {
466 csr5 = inl(ioaddr + CSR5);
467
468 outl(csr5 & 0x0001ffff, ioaddr + CSR5);
469
470 if (tulip_debug > 4)
471 printk("%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n",
472 dev->name, csr5, inl(dev->base_addr + CSR5));
473
474 if ((csr5 & 0x00018000) == 0)
475 break;
476
477 if (csr5 & 0x0040)
478 tulip_rx(dev);
479
480 if (csr5 & 0x0001) {
481 int dirty_tx = lp->dirty_tx;
482
483 while (dirty_tx < lp->cur_tx) {
484 int entry = dirty_tx % TX_RING_SIZE;
485 int status = lp->tx_ring[entry].status;
486
487 if (status < 0)
488 break;
489
490 if (status & 0x8000) {
491
492 lp->stats.tx_errors++;
493 if (status & 0x4104) lp->stats.tx_aborted_errors++;
494 if (status & 0x0C00) lp->stats.tx_carrier_errors++;
495 if (status & 0x0200) lp->stats.tx_window_errors++;
496 if (status & 0x0002) lp->stats.tx_fifo_errors++;
497 if (status & 0x0080) lp->stats.tx_heartbeat_errors++;
498 #ifdef ETHER_STATS
499 if (status & 0x0100) lp->stats.collisions16++;
500 #endif
501 } else {
502 #ifdef ETHER_STATS
503 if (status & 0x0001) lp->stats.tx_deferred++;
504 #endif
505 lp->stats.collisions += (status >> 3) & 15;
506 lp->stats.tx_packets++;
507 }
508
509
510 dev_kfree_skb(lp->tx_skbuff[entry], FREE_WRITE);
511 dirty_tx++;
512 }
513
514 #ifndef final_version
515 if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
516 printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
517 dirty_tx, lp->cur_tx, lp->tx_full);
518 dirty_tx += TX_RING_SIZE;
519 }
520 #endif
521
522 if (lp->tx_full && dev->tbusy
523 && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
524
525 lp->tx_full = 0;
526 dev->tbusy = 0;
527 mark_bh(NET_BH);
528 }
529
530 lp->dirty_tx = dirty_tx;
531 }
532
533
534 if (csr5 & 0x8000) {
535 if (csr5 & 0x0008) lp->stats.tx_errors++;
536 if (csr5 & 0x0100) {
537 lp->stats.rx_errors++;
538 lp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
539 }
540 if (csr5 & 0x0800) {
541 printk("%s: Something Wicked happened! %8.8x.\n",
542 dev->name, csr5);
543
544 }
545 }
546 if (--boguscnt < 0) {
547 printk("%s: Too much work at interrupt, csr5=0x%8.8x.\n",
548 dev->name, csr5);
549
550 outl(0x0001ffff, ioaddr + CSR5);
551 break;
552 }
553 } while (1);
554
555 if (tulip_debug > 3)
556 printk("%s: exiting interrupt, csr5=%#4.4x.\n",
557 dev->name, inl(ioaddr + CSR5));
558
559
560 {
561 static int stopit = 10;
562 if (dev->start == 0 && --stopit < 0) {
563 printk("%s: Emergency stop, looping startup interrupt.\n",
564 dev->name);
565 free_irq(irq, NULL);
566 }
567 }
568
569 dev->interrupt = 0;
570 return;
571 }
572
573 static int
574 tulip_rx(struct device *dev)
575 {
576 struct tulip_private *lp = (struct tulip_private *)dev->priv;
577 int entry = lp->cur_rx % RX_RING_SIZE;
578 int i;
579
580 if (tulip_debug > 4)
581 printk(" In tulip_rx().\n");
582
583 while (lp->rx_ring[entry].status >= 0) {
584 int status = lp->rx_ring[entry].status;
585
586 if (tulip_debug > 4)
587 printk(" tulip_rx() status was %8.8x.\n", status);
588 if ((status & 0x0300) != 0x0300) {
589 printk("%s: Ethernet frame spanned multiple buffers, status %8.8x!\n",
590 dev->name, status);
591 } else if (status & 0x8000) {
592
593 lp->stats.rx_errors++;
594 if (status & 0x0890) lp->stats.rx_length_errors++;
595 if (status & 0x0004) lp->stats.rx_frame_errors++;
596 if (status & 0x0002) lp->stats.rx_crc_errors++;
597 if (status & 0x0001) lp->stats.rx_fifo_errors++;
598 } else {
599
600 short pkt_len = lp->rx_ring[entry].status >> 16;
601 struct sk_buff *skb;
602
603 skb = dev_alloc_skb(pkt_len+2);
604 if (skb == NULL) {
605 printk("%s: Memory squeeze, deferring packet.\n", dev->name);
606
607
608 for (i=0; i < RX_RING_SIZE; i++)
609 if (lp->rx_ring[(entry+i) % RX_RING_SIZE].status < 0)
610 break;
611
612 if (i > RX_RING_SIZE -2) {
613 lp->stats.rx_dropped++;
614 lp->rx_ring[entry].status = 0x80000000;
615 lp->cur_rx++;
616 }
617 break;
618 }
619 skb->dev = dev;
620 skb_reserve(skb,2);
621 memcpy(skb_put(skb,pkt_len), lp->rx_ring[entry].buffer1, pkt_len);
622 skb->protocol=eth_type_trans(skb,dev);
623 netif_rx(skb);
624 lp->stats.rx_packets++;
625 }
626
627 lp->rx_ring[entry].status = 0x80000000;
628 entry = (++lp->cur_rx) % RX_RING_SIZE;
629 }
630
631 return 0;
632 }
633
634 static int
635 tulip_close(struct device *dev)
636 {
637 int ioaddr = dev->base_addr;
638 struct tulip_private *tp = (struct tulip_private *)dev->priv;
639
640 dev->start = 0;
641 dev->tbusy = 1;
642
643 if (tulip_debug > 1)
644 printk("%s: Shutting down ethercard, status was %2.2x.\n",
645 dev->name, inl(ioaddr + CSR5));
646
647
648 outl(0x00000000, ioaddr + CSR7);
649
650 outl(inl(ioaddr + CSR6) & ~0x2002, ioaddr + CSR6);
651
652 tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
653
654 free_irq(dev->irq, NULL);
655 irq2dev_map[dev->irq] = 0;
656
657 MOD_DEC_USE_COUNT;
658 return 0;
659 }
660
661 static struct enet_statistics *
662 tulip_get_stats(struct device *dev)
663 {
664 struct tulip_private *tp = (struct tulip_private *)dev->priv;
665 short ioaddr = dev->base_addr;
666
667 tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
668
669 return &tp->stats;
670 }
671
672
673
674
675
676 static void set_multicast_list(struct device *dev)
677 {
678 short ioaddr = dev->base_addr;
679 int csr6 = inl(ioaddr + CSR6) & ~0x00D5;
680
681 if (dev->flags&IFF_PROMISC)
682 {
683 outl(csr6 | 0x00C0, ioaddr + CSR6);
684
685 printk("%s: Promiscuous mode enabled.\n", dev->name);
686 }
687 else if (dev->mc_count > 15 || (dev->flags&IFF_ALLMULTI))
688 {
689
690 outl(csr6 | 0x0080, ioaddr + CSR6);
691 }
692 else
693 {
694 struct tulip_private *tp = (struct tulip_private *)dev->priv;
695 struct dev_mc_list *dmi=dev->mc_list;
696 int *setup_frm = tp->setup_frame;
697 unsigned short *eaddrs;
698 int i;
699
700
701
702
703 outl(csr6 | 0x0000, ioaddr + CSR6);
704 i=0;
705 while(dmi)
706 {
707 eaddrs=(unsigned short *)dmi->dmi_addr;
708 dmi=dmi->next;
709 i++;
710 *setup_frm++ = *eaddrs++;
711 *setup_frm++ = *eaddrs++;
712 *setup_frm++ = *eaddrs++;
713 }
714
715 eaddrs = (unsigned short *)dev->dev_addr;
716 do {
717 *setup_frm++ = eaddrs[0];
718 *setup_frm++ = eaddrs[1];
719 *setup_frm++ = eaddrs[2];
720 } while (++i < 16);
721
722
723 }
724 }
725
726 static int
727 set_mac_address(struct device *dev, void *addr)
728 {
729 int i;
730 struct sockaddr *sa=(struct sockaddr *)addr;
731 if (dev->start)
732 return -EBUSY;
733 printk("%s: Setting MAC address to ", dev->name);
734 for (i = 0; i < 6; i++)
735 printk(" %2.2x", dev->dev_addr[i] = sa->sa_data[i]);
736 printk(".\n");
737 return 0;
738 }
739
740 #ifdef MODULE
741 static char devicename[9] = { 0, };
742 static struct device dev_tulip = {
743 devicename,
744 0, 0, 0, 0,
745 0, 0,
746 0, 0, 0, NULL, tulip_probe
747 };
748
749 static int io = 0;
750 static int irq = 0;
751
752 int init_module(void)
753 {
754 printk("tulip: Sorry, modularization is not completed\n");
755 return -EIO;
756 #if 0
757 if (io == 0)
758 printk("tulip: You should not use auto-probing with insmod!\n");
759 dev_tulip.base_addr = io;
760 dev_tulip.irq = irq;
761 if (register_netdev(&dev_tulip) != 0) {
762 printk("tulip: register_netdev() returned non-zero.\n");
763 return -EIO;
764 }
765 return 0;
766 #endif
767 }
768
769 void
770 cleanup_module(void)
771 {
772 unregister_netdev(&dev_tulip);
773 }
774 #endif
775
776
777
778
779
780
781
782