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
63
64
65
66
67
68
69
70
71
72#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
73
74#include <linux/module.h>
75#include <linux/kernel.h>
76#include <linux/init.h>
77#include <linux/slab.h>
78#include <linux/string.h>
79#include <linux/timer.h>
80#include <linux/interrupt.h>
81#include <linux/in.h>
82#include <linux/delay.h>
83#include <linux/netdevice.h>
84#include <linux/etherdevice.h>
85#include <linux/skbuff.h>
86#include <linux/if_arp.h>
87#include <linux/ioport.h>
88#include <linux/bitops.h>
89#include <linux/mii.h>
90
91#include <pcmcia/cistpl.h>
92#include <pcmcia/cisreg.h>
93#include <pcmcia/ciscode.h>
94#include <pcmcia/ds.h>
95
96#include <asm/uaccess.h>
97#include <asm/io.h>
98
99
100
101
102
103MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
104MODULE_DESCRIPTION("3Com 3c574 series PCMCIA ethernet driver");
105MODULE_LICENSE("GPL");
106
107#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
108
109
110INT_MODULE_PARM(max_interrupt_work, 32);
111
112
113INT_MODULE_PARM(full_duplex, 0);
114
115
116INT_MODULE_PARM(auto_polarity, 1);
117
118
119
120
121
122#define TX_TIMEOUT ((800*HZ)/1000)
123
124
125
126
127
128#define EL3_DATA 0x00
129#define EL3_CMD 0x0e
130#define EL3_STATUS 0x0e
131
132#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
133
134
135
136enum el3_cmds {
137 TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
138 RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
139 TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
140 FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
141 SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
142 SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
143 StatsDisable = 22<<11, StopCoax = 23<<11,
144};
145
146enum elxl_status {
147 IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
148 TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
149 IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000 };
150
151
152enum RxFilter {
153 RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
154};
155
156enum Window0 {
157 Wn0EepromCmd = 10, Wn0EepromData = 12,
158 IntrStatus=0x0E,
159};
160
161enum Win0_EEPROM_cmds {
162 EEPROM_Read = 0x200, EEPROM_WRITE = 0x100, EEPROM_ERASE = 0x300,
163 EEPROM_EWENB = 0x30,
164 EEPROM_EWDIS = 0x00,
165};
166
167
168
169
170enum Window1 {
171 TX_FIFO = 0x10, RX_FIFO = 0x10, RxErrors = 0x14,
172 RxStatus = 0x18, Timer=0x1A, TxStatus = 0x1B,
173 TxFree = 0x0C,
174 RunnerRdCtrl = 0x16, RunnerWrCtrl = 0x1c,
175};
176
177enum Window3 {
178 Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
179};
180enum wn3_config {
181 Ram_size = 7,
182 Ram_width = 8,
183 Ram_speed = 0x30,
184 Rom_size = 0xc0,
185 Ram_split_shift = 16,
186 Ram_split = 3 << Ram_split_shift,
187 Xcvr_shift = 20,
188 Xcvr = 7 << Xcvr_shift,
189 Autoselect = 0x1000000,
190};
191
192enum Window4 {
193 Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,
194};
195
196#define MEDIA_TP 0x00C0
197
198struct el3_private {
199 struct pcmcia_device *p_dev;
200 u16 advertising, partner;
201 unsigned char phys;
202 unsigned int autoselect:1, default_media:3;
203
204 struct timer_list media;
205 unsigned short media_status;
206 unsigned short fast_poll;
207 unsigned long last_irq;
208 spinlock_t window_lock;
209};
210
211
212
213
214static char mii_preamble_required = 0;
215
216
217
218static int tc574_config(struct pcmcia_device *link);
219static void tc574_release(struct pcmcia_device *link);
220
221static void mdio_sync(unsigned int ioaddr, int bits);
222static int mdio_read(unsigned int ioaddr, int phy_id, int location);
223static void mdio_write(unsigned int ioaddr, int phy_id, int location,
224 int value);
225static unsigned short read_eeprom(unsigned int ioaddr, int index);
226static void tc574_wait_for_completion(struct net_device *dev, int cmd);
227
228static void tc574_reset(struct net_device *dev);
229static void media_check(unsigned long arg);
230static int el3_open(struct net_device *dev);
231static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
232 struct net_device *dev);
233static irqreturn_t el3_interrupt(int irq, void *dev_id);
234static void update_stats(struct net_device *dev);
235static struct net_device_stats *el3_get_stats(struct net_device *dev);
236static int el3_rx(struct net_device *dev, int worklimit);
237static int el3_close(struct net_device *dev);
238static void el3_tx_timeout(struct net_device *dev);
239static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
240static void set_rx_mode(struct net_device *dev);
241static void set_multicast_list(struct net_device *dev);
242
243static void tc574_detach(struct pcmcia_device *p_dev);
244
245
246
247
248
249
250static const struct net_device_ops el3_netdev_ops = {
251 .ndo_open = el3_open,
252 .ndo_stop = el3_close,
253 .ndo_start_xmit = el3_start_xmit,
254 .ndo_tx_timeout = el3_tx_timeout,
255 .ndo_get_stats = el3_get_stats,
256 .ndo_do_ioctl = el3_ioctl,
257 .ndo_set_rx_mode = set_multicast_list,
258 .ndo_change_mtu = eth_change_mtu,
259 .ndo_set_mac_address = eth_mac_addr,
260 .ndo_validate_addr = eth_validate_addr,
261};
262
263static int tc574_probe(struct pcmcia_device *link)
264{
265 struct el3_private *lp;
266 struct net_device *dev;
267
268 dev_dbg(&link->dev, "3c574_attach()\n");
269
270
271 dev = alloc_etherdev(sizeof(struct el3_private));
272 if (!dev)
273 return -ENOMEM;
274 lp = netdev_priv(dev);
275 link->priv = dev;
276 lp->p_dev = link;
277
278 spin_lock_init(&lp->window_lock);
279 link->resource[0]->end = 32;
280 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
281 link->config_flags |= CONF_ENABLE_IRQ;
282 link->config_index = 1;
283
284 dev->netdev_ops = &el3_netdev_ops;
285 dev->watchdog_timeo = TX_TIMEOUT;
286
287 return tc574_config(link);
288}
289
290static void tc574_detach(struct pcmcia_device *link)
291{
292 struct net_device *dev = link->priv;
293
294 dev_dbg(&link->dev, "3c574_detach()\n");
295
296 unregister_netdev(dev);
297
298 tc574_release(link);
299
300 free_netdev(dev);
301}
302
303static const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
304
305static int tc574_config(struct pcmcia_device *link)
306{
307 struct net_device *dev = link->priv;
308 struct el3_private *lp = netdev_priv(dev);
309 int ret, i, j;
310 unsigned int ioaddr;
311 __be16 *phys_addr;
312 char *cardname;
313 __u32 config;
314 u8 *buf;
315 size_t len;
316
317 phys_addr = (__be16 *)dev->dev_addr;
318
319 dev_dbg(&link->dev, "3c574_config()\n");
320
321 link->io_lines = 16;
322
323 for (i = j = 0; j < 0x400; j += 0x20) {
324 link->resource[0]->start = j ^ 0x300;
325 i = pcmcia_request_io(link);
326 if (i == 0)
327 break;
328 }
329 if (i != 0)
330 goto failed;
331
332 ret = pcmcia_request_irq(link, el3_interrupt);
333 if (ret)
334 goto failed;
335
336 ret = pcmcia_enable_device(link);
337 if (ret)
338 goto failed;
339
340 dev->irq = link->irq;
341 dev->base_addr = link->resource[0]->start;
342
343 ioaddr = dev->base_addr;
344
345
346
347
348
349 len = pcmcia_get_tuple(link, 0x88, &buf);
350 if (buf && len >= 6) {
351 for (i = 0; i < 3; i++)
352 phys_addr[i] = htons(le16_to_cpu(buf[i * 2]));
353 kfree(buf);
354 } else {
355 kfree(buf);
356 EL3WINDOW(0);
357 for (i = 0; i < 3; i++)
358 phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
359 if (phys_addr[0] == htons(0x6060)) {
360 pr_notice("IO port conflict at 0x%03lx-0x%03lx\n",
361 dev->base_addr, dev->base_addr+15);
362 goto failed;
363 }
364 }
365 if (link->prod_id[1])
366 cardname = link->prod_id[1];
367 else
368 cardname = "3Com 3c574";
369
370 {
371 u_char mcr;
372 outw(2<<11, ioaddr + RunnerRdCtrl);
373 mcr = inb(ioaddr + 2);
374 outw(0<<11, ioaddr + RunnerRdCtrl);
375 pr_info(" ASIC rev %d,", mcr>>3);
376 EL3WINDOW(3);
377 config = inl(ioaddr + Wn3_Config);
378 lp->default_media = (config & Xcvr) >> Xcvr_shift;
379 lp->autoselect = config & Autoselect ? 1 : 0;
380 }
381
382 init_timer(&lp->media);
383
384 {
385 int phy;
386
387
388 outw(0x8040, ioaddr + Wn3_Options);
389 mdelay(1);
390 outw(0xc040, ioaddr + Wn3_Options);
391 tc574_wait_for_completion(dev, TxReset);
392 tc574_wait_for_completion(dev, RxReset);
393 mdelay(1);
394 outw(0x8040, ioaddr + Wn3_Options);
395
396 EL3WINDOW(4);
397 for (phy = 1; phy <= 32; phy++) {
398 int mii_status;
399 mdio_sync(ioaddr, 32);
400 mii_status = mdio_read(ioaddr, phy & 0x1f, 1);
401 if (mii_status != 0xffff) {
402 lp->phys = phy & 0x1f;
403 dev_dbg(&link->dev, " MII transceiver at "
404 "index %d, status %x.\n",
405 phy, mii_status);
406 if ((mii_status & 0x0040) == 0)
407 mii_preamble_required = 1;
408 break;
409 }
410 }
411 if (phy > 32) {
412 pr_notice(" No MII transceivers found!\n");
413 goto failed;
414 }
415 i = mdio_read(ioaddr, lp->phys, 16) | 0x40;
416 mdio_write(ioaddr, lp->phys, 16, i);
417 lp->advertising = mdio_read(ioaddr, lp->phys, 4);
418 if (full_duplex) {
419
420 lp->advertising &= ~0x02a0;
421 mdio_write(ioaddr, lp->phys, 4, lp->advertising);
422 }
423 }
424
425 SET_NETDEV_DEV(dev, &link->dev);
426
427 if (register_netdev(dev) != 0) {
428 pr_notice("register_netdev() failed\n");
429 goto failed;
430 }
431
432 netdev_info(dev, "%s at io %#3lx, irq %d, hw_addr %pM\n",
433 cardname, dev->base_addr, dev->irq, dev->dev_addr);
434 netdev_info(dev, " %dK FIFO split %s Rx:Tx, %sMII interface.\n",
435 8 << (config & Ram_size),
436 ram_split[(config & Ram_split) >> Ram_split_shift],
437 config & Autoselect ? "autoselect " : "");
438
439 return 0;
440
441failed:
442 tc574_release(link);
443 return -ENODEV;
444
445}
446
447static void tc574_release(struct pcmcia_device *link)
448{
449 pcmcia_disable_device(link);
450}
451
452static int tc574_suspend(struct pcmcia_device *link)
453{
454 struct net_device *dev = link->priv;
455
456 if (link->open)
457 netif_device_detach(dev);
458
459 return 0;
460}
461
462static int tc574_resume(struct pcmcia_device *link)
463{
464 struct net_device *dev = link->priv;
465
466 if (link->open) {
467 tc574_reset(dev);
468 netif_device_attach(dev);
469 }
470
471 return 0;
472}
473
474static void dump_status(struct net_device *dev)
475{
476 unsigned int ioaddr = dev->base_addr;
477 EL3WINDOW(1);
478 netdev_info(dev, " irq status %04x, rx status %04x, tx status %02x, tx free %04x\n",
479 inw(ioaddr+EL3_STATUS),
480 inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
481 inw(ioaddr+TxFree));
482 EL3WINDOW(4);
483 netdev_info(dev, " diagnostics: fifo %04x net %04x ethernet %04x media %04x\n",
484 inw(ioaddr+0x04), inw(ioaddr+0x06),
485 inw(ioaddr+0x08), inw(ioaddr+0x0a));
486 EL3WINDOW(1);
487}
488
489
490
491
492static void tc574_wait_for_completion(struct net_device *dev, int cmd)
493{
494 int i = 1500;
495 outw(cmd, dev->base_addr + EL3_CMD);
496 while (--i > 0)
497 if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
498 if (i == 0)
499 netdev_notice(dev, "command 0x%04x did not complete!\n", cmd);
500}
501
502
503
504
505static unsigned short read_eeprom(unsigned int ioaddr, int index)
506{
507 int timer;
508 outw(EEPROM_Read + index, ioaddr + Wn0EepromCmd);
509
510 for (timer = 1620; timer >= 0; timer--) {
511 if ((inw(ioaddr + Wn0EepromCmd) & 0x8000) == 0)
512 break;
513 }
514 return inw(ioaddr + Wn0EepromData);
515}
516
517
518
519
520
521
522
523
524#define MDIO_SHIFT_CLK 0x01
525#define MDIO_DIR_WRITE 0x04
526#define MDIO_DATA_WRITE0 (0x00 | MDIO_DIR_WRITE)
527#define MDIO_DATA_WRITE1 (0x02 | MDIO_DIR_WRITE)
528#define MDIO_DATA_READ 0x02
529#define MDIO_ENB_IN 0x00
530
531
532
533static void mdio_sync(unsigned int ioaddr, int bits)
534{
535 unsigned int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
536
537
538 while (-- bits >= 0) {
539 outw(MDIO_DATA_WRITE1, mdio_addr);
540 outw(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
541 }
542}
543
544static int mdio_read(unsigned int ioaddr, int phy_id, int location)
545{
546 int i;
547 int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
548 unsigned int retval = 0;
549 unsigned int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
550
551 if (mii_preamble_required)
552 mdio_sync(ioaddr, 32);
553
554
555 for (i = 14; i >= 0; i--) {
556 int dataval = (read_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
557 outw(dataval, mdio_addr);
558 outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
559 }
560
561 for (i = 19; i > 0; i--) {
562 outw(MDIO_ENB_IN, mdio_addr);
563 retval = (retval << 1) | ((inw(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
564 outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
565 }
566 return (retval>>1) & 0xffff;
567}
568
569static void mdio_write(unsigned int ioaddr, int phy_id, int location, int value)
570{
571 int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value;
572 unsigned int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
573 int i;
574
575 if (mii_preamble_required)
576 mdio_sync(ioaddr, 32);
577
578
579 for (i = 31; i >= 0; i--) {
580 int dataval = (write_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
581 outw(dataval, mdio_addr);
582 outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
583 }
584
585 for (i = 1; i >= 0; i--) {
586 outw(MDIO_ENB_IN, mdio_addr);
587 outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
588 }
589}
590
591
592static void tc574_reset(struct net_device *dev)
593{
594 struct el3_private *lp = netdev_priv(dev);
595 int i;
596 unsigned int ioaddr = dev->base_addr;
597 unsigned long flags;
598
599 tc574_wait_for_completion(dev, TotalReset|0x10);
600
601 spin_lock_irqsave(&lp->window_lock, flags);
602
603 outw(0, ioaddr + RunnerWrCtrl);
604 outw(0, ioaddr + RunnerRdCtrl);
605
606
607 EL3WINDOW(2);
608 for (i = 0; i < 6; i++)
609 outb(dev->dev_addr[i], ioaddr + i);
610 for (; i < 12; i+=2)
611 outw(0, ioaddr + i);
612
613
614 EL3WINDOW(3);
615 outb((dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
616 outl((lp->autoselect ? 0x01000000 : 0) | 0x0062001b,
617 ioaddr + Wn3_Config);
618
619 outw(0x8040, ioaddr + Wn3_Options);
620 mdelay(1);
621 outw(0xc040, ioaddr + Wn3_Options);
622 EL3WINDOW(1);
623 spin_unlock_irqrestore(&lp->window_lock, flags);
624
625 tc574_wait_for_completion(dev, TxReset);
626 tc574_wait_for_completion(dev, RxReset);
627 mdelay(1);
628 spin_lock_irqsave(&lp->window_lock, flags);
629 EL3WINDOW(3);
630 outw(0x8040, ioaddr + Wn3_Options);
631
632
633 outw(StatsDisable, ioaddr + EL3_CMD);
634 EL3WINDOW(6);
635 for (i = 0; i < 10; i++)
636 inb(ioaddr + i);
637 inw(ioaddr + 10);
638 inw(ioaddr + 12);
639 EL3WINDOW(4);
640 inb(ioaddr + 12);
641 inb(ioaddr + 13);
642
643
644 outw(0x0040, ioaddr + Wn4_NetDiag);
645
646 EL3WINDOW(1);
647 spin_unlock_irqrestore(&lp->window_lock, flags);
648
649
650 mdio_sync(ioaddr, 32);
651 mdio_write(ioaddr, lp->phys, 4, lp->advertising);
652 if (!auto_polarity) {
653
654 i = mdio_read(ioaddr, lp->phys, 16) | 0x20;
655 mdio_write(ioaddr, lp->phys, 16, i);
656 }
657
658 spin_lock_irqsave(&lp->window_lock, flags);
659
660 set_rx_mode(dev);
661 spin_unlock_irqrestore(&lp->window_lock, flags);
662 outw(StatsEnable, ioaddr + EL3_CMD);
663 outw(RxEnable, ioaddr + EL3_CMD);
664 outw(TxEnable, ioaddr + EL3_CMD);
665
666 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
667
668 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
669 ioaddr + EL3_CMD);
670 outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
671 | AdapterFailure | RxEarly, ioaddr + EL3_CMD);
672}
673
674static int el3_open(struct net_device *dev)
675{
676 struct el3_private *lp = netdev_priv(dev);
677 struct pcmcia_device *link = lp->p_dev;
678
679 if (!pcmcia_dev_present(link))
680 return -ENODEV;
681
682 link->open++;
683 netif_start_queue(dev);
684
685 tc574_reset(dev);
686 lp->media.function = media_check;
687 lp->media.data = (unsigned long) dev;
688 lp->media.expires = jiffies + HZ;
689 add_timer(&lp->media);
690
691 dev_dbg(&link->dev, "%s: opened, status %4.4x.\n",
692 dev->name, inw(dev->base_addr + EL3_STATUS));
693
694 return 0;
695}
696
697static void el3_tx_timeout(struct net_device *dev)
698{
699 unsigned int ioaddr = dev->base_addr;
700
701 netdev_notice(dev, "Transmit timed out!\n");
702 dump_status(dev);
703 dev->stats.tx_errors++;
704 netif_trans_update(dev);
705
706 tc574_wait_for_completion(dev, TxReset);
707 outw(TxEnable, ioaddr + EL3_CMD);
708 netif_wake_queue(dev);
709}
710
711static void pop_tx_status(struct net_device *dev)
712{
713 unsigned int ioaddr = dev->base_addr;
714 int i;
715
716
717 for (i = 32; i > 0; i--) {
718 u_char tx_status = inb(ioaddr + TxStatus);
719 if (!(tx_status & 0x84))
720 break;
721
722 if (tx_status & 0x30)
723 tc574_wait_for_completion(dev, TxReset);
724 if (tx_status & 0x38) {
725 pr_debug("%s: transmit error: status 0x%02x\n",
726 dev->name, tx_status);
727 outw(TxEnable, ioaddr + EL3_CMD);
728 dev->stats.tx_aborted_errors++;
729 }
730 outb(0x00, ioaddr + TxStatus);
731 }
732}
733
734static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
735 struct net_device *dev)
736{
737 unsigned int ioaddr = dev->base_addr;
738 struct el3_private *lp = netdev_priv(dev);
739 unsigned long flags;
740
741 pr_debug("%s: el3_start_xmit(length = %ld) called, "
742 "status %4.4x.\n", dev->name, (long)skb->len,
743 inw(ioaddr + EL3_STATUS));
744
745 spin_lock_irqsave(&lp->window_lock, flags);
746
747 dev->stats.tx_bytes += skb->len;
748
749
750 outw(skb->len, ioaddr + TX_FIFO);
751 outw(0, ioaddr + TX_FIFO);
752
753 outsl(ioaddr + TX_FIFO, skb->data, (skb->len+3)>>2);
754
755
756 if (inw(ioaddr + TxFree) <= 1536) {
757 netif_stop_queue(dev);
758
759
760 outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
761 }
762
763 pop_tx_status(dev);
764 spin_unlock_irqrestore(&lp->window_lock, flags);
765 dev_kfree_skb(skb);
766 return NETDEV_TX_OK;
767}
768
769
770static irqreturn_t el3_interrupt(int irq, void *dev_id)
771{
772 struct net_device *dev = (struct net_device *) dev_id;
773 struct el3_private *lp = netdev_priv(dev);
774 unsigned int ioaddr;
775 unsigned status;
776 int work_budget = max_interrupt_work;
777 int handled = 0;
778
779 if (!netif_device_present(dev))
780 return IRQ_NONE;
781 ioaddr = dev->base_addr;
782
783 pr_debug("%s: interrupt, status %4.4x.\n",
784 dev->name, inw(ioaddr + EL3_STATUS));
785
786 spin_lock(&lp->window_lock);
787
788 while ((status = inw(ioaddr + EL3_STATUS)) &
789 (IntLatch | RxComplete | RxEarly | StatsFull)) {
790 if (!netif_device_present(dev) ||
791 ((status & 0xe000) != 0x2000)) {
792 pr_debug("%s: Interrupt from dead card\n", dev->name);
793 break;
794 }
795
796 handled = 1;
797
798 if (status & RxComplete)
799 work_budget = el3_rx(dev, work_budget);
800
801 if (status & TxAvailable) {
802 pr_debug(" TX room bit was handled.\n");
803
804 outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
805 netif_wake_queue(dev);
806 }
807
808 if (status & TxComplete)
809 pop_tx_status(dev);
810
811 if (status & (AdapterFailure | RxEarly | StatsFull)) {
812
813 if (status & StatsFull)
814 update_stats(dev);
815 if (status & RxEarly) {
816 work_budget = el3_rx(dev, work_budget);
817 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
818 }
819 if (status & AdapterFailure) {
820 u16 fifo_diag;
821 EL3WINDOW(4);
822 fifo_diag = inw(ioaddr + Wn4_FIFODiag);
823 EL3WINDOW(1);
824 netdev_notice(dev, "adapter failure, FIFO diagnostic register %04x\n",
825 fifo_diag);
826 if (fifo_diag & 0x0400) {
827
828 tc574_wait_for_completion(dev, TxReset);
829 outw(TxEnable, ioaddr + EL3_CMD);
830 }
831 if (fifo_diag & 0x2000) {
832
833 tc574_wait_for_completion(dev, RxReset);
834 set_rx_mode(dev);
835 outw(RxEnable, ioaddr + EL3_CMD);
836 }
837 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
838 }
839 }
840
841 if (--work_budget < 0) {
842 pr_debug("%s: Too much work in interrupt, "
843 "status %4.4x.\n", dev->name, status);
844
845 outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
846 break;
847 }
848
849 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
850 }
851
852 pr_debug("%s: exiting interrupt, status %4.4x.\n",
853 dev->name, inw(ioaddr + EL3_STATUS));
854
855 spin_unlock(&lp->window_lock);
856 return IRQ_RETVAL(handled);
857}
858
859
860
861
862
863
864static void media_check(unsigned long arg)
865{
866 struct net_device *dev = (struct net_device *) arg;
867 struct el3_private *lp = netdev_priv(dev);
868 unsigned int ioaddr = dev->base_addr;
869 unsigned long flags;
870 unsigned short media, partner;
871
872 if (!netif_device_present(dev))
873 goto reschedule;
874
875
876
877 if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + Timer) == 0xff)) {
878 if (!lp->fast_poll)
879 netdev_info(dev, "interrupt(s) dropped!\n");
880
881 local_irq_save(flags);
882 el3_interrupt(dev->irq, dev);
883 local_irq_restore(flags);
884
885 lp->fast_poll = HZ;
886 }
887 if (lp->fast_poll) {
888 lp->fast_poll--;
889 lp->media.expires = jiffies + 2*HZ/100;
890 add_timer(&lp->media);
891 return;
892 }
893
894 spin_lock_irqsave(&lp->window_lock, flags);
895 EL3WINDOW(4);
896 media = mdio_read(ioaddr, lp->phys, 1);
897 partner = mdio_read(ioaddr, lp->phys, 5);
898 EL3WINDOW(1);
899
900 if (media != lp->media_status) {
901 if ((media ^ lp->media_status) & 0x0004)
902 netdev_info(dev, "%s link beat\n",
903 (lp->media_status & 0x0004) ? "lost" : "found");
904 if ((media ^ lp->media_status) & 0x0020) {
905 lp->partner = 0;
906 if (lp->media_status & 0x0020) {
907 netdev_info(dev, "autonegotiation restarted\n");
908 } else if (partner) {
909 partner &= lp->advertising;
910 lp->partner = partner;
911 netdev_info(dev, "autonegotiation complete: "
912 "%dbaseT-%cD selected\n",
913 (partner & 0x0180) ? 100 : 10,
914 (partner & 0x0140) ? 'F' : 'H');
915 } else {
916 netdev_info(dev, "link partner did not autonegotiate\n");
917 }
918
919 EL3WINDOW(3);
920 outb((partner & 0x0140 ? 0x20 : 0) |
921 (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
922 EL3WINDOW(1);
923
924 }
925 if (media & 0x0010)
926 netdev_info(dev, "remote fault detected\n");
927 if (media & 0x0002)
928 netdev_info(dev, "jabber detected\n");
929 lp->media_status = media;
930 }
931 spin_unlock_irqrestore(&lp->window_lock, flags);
932
933reschedule:
934 lp->media.expires = jiffies + HZ;
935 add_timer(&lp->media);
936}
937
938static struct net_device_stats *el3_get_stats(struct net_device *dev)
939{
940 struct el3_private *lp = netdev_priv(dev);
941
942 if (netif_device_present(dev)) {
943 unsigned long flags;
944 spin_lock_irqsave(&lp->window_lock, flags);
945 update_stats(dev);
946 spin_unlock_irqrestore(&lp->window_lock, flags);
947 }
948 return &dev->stats;
949}
950
951
952
953
954
955static void update_stats(struct net_device *dev)
956{
957 unsigned int ioaddr = dev->base_addr;
958 u8 rx, tx, up;
959
960 pr_debug("%s: updating the statistics.\n", dev->name);
961
962 if (inw(ioaddr+EL3_STATUS) == 0xffff)
963 return;
964
965
966
967 EL3WINDOW(6);
968 dev->stats.tx_carrier_errors += inb(ioaddr + 0);
969 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1);
970 inb(ioaddr + 2);
971 dev->stats.collisions += inb(ioaddr + 3);
972 dev->stats.tx_window_errors += inb(ioaddr + 4);
973 dev->stats.rx_fifo_errors += inb(ioaddr + 5);
974 dev->stats.tx_packets += inb(ioaddr + 6);
975 up = inb(ioaddr + 9);
976 dev->stats.tx_packets += (up&0x30) << 4;
977 inb(ioaddr + 7);
978 inb(ioaddr + 8);
979 rx = inw(ioaddr + 10);
980 tx = inw(ioaddr + 12);
981
982 EL3WINDOW(4);
983 inb(ioaddr + 12);
984 up = inb(ioaddr + 13);
985
986 EL3WINDOW(1);
987}
988
989static int el3_rx(struct net_device *dev, int worklimit)
990{
991 unsigned int ioaddr = dev->base_addr;
992 short rx_status;
993
994 pr_debug("%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
995 dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
996 while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
997 worklimit > 0) {
998 worklimit--;
999 if (rx_status & 0x4000) {
1000 short error = rx_status & 0x3800;
1001 dev->stats.rx_errors++;
1002 switch (error) {
1003 case 0x0000: dev->stats.rx_over_errors++; break;
1004 case 0x0800: dev->stats.rx_length_errors++; break;
1005 case 0x1000: dev->stats.rx_frame_errors++; break;
1006 case 0x1800: dev->stats.rx_length_errors++; break;
1007 case 0x2000: dev->stats.rx_frame_errors++; break;
1008 case 0x2800: dev->stats.rx_crc_errors++; break;
1009 }
1010 } else {
1011 short pkt_len = rx_status & 0x7ff;
1012 struct sk_buff *skb;
1013
1014 skb = netdev_alloc_skb(dev, pkt_len + 5);
1015
1016 pr_debug(" Receiving packet size %d status %4.4x.\n",
1017 pkt_len, rx_status);
1018 if (skb != NULL) {
1019 skb_reserve(skb, 2);
1020 insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
1021 ((pkt_len+3)>>2));
1022 skb->protocol = eth_type_trans(skb, dev);
1023 netif_rx(skb);
1024 dev->stats.rx_packets++;
1025 dev->stats.rx_bytes += pkt_len;
1026 } else {
1027 pr_debug("%s: couldn't allocate a sk_buff of"
1028 " size %d.\n", dev->name, pkt_len);
1029 dev->stats.rx_dropped++;
1030 }
1031 }
1032 tc574_wait_for_completion(dev, RxDiscard);
1033 }
1034
1035 return worklimit;
1036}
1037
1038
1039static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1040{
1041 struct el3_private *lp = netdev_priv(dev);
1042 unsigned int ioaddr = dev->base_addr;
1043 struct mii_ioctl_data *data = if_mii(rq);
1044 int phy = lp->phys & 0x1f;
1045
1046 pr_debug("%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
1047 dev->name, rq->ifr_ifrn.ifrn_name, cmd,
1048 data->phy_id, data->reg_num, data->val_in, data->val_out);
1049
1050 switch(cmd) {
1051 case SIOCGMIIPHY:
1052 data->phy_id = phy;
1053 case SIOCGMIIREG:
1054 {
1055 int saved_window;
1056 unsigned long flags;
1057
1058 spin_lock_irqsave(&lp->window_lock, flags);
1059 saved_window = inw(ioaddr + EL3_CMD) >> 13;
1060 EL3WINDOW(4);
1061 data->val_out = mdio_read(ioaddr, data->phy_id & 0x1f,
1062 data->reg_num & 0x1f);
1063 EL3WINDOW(saved_window);
1064 spin_unlock_irqrestore(&lp->window_lock, flags);
1065 return 0;
1066 }
1067 case SIOCSMIIREG:
1068 {
1069 int saved_window;
1070 unsigned long flags;
1071
1072 spin_lock_irqsave(&lp->window_lock, flags);
1073 saved_window = inw(ioaddr + EL3_CMD) >> 13;
1074 EL3WINDOW(4);
1075 mdio_write(ioaddr, data->phy_id & 0x1f,
1076 data->reg_num & 0x1f, data->val_in);
1077 EL3WINDOW(saved_window);
1078 spin_unlock_irqrestore(&lp->window_lock, flags);
1079 return 0;
1080 }
1081 default:
1082 return -EOPNOTSUPP;
1083 }
1084}
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094static void set_rx_mode(struct net_device *dev)
1095{
1096 unsigned int ioaddr = dev->base_addr;
1097
1098 if (dev->flags & IFF_PROMISC)
1099 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1100 ioaddr + EL3_CMD);
1101 else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI))
1102 outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
1103 else
1104 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1105}
1106
1107static void set_multicast_list(struct net_device *dev)
1108{
1109 struct el3_private *lp = netdev_priv(dev);
1110 unsigned long flags;
1111
1112 spin_lock_irqsave(&lp->window_lock, flags);
1113 set_rx_mode(dev);
1114 spin_unlock_irqrestore(&lp->window_lock, flags);
1115}
1116
1117static int el3_close(struct net_device *dev)
1118{
1119 unsigned int ioaddr = dev->base_addr;
1120 struct el3_private *lp = netdev_priv(dev);
1121 struct pcmcia_device *link = lp->p_dev;
1122
1123 dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
1124
1125 if (pcmcia_dev_present(link)) {
1126 unsigned long flags;
1127
1128
1129 outw(StatsDisable, ioaddr + EL3_CMD);
1130
1131
1132 outw(RxDisable, ioaddr + EL3_CMD);
1133 outw(TxDisable, ioaddr + EL3_CMD);
1134
1135
1136 EL3WINDOW(0);
1137 spin_lock_irqsave(&lp->window_lock, flags);
1138 update_stats(dev);
1139 spin_unlock_irqrestore(&lp->window_lock, flags);
1140
1141
1142 outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
1143 }
1144
1145 link->open--;
1146 netif_stop_queue(dev);
1147 del_timer_sync(&lp->media);
1148
1149 return 0;
1150}
1151
1152static const struct pcmcia_device_id tc574_ids[] = {
1153 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0574),
1154 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
1155 PCMCIA_DEVICE_NULL,
1156};
1157MODULE_DEVICE_TABLE(pcmcia, tc574_ids);
1158
1159static struct pcmcia_driver tc574_driver = {
1160 .owner = THIS_MODULE,
1161 .name = "3c574_cs",
1162 .probe = tc574_probe,
1163 .remove = tc574_detach,
1164 .id_table = tc574_ids,
1165 .suspend = tc574_suspend,
1166 .resume = tc574_resume,
1167};
1168module_pcmcia_driver(tc574_driver);
1169