This source file includes following definitions.
- lance_init
- lance_probe1
- lance_open
- lance_purge_tx_ring
- lance_init_ring
- lance_restart
- lance_start_xmit
- lance_interrupt
- lance_rx
- lance_close
- lance_get_stats
- set_multicast_list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 static const char *version = "lance.c:v1.08 4/10/95 dplatt@3do.com\n";
19
20 #include <linux/config.h>
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 static unsigned int lance_portlist[] = {0x300, 0x320, 0x340, 0x360, 0};
40 void lance_probe1(int ioaddr);
41
42 #ifdef HAVE_DEVLIST
43 struct netdev_entry lance_drv =
44 {"lance", lance_probe1, LANCE_TOTAL_SIZE, lance_portlist};
45 #endif
46
47 #ifdef LANCE_DEBUG
48 int lance_debug = LANCE_DEBUG;
49 #else
50 int lance_debug = 1;
51 #endif
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 #ifndef LANCE_LOG_TX_BUFFERS
144 #define LANCE_LOG_TX_BUFFERS 4
145 #define LANCE_LOG_RX_BUFFERS 4
146 #endif
147
148 #define TX_RING_SIZE (1 << (LANCE_LOG_TX_BUFFERS))
149 #define TX_RING_MOD_MASK (TX_RING_SIZE - 1)
150 #define TX_RING_LEN_BITS ((LANCE_LOG_TX_BUFFERS) << 29)
151
152 #define RX_RING_SIZE (1 << (LANCE_LOG_RX_BUFFERS))
153 #define RX_RING_MOD_MASK (RX_RING_SIZE - 1)
154 #define RX_RING_LEN_BITS ((LANCE_LOG_RX_BUFFERS) << 29)
155
156 #define PKT_BUF_SZ 1544
157
158
159 #define LANCE_DATA 0x10
160 #define LANCE_ADDR 0x12
161 #define LANCE_RESET 0x14
162 #define LANCE_BUS_IF 0x16
163 #define LANCE_TOTAL_SIZE 0x18
164
165
166 struct lance_rx_head {
167 int base;
168 short buf_length;
169 short msg_length;
170 };
171
172 struct lance_tx_head {
173 int base;
174 short length;
175 short misc;
176 };
177
178
179 struct lance_init_block {
180 unsigned short mode;
181 unsigned char phys_addr[6];
182 unsigned filter[2];
183
184 unsigned rx_ring;
185 unsigned tx_ring;
186 };
187
188 struct lance_private {
189
190
191 struct lance_rx_head rx_ring[RX_RING_SIZE];
192 struct lance_tx_head tx_ring[TX_RING_SIZE];
193 struct lance_init_block init_block;
194 const char *name;
195
196 struct sk_buff* tx_skbuff[TX_RING_SIZE];
197 long rx_buffs;
198
199 char (*tx_bounce_buffs)[PKT_BUF_SZ];
200 int cur_rx, cur_tx;
201 int dirty_rx, dirty_tx;
202 int dma;
203 struct enet_statistics stats;
204 unsigned char chip_version;
205 char tx_full;
206 char lock;
207 };
208
209 #define LANCE_MUST_PAD 0x00000001
210 #define LANCE_ENABLE_AUTOSELECT 0x00000002
211 #define LANCE_MUST_REINIT_RING 0x00000004
212 #define LANCE_MUST_UNRESET 0x00000008
213 #define LANCE_HAS_MISSED_FRAME 0x00000010
214
215
216
217
218 static struct lance_chip_type {
219 int id_number;
220 const char *name;
221 int flags;
222 } chip_table[] = {
223 {0x0000, "LANCE 7990",
224 LANCE_MUST_PAD + LANCE_MUST_UNRESET},
225 {0x0003, "PCnet/ISA 79C960",
226 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
227 LANCE_HAS_MISSED_FRAME},
228 {0x2260, "PCnet/ISA+ 79C961",
229 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
230 LANCE_HAS_MISSED_FRAME},
231 {0x2420, "PCnet/PCI 79C970",
232 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
233 LANCE_HAS_MISSED_FRAME},
234
235
236 {0x2430, "PCnet32",
237 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
238 LANCE_HAS_MISSED_FRAME},
239 {0x0, "PCnet (unknown)",
240 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
241 LANCE_HAS_MISSED_FRAME},
242 };
243
244 enum {OLD_LANCE = 0, PCNET_ISA=1, PCNET_ISAP=2, PCNET_PCI=3, PCNET_VLB=4, LANCE_UNKNOWN=5};
245
246
247 static unsigned char pci_irq_line = 0;
248
249
250
251 static unsigned char lance_need_isa_bounce_buffers = 1;
252
253 static int lance_open(struct device *dev);
254 static void lance_init_ring(struct device *dev);
255 static int lance_start_xmit(struct sk_buff *skb, struct device *dev);
256 static int lance_rx(struct device *dev);
257 static void lance_interrupt(int irq, struct pt_regs *regs);
258 static int lance_close(struct device *dev);
259 static struct enet_statistics *lance_get_stats(struct device *dev);
260 #ifdef HAVE_MULTICAST
261 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
262 #endif
263
264
265
266
267
268
269
270
271
272 int lance_init(void)
273 {
274 int *port;
275
276 if (high_memory <= 16*1024*1024)
277 lance_need_isa_bounce_buffers = 0;
278
279 #if defined(CONFIG_PCI)
280 if (pcibios_present()) {
281 int pci_index;
282 printk("lance.c: PCI bios is present, checking for devices...\n");
283 for (pci_index = 0; pci_index < 8; pci_index++) {
284 unsigned char pci_bus, pci_device_fn;
285 unsigned int pci_ioaddr;
286 unsigned short pci_command;
287
288 if (pcibios_find_device (PCI_VENDOR_ID_AMD,
289 PCI_DEVICE_ID_AMD_LANCE, pci_index,
290 &pci_bus, &pci_device_fn) != 0)
291 break;
292 pcibios_read_config_byte(pci_bus, pci_device_fn,
293 PCI_INTERRUPT_LINE, &pci_irq_line);
294 pcibios_read_config_dword(pci_bus, pci_device_fn,
295 PCI_BASE_ADDRESS_0, &pci_ioaddr);
296
297 pci_ioaddr &= ~3;
298
299
300
301
302 pcibios_read_config_word(pci_bus, pci_device_fn,
303 PCI_COMMAND, &pci_command);
304 if ( ! (pci_command & PCI_COMMAND_MASTER)) {
305 printk("PCI Master Bit has not been set. Setting...\n");
306 pci_command |= PCI_COMMAND_MASTER;
307 pcibios_write_config_word(pci_bus, pci_device_fn,
308 PCI_COMMAND, pci_command);
309 }
310 printk("Found PCnet/PCI at %#x, irq %d.\n",
311 pci_ioaddr, pci_irq_line);
312 lance_probe1(pci_ioaddr);
313 pci_irq_line = 0;
314 }
315 }
316 #endif
317
318 for (port = lance_portlist; *port; port++) {
319 int ioaddr = *port;
320
321 if ( check_region(ioaddr, LANCE_TOTAL_SIZE) == 0) {
322
323
324 char offset15, offset14 = inb(ioaddr + 14);
325
326 if ((offset14 == 0x52 || offset14 == 0x57) &&
327 ((offset15 = inb(ioaddr + 15)) == 0x57 || offset15 == 0x44))
328 lance_probe1(ioaddr);
329 }
330 }
331
332 return 0;
333 }
334
335 void lance_probe1(int ioaddr)
336 {
337 struct device *dev;
338 struct lance_private *lp;
339 short dma_channels;
340 int i, reset_val, lance_version;
341 const char *chipname;
342
343 unsigned char hpJ2405A = 0;
344 int hp_builtin = 0;
345 static int did_version = 0;
346
347
348
349
350
351
352 if ( *((unsigned short *) 0x000f0102) == 0x5048) {
353 static const short ioaddr_table[] = { 0x300, 0x320, 0x340, 0x360};
354 int hp_port = ( *((unsigned char *) 0x000f00f1) & 1) ? 0x499 : 0x99;
355
356 if ((inb(hp_port) & 0xc0) == 0x80
357 && ioaddr_table[inb(hp_port) & 3] == ioaddr)
358 hp_builtin = hp_port;
359 }
360
361 hpJ2405A = (inb(ioaddr) == 0x08 && inb(ioaddr+1) == 0x00
362 && inb(ioaddr+2) == 0x09);
363
364
365 reset_val = inw(ioaddr+LANCE_RESET);
366
367
368
369 if (!hpJ2405A)
370 outw(reset_val, ioaddr+LANCE_RESET);
371
372 outw(0x0000, ioaddr+LANCE_ADDR);
373 if (inw(ioaddr+LANCE_DATA) != 0x0004)
374 return;
375
376
377 outw(88, ioaddr+LANCE_ADDR);
378 if (inw(ioaddr+LANCE_ADDR) != 88) {
379 lance_version = 0;
380 } else {
381 int chip_version = inw(ioaddr+LANCE_DATA);
382 outw(89, ioaddr+LANCE_ADDR);
383 chip_version |= inw(ioaddr+LANCE_DATA) << 16;
384 if (lance_debug > 2)
385 printk(" LANCE chip version is %#x.\n", chip_version);
386 if ((chip_version & 0xfff) != 0x003)
387 return;
388 chip_version = (chip_version >> 12) & 0xffff;
389 for (lance_version = 1; chip_table[lance_version].id_number; lance_version++) {
390 if (chip_table[lance_version].id_number == chip_version)
391 break;
392 }
393 }
394
395 dev = init_etherdev(0, 0);
396 chipname = chip_table[lance_version].name;
397 printk("%s: %s at %#3x,", dev->name, chipname, ioaddr);
398
399
400
401 for (i = 0; i < 6; i++)
402 printk(" %2.2x", dev->dev_addr[i] = inb(ioaddr + i));
403
404 dev->base_addr = ioaddr;
405 request_region(ioaddr, LANCE_TOTAL_SIZE, chip_table[lance_version].name);
406
407
408 lp = (struct lance_private *) kmalloc(sizeof(*lp), GFP_DMA | GFP_KERNEL);
409 dev->priv = lp;
410 lp->name = chipname;
411 lp->rx_buffs = (unsigned long) kmalloc(PKT_BUF_SZ*RX_RING_SIZE, GFP_DMA | GFP_KERNEL);
412 lp->tx_bounce_buffs = NULL;
413 if (lance_need_isa_bounce_buffers)
414 lp->tx_bounce_buffs = kmalloc(PKT_BUF_SZ*TX_RING_SIZE, GFP_DMA | GFP_KERNEL);
415
416 lp->chip_version = lance_version;
417
418 lp->init_block.mode = 0x0003;
419 for (i = 0; i < 6; i++)
420 lp->init_block.phys_addr[i] = dev->dev_addr[i];
421 lp->init_block.filter[0] = 0x00000000;
422 lp->init_block.filter[1] = 0x00000000;
423 lp->init_block.rx_ring = (int)lp->rx_ring | RX_RING_LEN_BITS;
424 lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
425
426 outw(0x0001, ioaddr+LANCE_ADDR);
427 inw(ioaddr+LANCE_ADDR);
428 outw((short) (int) &lp->init_block, ioaddr+LANCE_DATA);
429 outw(0x0002, ioaddr+LANCE_ADDR);
430 inw(ioaddr+LANCE_ADDR);
431 outw(((int)&lp->init_block) >> 16, ioaddr+LANCE_DATA);
432 outw(0x0000, ioaddr+LANCE_ADDR);
433 inw(ioaddr+LANCE_ADDR);
434
435 if (pci_irq_line) {
436 dev->dma = 4;
437 dev->irq = pci_irq_line;
438 } else if (hp_builtin) {
439 static const char dma_tbl[4] = {3, 5, 6, 0};
440 static const char irq_tbl[4] = {3, 4, 5, 9};
441 unsigned char port_val = inb(hp_builtin);
442 dev->dma = dma_tbl[(port_val >> 4) & 3];
443 dev->irq = irq_tbl[(port_val >> 2) & 3];
444 printk(" HP Vectra IRQ %d DMA %d.\n", dev->irq, dev->dma);
445 } else if (hpJ2405A) {
446 static const char dma_tbl[4] = {3, 5, 6, 7};
447 static const char irq_tbl[8] = {3, 4, 5, 9, 10, 11, 12, 15};
448 short reset_val = inw(ioaddr+LANCE_RESET);
449 dev->dma = dma_tbl[(reset_val >> 2) & 3];
450 dev->irq = irq_tbl[(reset_val >> 4) & 7];
451 printk(" HP J2405A IRQ %d DMA %d.\n", dev->irq, dev->dma);
452 } else if (lance_version == PCNET_ISAP) {
453 short bus_info;
454 outw(8, ioaddr+LANCE_ADDR);
455 bus_info = inw(ioaddr+LANCE_BUS_IF);
456 dev->dma = bus_info & 0x07;
457 dev->irq = (bus_info >> 4) & 0x0F;
458 } else {
459
460 if (dev->mem_start & 0x07)
461 dev->dma = dev->mem_start & 0x07;
462 }
463
464 if (dev->dma == 0) {
465
466
467 dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) |
468 (inb(DMA2_STAT_REG) & 0xf0);
469 }
470 if (dev->irq >= 2)
471 printk(" assigned IRQ %d", dev->irq);
472 else {
473
474
475
476 autoirq_setup(0);
477
478
479 outw(0x0041, ioaddr+LANCE_DATA);
480
481 dev->irq = autoirq_report(1);
482 if (dev->irq)
483 printk(", probed IRQ %d", dev->irq);
484 else {
485 printk(", failed to detect IRQ line.\n");
486 return;
487 }
488
489
490
491 if (inw(ioaddr+LANCE_DATA) & 0x0100)
492 dev->dma = 4;
493 }
494
495 if (dev->dma == 4) {
496 printk(", no DMA needed.\n");
497 } else if (dev->dma) {
498 if (request_dma(dev->dma, chipname)) {
499 printk("DMA %d allocation failed.\n", dev->dma);
500 return;
501 } else
502 printk(", assigned DMA %d.\n", dev->dma);
503 } else {
504 for (i = 0; i < 4; i++) {
505 static const char dmas[] = { 5, 6, 7, 3 };
506 int dma = dmas[i];
507 int boguscnt;
508
509
510
511 if (test_bit(dma, &dma_channels))
512 continue;
513 outw(0x7f04, ioaddr+LANCE_DATA);
514 if (request_dma(dma, chipname))
515 continue;
516 set_dma_mode(dma, DMA_MODE_CASCADE);
517 enable_dma(dma);
518
519
520 outw(0x0001, ioaddr+LANCE_DATA);
521 for (boguscnt = 100; boguscnt > 0; --boguscnt)
522 if (inw(ioaddr+LANCE_DATA) & 0x0900)
523 break;
524 if (inw(ioaddr+LANCE_DATA) & 0x0100) {
525 dev->dma = dma;
526 printk(", DMA %d.\n", dev->dma);
527 break;
528 } else {
529 disable_dma(dma);
530 free_dma(dma);
531 }
532 }
533 if (i == 4) {
534 printk("DMA detection failed.\n");
535 return;
536 }
537 }
538
539 if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
540
541
542 outw(0x0002, ioaddr+LANCE_ADDR);
543 outw(0x0002, ioaddr+LANCE_BUS_IF);
544 }
545
546 if (lance_debug > 0 && did_version++ == 0)
547 printk(version);
548
549
550 dev->open = &lance_open;
551 dev->hard_start_xmit = &lance_start_xmit;
552 dev->stop = &lance_close;
553 dev->get_stats = &lance_get_stats;
554 dev->set_multicast_list = &set_multicast_list;
555
556 return;
557 }
558
559
560 static int
561 lance_open(struct device *dev)
562 {
563 struct lance_private *lp = (struct lance_private *)dev->priv;
564 int ioaddr = dev->base_addr;
565 int i;
566
567 if (dev->irq == 0 ||
568 request_irq(dev->irq, &lance_interrupt, 0, lp->name)) {
569 return -EAGAIN;
570 }
571
572
573
574
575 irq2dev_map[dev->irq] = dev;
576
577
578 inw(ioaddr+LANCE_RESET);
579
580
581 if (dev->dma != 4) {
582 enable_dma(dev->dma);
583 set_dma_mode(dev->dma, DMA_MODE_CASCADE);
584 }
585
586
587 if (chip_table[lp->chip_version].flags & LANCE_MUST_UNRESET)
588 outw(0, ioaddr+LANCE_RESET);
589
590 if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
591
592 outw(0x0002, ioaddr+LANCE_ADDR);
593 outw(0x0002, ioaddr+LANCE_BUS_IF);
594 }
595
596 if (lance_debug > 1)
597 printk("%s: lance_open() irq %d dma %d tx/rx rings %#x/%#x init %#x.\n",
598 dev->name, dev->irq, dev->dma, (int) lp->tx_ring, (int) lp->rx_ring,
599 (int) &lp->init_block);
600
601 lance_init_ring(dev);
602
603 outw(0x0001, ioaddr+LANCE_ADDR);
604 outw((short) (int) &lp->init_block, ioaddr+LANCE_DATA);
605 outw(0x0002, ioaddr+LANCE_ADDR);
606 outw(((int)&lp->init_block) >> 16, ioaddr+LANCE_DATA);
607
608 outw(0x0004, ioaddr+LANCE_ADDR);
609 outw(0x0915, ioaddr+LANCE_DATA);
610
611 outw(0x0000, ioaddr+LANCE_ADDR);
612 outw(0x0001, ioaddr+LANCE_DATA);
613
614 dev->tbusy = 0;
615 dev->interrupt = 0;
616 dev->start = 1;
617 i = 0;
618 while (i++ < 100)
619 if (inw(ioaddr+LANCE_DATA) & 0x0100)
620 break;
621
622
623
624
625 outw(0x0042, ioaddr+LANCE_DATA);
626
627 if (lance_debug > 2)
628 printk("%s: LANCE open after %d ticks, init block %#x csr0 %4.4x.\n",
629 dev->name, i, (int) &lp->init_block, inw(ioaddr+LANCE_DATA));
630
631 return 0;
632 }
633
634
635
636
637
638
639
640
641
642
643
644
645
646 static void
647 lance_purge_tx_ring(struct device *dev)
648 {
649 struct lance_private *lp = (struct lance_private *)dev->priv;
650 int i;
651
652 for (i = 0; i < TX_RING_SIZE; i++) {
653 if (lp->tx_skbuff[i]) {
654 dev_kfree_skb(lp->tx_skbuff[i],FREE_WRITE);
655 lp->tx_skbuff[i] = NULL;
656 }
657 }
658 }
659
660
661
662 static void
663 lance_init_ring(struct device *dev)
664 {
665 struct lance_private *lp = (struct lance_private *)dev->priv;
666 int i;
667
668 lp->lock = 0, lp->tx_full = 0;
669 lp->cur_rx = lp->cur_tx = 0;
670 lp->dirty_rx = lp->dirty_tx = 0;
671
672 for (i = 0; i < RX_RING_SIZE; i++) {
673 lp->rx_ring[i].base = (lp->rx_buffs + i*PKT_BUF_SZ) | 0x80000000;
674 lp->rx_ring[i].buf_length = -PKT_BUF_SZ;
675 }
676
677
678 for (i = 0; i < TX_RING_SIZE; i++) {
679 lp->tx_ring[i].base = 0;
680 }
681
682 lp->init_block.mode = 0x0000;
683 for (i = 0; i < 6; i++)
684 lp->init_block.phys_addr[i] = dev->dev_addr[i];
685 lp->init_block.filter[0] = 0x00000000;
686 lp->init_block.filter[1] = 0x00000000;
687 lp->init_block.rx_ring = (int)lp->rx_ring | RX_RING_LEN_BITS;
688 lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
689 }
690
691 static void
692 lance_restart(struct device *dev, unsigned int csr0_bits, int must_reinit)
693 {
694 struct lance_private *lp = (struct lance_private *)dev->priv;
695
696 if (must_reinit ||
697 (chip_table[lp->chip_version].flags & LANCE_MUST_REINIT_RING)) {
698 lance_purge_tx_ring(dev);
699 lance_init_ring(dev);
700 }
701 outw(0x0000, dev->base_addr + LANCE_ADDR);
702 outw(csr0_bits, dev->base_addr + LANCE_DATA);
703 }
704
705 static int
706 lance_start_xmit(struct sk_buff *skb, struct device *dev)
707 {
708 struct lance_private *lp = (struct lance_private *)dev->priv;
709 int ioaddr = dev->base_addr;
710 int entry;
711 unsigned long flags;
712
713
714 if (dev->tbusy) {
715 int tickssofar = jiffies - dev->trans_start;
716 if (tickssofar < 20)
717 return 1;
718 outw(0, ioaddr+LANCE_ADDR);
719 printk("%s: transmit timed out, status %4.4x, resetting.\n",
720 dev->name, inw(ioaddr+LANCE_DATA));
721 outw(0x0004, ioaddr+LANCE_DATA);
722 lp->stats.tx_errors++;
723 #ifndef final_version
724 {
725 int i;
726 printk(" Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.",
727 lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "",
728 lp->cur_rx);
729 for (i = 0 ; i < RX_RING_SIZE; i++)
730 printk("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
731 lp->rx_ring[i].base, -lp->rx_ring[i].buf_length,
732 lp->rx_ring[i].msg_length);
733 for (i = 0 ; i < TX_RING_SIZE; i++)
734 printk("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
735 lp->tx_ring[i].base, -lp->tx_ring[i].length,
736 lp->tx_ring[i].misc);
737 printk("\n");
738 }
739 #endif
740 lance_restart(dev, 0x0043, 1);
741
742 dev->tbusy=0;
743 dev->trans_start = jiffies;
744
745 return 0;
746 }
747
748 if (skb == NULL) {
749 dev_tint(dev);
750 return 0;
751 }
752
753 if (skb->len <= 0)
754 return 0;
755
756 if (lance_debug > 3) {
757 outw(0x0000, ioaddr+LANCE_ADDR);
758 printk("%s: lance_start_xmit() called, csr0 %4.4x.\n", dev->name,
759 inw(ioaddr+LANCE_DATA));
760 outw(0x0000, ioaddr+LANCE_DATA);
761 }
762
763
764
765 if (set_bit(0, (void*)&dev->tbusy) != 0) {
766 printk("%s: Transmitter access conflict.\n", dev->name);
767 return 1;
768 }
769
770 if (set_bit(0, (void*)&lp->lock) != 0) {
771 if (lance_debug > 0)
772 printk("%s: tx queue lock!.\n", dev->name);
773
774 return 1;
775 }
776
777
778
779
780 entry = lp->cur_tx & TX_RING_MOD_MASK;
781
782
783
784
785
786 if (chip_table[lp->chip_version].flags & LANCE_MUST_PAD) {
787 lp->tx_ring[entry].length =
788 -(ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN);
789 } else
790 lp->tx_ring[entry].length = -skb->len;
791
792 lp->tx_ring[entry].misc = 0x0000;
793
794
795
796 if ((int)(skb->data) + skb->len > 0x01000000) {
797 if (lance_debug > 5)
798 printk("%s: bouncing a high-memory packet (%#x).\n",
799 dev->name, (int)(skb->data));
800 memcpy(&lp->tx_bounce_buffs[entry], skb->data, skb->len);
801 lp->tx_ring[entry].base =
802 (int)(lp->tx_bounce_buffs + entry) | 0x83000000;
803 dev_kfree_skb (skb, FREE_WRITE);
804 } else {
805 lp->tx_skbuff[entry] = skb;
806 lp->tx_ring[entry].base = (int)(skb->data) | 0x83000000;
807 }
808 lp->cur_tx++;
809
810
811 outw(0x0000, ioaddr+LANCE_ADDR);
812 outw(0x0048, ioaddr+LANCE_DATA);
813
814 dev->trans_start = jiffies;
815
816 save_flags(flags);
817 cli();
818 lp->lock = 0;
819 if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
820 dev->tbusy=0;
821 else
822 lp->tx_full = 1;
823 restore_flags(flags);
824
825 return 0;
826 }
827
828
829 static void
830 lance_interrupt(int irq, struct pt_regs * regs)
831 {
832 struct device *dev = (struct device *)(irq2dev_map[irq]);
833 struct lance_private *lp;
834 int csr0, ioaddr, boguscnt=10;
835 int must_restart;
836
837 if (dev == NULL) {
838 printk ("lance_interrupt(): irq %d for unknown device.\n", irq);
839 return;
840 }
841
842 ioaddr = dev->base_addr;
843 lp = (struct lance_private *)dev->priv;
844 if (dev->interrupt)
845 printk("%s: Re-entering the interrupt handler.\n", dev->name);
846
847 dev->interrupt = 1;
848
849 outw(0x00, dev->base_addr + LANCE_ADDR);
850 while ((csr0 = inw(dev->base_addr + LANCE_DATA)) & 0x8600
851 && --boguscnt >= 0) {
852
853 outw(csr0 & ~0x004f, dev->base_addr + LANCE_DATA);
854
855 must_restart = 0;
856
857 if (lance_debug > 5)
858 printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
859 dev->name, csr0, inw(dev->base_addr + LANCE_DATA));
860
861 if (csr0 & 0x0400)
862 lance_rx(dev);
863
864 if (csr0 & 0x0200) {
865 int dirty_tx = lp->dirty_tx;
866
867 while (dirty_tx < lp->cur_tx) {
868 int entry = dirty_tx & TX_RING_MOD_MASK;
869 int status = lp->tx_ring[entry].base;
870
871 if (status < 0)
872 break;
873
874 lp->tx_ring[entry].base = 0;
875
876 if (status & 0x40000000) {
877
878 int err_status = lp->tx_ring[entry].misc;
879 lp->stats.tx_errors++;
880 if (err_status & 0x0400) lp->stats.tx_aborted_errors++;
881 if (err_status & 0x0800) lp->stats.tx_carrier_errors++;
882 if (err_status & 0x1000) lp->stats.tx_window_errors++;
883 if (err_status & 0x4000) {
884
885 lp->stats.tx_fifo_errors++;
886
887 printk("%s: Tx FIFO error! Status %4.4x.\n",
888 dev->name, csr0);
889
890 must_restart = 1;
891 }
892 } else {
893 if (status & 0x18000000)
894 lp->stats.collisions++;
895 lp->stats.tx_packets++;
896 }
897
898
899
900 if (lp->tx_skbuff[entry]) {
901 dev_kfree_skb(lp->tx_skbuff[entry],FREE_WRITE);
902 lp->tx_skbuff[entry] = 0;
903 }
904 dirty_tx++;
905 }
906
907 #ifndef final_version
908 if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
909 printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
910 dirty_tx, lp->cur_tx, lp->tx_full);
911 dirty_tx += TX_RING_SIZE;
912 }
913 #endif
914
915 if (lp->tx_full && dev->tbusy
916 && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
917
918 lp->tx_full = 0;
919 dev->tbusy = 0;
920 mark_bh(NET_BH);
921 }
922
923 lp->dirty_tx = dirty_tx;
924 }
925
926
927 if (csr0 & 0x4000) lp->stats.tx_errors++;
928 if (csr0 & 0x1000) lp->stats.rx_errors++;
929 if (csr0 & 0x0800) {
930 printk("%s: Bus master arbitration failure, status %4.4x.\n",
931 dev->name, csr0);
932
933 must_restart = 1;
934 }
935
936 if (must_restart) {
937
938 outw(0x0000, dev->base_addr + LANCE_ADDR);
939 outw(0x0004, dev->base_addr + LANCE_DATA);
940 lance_restart(dev, 0x0002, 0);
941 }
942 }
943
944
945 outw(0x0000, dev->base_addr + LANCE_ADDR);
946 outw(0x7940, dev->base_addr + LANCE_DATA);
947
948 if (lance_debug > 4)
949 printk("%s: exiting interrupt, csr%d=%#4.4x.\n",
950 dev->name, inw(ioaddr + LANCE_ADDR),
951 inw(dev->base_addr + LANCE_DATA));
952
953 dev->interrupt = 0;
954 return;
955 }
956
957 static int
958 lance_rx(struct device *dev)
959 {
960 struct lance_private *lp = (struct lance_private *)dev->priv;
961 int entry = lp->cur_rx & RX_RING_MOD_MASK;
962 int i;
963
964
965 while (lp->rx_ring[entry].base >= 0) {
966 int status = lp->rx_ring[entry].base >> 24;
967
968 if (status != 0x03) {
969
970
971
972
973 if (status & 0x01)
974 lp->stats.rx_errors++;
975 if (status & 0x20) lp->stats.rx_frame_errors++;
976 if (status & 0x10) lp->stats.rx_over_errors++;
977 if (status & 0x08) lp->stats.rx_crc_errors++;
978 if (status & 0x04) lp->stats.rx_fifo_errors++;
979 lp->rx_ring[entry].base &= 0x03ffffff;
980 } else {
981
982 short pkt_len = (lp->rx_ring[entry].msg_length & 0xfff)-4;
983 struct sk_buff *skb;
984
985 skb = dev_alloc_skb(pkt_len+2);
986 if (skb == NULL) {
987 printk("%s: Memory squeeze, deferring packet.\n", dev->name);
988 for (i=0; i < RX_RING_SIZE; i++)
989 if (lp->rx_ring[(entry+i) & RX_RING_MOD_MASK].base < 0)
990 break;
991
992 if (i > RX_RING_SIZE -2) {
993 lp->stats.rx_dropped++;
994 lp->rx_ring[entry].base |= 0x80000000;
995 lp->cur_rx++;
996 }
997 break;
998 }
999 skb->dev = dev;
1000 skb_reserve(skb,2);
1001 skb_put(skb,pkt_len);
1002 eth_copy_and_sum(skb,
1003 (unsigned char *)(lp->rx_ring[entry].base & 0x00ffffff),
1004 pkt_len,0);
1005 skb->protocol=eth_type_trans(skb,dev);
1006 netif_rx(skb);
1007 lp->stats.rx_packets++;
1008 }
1009
1010
1011
1012 lp->rx_ring[entry].buf_length = -PKT_BUF_SZ;
1013 lp->rx_ring[entry].base |= 0x80000000;
1014 entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
1015 }
1016
1017
1018
1019
1020 return 0;
1021 }
1022
1023 static int
1024 lance_close(struct device *dev)
1025 {
1026 int ioaddr = dev->base_addr;
1027 struct lance_private *lp = (struct lance_private *)dev->priv;
1028
1029 dev->start = 0;
1030 dev->tbusy = 1;
1031
1032 if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
1033 outw(112, ioaddr+LANCE_ADDR);
1034 lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
1035 }
1036 outw(0, ioaddr+LANCE_ADDR);
1037
1038 if (lance_debug > 1)
1039 printk("%s: Shutting down ethercard, status was %2.2x.\n",
1040 dev->name, inw(ioaddr+LANCE_DATA));
1041
1042
1043
1044 outw(0x0004, ioaddr+LANCE_DATA);
1045
1046 if (dev->dma != 4)
1047 disable_dma(dev->dma);
1048
1049 free_irq(dev->irq);
1050
1051 irq2dev_map[dev->irq] = 0;
1052
1053 return 0;
1054 }
1055
1056 static struct enet_statistics *
1057 lance_get_stats(struct device *dev)
1058 {
1059 struct lance_private *lp = (struct lance_private *)dev->priv;
1060 short ioaddr = dev->base_addr;
1061 short saved_addr;
1062 unsigned long flags;
1063
1064 if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
1065 save_flags(flags);
1066 cli();
1067 saved_addr = inw(ioaddr+LANCE_ADDR);
1068 outw(112, ioaddr+LANCE_ADDR);
1069 lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
1070 outw(saved_addr, ioaddr+LANCE_ADDR);
1071 restore_flags(flags);
1072 }
1073
1074 return &lp->stats;
1075 }
1076
1077
1078
1079
1080
1081
1082
1083
1084 static void
1085 set_multicast_list(struct device *dev, int num_addrs, void *addrs)
1086 {
1087 short ioaddr = dev->base_addr;
1088
1089 outw(0, ioaddr+LANCE_ADDR);
1090 outw(0x0004, ioaddr+LANCE_DATA);
1091
1092 if (num_addrs >= 0 || num_addrs==-2) {
1093 short multicast_table[4];
1094 int i;
1095
1096 memset(multicast_table, (num_addrs == 0) ? 0 : -1, sizeof(multicast_table));
1097 for (i = 0; i < 4; i++) {
1098 outw(8 + i, ioaddr+LANCE_ADDR);
1099 outw(multicast_table[i], ioaddr+LANCE_DATA);
1100 }
1101 outw(15, ioaddr+LANCE_ADDR);
1102 outw(0x0000, ioaddr+LANCE_DATA);
1103 } else {
1104
1105 printk("%s: Promiscuous mode enabled.\n", dev->name);
1106 outw(15, ioaddr+LANCE_ADDR);
1107 outw(0x8000, ioaddr+LANCE_DATA);
1108 }
1109
1110 lance_restart(dev, 0x0142, 0);
1111
1112 }
1113
1114
1115
1116
1117
1118
1119
1120
1121