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 static char *version = "lance.c:v0.14g 12/21/93 becker@super.org\n";
18
19 #include <linux/config.h>
20 #include <linux/kernel.h>
21 #include <linux/sched.h>
22 #include <linux/string.h>
23 #include <linux/ptrace.h>
24 #include <linux/errno.h>
25 #include <linux/ioport.h>
26 #include <linux/malloc.h>
27 #include <linux/interrupt.h>
28 #include <asm/bitops.h>
29 #include <asm/io.h>
30 #include <asm/dma.h>
31
32 #include <linux/netdevice.h>
33 #include <linux/etherdevice.h>
34 #include <linux/skbuff.h>
35
36 #ifndef HAVE_PORTRESERVE
37 #define check_region(addr, size) 0
38 #define snarf_region(addr, size) do ; while(0)
39 #endif
40
41 struct device *init_etherdev(struct device *dev, int sizeof_private,
42 unsigned long *mem_startp);
43
44 #ifdef LANCE_DEBUG
45 int lance_debug = LANCE_DEBUG;
46 #else
47 int lance_debug = 1;
48 #endif
49
50 #ifndef LANCE_DMA
51 #define LANCE_DMA 5
52 #endif
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 #ifndef LANCE_LOG_TX_BUFFERS
141 #define LANCE_LOG_TX_BUFFERS 4
142 #define LANCE_LOG_RX_BUFFERS 4
143 #endif
144
145 #define TX_RING_SIZE (1 << (LANCE_LOG_TX_BUFFERS))
146 #define TX_RING_MOD_MASK (TX_RING_SIZE - 1)
147 #define TX_RING_LEN_BITS ((LANCE_LOG_TX_BUFFERS) << 29)
148
149 #define RX_RING_SIZE (1 << (LANCE_LOG_RX_BUFFERS))
150 #define RX_RING_MOD_MASK (RX_RING_SIZE - 1)
151 #define RX_RING_LEN_BITS ((LANCE_LOG_RX_BUFFERS) << 29)
152
153 #define PKT_BUF_SZ 1544
154
155
156 #define LANCE_DATA 0x10
157 #define LANCE_ADDR 0x12
158 #define LANCE_RESET 0x14
159 #define LANCE_BUS_IF 0x16
160 #define LANCE_TOTAL_SIZE 0x18
161
162
163 struct lance_rx_head {
164 int base;
165 short buf_length;
166 short msg_length;
167 };
168
169 struct lance_tx_head {
170 int base;
171 short length;
172 short misc;
173 };
174
175
176 struct lance_init_block {
177 unsigned short mode;
178 unsigned char phys_addr[6];
179 unsigned filter[2];
180
181 unsigned rx_ring;
182 unsigned tx_ring;
183 };
184
185 struct lance_private {
186 char devname[8];
187
188 struct lance_rx_head rx_ring[RX_RING_SIZE];
189 struct lance_tx_head tx_ring[TX_RING_SIZE];
190 struct lance_init_block init_block;
191 long rx_buffs;
192
193 char (*tx_bounce_buffs)[PKT_BUF_SZ];
194 int cur_rx, cur_tx;
195 int dirty_rx, dirty_tx;
196 int dma;
197 struct enet_statistics stats;
198 char old_lance;
199 int pad0, pad1;
200 };
201
202 unsigned long lance_probe1(short ioaddr, unsigned long mem_start);
203 static int lance_open(struct device *dev);
204 static void lance_init_ring(struct device *dev);
205 static int lance_start_xmit(struct sk_buff *skb, struct device *dev);
206 static int lance_rx(struct device *dev);
207 static void lance_interrupt(int reg_ptr);
208 static int lance_close(struct device *dev);
209 static struct enet_statistics *lance_get_stats(struct device *dev);
210 #ifdef HAVE_MULTICAST
211 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
212 #endif
213
214
215
216 unsigned long lance_init(unsigned long mem_start, unsigned long mem_end)
217 {
218 int *port, ports[] = {0x300, 0x320, 0x340, 0x360, 0};
219
220 for (port = &ports[0]; *port; port++) {
221 int ioaddr = *port;
222
223 if ( check_region(ioaddr, LANCE_TOTAL_SIZE) == 0
224 && inb(ioaddr + 14) == 0x57
225 && inb(ioaddr + 15) == 0x57) {
226 mem_start = lance_probe1(ioaddr, mem_start);
227 }
228 }
229
230 return mem_start;
231 }
232
233 unsigned long lance_probe1(short ioaddr, unsigned long mem_start)
234 {
235 struct device *dev;
236 struct lance_private *lp;
237 int hpJ2405A = 0;
238 int i, reset_val;
239
240 hpJ2405A = (inb(ioaddr) == 0x08 && inb(ioaddr+1) == 0x00
241 && inb(ioaddr+2) == 0x09);
242
243
244 reset_val = inw(ioaddr+LANCE_RESET);
245
246
247
248 if (!hpJ2405A)
249 outw(reset_val, ioaddr+LANCE_RESET);
250
251 outw(0x0000, ioaddr+LANCE_ADDR);
252 if (inw(ioaddr+LANCE_DATA) != 0x0004)
253 return mem_start;
254
255 dev = init_etherdev(0, sizeof(struct lance_private)
256 + PKT_BUF_SZ*(RX_RING_SIZE + TX_RING_SIZE),
257 &mem_start);
258
259 printk("%s: LANCE at %#3x,", dev->name, ioaddr);
260
261
262
263 for (i = 0; i < 6; i++)
264 printk(" %2.2x", dev->dev_addr[i] = inb(ioaddr + i));
265
266 dev->base_addr = ioaddr;
267 snarf_region(ioaddr, LANCE_TOTAL_SIZE);
268
269
270 dev->priv = (void *)(((int)dev->priv + 7) & ~7);
271 lp = (struct lance_private *)dev->priv;
272 lp->rx_buffs = (long)dev->priv + sizeof(struct lance_private);
273 lp->tx_bounce_buffs = (char (*)[PKT_BUF_SZ])
274 (lp->rx_buffs + PKT_BUF_SZ*RX_RING_SIZE);
275
276 #ifndef final_version
277
278 if ((int)(lp->rx_ring) & 0x07) {
279 printk(" **ERROR** LANCE Rx and Tx rings not on even boundary.\n");
280 return mem_start;
281 }
282 #endif
283
284 outw(88, ioaddr+LANCE_ADDR);
285 lp->old_lance = (inw(ioaddr+LANCE_DATA) != 0x3003);
286
287 #if defined(notdef)
288 printk(lp->old_lance ? " original LANCE (%04x)" : " PCnet-ISA LANCE (%04x)",
289 inw(ioaddr+LANCE_DATA));
290 #endif
291
292 lp->init_block.mode = 0x0003;
293 for (i = 0; i < 6; i++)
294 lp->init_block.phys_addr[i] = dev->dev_addr[i];
295 lp->init_block.filter[0] = 0x00000000;
296 lp->init_block.filter[1] = 0x00000000;
297 lp->init_block.rx_ring = (int)lp->rx_ring | RX_RING_LEN_BITS;
298 lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
299
300 outw(0x0001, ioaddr+LANCE_ADDR);
301 outw((short) (int) &lp->init_block, ioaddr+LANCE_DATA);
302 outw(0x0002, ioaddr+LANCE_ADDR);
303 outw(((int)&lp->init_block) >> 16, ioaddr+LANCE_DATA);
304 outw(0x0000, ioaddr+LANCE_ADDR);
305
306 if (hpJ2405A) {
307 char dma_tbl[4] = {3, 5, 6, 7};
308 char irq_tbl[8] = {3, 4, 5, 9, 10, 11, 12, 15};
309 short reset_val = inw(ioaddr+LANCE_RESET);
310 dev->dma = dma_tbl[(reset_val >> 2) & 3];
311 dev->irq = irq_tbl[(reset_val >> 4) & 7];
312 printk(" HP J2405A IRQ %d DMA %d.\n", dev->irq, dev->dma);
313 } else {
314
315 if (dev->mem_start & 0x07)
316 dev->dma = dev->mem_start & 0x07;
317 else if (dev->dma == 0)
318 dev->dma = LANCE_DMA;
319
320
321
322 if (dev->irq < 2) {
323
324 autoirq_setup(0);
325
326
327 outw(0x0041, ioaddr+LANCE_DATA);
328
329 dev->irq = autoirq_report(1);
330 if (dev->irq)
331 printk(", probed IRQ %d, fixed at DMA %d.\n",
332 dev->irq, dev->dma);
333 else {
334 printk(", failed to detect IRQ line.\n");
335 return mem_start;
336 }
337 } else
338 printk(" assigned IRQ %d DMA %d.\n", dev->irq, dev->dma);
339 }
340
341 if (! lp->old_lance) {
342
343
344 outw(0x0002, ioaddr+LANCE_ADDR);
345 outw(0x0002, ioaddr+LANCE_BUS_IF);
346 }
347
348 if (lance_debug > 0)
349 printk(version);
350
351
352 dev->open = &lance_open;
353 dev->hard_start_xmit = &lance_start_xmit;
354 dev->stop = &lance_close;
355 dev->get_stats = &lance_get_stats;
356 dev->set_multicast_list = &set_multicast_list;
357
358 return mem_start;
359 }
360
361
362 static int
363 lance_open(struct device *dev)
364 {
365 struct lance_private *lp = (struct lance_private *)dev->priv;
366 int ioaddr = dev->base_addr;
367 int i;
368
369 if (request_irq(dev->irq, &lance_interrupt)) {
370 return -EAGAIN;
371 }
372
373 if (request_dma(dev->dma)) {
374 free_irq(dev->irq);
375 return -EAGAIN;
376 }
377 irq2dev_map[dev->irq] = dev;
378
379
380 inw(ioaddr+LANCE_RESET);
381
382
383 enable_dma(dev->dma);
384 set_dma_mode(dev->dma, DMA_MODE_CASCADE);
385
386
387 if (lp->old_lance)
388 outw(0, ioaddr+LANCE_RESET);
389
390 if (! lp->old_lance) {
391
392 outw(0x0002, ioaddr+LANCE_ADDR);
393 outw(0x0002, ioaddr+LANCE_BUS_IF);
394 }
395
396 if (lance_debug > 1)
397 printk("%s: lance_open() irq %d dma %d tx/rx rings %#x/%#x init %#x.\n",
398 dev->name, dev->irq, dev->dma, (int) lp->tx_ring, (int) lp->rx_ring,
399 (int) &lp->init_block);
400
401 lance_init_ring(dev);
402
403 outw(0x0001, ioaddr+LANCE_ADDR);
404 outw((short) (int) &lp->init_block, ioaddr+LANCE_DATA);
405 outw(0x0002, ioaddr+LANCE_ADDR);
406 outw(((int)&lp->init_block) >> 16, ioaddr+LANCE_DATA);
407
408 outw(0x0004, ioaddr+LANCE_ADDR);
409 outw(0x0d15, ioaddr+LANCE_DATA);
410
411 outw(0x0000, ioaddr+LANCE_ADDR);
412 outw(0x0001, ioaddr+LANCE_DATA);
413
414 dev->tbusy = 0;
415 dev->interrupt = 0;
416 dev->start = 1;
417 i = 0;
418 while (i++ < 100)
419 if (inw(ioaddr+LANCE_DATA) & 0x0100)
420 break;
421 outw(0x0142, ioaddr+LANCE_DATA);
422
423 if (lance_debug > 2)
424 printk("%s: LANCE open after %d ticks, init block %#x csr0 %4.4x.\n",
425 dev->name, i, (int) &lp->init_block, inw(ioaddr+LANCE_DATA));
426
427 return 0;
428 }
429
430
431 static void
432 lance_init_ring(struct device *dev)
433 {
434 struct lance_private *lp = (struct lance_private *)dev->priv;
435 int i;
436
437 lp->cur_rx = lp->cur_tx = 0;
438 lp->dirty_rx = lp->dirty_tx = 0;
439
440 for (i = 0; i < RX_RING_SIZE; i++) {
441 lp->rx_ring[i].base = (lp->rx_buffs + i*PKT_BUF_SZ) | 0x80000000;
442 lp->rx_ring[i].buf_length = -PKT_BUF_SZ;
443 }
444
445
446 for (i = 0; i < TX_RING_SIZE; i++) {
447 lp->tx_ring[i].base = 0;
448 }
449
450 lp->init_block.mode = 0x0000;
451 for (i = 0; i < 6; i++)
452 lp->init_block.phys_addr[i] = dev->dev_addr[i];
453 lp->init_block.filter[0] = 0x00000000;
454 lp->init_block.filter[1] = 0x00000000;
455 lp->init_block.rx_ring = (int)lp->rx_ring | RX_RING_LEN_BITS;
456 lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
457 }
458
459 static int
460 lance_start_xmit(struct sk_buff *skb, struct device *dev)
461 {
462 struct lance_private *lp = (struct lance_private *)dev->priv;
463 int ioaddr = dev->base_addr;
464 int entry;
465
466
467 if (dev->tbusy) {
468 int tickssofar = jiffies - dev->trans_start;
469 if (tickssofar < 10)
470 return 1;
471 outw(0, ioaddr+LANCE_ADDR);
472 printk("%s: transmit timed out, status %4.4x, resetting.\n",
473 dev->name, inw(ioaddr+LANCE_DATA));
474 outw(0x0001, ioaddr+LANCE_DATA);
475 lp->stats.tx_errors++;
476 #ifndef final_version
477 {
478 int i;
479 printk(" Ring data dump: dirty_tx %d cur_tx %d cur_rx %d.",
480 lp->dirty_tx, lp->cur_tx, lp->cur_rx);
481 for (i = 0 ; i < RX_RING_SIZE; i++)
482 printk("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
483 lp->rx_ring[i].base, -lp->rx_ring[i].buf_length,
484 lp->rx_ring[i].msg_length);
485 for (i = 0 ; i < TX_RING_SIZE; i++)
486 printk(" %s%08x %04x %04x", i & 0x3 ? "" : "\n ",
487 lp->tx_ring[i].base, -lp->tx_ring[i].length,
488 lp->tx_ring[i].misc);
489 printk("\n");
490 }
491 #endif
492 lance_init_ring(dev);
493 outw(0x0043, ioaddr+LANCE_DATA);
494
495 dev->tbusy=0;
496 dev->trans_start = jiffies;
497
498 return 0;
499 }
500
501 if (skb == NULL) {
502 dev_tint(dev);
503 return 0;
504 }
505
506 if (skb->len <= 0)
507 return 0;
508
509 if (lance_debug > 3) {
510 outw(0x0000, ioaddr+LANCE_ADDR);
511 printk("%s: lance_start_xmit() called, csr0 %4.4x.\n", dev->name,
512 inw(ioaddr+LANCE_DATA));
513 outw(0x0000, ioaddr+LANCE_DATA);
514 }
515
516
517
518 if (set_bit(0, (void*)&dev->tbusy) != 0)
519 printk("%s: Transmitter access conflict.\n", dev->name);
520
521
522
523
524 entry = lp->cur_tx & TX_RING_MOD_MASK;
525
526
527
528
529
530 if (lp->old_lance) {
531 lp->tx_ring[entry].length =
532 -(ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN);
533 } else
534 lp->tx_ring[entry].length = -skb->len;
535
536 lp->tx_ring[entry].misc = 0x0000;
537
538
539
540 if ((int)(skb->data) + skb->len > 0x01000000) {
541 if (lance_debug > 5)
542 printk("%s: bouncing a high-memory packet (%#x).\n",
543 dev->name, (int)(skb->data));
544 memcpy(&lp->tx_bounce_buffs[entry], skb->data, skb->len);
545 lp->tx_ring[entry].base =
546 (int)(lp->tx_bounce_buffs + entry) | 0x83000000;
547 if (skb->free)
548 kfree_skb (skb, FREE_WRITE);
549 } else {
550
551
552 if(skb->free==0)
553 skb_kept_by_device(skb);
554 lp->tx_ring[entry].base = (int)(skb->data) | 0x83000000;
555 }
556 lp->cur_tx++;
557
558
559 outw(0x0000, ioaddr+LANCE_ADDR);
560 outw(0x0048, ioaddr+LANCE_DATA);
561
562 dev->trans_start = jiffies;
563
564 if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
565 dev->tbusy=0;
566
567 return 0;
568 }
569
570
571 static void
572 lance_interrupt(int reg_ptr)
573 {
574 int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
575 struct device *dev = (struct device *)(irq2dev_map[irq]);
576 struct lance_private *lp;
577 int csr0, ioaddr;
578
579 if (dev == NULL) {
580 printk ("lance_interrupt(): irq %d for unknown device.\n", irq);
581 return;
582 }
583
584 ioaddr = dev->base_addr;
585 lp = (struct lance_private *)dev->priv;
586 if (dev->interrupt)
587 printk("%s: Re-entering the interrupt handler.\n", dev->name);
588
589 dev->interrupt = 1;
590
591 outw(0x00, dev->base_addr + LANCE_ADDR);
592 csr0 = inw(dev->base_addr + LANCE_DATA);
593
594
595 outw(csr0 & ~0x004f, dev->base_addr + LANCE_DATA);
596
597 if (lance_debug > 5)
598 printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
599 dev->name, csr0, inw(dev->base_addr + LANCE_DATA));
600
601 if (csr0 & 0x0400)
602 lance_rx(dev);
603
604 if (csr0 & 0x0200) {
605 int dirty_tx = lp->dirty_tx;
606
607 while (dirty_tx < lp->cur_tx) {
608 int entry = dirty_tx & TX_RING_MOD_MASK;
609 int status = lp->tx_ring[entry].base;
610 void *databuff;
611
612 if (status < 0)
613 break;
614
615 lp->tx_ring[entry].base = 0;
616 databuff = (void*)(status & 0x00ffffff);
617
618 if (status & 0x40000000) {
619 int err_status = lp->tx_ring[entry].misc;
620 lp->stats.tx_errors++;
621 if (err_status & 0x0400) lp->stats.tx_aborted_errors++;
622 if (err_status & 0x0800) lp->stats.tx_carrier_errors++;
623 if (err_status & 0x1000) lp->stats.tx_window_errors++;
624 if (err_status & 0x4000) lp->stats.tx_fifo_errors++;
625
626 } else {
627 if (status & 0x18000000)
628 lp->stats.collisions++;
629 lp->stats.tx_packets++;
630 }
631
632
633
634
635 if (databuff >= (void*)(&lp->tx_bounce_buffs[TX_RING_SIZE])
636 || databuff < (void*)(lp->tx_bounce_buffs)) {
637 struct sk_buff *skb = ((struct sk_buff *)databuff) - 1;
638 if (skb->free)
639 kfree_skb(skb, FREE_WRITE);
640 else
641 skb_device_release(skb,FREE_WRITE);
642
643
644 }
645 dirty_tx++;
646 }
647
648 #ifndef final_version
649 if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
650 printk("out-of-sync dirty pointer, %d vs. %d.\n",
651 dirty_tx, lp->cur_tx);
652 dirty_tx += TX_RING_SIZE;
653 }
654 #endif
655
656 if (dev->tbusy && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
657
658 dev->tbusy = 0;
659 mark_bh(INET_BH);
660 }
661
662 lp->dirty_tx = dirty_tx;
663 }
664
665 if (csr0 & 0x8000) {
666 if (csr0 & 0x4000) lp->stats.tx_errors++;
667 if (csr0 & 0x1000) lp->stats.rx_errors++;
668 }
669
670
671 outw(0x0000, dev->base_addr + LANCE_ADDR);
672 outw(0x7f40, dev->base_addr + LANCE_DATA);
673
674 if (lance_debug > 4)
675 printk("%s: exiting interrupt, csr%d=%#4.4x.\n",
676 dev->name, inw(ioaddr + LANCE_ADDR),
677 inw(dev->base_addr + LANCE_DATA));
678
679 dev->interrupt = 0;
680 return;
681 }
682
683 static int
684 lance_rx(struct device *dev)
685 {
686 struct lance_private *lp = (struct lance_private *)dev->priv;
687 int entry = lp->cur_rx & RX_RING_MOD_MASK;
688
689
690 while (lp->rx_ring[entry].base >= 0) {
691 int status = lp->rx_ring[entry].base >> 24;
692
693 if (status != 0x03) {
694
695
696
697
698 if (status & 0x01)
699 lp->stats.rx_errors++;
700 if (status & 0x20) lp->stats.rx_frame_errors++;
701 if (status & 0x10) lp->stats.rx_over_errors++;
702 if (status & 0x08) lp->stats.rx_crc_errors++;
703 if (status & 0x04) lp->stats.rx_fifo_errors++;
704 } else {
705
706 short pkt_len = lp->rx_ring[entry].msg_length;
707 struct sk_buff *skb;
708
709 skb = alloc_skb(pkt_len, GFP_ATOMIC);
710 if (skb == NULL) {
711 printk("%s: Memory squeeze, deferring packet.\n", dev->name);
712 lp->stats.rx_dropped++;
713 break;
714 }
715 skb->len = pkt_len;
716 skb->dev = dev;
717 memcpy(skb->data,
718 (unsigned char *)(lp->rx_ring[entry].base & 0x00ffffff),
719 pkt_len);
720 netif_rx(skb);
721 lp->stats.rx_packets++;
722 }
723
724 lp->rx_ring[entry].base |= 0x80000000;
725 entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
726 }
727
728
729
730
731 return 0;
732 }
733
734 static int
735 lance_close(struct device *dev)
736 {
737 int ioaddr = dev->base_addr;
738 struct lance_private *lp = (struct lance_private *)dev->priv;
739
740 dev->start = 0;
741 dev->tbusy = 1;
742
743 outw(112, ioaddr+LANCE_ADDR);
744 lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
745
746 outw(0, ioaddr+LANCE_ADDR);
747
748 if (lance_debug > 1)
749 printk("%s: Shutting down ethercard, status was %2.2x.\n",
750 dev->name, inw(ioaddr+LANCE_DATA));
751
752
753
754 outw(0x0004, ioaddr+LANCE_DATA);
755
756 disable_dma(dev->dma);
757
758 free_irq(dev->irq);
759 free_dma(dev->dma);
760
761 irq2dev_map[dev->irq] = 0;
762
763 return 0;
764 }
765
766 static struct enet_statistics *
767 lance_get_stats(struct device *dev)
768 {
769 struct lance_private *lp = (struct lance_private *)dev->priv;
770 short ioaddr = dev->base_addr;
771 short saved_addr;
772
773 cli();
774 saved_addr = inw(ioaddr+LANCE_ADDR);
775 outw(112, ioaddr+LANCE_ADDR);
776 lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
777 outw(saved_addr, ioaddr+LANCE_ADDR);
778 sti();
779
780 return &lp->stats;
781 }
782
783
784
785
786
787
788
789 static void
790 set_multicast_list(struct device *dev, int num_addrs, void *addrs)
791 {
792 short ioaddr = dev->base_addr;
793
794
795 outw(0, ioaddr+LANCE_ADDR);
796 outw(0x0004, ioaddr+LANCE_DATA);
797
798 outw(15, ioaddr+LANCE_ADDR);
799 if (num_addrs >= 0) {
800 short multicast_table[4];
801 int i;
802
803 memset(multicast_table, (num_addrs == 0) ? 0 : -1, sizeof(multicast_table));
804 for (i = 0; i < 4; i++) {
805 outw(8 + i, ioaddr+LANCE_ADDR);
806 outw(multicast_table[i], ioaddr+LANCE_DATA);
807 }
808 outw(0x0000, ioaddr+LANCE_DATA);
809 } else {
810 outw(0x8000, ioaddr+LANCE_DATA);
811 }
812
813 outw(0, ioaddr+LANCE_ADDR);
814 outw(0x0142, ioaddr+LANCE_DATA);
815 }
816
817 #ifdef HAVE_DEVLIST
818 static unsigned int lance_portlist[] = {0x300, 0x320, 0x340, 0x360, 0};
819 struct netdev_entry lance_drv =
820 {"lance", lance_probe1, LANCE_TOTAL_SIZE, lance_portlist};
821 #endif
822
823
824
825
826
827