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