1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45static const char version[] = "lance.c:v1.16 2006/11/09 dplatt@3do.com, becker@cesdis.gsfc.nasa.gov\n";
46
47#include <linux/module.h>
48#include <linux/kernel.h>
49#include <linux/string.h>
50#include <linux/delay.h>
51#include <linux/errno.h>
52#include <linux/ioport.h>
53#include <linux/slab.h>
54#include <linux/interrupt.h>
55#include <linux/pci.h>
56#include <linux/init.h>
57#include <linux/netdevice.h>
58#include <linux/etherdevice.h>
59#include <linux/skbuff.h>
60#include <linux/mm.h>
61#include <linux/bitops.h>
62
63#include <asm/io.h>
64#include <asm/dma.h>
65
66static unsigned int lance_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x360, 0};
67static int lance_probe1(struct net_device *dev, int ioaddr, int irq, int options);
68static int __init do_lance_probe(struct net_device *dev);
69
70
71static struct card {
72 char id_offset14;
73 char id_offset15;
74} cards[] = {
75 {
76 .id_offset14 = 0x57,
77 .id_offset15 = 0x57,
78 },
79 {
80 .id_offset14 = 0x52,
81 .id_offset15 = 0x44,
82 },
83 {
84 .id_offset14 = 0x52,
85 .id_offset15 = 0x49,
86 },
87};
88#define NUM_CARDS 3
89
90#ifdef LANCE_DEBUG
91static int lance_debug = LANCE_DEBUG;
92#else
93static int lance_debug = 1;
94#endif
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188#ifndef LANCE_LOG_TX_BUFFERS
189#define LANCE_LOG_TX_BUFFERS 4
190#define LANCE_LOG_RX_BUFFERS 4
191#endif
192
193#define TX_RING_SIZE (1 << (LANCE_LOG_TX_BUFFERS))
194#define TX_RING_MOD_MASK (TX_RING_SIZE - 1)
195#define TX_RING_LEN_BITS ((LANCE_LOG_TX_BUFFERS) << 29)
196
197#define RX_RING_SIZE (1 << (LANCE_LOG_RX_BUFFERS))
198#define RX_RING_MOD_MASK (RX_RING_SIZE - 1)
199#define RX_RING_LEN_BITS ((LANCE_LOG_RX_BUFFERS) << 29)
200
201#define PKT_BUF_SZ 1544
202
203
204#define LANCE_DATA 0x10
205#define LANCE_ADDR 0x12
206#define LANCE_RESET 0x14
207#define LANCE_BUS_IF 0x16
208#define LANCE_TOTAL_SIZE 0x18
209
210#define TX_TIMEOUT (HZ/5)
211
212
213struct lance_rx_head {
214 s32 base;
215 s16 buf_length;
216 s16 msg_length;
217};
218
219struct lance_tx_head {
220 s32 base;
221 s16 length;
222 s16 misc;
223};
224
225
226struct lance_init_block {
227 u16 mode;
228 u8 phys_addr[6];
229 u32 filter[2];
230
231 u32 rx_ring;
232 u32 tx_ring;
233};
234
235struct lance_private {
236
237 struct lance_rx_head rx_ring[RX_RING_SIZE];
238 struct lance_tx_head tx_ring[TX_RING_SIZE];
239 struct lance_init_block init_block;
240 const char *name;
241
242 struct sk_buff* tx_skbuff[TX_RING_SIZE];
243
244 struct sk_buff* rx_skbuff[RX_RING_SIZE];
245 unsigned long rx_buffs;
246
247 char (*tx_bounce_buffs)[PKT_BUF_SZ];
248 int cur_rx, cur_tx;
249 int dirty_rx, dirty_tx;
250 int dma;
251 unsigned char chip_version;
252 spinlock_t devlock;
253};
254
255#define LANCE_MUST_PAD 0x00000001
256#define LANCE_ENABLE_AUTOSELECT 0x00000002
257#define LANCE_MUST_REINIT_RING 0x00000004
258#define LANCE_MUST_UNRESET 0x00000008
259#define LANCE_HAS_MISSED_FRAME 0x00000010
260
261
262
263
264static struct lance_chip_type {
265 int id_number;
266 const char *name;
267 int flags;
268} chip_table[] = {
269 {0x0000, "LANCE 7990",
270 LANCE_MUST_PAD + LANCE_MUST_UNRESET},
271 {0x0003, "PCnet/ISA 79C960",
272 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
273 LANCE_HAS_MISSED_FRAME},
274 {0x2260, "PCnet/ISA+ 79C961",
275 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
276 LANCE_HAS_MISSED_FRAME},
277 {0x2420, "PCnet/PCI 79C970",
278 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
279 LANCE_HAS_MISSED_FRAME},
280
281
282 {0x2430, "PCnet32",
283 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
284 LANCE_HAS_MISSED_FRAME},
285 {0x2621, "PCnet/PCI-II 79C970A",
286 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
287 LANCE_HAS_MISSED_FRAME},
288 {0x0, "PCnet (unknown)",
289 LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
290 LANCE_HAS_MISSED_FRAME},
291};
292
293enum {OLD_LANCE = 0, PCNET_ISA=1, PCNET_ISAP=2, PCNET_PCI=3, PCNET_VLB=4, PCNET_PCI_II=5, LANCE_UNKNOWN=6};
294
295
296
297
298static unsigned char lance_need_isa_bounce_buffers = 1;
299
300static int lance_open(struct net_device *dev);
301static void lance_init_ring(struct net_device *dev, gfp_t mode);
302static netdev_tx_t lance_start_xmit(struct sk_buff *skb,
303 struct net_device *dev);
304static int lance_rx(struct net_device *dev);
305static irqreturn_t lance_interrupt(int irq, void *dev_id);
306static int lance_close(struct net_device *dev);
307static struct net_device_stats *lance_get_stats(struct net_device *dev);
308static void set_multicast_list(struct net_device *dev);
309static void lance_tx_timeout (struct net_device *dev, unsigned int txqueue);
310
311
312
313#ifdef MODULE
314#define MAX_CARDS 8
315
316static struct net_device *dev_lance[MAX_CARDS];
317static int io[MAX_CARDS];
318static int dma[MAX_CARDS];
319static int irq[MAX_CARDS];
320
321module_param_hw_array(io, int, ioport, NULL, 0);
322module_param_hw_array(dma, int, dma, NULL, 0);
323module_param_hw_array(irq, int, irq, NULL, 0);
324module_param(lance_debug, int, 0);
325MODULE_PARM_DESC(io, "LANCE/PCnet I/O base address(es),required");
326MODULE_PARM_DESC(dma, "LANCE/PCnet ISA DMA channel (ignored for some devices)");
327MODULE_PARM_DESC(irq, "LANCE/PCnet IRQ number (ignored for some devices)");
328MODULE_PARM_DESC(lance_debug, "LANCE/PCnet debug level (0-7)");
329
330static int __init lance_init_module(void)
331{
332 struct net_device *dev;
333 int this_dev, found = 0;
334
335 for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) {
336 if (io[this_dev] == 0) {
337 if (this_dev != 0)
338 break;
339 printk(KERN_NOTICE "lance.c: Module autoprobing not allowed. Append \"io=0xNNN\" value(s).\n");
340 return -EPERM;
341 }
342 dev = alloc_etherdev(0);
343 if (!dev)
344 break;
345 dev->irq = irq[this_dev];
346 dev->base_addr = io[this_dev];
347 dev->dma = dma[this_dev];
348 if (do_lance_probe(dev) == 0) {
349 dev_lance[found++] = dev;
350 continue;
351 }
352 free_netdev(dev);
353 break;
354 }
355 if (found != 0)
356 return 0;
357 return -ENXIO;
358}
359module_init(lance_init_module);
360
361static void cleanup_card(struct net_device *dev)
362{
363 struct lance_private *lp = dev->ml_priv;
364 if (dev->dma != 4)
365 free_dma(dev->dma);
366 release_region(dev->base_addr, LANCE_TOTAL_SIZE);
367 kfree(lp->tx_bounce_buffs);
368 kfree((void*)lp->rx_buffs);
369 kfree(lp);
370}
371
372static void __exit lance_cleanup_module(void)
373{
374 int this_dev;
375
376 for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) {
377 struct net_device *dev = dev_lance[this_dev];
378 if (dev) {
379 unregister_netdev(dev);
380 cleanup_card(dev);
381 free_netdev(dev);
382 }
383 }
384}
385module_exit(lance_cleanup_module);
386#endif
387MODULE_LICENSE("GPL");
388
389
390
391
392
393
394static int __init do_lance_probe(struct net_device *dev)
395{
396 unsigned int *port;
397 int result;
398
399 if (high_memory <= phys_to_virt(16*1024*1024))
400 lance_need_isa_bounce_buffers = 0;
401
402 for (port = lance_portlist; *port; port++) {
403 int ioaddr = *port;
404 struct resource *r = request_region(ioaddr, LANCE_TOTAL_SIZE,
405 "lance-probe");
406
407 if (r) {
408
409 char offset14 = inb(ioaddr + 14);
410 int card;
411 for (card = 0; card < NUM_CARDS; ++card)
412 if (cards[card].id_offset14 == offset14)
413 break;
414 if (card < NUM_CARDS) {
415 char offset15 = inb(ioaddr + 15);
416 for (card = 0; card < NUM_CARDS; ++card)
417 if ((cards[card].id_offset14 == offset14) &&
418 (cards[card].id_offset15 == offset15))
419 break;
420 }
421 if (card < NUM_CARDS) {
422 result = lance_probe1(dev, ioaddr, 0, 0);
423 if (!result) {
424 struct lance_private *lp = dev->ml_priv;
425 int ver = lp->chip_version;
426
427 r->name = chip_table[ver].name;
428 return 0;
429 }
430 }
431 release_region(ioaddr, LANCE_TOTAL_SIZE);
432 }
433 }
434 return -ENODEV;
435}
436
437#ifndef MODULE
438struct net_device * __init lance_probe(int unit)
439{
440 struct net_device *dev = alloc_etherdev(0);
441 int err;
442
443 if (!dev)
444 return ERR_PTR(-ENODEV);
445
446 sprintf(dev->name, "eth%d", unit);
447 netdev_boot_setup_check(dev);
448
449 err = do_lance_probe(dev);
450 if (err)
451 goto out;
452 return dev;
453out:
454 free_netdev(dev);
455 return ERR_PTR(err);
456}
457#endif
458
459static const struct net_device_ops lance_netdev_ops = {
460 .ndo_open = lance_open,
461 .ndo_start_xmit = lance_start_xmit,
462 .ndo_stop = lance_close,
463 .ndo_get_stats = lance_get_stats,
464 .ndo_set_rx_mode = set_multicast_list,
465 .ndo_tx_timeout = lance_tx_timeout,
466 .ndo_set_mac_address = eth_mac_addr,
467 .ndo_validate_addr = eth_validate_addr,
468};
469
470static int __init lance_probe1(struct net_device *dev, int ioaddr, int irq, int options)
471{
472 struct lance_private *lp;
473 unsigned long dma_channels;
474 int i, reset_val, lance_version;
475 const char *chipname;
476
477 unsigned char hpJ2405A = 0;
478 int hp_builtin = 0;
479 static int did_version;
480 unsigned long flags;
481 int err = -ENOMEM;
482 void __iomem *bios;
483
484
485
486
487
488
489 bios = ioremap(0xf00f0, 0x14);
490 if (!bios)
491 return -ENOMEM;
492 if (readw(bios + 0x12) == 0x5048) {
493 static const short ioaddr_table[] = { 0x300, 0x320, 0x340, 0x360};
494 int hp_port = (readl(bios + 1) & 1) ? 0x499 : 0x99;
495
496 if ((inb(hp_port) & 0xc0) == 0x80 &&
497 ioaddr_table[inb(hp_port) & 3] == ioaddr)
498 hp_builtin = hp_port;
499 }
500 iounmap(bios);
501
502 hpJ2405A = (inb(ioaddr) == 0x08 && inb(ioaddr+1) == 0x00 &&
503 inb(ioaddr+2) == 0x09);
504
505
506 reset_val = inw(ioaddr+LANCE_RESET);
507
508
509
510 if (!hpJ2405A)
511 outw(reset_val, ioaddr+LANCE_RESET);
512
513 outw(0x0000, ioaddr+LANCE_ADDR);
514 if (inw(ioaddr+LANCE_DATA) != 0x0004)
515 return -ENODEV;
516
517
518 outw(88, ioaddr+LANCE_ADDR);
519 if (inw(ioaddr+LANCE_ADDR) != 88) {
520 lance_version = 0;
521 } else {
522 int chip_version = inw(ioaddr+LANCE_DATA);
523 outw(89, ioaddr+LANCE_ADDR);
524 chip_version |= inw(ioaddr+LANCE_DATA) << 16;
525 if (lance_debug > 2)
526 printk(" LANCE chip version is %#x.\n", chip_version);
527 if ((chip_version & 0xfff) != 0x003)
528 return -ENODEV;
529 chip_version = (chip_version >> 12) & 0xffff;
530 for (lance_version = 1; chip_table[lance_version].id_number; lance_version++) {
531 if (chip_table[lance_version].id_number == chip_version)
532 break;
533 }
534 }
535
536
537
538 chipname = chip_table[lance_version].name;
539 printk("%s: %s at %#3x, ", dev->name, chipname, ioaddr);
540
541
542
543 for (i = 0; i < 6; i++)
544 dev->dev_addr[i] = inb(ioaddr + i);
545 printk("%pM", dev->dev_addr);
546
547 dev->base_addr = ioaddr;
548
549
550 lp = kzalloc(sizeof(*lp), GFP_DMA | GFP_KERNEL);
551 if (!lp)
552 return -ENOMEM;
553 if (lance_debug > 6) printk(" (#0x%05lx)", (unsigned long)lp);
554 dev->ml_priv = lp;
555 lp->name = chipname;
556 lp->rx_buffs = (unsigned long)kmalloc_array(RX_RING_SIZE, PKT_BUF_SZ,
557 GFP_DMA | GFP_KERNEL);
558 if (!lp->rx_buffs)
559 goto out_lp;
560 if (lance_need_isa_bounce_buffers) {
561 lp->tx_bounce_buffs = kmalloc_array(TX_RING_SIZE, PKT_BUF_SZ,
562 GFP_DMA | GFP_KERNEL);
563 if (!lp->tx_bounce_buffs)
564 goto out_rx;
565 } else
566 lp->tx_bounce_buffs = NULL;
567
568 lp->chip_version = lance_version;
569 spin_lock_init(&lp->devlock);
570
571 lp->init_block.mode = 0x0003;
572 for (i = 0; i < 6; i++)
573 lp->init_block.phys_addr[i] = dev->dev_addr[i];
574 lp->init_block.filter[0] = 0x00000000;
575 lp->init_block.filter[1] = 0x00000000;
576 lp->init_block.rx_ring = ((u32)isa_virt_to_bus(lp->rx_ring) & 0xffffff) | RX_RING_LEN_BITS;
577 lp->init_block.tx_ring = ((u32)isa_virt_to_bus(lp->tx_ring) & 0xffffff) | TX_RING_LEN_BITS;
578
579 outw(0x0001, ioaddr+LANCE_ADDR);
580 inw(ioaddr+LANCE_ADDR);
581 outw((short) (u32) isa_virt_to_bus(&lp->init_block), ioaddr+LANCE_DATA);
582 outw(0x0002, ioaddr+LANCE_ADDR);
583 inw(ioaddr+LANCE_ADDR);
584 outw(((u32)isa_virt_to_bus(&lp->init_block)) >> 16, ioaddr+LANCE_DATA);
585 outw(0x0000, ioaddr+LANCE_ADDR);
586 inw(ioaddr+LANCE_ADDR);
587
588 if (irq) {
589 dev->dma = 4;
590 dev->irq = irq;
591 } else if (hp_builtin) {
592 static const char dma_tbl[4] = {3, 5, 6, 0};
593 static const char irq_tbl[4] = {3, 4, 5, 9};
594 unsigned char port_val = inb(hp_builtin);
595 dev->dma = dma_tbl[(port_val >> 4) & 3];
596 dev->irq = irq_tbl[(port_val >> 2) & 3];
597 printk(" HP Vectra IRQ %d DMA %d.\n", dev->irq, dev->dma);
598 } else if (hpJ2405A) {
599 static const char dma_tbl[4] = {3, 5, 6, 7};
600 static const char irq_tbl[8] = {3, 4, 5, 9, 10, 11, 12, 15};
601 short reset_val = inw(ioaddr+LANCE_RESET);
602 dev->dma = dma_tbl[(reset_val >> 2) & 3];
603 dev->irq = irq_tbl[(reset_val >> 4) & 7];
604 printk(" HP J2405A IRQ %d DMA %d.\n", dev->irq, dev->dma);
605 } else if (lance_version == PCNET_ISAP) {
606 short bus_info;
607 outw(8, ioaddr+LANCE_ADDR);
608 bus_info = inw(ioaddr+LANCE_BUS_IF);
609 dev->dma = bus_info & 0x07;
610 dev->irq = (bus_info >> 4) & 0x0F;
611 } else {
612
613 if (dev->mem_start & 0x07)
614 dev->dma = dev->mem_start & 0x07;
615 }
616
617 if (dev->dma == 0) {
618
619
620 dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) |
621 (inb(DMA2_STAT_REG) & 0xf0);
622 }
623 err = -ENODEV;
624 if (dev->irq >= 2)
625 printk(" assigned IRQ %d", dev->irq);
626 else if (lance_version != 0) {
627 unsigned long irq_mask;
628
629
630
631
632 irq_mask = probe_irq_on();
633
634
635 outw(0x0041, ioaddr+LANCE_DATA);
636
637 mdelay(20);
638 dev->irq = probe_irq_off(irq_mask);
639 if (dev->irq)
640 printk(", probed IRQ %d", dev->irq);
641 else {
642 printk(", failed to detect IRQ line.\n");
643 goto out_tx;
644 }
645
646
647
648 if (inw(ioaddr+LANCE_DATA) & 0x0100)
649 dev->dma = 4;
650 }
651
652 if (dev->dma == 4) {
653 printk(", no DMA needed.\n");
654 } else if (dev->dma) {
655 if (request_dma(dev->dma, chipname)) {
656 printk("DMA %d allocation failed.\n", dev->dma);
657 goto out_tx;
658 } else
659 printk(", assigned DMA %d.\n", dev->dma);
660 } else {
661 for (i = 0; i < 4; i++) {
662 static const char dmas[] = { 5, 6, 7, 3 };
663 int dma = dmas[i];
664 int boguscnt;
665
666
667
668 if (test_bit(dma, &dma_channels))
669 continue;
670 outw(0x7f04, ioaddr+LANCE_DATA);
671 if (request_dma(dma, chipname))
672 continue;
673
674 flags=claim_dma_lock();
675 set_dma_mode(dma, DMA_MODE_CASCADE);
676 enable_dma(dma);
677 release_dma_lock(flags);
678
679
680 outw(0x0001, ioaddr+LANCE_DATA);
681 for (boguscnt = 100; boguscnt > 0; --boguscnt)
682 if (inw(ioaddr+LANCE_DATA) & 0x0900)
683 break;
684 if (inw(ioaddr+LANCE_DATA) & 0x0100) {
685 dev->dma = dma;
686 printk(", DMA %d.\n", dev->dma);
687 break;
688 } else {
689 flags=claim_dma_lock();
690 disable_dma(dma);
691 release_dma_lock(flags);
692 free_dma(dma);
693 }
694 }
695 if (i == 4) {
696 printk("DMA detection failed.\n");
697 goto out_tx;
698 }
699 }
700
701 if (lance_version == 0 && dev->irq == 0) {
702
703
704 unsigned long irq_mask;
705
706 irq_mask = probe_irq_on();
707 outw(0x0041, ioaddr+LANCE_DATA);
708
709 mdelay(40);
710 dev->irq = probe_irq_off(irq_mask);
711 if (dev->irq == 0) {
712 printk(" Failed to detect the 7990 IRQ line.\n");
713 goto out_dma;
714 }
715 printk(" Auto-IRQ detected IRQ%d.\n", dev->irq);
716 }
717
718 if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
719
720
721 outw(0x0002, ioaddr+LANCE_ADDR);
722
723 outw(inw(ioaddr+LANCE_BUS_IF) | 0x0002, ioaddr+LANCE_BUS_IF);
724 }
725
726 if (lance_debug > 0 && did_version++ == 0)
727 printk(version);
728
729
730 dev->netdev_ops = &lance_netdev_ops;
731 dev->watchdog_timeo = TX_TIMEOUT;
732
733 err = register_netdev(dev);
734 if (err)
735 goto out_dma;
736 return 0;
737out_dma:
738 if (dev->dma != 4)
739 free_dma(dev->dma);
740out_tx:
741 kfree(lp->tx_bounce_buffs);
742out_rx:
743 kfree((void*)lp->rx_buffs);
744out_lp:
745 kfree(lp);
746 return err;
747}
748
749
750static int
751lance_open(struct net_device *dev)
752{
753 struct lance_private *lp = dev->ml_priv;
754 int ioaddr = dev->base_addr;
755 int i;
756
757 if (dev->irq == 0 ||
758 request_irq(dev->irq, lance_interrupt, 0, dev->name, dev)) {
759 return -EAGAIN;
760 }
761
762
763
764
765
766 inw(ioaddr+LANCE_RESET);
767
768
769 if (dev->dma != 4) {
770 unsigned long flags=claim_dma_lock();
771 enable_dma(dev->dma);
772 set_dma_mode(dev->dma, DMA_MODE_CASCADE);
773 release_dma_lock(flags);
774 }
775
776
777 if (chip_table[lp->chip_version].flags & LANCE_MUST_UNRESET)
778 outw(0, ioaddr+LANCE_RESET);
779
780 if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
781
782 outw(0x0002, ioaddr+LANCE_ADDR);
783
784 outw(inw(ioaddr+LANCE_BUS_IF) | 0x0002, ioaddr+LANCE_BUS_IF);
785 }
786
787 if (lance_debug > 1)
788 printk("%s: lance_open() irq %d dma %d tx/rx rings %#x/%#x init %#x.\n",
789 dev->name, dev->irq, dev->dma,
790 (u32) isa_virt_to_bus(lp->tx_ring),
791 (u32) isa_virt_to_bus(lp->rx_ring),
792 (u32) isa_virt_to_bus(&lp->init_block));
793
794 lance_init_ring(dev, GFP_KERNEL);
795
796 outw(0x0001, ioaddr+LANCE_ADDR);
797 outw((short) (u32) isa_virt_to_bus(&lp->init_block), ioaddr+LANCE_DATA);
798 outw(0x0002, ioaddr+LANCE_ADDR);
799 outw(((u32)isa_virt_to_bus(&lp->init_block)) >> 16, ioaddr+LANCE_DATA);
800
801 outw(0x0004, ioaddr+LANCE_ADDR);
802 outw(0x0915, ioaddr+LANCE_DATA);
803
804 outw(0x0000, ioaddr+LANCE_ADDR);
805 outw(0x0001, ioaddr+LANCE_DATA);
806
807 netif_start_queue (dev);
808
809 i = 0;
810 while (i++ < 100)
811 if (inw(ioaddr+LANCE_DATA) & 0x0100)
812 break;
813
814
815
816
817 outw(0x0042, ioaddr+LANCE_DATA);
818
819 if (lance_debug > 2)
820 printk("%s: LANCE open after %d ticks, init block %#x csr0 %4.4x.\n",
821 dev->name, i, (u32) isa_virt_to_bus(&lp->init_block), inw(ioaddr+LANCE_DATA));
822
823 return 0;
824}
825
826
827
828
829
830
831
832
833
834
835
836
837
838static void
839lance_purge_ring(struct net_device *dev)
840{
841 struct lance_private *lp = dev->ml_priv;
842 int i;
843
844
845 for (i = 0; i < RX_RING_SIZE; i++) {
846 struct sk_buff *skb = lp->rx_skbuff[i];
847 lp->rx_skbuff[i] = NULL;
848 lp->rx_ring[i].base = 0;
849 if (skb)
850 dev_kfree_skb_any(skb);
851 }
852 for (i = 0; i < TX_RING_SIZE; i++) {
853 if (lp->tx_skbuff[i]) {
854 dev_kfree_skb_any(lp->tx_skbuff[i]);
855 lp->tx_skbuff[i] = NULL;
856 }
857 }
858}
859
860
861
862static void
863lance_init_ring(struct net_device *dev, gfp_t gfp)
864{
865 struct lance_private *lp = dev->ml_priv;
866 int i;
867
868 lp->cur_rx = lp->cur_tx = 0;
869 lp->dirty_rx = lp->dirty_tx = 0;
870
871 for (i = 0; i < RX_RING_SIZE; i++) {
872 struct sk_buff *skb;
873 void *rx_buff;
874
875 skb = alloc_skb(PKT_BUF_SZ, GFP_DMA | gfp);
876 lp->rx_skbuff[i] = skb;
877 if (skb)
878 rx_buff = skb->data;
879 else
880 rx_buff = kmalloc(PKT_BUF_SZ, GFP_DMA | gfp);
881 if (rx_buff == NULL)
882 lp->rx_ring[i].base = 0;
883 else
884 lp->rx_ring[i].base = (u32)isa_virt_to_bus(rx_buff) | 0x80000000;
885 lp->rx_ring[i].buf_length = -PKT_BUF_SZ;
886 }
887
888
889 for (i = 0; i < TX_RING_SIZE; i++) {
890 lp->tx_skbuff[i] = NULL;
891 lp->tx_ring[i].base = 0;
892 }
893
894 lp->init_block.mode = 0x0000;
895 for (i = 0; i < 6; i++)
896 lp->init_block.phys_addr[i] = dev->dev_addr[i];
897 lp->init_block.filter[0] = 0x00000000;
898 lp->init_block.filter[1] = 0x00000000;
899 lp->init_block.rx_ring = ((u32)isa_virt_to_bus(lp->rx_ring) & 0xffffff) | RX_RING_LEN_BITS;
900 lp->init_block.tx_ring = ((u32)isa_virt_to_bus(lp->tx_ring) & 0xffffff) | TX_RING_LEN_BITS;
901}
902
903static void
904lance_restart(struct net_device *dev, unsigned int csr0_bits, int must_reinit)
905{
906 struct lance_private *lp = dev->ml_priv;
907
908 if (must_reinit ||
909 (chip_table[lp->chip_version].flags & LANCE_MUST_REINIT_RING)) {
910 lance_purge_ring(dev);
911 lance_init_ring(dev, GFP_ATOMIC);
912 }
913 outw(0x0000, dev->base_addr + LANCE_ADDR);
914 outw(csr0_bits, dev->base_addr + LANCE_DATA);
915}
916
917
918static void lance_tx_timeout (struct net_device *dev, unsigned int txqueue)
919{
920 struct lance_private *lp = (struct lance_private *) dev->ml_priv;
921 int ioaddr = dev->base_addr;
922
923 outw (0, ioaddr + LANCE_ADDR);
924 printk ("%s: transmit timed out, status %4.4x, resetting.\n",
925 dev->name, inw (ioaddr + LANCE_DATA));
926 outw (0x0004, ioaddr + LANCE_DATA);
927 dev->stats.tx_errors++;
928#ifndef final_version
929 if (lance_debug > 3) {
930 int i;
931 printk (" Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.",
932 lp->dirty_tx, lp->cur_tx, netif_queue_stopped(dev) ? " (full)" : "",
933 lp->cur_rx);
934 for (i = 0; i < RX_RING_SIZE; i++)
935 printk ("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
936 lp->rx_ring[i].base, -lp->rx_ring[i].buf_length,
937 lp->rx_ring[i].msg_length);
938 for (i = 0; i < TX_RING_SIZE; i++)
939 printk ("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
940 lp->tx_ring[i].base, -lp->tx_ring[i].length,
941 lp->tx_ring[i].misc);
942 printk ("\n");
943 }
944#endif
945 lance_restart (dev, 0x0043, 1);
946
947 netif_trans_update(dev);
948 netif_wake_queue (dev);
949}
950
951
952static netdev_tx_t lance_start_xmit(struct sk_buff *skb,
953 struct net_device *dev)
954{
955 struct lance_private *lp = dev->ml_priv;
956 int ioaddr = dev->base_addr;
957 int entry;
958 unsigned long flags;
959
960 spin_lock_irqsave(&lp->devlock, flags);
961
962 if (lance_debug > 3) {
963 outw(0x0000, ioaddr+LANCE_ADDR);
964 printk("%s: lance_start_xmit() called, csr0 %4.4x.\n", dev->name,
965 inw(ioaddr+LANCE_DATA));
966 outw(0x0000, ioaddr+LANCE_DATA);
967 }
968
969
970
971
972 entry = lp->cur_tx & TX_RING_MOD_MASK;
973
974
975
976
977
978 if (chip_table[lp->chip_version].flags & LANCE_MUST_PAD) {
979 if (skb->len < ETH_ZLEN) {
980 if (skb_padto(skb, ETH_ZLEN))
981 goto out;
982 lp->tx_ring[entry].length = -ETH_ZLEN;
983 }
984 else
985 lp->tx_ring[entry].length = -skb->len;
986 } else
987 lp->tx_ring[entry].length = -skb->len;
988
989 lp->tx_ring[entry].misc = 0x0000;
990
991 dev->stats.tx_bytes += skb->len;
992
993
994
995 if ((u32)isa_virt_to_bus(skb->data) + skb->len > 0x01000000) {
996 if (lance_debug > 5)
997 printk("%s: bouncing a high-memory packet (%#x).\n",
998 dev->name, (u32)isa_virt_to_bus(skb->data));
999 skb_copy_from_linear_data(skb, &lp->tx_bounce_buffs[entry], skb->len);
1000 lp->tx_ring[entry].base =
1001 ((u32)isa_virt_to_bus((lp->tx_bounce_buffs + entry)) & 0xffffff) | 0x83000000;
1002 dev_kfree_skb(skb);
1003 } else {
1004 lp->tx_skbuff[entry] = skb;
1005 lp->tx_ring[entry].base = ((u32)isa_virt_to_bus(skb->data) & 0xffffff) | 0x83000000;
1006 }
1007 lp->cur_tx++;
1008
1009
1010 outw(0x0000, ioaddr+LANCE_ADDR);
1011 outw(0x0048, ioaddr+LANCE_DATA);
1012
1013 if ((lp->cur_tx - lp->dirty_tx) >= TX_RING_SIZE)
1014 netif_stop_queue(dev);
1015
1016out:
1017 spin_unlock_irqrestore(&lp->devlock, flags);
1018 return NETDEV_TX_OK;
1019}
1020
1021
1022static irqreturn_t lance_interrupt(int irq, void *dev_id)
1023{
1024 struct net_device *dev = dev_id;
1025 struct lance_private *lp;
1026 int csr0, ioaddr, boguscnt=10;
1027 int must_restart;
1028
1029 ioaddr = dev->base_addr;
1030 lp = dev->ml_priv;
1031
1032 spin_lock (&lp->devlock);
1033
1034 outw(0x00, dev->base_addr + LANCE_ADDR);
1035 while ((csr0 = inw(dev->base_addr + LANCE_DATA)) & 0x8600 &&
1036 --boguscnt >= 0) {
1037
1038 outw(csr0 & ~0x004f, dev->base_addr + LANCE_DATA);
1039
1040 must_restart = 0;
1041
1042 if (lance_debug > 5)
1043 printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
1044 dev->name, csr0, inw(dev->base_addr + LANCE_DATA));
1045
1046 if (csr0 & 0x0400)
1047 lance_rx(dev);
1048
1049 if (csr0 & 0x0200) {
1050 int dirty_tx = lp->dirty_tx;
1051
1052 while (dirty_tx < lp->cur_tx) {
1053 int entry = dirty_tx & TX_RING_MOD_MASK;
1054 int status = lp->tx_ring[entry].base;
1055
1056 if (status < 0)
1057 break;
1058
1059 lp->tx_ring[entry].base = 0;
1060
1061 if (status & 0x40000000) {
1062
1063 int err_status = lp->tx_ring[entry].misc;
1064 dev->stats.tx_errors++;
1065 if (err_status & 0x0400)
1066 dev->stats.tx_aborted_errors++;
1067 if (err_status & 0x0800)
1068 dev->stats.tx_carrier_errors++;
1069 if (err_status & 0x1000)
1070 dev->stats.tx_window_errors++;
1071 if (err_status & 0x4000) {
1072
1073 dev->stats.tx_fifo_errors++;
1074
1075 printk("%s: Tx FIFO error! Status %4.4x.\n",
1076 dev->name, csr0);
1077
1078 must_restart = 1;
1079 }
1080 } else {
1081 if (status & 0x18000000)
1082 dev->stats.collisions++;
1083 dev->stats.tx_packets++;
1084 }
1085
1086
1087
1088 if (lp->tx_skbuff[entry]) {
1089 dev_consume_skb_irq(lp->tx_skbuff[entry]);
1090 lp->tx_skbuff[entry] = NULL;
1091 }
1092 dirty_tx++;
1093 }
1094
1095#ifndef final_version
1096 if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
1097 printk("out-of-sync dirty pointer, %d vs. %d, full=%s.\n",
1098 dirty_tx, lp->cur_tx,
1099 netif_queue_stopped(dev) ? "yes" : "no");
1100 dirty_tx += TX_RING_SIZE;
1101 }
1102#endif
1103
1104
1105 if (netif_queue_stopped(dev) &&
1106 dirty_tx > lp->cur_tx - TX_RING_SIZE + 2)
1107 netif_wake_queue (dev);
1108
1109 lp->dirty_tx = dirty_tx;
1110 }
1111
1112
1113 if (csr0 & 0x4000)
1114 dev->stats.tx_errors++;
1115 if (csr0 & 0x1000)
1116 dev->stats.rx_errors++;
1117 if (csr0 & 0x0800) {
1118 printk("%s: Bus master arbitration failure, status %4.4x.\n",
1119 dev->name, csr0);
1120
1121 must_restart = 1;
1122 }
1123
1124 if (must_restart) {
1125
1126 outw(0x0000, dev->base_addr + LANCE_ADDR);
1127 outw(0x0004, dev->base_addr + LANCE_DATA);
1128 lance_restart(dev, 0x0002, 0);
1129 }
1130 }
1131
1132
1133 outw(0x0000, dev->base_addr + LANCE_ADDR);
1134 outw(0x7940, dev->base_addr + LANCE_DATA);
1135
1136 if (lance_debug > 4)
1137 printk("%s: exiting interrupt, csr%d=%#4.4x.\n",
1138 dev->name, inw(ioaddr + LANCE_ADDR),
1139 inw(dev->base_addr + LANCE_DATA));
1140
1141 spin_unlock (&lp->devlock);
1142 return IRQ_HANDLED;
1143}
1144
1145static int
1146lance_rx(struct net_device *dev)
1147{
1148 struct lance_private *lp = dev->ml_priv;
1149 int entry = lp->cur_rx & RX_RING_MOD_MASK;
1150 int i;
1151
1152
1153 while (lp->rx_ring[entry].base >= 0) {
1154 int status = lp->rx_ring[entry].base >> 24;
1155
1156 if (status != 0x03) {
1157
1158
1159
1160
1161 if (status & 0x01)
1162 dev->stats.rx_errors++;
1163 if (status & 0x20)
1164 dev->stats.rx_frame_errors++;
1165 if (status & 0x10)
1166 dev->stats.rx_over_errors++;
1167 if (status & 0x08)
1168 dev->stats.rx_crc_errors++;
1169 if (status & 0x04)
1170 dev->stats.rx_fifo_errors++;
1171 lp->rx_ring[entry].base &= 0x03ffffff;
1172 }
1173 else
1174 {
1175
1176 short pkt_len = (lp->rx_ring[entry].msg_length & 0xfff)-4;
1177 struct sk_buff *skb;
1178
1179 if(pkt_len<60)
1180 {
1181 printk("%s: Runt packet!\n",dev->name);
1182 dev->stats.rx_errors++;
1183 }
1184 else
1185 {
1186 skb = dev_alloc_skb(pkt_len+2);
1187 if (skb == NULL)
1188 {
1189 printk("%s: Memory squeeze, deferring packet.\n", dev->name);
1190 for (i=0; i < RX_RING_SIZE; i++)
1191 if (lp->rx_ring[(entry+i) & RX_RING_MOD_MASK].base < 0)
1192 break;
1193
1194 if (i > RX_RING_SIZE -2)
1195 {
1196 dev->stats.rx_dropped++;
1197 lp->rx_ring[entry].base |= 0x80000000;
1198 lp->cur_rx++;
1199 }
1200 break;
1201 }
1202 skb_reserve(skb,2);
1203 skb_put(skb,pkt_len);
1204 skb_copy_to_linear_data(skb,
1205 (unsigned char *)isa_bus_to_virt((lp->rx_ring[entry].base & 0x00ffffff)),
1206 pkt_len);
1207 skb->protocol=eth_type_trans(skb,dev);
1208 netif_rx(skb);
1209 dev->stats.rx_packets++;
1210 dev->stats.rx_bytes += pkt_len;
1211 }
1212 }
1213
1214
1215 lp->rx_ring[entry].buf_length = -PKT_BUF_SZ;
1216 lp->rx_ring[entry].base |= 0x80000000;
1217 entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
1218 }
1219
1220
1221
1222
1223 return 0;
1224}
1225
1226static int
1227lance_close(struct net_device *dev)
1228{
1229 int ioaddr = dev->base_addr;
1230 struct lance_private *lp = dev->ml_priv;
1231
1232 netif_stop_queue (dev);
1233
1234 if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
1235 outw(112, ioaddr+LANCE_ADDR);
1236 dev->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
1237 }
1238 outw(0, ioaddr+LANCE_ADDR);
1239
1240 if (lance_debug > 1)
1241 printk("%s: Shutting down ethercard, status was %2.2x.\n",
1242 dev->name, inw(ioaddr+LANCE_DATA));
1243
1244
1245
1246 outw(0x0004, ioaddr+LANCE_DATA);
1247
1248 if (dev->dma != 4)
1249 {
1250 unsigned long flags=claim_dma_lock();
1251 disable_dma(dev->dma);
1252 release_dma_lock(flags);
1253 }
1254 free_irq(dev->irq, dev);
1255
1256 lance_purge_ring(dev);
1257
1258 return 0;
1259}
1260
1261static struct net_device_stats *lance_get_stats(struct net_device *dev)
1262{
1263 struct lance_private *lp = dev->ml_priv;
1264
1265 if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
1266 short ioaddr = dev->base_addr;
1267 short saved_addr;
1268 unsigned long flags;
1269
1270 spin_lock_irqsave(&lp->devlock, flags);
1271 saved_addr = inw(ioaddr+LANCE_ADDR);
1272 outw(112, ioaddr+LANCE_ADDR);
1273 dev->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
1274 outw(saved_addr, ioaddr+LANCE_ADDR);
1275 spin_unlock_irqrestore(&lp->devlock, flags);
1276 }
1277
1278 return &dev->stats;
1279}
1280
1281
1282
1283
1284static void set_multicast_list(struct net_device *dev)
1285{
1286 short ioaddr = dev->base_addr;
1287
1288 outw(0, ioaddr+LANCE_ADDR);
1289 outw(0x0004, ioaddr+LANCE_DATA);
1290
1291 if (dev->flags&IFF_PROMISC) {
1292 outw(15, ioaddr+LANCE_ADDR);
1293 outw(0x8000, ioaddr+LANCE_DATA);
1294 } else {
1295 short multicast_table[4];
1296 int i;
1297 int num_addrs=netdev_mc_count(dev);
1298 if(dev->flags&IFF_ALLMULTI)
1299 num_addrs=1;
1300
1301 memset(multicast_table, (num_addrs == 0) ? 0 : -1, sizeof(multicast_table));
1302 for (i = 0; i < 4; i++) {
1303 outw(8 + i, ioaddr+LANCE_ADDR);
1304 outw(multicast_table[i], ioaddr+LANCE_DATA);
1305 }
1306 outw(15, ioaddr+LANCE_ADDR);
1307 outw(0x0000, ioaddr+LANCE_DATA);
1308 }
1309
1310 lance_restart(dev, 0x0142, 0);
1311
1312}
1313
1314