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