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