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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62#define DRV_NAME "3c509"
63#define DRV_VERSION "1.20"
64#define DRV_RELDATE "04Feb2008"
65
66
67
68
69#define TX_TIMEOUT (400*HZ/1000)
70
71#include <linux/module.h>
72#include <linux/isa.h>
73#include <linux/pnp.h>
74#include <linux/string.h>
75#include <linux/interrupt.h>
76#include <linux/errno.h>
77#include <linux/in.h>
78#include <linux/ioport.h>
79#include <linux/init.h>
80#include <linux/netdevice.h>
81#include <linux/etherdevice.h>
82#include <linux/pm.h>
83#include <linux/skbuff.h>
84#include <linux/delay.h>
85#include <linux/spinlock.h>
86#include <linux/ethtool.h>
87#include <linux/device.h>
88#include <linux/eisa.h>
89#include <linux/bitops.h>
90
91#include <asm/uaccess.h>
92#include <asm/io.h>
93#include <asm/irq.h>
94
95static char version[] __devinitdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n";
96
97#ifdef EL3_DEBUG
98static int el3_debug = EL3_DEBUG;
99#else
100static int el3_debug = 2;
101#endif
102
103
104
105
106static int el3_cards = 0;
107#define EL3_MAX_CARDS 8
108
109
110
111
112
113#define EL3_DATA 0x00
114#define EL3_CMD 0x0e
115#define EL3_STATUS 0x0e
116#define EEPROM_READ 0x80
117
118#define EL3_IO_EXTENT 16
119
120#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
121
122
123
124
125enum c509cmd {
126 TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
127 RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
128 TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
129 FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
130 SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
131 SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
132 StatsDisable = 22<<11, StopCoax = 23<<11, PowerUp = 27<<11,
133 PowerDown = 28<<11, PowerAuto = 29<<11};
134
135enum c509status {
136 IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
137 TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
138 IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000, };
139
140
141enum RxFilter {
142 RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
143
144
145#define TX_FIFO 0x00
146#define RX_FIFO 0x00
147#define RX_STATUS 0x08
148#define TX_STATUS 0x0B
149#define TX_FREE 0x0C
150
151#define WN0_CONF_CTRL 0x04
152#define WN0_ADDR_CONF 0x06
153#define WN0_IRQ 0x08
154#define WN4_MEDIA 0x0A
155#define MEDIA_TP 0x00C0
156#define WN4_NETDIAG 0x06
157#define FD_ENABLE 0x8000
158
159
160
161
162
163#define SKB_QUEUE_SIZE 64
164
165enum el3_cardtype { EL3_ISA, EL3_PNP, EL3_EISA };
166
167struct el3_private {
168 spinlock_t lock;
169
170 int head, size;
171 struct sk_buff *queue[SKB_QUEUE_SIZE];
172 enum el3_cardtype type;
173};
174static int id_port;
175static int current_tag;
176static struct net_device *el3_devs[EL3_MAX_CARDS];
177
178
179static int debug = -1;
180static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
181
182static int max_interrupt_work = 10;
183#ifdef CONFIG_PNP
184static int nopnp;
185#endif
186
187static int __devinit el3_common_init(struct net_device *dev);
188static void el3_common_remove(struct net_device *dev);
189static ushort id_read_eeprom(int index);
190static ushort read_eeprom(int ioaddr, int index);
191static int el3_open(struct net_device *dev);
192static netdev_tx_t el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
193static irqreturn_t el3_interrupt(int irq, void *dev_id);
194static void update_stats(struct net_device *dev);
195static struct net_device_stats *el3_get_stats(struct net_device *dev);
196static int el3_rx(struct net_device *dev);
197static int el3_close(struct net_device *dev);
198static void set_multicast_list(struct net_device *dev);
199static void el3_tx_timeout (struct net_device *dev);
200static void el3_down(struct net_device *dev);
201static void el3_up(struct net_device *dev);
202static const struct ethtool_ops ethtool_ops;
203#ifdef CONFIG_PM
204static int el3_suspend(struct device *, pm_message_t);
205static int el3_resume(struct device *);
206#else
207#define el3_suspend NULL
208#define el3_resume NULL
209#endif
210
211
212
213static int el3_device_remove (struct device *device);
214#ifdef CONFIG_NET_POLL_CONTROLLER
215static void el3_poll_controller(struct net_device *dev);
216#endif
217
218
219static int el3_isa_id_sequence(__be16 *phys_addr)
220{
221 short lrs_state = 0xff;
222 int i;
223
224
225
226
227
228
229 outb(0x00, id_port);
230 outb(0x00, id_port);
231 for (i = 0; i < 255; i++) {
232 outb(lrs_state, id_port);
233 lrs_state <<= 1;
234 lrs_state = lrs_state & 0x100 ? lrs_state ^ 0xcf : lrs_state;
235 }
236
237 if (current_tag == 0)
238 outb(0xd0, id_port);
239 else
240 outb(0xd8, id_port);
241 if (id_read_eeprom(7) != 0x6d50)
242 return 1;
243
244
245
246 for (i = 0; i < 3; i++)
247 phys_addr[i] = htons(id_read_eeprom(i));
248#ifdef CONFIG_PNP
249 if (!nopnp) {
250
251
252 for (i = 0; i < el3_cards; i++) {
253 struct el3_private *lp = netdev_priv(el3_devs[i]);
254 if (lp->type == EL3_PNP &&
255 !memcmp(phys_addr, el3_devs[i]->dev_addr,
256 ETH_ALEN)) {
257 if (el3_debug > 3)
258 pr_debug("3c509 with address %02x %02x %02x %02x %02x %02x was found by ISAPnP\n",
259 phys_addr[0] & 0xff, phys_addr[0] >> 8,
260 phys_addr[1] & 0xff, phys_addr[1] >> 8,
261 phys_addr[2] & 0xff, phys_addr[2] >> 8);
262
263 outb(0xd0 + ++current_tag, id_port);
264 return 2;
265 }
266 }
267 }
268#endif
269 return 0;
270
271}
272
273static void __devinit el3_dev_fill(struct net_device *dev, __be16 *phys_addr,
274 int ioaddr, int irq, int if_port,
275 enum el3_cardtype type)
276{
277 struct el3_private *lp = netdev_priv(dev);
278
279 memcpy(dev->dev_addr, phys_addr, ETH_ALEN);
280 dev->base_addr = ioaddr;
281 dev->irq = irq;
282 dev->if_port = if_port;
283 lp->type = type;
284}
285
286static int __devinit el3_isa_match(struct device *pdev,
287 unsigned int ndev)
288{
289 struct net_device *dev;
290 int ioaddr, isa_irq, if_port, err;
291 unsigned int iobase;
292 __be16 phys_addr[3];
293
294 while ((err = el3_isa_id_sequence(phys_addr)) == 2)
295 ;
296 if (err == 1)
297 return 0;
298
299 iobase = id_read_eeprom(8);
300 if_port = iobase >> 14;
301 ioaddr = 0x200 + ((iobase & 0x1f) << 4);
302 if (irq[el3_cards] > 1 && irq[el3_cards] < 16)
303 isa_irq = irq[el3_cards];
304 else
305 isa_irq = id_read_eeprom(9) >> 12;
306
307 dev = alloc_etherdev(sizeof(struct el3_private));
308 if (!dev)
309 return -ENOMEM;
310
311 netdev_boot_setup_check(dev);
312
313 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-isa")) {
314 free_netdev(dev);
315 return 0;
316 }
317
318
319 outb(0xd0 + ++current_tag, id_port);
320
321
322 outb((ioaddr >> 4) | 0xe0, id_port);
323
324 EL3WINDOW(0);
325 if (inw(ioaddr) != 0x6d50) {
326 free_netdev(dev);
327 return 0;
328 }
329
330
331 outw(0x0f00, ioaddr + WN0_IRQ);
332
333 el3_dev_fill(dev, phys_addr, ioaddr, isa_irq, if_port, EL3_ISA);
334 dev_set_drvdata(pdev, dev);
335 if (el3_common_init(dev)) {
336 free_netdev(dev);
337 return 0;
338 }
339
340 el3_devs[el3_cards++] = dev;
341 return 1;
342}
343
344static int __devexit el3_isa_remove(struct device *pdev,
345 unsigned int ndev)
346{
347 el3_device_remove(pdev);
348 dev_set_drvdata(pdev, NULL);
349 return 0;
350}
351
352#ifdef CONFIG_PM
353static int el3_isa_suspend(struct device *dev, unsigned int n,
354 pm_message_t state)
355{
356 current_tag = 0;
357 return el3_suspend(dev, state);
358}
359
360static int el3_isa_resume(struct device *dev, unsigned int n)
361{
362 struct net_device *ndev = dev_get_drvdata(dev);
363 int ioaddr = ndev->base_addr, err;
364 __be16 phys_addr[3];
365
366 while ((err = el3_isa_id_sequence(phys_addr)) == 2)
367 ;
368 if (err == 1)
369 return 0;
370
371 outb(0xd0 + ++current_tag, id_port);
372
373 outb((ioaddr >> 4) | 0xe0, id_port);
374 EL3WINDOW(0);
375 if (inw(ioaddr) != 0x6d50)
376 return 1;
377
378 outw(0x0f00, ioaddr + WN0_IRQ);
379 return el3_resume(dev);
380}
381#endif
382
383static struct isa_driver el3_isa_driver = {
384 .match = el3_isa_match,
385 .remove = __devexit_p(el3_isa_remove),
386#ifdef CONFIG_PM
387 .suspend = el3_isa_suspend,
388 .resume = el3_isa_resume,
389#endif
390 .driver = {
391 .name = "3c509"
392 },
393};
394static int isa_registered;
395
396#ifdef CONFIG_PNP
397static struct pnp_device_id el3_pnp_ids[] = {
398 { .id = "TCM5090" },
399 { .id = "TCM5091" },
400 { .id = "TCM5094" },
401 { .id = "TCM5095" },
402 { .id = "TCM5098" },
403 { .id = "PNP80f7" },
404 { .id = "PNP80f8" },
405 { .id = "" }
406};
407MODULE_DEVICE_TABLE(pnp, el3_pnp_ids);
408
409static int __devinit el3_pnp_probe(struct pnp_dev *pdev,
410 const struct pnp_device_id *id)
411{
412 short i;
413 int ioaddr, irq, if_port;
414 __be16 phys_addr[3];
415 struct net_device *dev = NULL;
416 int err;
417
418 ioaddr = pnp_port_start(pdev, 0);
419 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-pnp"))
420 return -EBUSY;
421 irq = pnp_irq(pdev, 0);
422 EL3WINDOW(0);
423 for (i = 0; i < 3; i++)
424 phys_addr[i] = htons(read_eeprom(ioaddr, i));
425 if_port = read_eeprom(ioaddr, 8) >> 14;
426 dev = alloc_etherdev(sizeof(struct el3_private));
427 if (!dev) {
428 release_region(ioaddr, EL3_IO_EXTENT);
429 return -ENOMEM;
430 }
431 SET_NETDEV_DEV(dev, &pdev->dev);
432 netdev_boot_setup_check(dev);
433
434 el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_PNP);
435 pnp_set_drvdata(pdev, dev);
436 err = el3_common_init(dev);
437
438 if (err) {
439 pnp_set_drvdata(pdev, NULL);
440 free_netdev(dev);
441 return err;
442 }
443
444 el3_devs[el3_cards++] = dev;
445 return 0;
446}
447
448static void __devexit el3_pnp_remove(struct pnp_dev *pdev)
449{
450 el3_common_remove(pnp_get_drvdata(pdev));
451 pnp_set_drvdata(pdev, NULL);
452}
453
454#ifdef CONFIG_PM
455static int el3_pnp_suspend(struct pnp_dev *pdev, pm_message_t state)
456{
457 return el3_suspend(&pdev->dev, state);
458}
459
460static int el3_pnp_resume(struct pnp_dev *pdev)
461{
462 return el3_resume(&pdev->dev);
463}
464#endif
465
466static struct pnp_driver el3_pnp_driver = {
467 .name = "3c509",
468 .id_table = el3_pnp_ids,
469 .probe = el3_pnp_probe,
470 .remove = __devexit_p(el3_pnp_remove),
471#ifdef CONFIG_PM
472 .suspend = el3_pnp_suspend,
473 .resume = el3_pnp_resume,
474#endif
475};
476static int pnp_registered;
477#endif
478
479#ifdef CONFIG_EISA
480static struct eisa_device_id el3_eisa_ids[] = {
481 { "TCM5090" },
482 { "TCM5091" },
483 { "TCM5092" },
484 { "TCM5093" },
485 { "TCM5094" },
486 { "TCM5095" },
487 { "TCM5098" },
488 { "" }
489};
490MODULE_DEVICE_TABLE(eisa, el3_eisa_ids);
491
492static int el3_eisa_probe (struct device *device);
493
494static struct eisa_driver el3_eisa_driver = {
495 .id_table = el3_eisa_ids,
496 .driver = {
497 .name = "3c579",
498 .probe = el3_eisa_probe,
499 .remove = __devexit_p (el3_device_remove),
500 .suspend = el3_suspend,
501 .resume = el3_resume,
502 }
503};
504static int eisa_registered;
505#endif
506
507static const struct net_device_ops netdev_ops = {
508 .ndo_open = el3_open,
509 .ndo_stop = el3_close,
510 .ndo_start_xmit = el3_start_xmit,
511 .ndo_get_stats = el3_get_stats,
512 .ndo_set_rx_mode = set_multicast_list,
513 .ndo_tx_timeout = el3_tx_timeout,
514 .ndo_change_mtu = eth_change_mtu,
515 .ndo_set_mac_address = eth_mac_addr,
516 .ndo_validate_addr = eth_validate_addr,
517#ifdef CONFIG_NET_POLL_CONTROLLER
518 .ndo_poll_controller = el3_poll_controller,
519#endif
520};
521
522static int __devinit el3_common_init(struct net_device *dev)
523{
524 struct el3_private *lp = netdev_priv(dev);
525 int err;
526 const char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
527
528 spin_lock_init(&lp->lock);
529
530 if (dev->mem_start & 0x05) {
531 dev->if_port = (dev->mem_start & 0x0f);
532 } else {
533
534 dev->if_port |= (dev->mem_start & 0x08);
535 }
536
537
538 dev->netdev_ops = &netdev_ops;
539 dev->watchdog_timeo = TX_TIMEOUT;
540 SET_ETHTOOL_OPS(dev, ðtool_ops);
541
542 err = register_netdev(dev);
543 if (err) {
544 pr_err("Failed to register 3c5x9 at %#3.3lx, IRQ %d.\n",
545 dev->base_addr, dev->irq);
546 release_region(dev->base_addr, EL3_IO_EXTENT);
547 return err;
548 }
549
550 pr_info("%s: 3c5x9 found at %#3.3lx, %s port, address %pM, IRQ %d.\n",
551 dev->name, dev->base_addr, if_names[(dev->if_port & 0x03)],
552 dev->dev_addr, dev->irq);
553
554 if (el3_debug > 0)
555 pr_info("%s", version);
556 return 0;
557
558}
559
560static void el3_common_remove (struct net_device *dev)
561{
562 unregister_netdev (dev);
563 release_region(dev->base_addr, EL3_IO_EXTENT);
564 free_netdev (dev);
565}
566
567#ifdef CONFIG_EISA
568static int __init el3_eisa_probe (struct device *device)
569{
570 short i;
571 int ioaddr, irq, if_port;
572 __be16 phys_addr[3];
573 struct net_device *dev = NULL;
574 struct eisa_device *edev;
575 int err;
576
577
578 edev = to_eisa_device (device);
579 ioaddr = edev->base_addr;
580
581 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c579-eisa"))
582 return -EBUSY;
583
584
585 outw(SelectWindow | 0, ioaddr + 0xC80 + EL3_CMD);
586
587 irq = inw(ioaddr + WN0_IRQ) >> 12;
588 if_port = inw(ioaddr + 6)>>14;
589 for (i = 0; i < 3; i++)
590 phys_addr[i] = htons(read_eeprom(ioaddr, i));
591
592
593 read_eeprom(ioaddr, 3);
594
595 dev = alloc_etherdev(sizeof (struct el3_private));
596 if (dev == NULL) {
597 release_region(ioaddr, EL3_IO_EXTENT);
598 return -ENOMEM;
599 }
600
601 netdev_boot_setup_check(dev);
602
603 el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_EISA);
604 eisa_set_drvdata (edev, dev);
605 err = el3_common_init(dev);
606
607 if (err) {
608 eisa_set_drvdata (edev, NULL);
609 free_netdev(dev);
610 return err;
611 }
612
613 el3_devs[el3_cards++] = dev;
614 return 0;
615}
616#endif
617
618
619
620
621static int __devexit el3_device_remove (struct device *device)
622{
623 struct net_device *dev;
624
625 dev = dev_get_drvdata(device);
626
627 el3_common_remove (dev);
628 return 0;
629}
630
631
632
633
634static ushort read_eeprom(int ioaddr, int index)
635{
636 outw(EEPROM_READ + index, ioaddr + 10);
637
638
639 mdelay(2);
640 return inw(ioaddr + 12);
641}
642
643
644static ushort id_read_eeprom(int index)
645{
646 int bit, word = 0;
647
648
649
650 outb(EEPROM_READ + index, id_port);
651
652
653
654 mdelay(4);
655
656 for (bit = 15; bit >= 0; bit--)
657 word = (word << 1) + (inb(id_port) & 0x01);
658
659 if (el3_debug > 3)
660 pr_debug(" 3c509 EEPROM word %d %#4.4x.\n", index, word);
661
662 return word;
663}
664
665
666static int
667el3_open(struct net_device *dev)
668{
669 int ioaddr = dev->base_addr;
670 int i;
671
672 outw(TxReset, ioaddr + EL3_CMD);
673 outw(RxReset, ioaddr + EL3_CMD);
674 outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
675
676 i = request_irq(dev->irq, el3_interrupt, 0, dev->name, dev);
677 if (i)
678 return i;
679
680 EL3WINDOW(0);
681 if (el3_debug > 3)
682 pr_debug("%s: Opening, IRQ %d status@%x %4.4x.\n", dev->name,
683 dev->irq, ioaddr + EL3_STATUS, inw(ioaddr + EL3_STATUS));
684
685 el3_up(dev);
686
687 if (el3_debug > 3)
688 pr_debug("%s: Opened 3c509 IRQ %d status %4.4x.\n",
689 dev->name, dev->irq, inw(ioaddr + EL3_STATUS));
690
691 return 0;
692}
693
694static void
695el3_tx_timeout (struct net_device *dev)
696{
697 int ioaddr = dev->base_addr;
698
699
700 pr_warning("%s: transmit timed out, Tx_status %2.2x status %4.4x Tx FIFO room %d.\n",
701 dev->name, inb(ioaddr + TX_STATUS), inw(ioaddr + EL3_STATUS),
702 inw(ioaddr + TX_FREE));
703 dev->stats.tx_errors++;
704 dev->trans_start = jiffies;
705
706 outw(TxReset, ioaddr + EL3_CMD);
707 outw(TxEnable, ioaddr + EL3_CMD);
708 netif_wake_queue(dev);
709}
710
711
712static netdev_tx_t
713el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
714{
715 struct el3_private *lp = netdev_priv(dev);
716 int ioaddr = dev->base_addr;
717 unsigned long flags;
718
719 netif_stop_queue (dev);
720
721 dev->stats.tx_bytes += skb->len;
722
723 if (el3_debug > 4) {
724 pr_debug("%s: el3_start_xmit(length = %u) called, status %4.4x.\n",
725 dev->name, skb->len, inw(ioaddr + EL3_STATUS));
726 }
727#if 0
728#ifndef final_version
729 {
730 ushort status = inw(ioaddr + EL3_STATUS);
731 if (status & 0x0001 &&
732 inw(ioaddr + EL3_STATUS) & 1) {
733 pr_debug("%s: Missed interrupt, status then %04x now %04x"
734 " Tx %2.2x Rx %4.4x.\n", dev->name, status,
735 inw(ioaddr + EL3_STATUS), inb(ioaddr + TX_STATUS),
736 inw(ioaddr + RX_STATUS));
737
738 outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
739 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
740 ioaddr + EL3_CMD);
741 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
742 }
743 }
744#endif
745#endif
746
747
748
749
750
751
752
753
754
755
756
757 spin_lock_irqsave(&lp->lock, flags);
758
759
760 outw(skb->len, ioaddr + TX_FIFO);
761 outw(0x00, ioaddr + TX_FIFO);
762
763 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
764
765 if (inw(ioaddr + TX_FREE) > 1536)
766 netif_start_queue(dev);
767 else
768
769 outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
770
771 spin_unlock_irqrestore(&lp->lock, flags);
772
773 dev_kfree_skb (skb);
774
775
776 {
777 short tx_status;
778 int i = 4;
779
780 while (--i > 0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) {
781 if (tx_status & 0x38) dev->stats.tx_aborted_errors++;
782 if (tx_status & 0x30) outw(TxReset, ioaddr + EL3_CMD);
783 if (tx_status & 0x3C) outw(TxEnable, ioaddr + EL3_CMD);
784 outb(0x00, ioaddr + TX_STATUS);
785 }
786 }
787 return NETDEV_TX_OK;
788}
789
790
791static irqreturn_t
792el3_interrupt(int irq, void *dev_id)
793{
794 struct net_device *dev = dev_id;
795 struct el3_private *lp;
796 int ioaddr, status;
797 int i = max_interrupt_work;
798
799 lp = netdev_priv(dev);
800 spin_lock(&lp->lock);
801
802 ioaddr = dev->base_addr;
803
804 if (el3_debug > 4) {
805 status = inw(ioaddr + EL3_STATUS);
806 pr_debug("%s: interrupt, status %4.4x.\n", dev->name, status);
807 }
808
809 while ((status = inw(ioaddr + EL3_STATUS)) &
810 (IntLatch | RxComplete | StatsFull)) {
811
812 if (status & RxComplete)
813 el3_rx(dev);
814
815 if (status & TxAvailable) {
816 if (el3_debug > 5)
817 pr_debug(" TX room bit was handled.\n");
818
819 outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
820 netif_wake_queue (dev);
821 }
822 if (status & (AdapterFailure | RxEarly | StatsFull | TxComplete)) {
823
824 if (status & StatsFull)
825 update_stats(dev);
826 if (status & RxEarly) {
827 el3_rx(dev);
828 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
829 }
830 if (status & TxComplete) {
831 short tx_status;
832 int i = 4;
833
834 while (--i>0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) {
835 if (tx_status & 0x38) dev->stats.tx_aborted_errors++;
836 if (tx_status & 0x30) outw(TxReset, ioaddr + EL3_CMD);
837 if (tx_status & 0x3C) outw(TxEnable, ioaddr + EL3_CMD);
838 outb(0x00, ioaddr + TX_STATUS);
839 }
840 }
841 if (status & AdapterFailure) {
842
843 outw(RxReset, ioaddr + EL3_CMD);
844
845 outw(SetRxFilter | RxStation | RxBroadcast
846 | (dev->flags & IFF_ALLMULTI ? RxMulticast : 0)
847 | (dev->flags & IFF_PROMISC ? RxProm : 0),
848 ioaddr + EL3_CMD);
849 outw(RxEnable, ioaddr + EL3_CMD);
850 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
851 }
852 }
853
854 if (--i < 0) {
855 pr_err("%s: Infinite loop in interrupt, status %4.4x.\n",
856 dev->name, status);
857
858 outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
859 break;
860 }
861
862 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
863 }
864
865 if (el3_debug > 4) {
866 pr_debug("%s: exiting interrupt, status %4.4x.\n", dev->name,
867 inw(ioaddr + EL3_STATUS));
868 }
869 spin_unlock(&lp->lock);
870 return IRQ_HANDLED;
871}
872
873
874#ifdef CONFIG_NET_POLL_CONTROLLER
875
876
877
878
879static void el3_poll_controller(struct net_device *dev)
880{
881 disable_irq(dev->irq);
882 el3_interrupt(dev->irq, dev);
883 enable_irq(dev->irq);
884}
885#endif
886
887static struct net_device_stats *
888el3_get_stats(struct net_device *dev)
889{
890 struct el3_private *lp = netdev_priv(dev);
891 unsigned long flags;
892
893
894
895
896
897
898 spin_lock_irqsave(&lp->lock, flags);
899 update_stats(dev);
900 spin_unlock_irqrestore(&lp->lock, flags);
901 return &dev->stats;
902}
903
904
905
906
907
908
909static void update_stats(struct net_device *dev)
910{
911 int ioaddr = dev->base_addr;
912
913 if (el3_debug > 5)
914 pr_debug(" Updating the statistics.\n");
915
916 outw(StatsDisable, ioaddr + EL3_CMD);
917
918 EL3WINDOW(6);
919 dev->stats.tx_carrier_errors += inb(ioaddr + 0);
920 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1);
921 inb(ioaddr + 2);
922 dev->stats.collisions += inb(ioaddr + 3);
923 dev->stats.tx_window_errors += inb(ioaddr + 4);
924 dev->stats.rx_fifo_errors += inb(ioaddr + 5);
925 dev->stats.tx_packets += inb(ioaddr + 6);
926 inb(ioaddr + 7);
927 inb(ioaddr + 8);
928 inw(ioaddr + 10);
929 inw(ioaddr + 12);
930
931
932 EL3WINDOW(1);
933 outw(StatsEnable, ioaddr + EL3_CMD);
934}
935
936static int
937el3_rx(struct net_device *dev)
938{
939 int ioaddr = dev->base_addr;
940 short rx_status;
941
942 if (el3_debug > 5)
943 pr_debug(" In rx_packet(), status %4.4x, rx_status %4.4x.\n",
944 inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
945 while ((rx_status = inw(ioaddr + RX_STATUS)) > 0) {
946 if (rx_status & 0x4000) {
947 short error = rx_status & 0x3800;
948
949 outw(RxDiscard, ioaddr + EL3_CMD);
950 dev->stats.rx_errors++;
951 switch (error) {
952 case 0x0000: dev->stats.rx_over_errors++; break;
953 case 0x0800: dev->stats.rx_length_errors++; break;
954 case 0x1000: dev->stats.rx_frame_errors++; break;
955 case 0x1800: dev->stats.rx_length_errors++; break;
956 case 0x2000: dev->stats.rx_frame_errors++; break;
957 case 0x2800: dev->stats.rx_crc_errors++; break;
958 }
959 } else {
960 short pkt_len = rx_status & 0x7ff;
961 struct sk_buff *skb;
962
963 skb = netdev_alloc_skb(dev, pkt_len + 5);
964 if (el3_debug > 4)
965 pr_debug("Receiving packet size %d status %4.4x.\n",
966 pkt_len, rx_status);
967 if (skb != NULL) {
968 skb_reserve(skb, 2);
969
970
971 insl(ioaddr + RX_FIFO, skb_put(skb,pkt_len),
972 (pkt_len + 3) >> 2);
973
974 outw(RxDiscard, ioaddr + EL3_CMD);
975 skb->protocol = eth_type_trans(skb,dev);
976 netif_rx(skb);
977 dev->stats.rx_bytes += pkt_len;
978 dev->stats.rx_packets++;
979 continue;
980 }
981 outw(RxDiscard, ioaddr + EL3_CMD);
982 dev->stats.rx_dropped++;
983 if (el3_debug)
984 pr_debug("%s: Couldn't allocate a sk_buff of size %d.\n",
985 dev->name, pkt_len);
986 }
987 inw(ioaddr + EL3_STATUS);
988 while (inw(ioaddr + EL3_STATUS) & 0x1000)
989 pr_debug(" Waiting for 3c509 to discard packet, status %x.\n",
990 inw(ioaddr + EL3_STATUS) );
991 }
992
993 return 0;
994}
995
996
997
998
999static void
1000set_multicast_list(struct net_device *dev)
1001{
1002 unsigned long flags;
1003 struct el3_private *lp = netdev_priv(dev);
1004 int ioaddr = dev->base_addr;
1005 int mc_count = netdev_mc_count(dev);
1006
1007 if (el3_debug > 1) {
1008 static int old;
1009 if (old != mc_count) {
1010 old = mc_count;
1011 pr_debug("%s: Setting Rx mode to %d addresses.\n",
1012 dev->name, mc_count);
1013 }
1014 }
1015 spin_lock_irqsave(&lp->lock, flags);
1016 if (dev->flags&IFF_PROMISC) {
1017 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1018 ioaddr + EL3_CMD);
1019 }
1020 else if (mc_count || (dev->flags&IFF_ALLMULTI)) {
1021 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast, ioaddr + EL3_CMD);
1022 }
1023 else
1024 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1025 spin_unlock_irqrestore(&lp->lock, flags);
1026}
1027
1028static int
1029el3_close(struct net_device *dev)
1030{
1031 int ioaddr = dev->base_addr;
1032 struct el3_private *lp = netdev_priv(dev);
1033
1034 if (el3_debug > 2)
1035 pr_debug("%s: Shutting down ethercard.\n", dev->name);
1036
1037 el3_down(dev);
1038
1039 free_irq(dev->irq, dev);
1040
1041 EL3WINDOW(0);
1042 if (lp->type != EL3_EISA) {
1043
1044
1045
1046 outw(0x0f00, ioaddr + WN0_IRQ);
1047 }
1048
1049 return 0;
1050}
1051
1052static int
1053el3_link_ok(struct net_device *dev)
1054{
1055 int ioaddr = dev->base_addr;
1056 u16 tmp;
1057
1058 EL3WINDOW(4);
1059 tmp = inw(ioaddr + WN4_MEDIA);
1060 EL3WINDOW(1);
1061 return tmp & (1<<11);
1062}
1063
1064static int
1065el3_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1066{
1067 u16 tmp;
1068 int ioaddr = dev->base_addr;
1069
1070 EL3WINDOW(0);
1071
1072 tmp = inw(ioaddr + WN0_ADDR_CONF);
1073 ecmd->transceiver = XCVR_INTERNAL;
1074 switch (tmp >> 14) {
1075 case 0:
1076 ecmd->port = PORT_TP;
1077 break;
1078 case 1:
1079 ecmd->port = PORT_AUI;
1080 ecmd->transceiver = XCVR_EXTERNAL;
1081 break;
1082 case 3:
1083 ecmd->port = PORT_BNC;
1084 default:
1085 break;
1086 }
1087
1088 ecmd->duplex = DUPLEX_HALF;
1089 ecmd->supported = 0;
1090 tmp = inw(ioaddr + WN0_CONF_CTRL);
1091 if (tmp & (1<<13))
1092 ecmd->supported |= SUPPORTED_AUI;
1093 if (tmp & (1<<12))
1094 ecmd->supported |= SUPPORTED_BNC;
1095 if (tmp & (1<<9)) {
1096 ecmd->supported |= SUPPORTED_TP | SUPPORTED_10baseT_Half |
1097 SUPPORTED_10baseT_Full;
1098 EL3WINDOW(4);
1099 tmp = inw(ioaddr + WN4_NETDIAG);
1100 if (tmp & FD_ENABLE)
1101 ecmd->duplex = DUPLEX_FULL;
1102 }
1103
1104 ethtool_cmd_speed_set(ecmd, SPEED_10);
1105 EL3WINDOW(1);
1106 return 0;
1107}
1108
1109static int
1110el3_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1111{
1112 u16 tmp;
1113 int ioaddr = dev->base_addr;
1114
1115 if (ecmd->speed != SPEED_10)
1116 return -EINVAL;
1117 if ((ecmd->duplex != DUPLEX_HALF) && (ecmd->duplex != DUPLEX_FULL))
1118 return -EINVAL;
1119 if ((ecmd->transceiver != XCVR_INTERNAL) && (ecmd->transceiver != XCVR_EXTERNAL))
1120 return -EINVAL;
1121
1122
1123 EL3WINDOW(0);
1124 tmp = inw(ioaddr + WN0_ADDR_CONF);
1125 switch (ecmd->port) {
1126 case PORT_TP:
1127 tmp &= ~(3<<14);
1128 dev->if_port = 0;
1129 break;
1130 case PORT_AUI:
1131 tmp |= (1<<14);
1132 dev->if_port = 1;
1133 break;
1134 case PORT_BNC:
1135 tmp |= (3<<14);
1136 dev->if_port = 3;
1137 break;
1138 default:
1139 return -EINVAL;
1140 }
1141
1142 outw(tmp, ioaddr + WN0_ADDR_CONF);
1143 if (dev->if_port == 3) {
1144
1145 tmp = inw(ioaddr + WN0_ADDR_CONF);
1146 if (tmp & (3 << 14)) {
1147 outw(StartCoax, ioaddr + EL3_CMD);
1148 udelay(800);
1149 } else
1150 return -EIO;
1151 }
1152
1153 EL3WINDOW(4);
1154 tmp = inw(ioaddr + WN4_NETDIAG);
1155 if (ecmd->duplex == DUPLEX_FULL)
1156 tmp |= FD_ENABLE;
1157 else
1158 tmp &= ~FD_ENABLE;
1159 outw(tmp, ioaddr + WN4_NETDIAG);
1160 EL3WINDOW(1);
1161
1162 return 0;
1163}
1164
1165static void el3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1166{
1167 strcpy(info->driver, DRV_NAME);
1168 strcpy(info->version, DRV_VERSION);
1169}
1170
1171static int el3_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1172{
1173 struct el3_private *lp = netdev_priv(dev);
1174 int ret;
1175
1176 spin_lock_irq(&lp->lock);
1177 ret = el3_netdev_get_ecmd(dev, ecmd);
1178 spin_unlock_irq(&lp->lock);
1179 return ret;
1180}
1181
1182static int el3_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1183{
1184 struct el3_private *lp = netdev_priv(dev);
1185 int ret;
1186
1187 spin_lock_irq(&lp->lock);
1188 ret = el3_netdev_set_ecmd(dev, ecmd);
1189 spin_unlock_irq(&lp->lock);
1190 return ret;
1191}
1192
1193static u32 el3_get_link(struct net_device *dev)
1194{
1195 struct el3_private *lp = netdev_priv(dev);
1196 u32 ret;
1197
1198 spin_lock_irq(&lp->lock);
1199 ret = el3_link_ok(dev);
1200 spin_unlock_irq(&lp->lock);
1201 return ret;
1202}
1203
1204static u32 el3_get_msglevel(struct net_device *dev)
1205{
1206 return el3_debug;
1207}
1208
1209static void el3_set_msglevel(struct net_device *dev, u32 v)
1210{
1211 el3_debug = v;
1212}
1213
1214static const struct ethtool_ops ethtool_ops = {
1215 .get_drvinfo = el3_get_drvinfo,
1216 .get_settings = el3_get_settings,
1217 .set_settings = el3_set_settings,
1218 .get_link = el3_get_link,
1219 .get_msglevel = el3_get_msglevel,
1220 .set_msglevel = el3_set_msglevel,
1221};
1222
1223static void
1224el3_down(struct net_device *dev)
1225{
1226 int ioaddr = dev->base_addr;
1227
1228 netif_stop_queue(dev);
1229
1230
1231 outw(StatsDisable, ioaddr + EL3_CMD);
1232
1233
1234 outw(RxDisable, ioaddr + EL3_CMD);
1235 outw(TxDisable, ioaddr + EL3_CMD);
1236
1237 if (dev->if_port == 3)
1238
1239 outw(StopCoax, ioaddr + EL3_CMD);
1240 else if (dev->if_port == 0) {
1241
1242 EL3WINDOW(4);
1243 outw(inw(ioaddr + WN4_MEDIA) & ~MEDIA_TP, ioaddr + WN4_MEDIA);
1244 }
1245
1246 outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
1247
1248 update_stats(dev);
1249}
1250
1251static void
1252el3_up(struct net_device *dev)
1253{
1254 int i, sw_info, net_diag;
1255 int ioaddr = dev->base_addr;
1256
1257
1258 outw(0x0001, ioaddr + 4);
1259
1260
1261 outw((dev->irq << 12) | 0x0f00, ioaddr + WN0_IRQ);
1262
1263
1264 EL3WINDOW(2);
1265
1266 for (i = 0; i < 6; i++)
1267 outb(dev->dev_addr[i], ioaddr + i);
1268
1269 if ((dev->if_port & 0x03) == 3)
1270
1271 outw(StartCoax, ioaddr + EL3_CMD);
1272 else if ((dev->if_port & 0x03) == 0) {
1273
1274
1275 EL3WINDOW(0);
1276 sw_info = (read_eeprom(ioaddr, 0x14) & 0x400f) |
1277 (read_eeprom(ioaddr, 0x0d) & 0xBff0);
1278
1279 EL3WINDOW(4);
1280 net_diag = inw(ioaddr + WN4_NETDIAG);
1281 net_diag = (net_diag | FD_ENABLE);
1282 pr_info("%s: ", dev->name);
1283 switch (dev->if_port & 0x0c) {
1284 case 12:
1285
1286 if (sw_info & 0x000f) {
1287 pr_cont("Forcing 3c5x9b full-duplex mode");
1288 break;
1289 }
1290 case 8:
1291
1292 if ((sw_info & 0x000f) && (sw_info & 0x8000)) {
1293 pr_cont("Setting 3c5x9b full-duplex mode (from EEPROM configuration bit)");
1294 break;
1295 }
1296 default:
1297
1298 pr_cont("Setting 3c5x9/3c5x9B half-duplex mode");
1299 net_diag = (net_diag & ~FD_ENABLE);
1300 }
1301
1302 outw(net_diag, ioaddr + WN4_NETDIAG);
1303 pr_cont(" if_port: %d, sw_info: %4.4x\n", dev->if_port, sw_info);
1304 if (el3_debug > 3)
1305 pr_debug("%s: 3c5x9 net diag word is now: %4.4x.\n", dev->name, net_diag);
1306
1307 outw(inw(ioaddr + WN4_MEDIA) | MEDIA_TP, ioaddr + WN4_MEDIA);
1308 }
1309
1310
1311 outw(StatsDisable, ioaddr + EL3_CMD);
1312 EL3WINDOW(6);
1313 for (i = 0; i < 9; i++)
1314 inb(ioaddr + i);
1315 inw(ioaddr + 10);
1316 inw(ioaddr + 12);
1317
1318
1319 EL3WINDOW(1);
1320
1321
1322 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1323 outw(StatsEnable, ioaddr + EL3_CMD);
1324
1325 outw(RxEnable, ioaddr + EL3_CMD);
1326 outw(TxEnable, ioaddr + EL3_CMD);
1327
1328 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
1329
1330 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
1331 ioaddr + EL3_CMD);
1332 outw(SetIntrEnb | IntLatch|TxAvailable|TxComplete|RxComplete|StatsFull,
1333 ioaddr + EL3_CMD);
1334
1335 netif_start_queue(dev);
1336}
1337
1338
1339#ifdef CONFIG_PM
1340
1341static int
1342el3_suspend(struct device *pdev, pm_message_t state)
1343{
1344 unsigned long flags;
1345 struct net_device *dev;
1346 struct el3_private *lp;
1347 int ioaddr;
1348
1349 dev = dev_get_drvdata(pdev);
1350 lp = netdev_priv(dev);
1351 ioaddr = dev->base_addr;
1352
1353 spin_lock_irqsave(&lp->lock, flags);
1354
1355 if (netif_running(dev))
1356 netif_device_detach(dev);
1357
1358 el3_down(dev);
1359 outw(PowerDown, ioaddr + EL3_CMD);
1360
1361 spin_unlock_irqrestore(&lp->lock, flags);
1362 return 0;
1363}
1364
1365static int
1366el3_resume(struct device *pdev)
1367{
1368 unsigned long flags;
1369 struct net_device *dev;
1370 struct el3_private *lp;
1371 int ioaddr;
1372
1373 dev = dev_get_drvdata(pdev);
1374 lp = netdev_priv(dev);
1375 ioaddr = dev->base_addr;
1376
1377 spin_lock_irqsave(&lp->lock, flags);
1378
1379 outw(PowerUp, ioaddr + EL3_CMD);
1380 EL3WINDOW(0);
1381 el3_up(dev);
1382
1383 if (netif_running(dev))
1384 netif_device_attach(dev);
1385
1386 spin_unlock_irqrestore(&lp->lock, flags);
1387 return 0;
1388}
1389
1390#endif
1391
1392module_param(debug,int, 0);
1393module_param_array(irq, int, NULL, 0);
1394module_param(max_interrupt_work, int, 0);
1395MODULE_PARM_DESC(debug, "debug level (0-6)");
1396MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
1397MODULE_PARM_DESC(max_interrupt_work, "maximum events handled per interrupt");
1398#ifdef CONFIG_PNP
1399module_param(nopnp, int, 0);
1400MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)");
1401#endif
1402MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B, 3c529, 3c579) ethernet driver");
1403MODULE_LICENSE("GPL");
1404
1405static int __init el3_init_module(void)
1406{
1407 int ret = 0;
1408
1409 if (debug >= 0)
1410 el3_debug = debug;
1411
1412#ifdef CONFIG_PNP
1413 if (!nopnp) {
1414 ret = pnp_register_driver(&el3_pnp_driver);
1415 if (!ret)
1416 pnp_registered = 1;
1417 }
1418#endif
1419
1420
1421 for (id_port = 0x110 ; id_port < 0x200; id_port += 0x10) {
1422 if (!request_region(id_port, 1, "3c509-control"))
1423 continue;
1424 outb(0x00, id_port);
1425 outb(0xff, id_port);
1426 if (inb(id_port) & 0x01)
1427 break;
1428 else
1429 release_region(id_port, 1);
1430 }
1431 if (id_port >= 0x200) {
1432 id_port = 0;
1433 pr_err("No I/O port available for 3c509 activation.\n");
1434 } else {
1435 ret = isa_register_driver(&el3_isa_driver, EL3_MAX_CARDS);
1436 if (!ret)
1437 isa_registered = 1;
1438 }
1439#ifdef CONFIG_EISA
1440 ret = eisa_driver_register(&el3_eisa_driver);
1441 if (!ret)
1442 eisa_registered = 1;
1443#endif
1444
1445#ifdef CONFIG_PNP
1446 if (pnp_registered)
1447 ret = 0;
1448#endif
1449 if (isa_registered)
1450 ret = 0;
1451#ifdef CONFIG_EISA
1452 if (eisa_registered)
1453 ret = 0;
1454#endif
1455 return ret;
1456}
1457
1458static void __exit el3_cleanup_module(void)
1459{
1460#ifdef CONFIG_PNP
1461 if (pnp_registered)
1462 pnp_unregister_driver(&el3_pnp_driver);
1463#endif
1464 if (isa_registered)
1465 isa_unregister_driver(&el3_isa_driver);
1466 if (id_port)
1467 release_region(id_port, 1);
1468#ifdef CONFIG_EISA
1469 if (eisa_registered)
1470 eisa_driver_unregister(&el3_eisa_driver);
1471#endif
1472}
1473
1474module_init (el3_init_module);
1475module_exit (el3_cleanup_module);
1476