1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#define DRV_NAME "3c589_cs"
23#define DRV_VERSION "1.162-ac"
24
25#include <linux/module.h>
26#include <linux/init.h>
27#include <linux/kernel.h>
28#include <linux/ptrace.h>
29#include <linux/slab.h>
30#include <linux/string.h>
31#include <linux/timer.h>
32#include <linux/interrupt.h>
33#include <linux/in.h>
34#include <linux/delay.h>
35#include <linux/ethtool.h>
36#include <linux/netdevice.h>
37#include <linux/etherdevice.h>
38#include <linux/skbuff.h>
39#include <linux/if_arp.h>
40#include <linux/ioport.h>
41#include <linux/bitops.h>
42#include <linux/jiffies.h>
43
44#include <pcmcia/cs_types.h>
45#include <pcmcia/cs.h>
46#include <pcmcia/cistpl.h>
47#include <pcmcia/cisreg.h>
48#include <pcmcia/ciscode.h>
49#include <pcmcia/ds.h>
50
51#include <asm/uaccess.h>
52#include <asm/io.h>
53#include <asm/system.h>
54
55
56
57
58
59#define EL3_DATA 0x00
60#define EL3_TIMER 0x0a
61#define EL3_CMD 0x0e
62#define EL3_STATUS 0x0e
63
64#define EEPROM_READ 0x0080
65#define EEPROM_BUSY 0x8000
66
67#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
68
69
70
71enum c509cmd {
72 TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
73 RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
74 TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
75 FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
76 SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
77 SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
78 StatsDisable = 22<<11, StopCoax = 23<<11,
79};
80
81enum c509status {
82 IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
83 TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
84 IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000
85};
86
87
88enum RxFilter {
89 RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
90};
91
92
93#define TX_FIFO 0x00
94#define RX_FIFO 0x00
95#define RX_STATUS 0x08
96#define TX_STATUS 0x0B
97#define TX_FREE 0x0C
98
99#define WN0_IRQ 0x08
100#define WN4_MEDIA 0x0A
101#define MEDIA_TP 0x00C0
102#define MEDIA_LED 0x0001
103
104
105#define TX_TIMEOUT ((400*HZ)/1000)
106
107struct el3_private {
108 struct pcmcia_device *p_dev;
109 dev_node_t node;
110
111 struct timer_list media;
112 u16 media_status;
113 u16 fast_poll;
114 unsigned long last_irq;
115 spinlock_t lock;
116};
117
118static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" };
119
120
121
122
123
124MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
125MODULE_DESCRIPTION("3Com 3c589 series PCMCIA ethernet driver");
126MODULE_LICENSE("GPL");
127
128#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
129
130
131INT_MODULE_PARM(if_port, 0);
132
133#ifdef PCMCIA_DEBUG
134INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
135#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
136static char *version =
137DRV_NAME ".c " DRV_VERSION " 2001/10/13 00:08:50 (David Hinds)";
138#else
139#define DEBUG(n, args...)
140#endif
141
142
143
144static int tc589_config(struct pcmcia_device *link);
145static void tc589_release(struct pcmcia_device *link);
146
147static u16 read_eeprom(unsigned int ioaddr, int index);
148static void tc589_reset(struct net_device *dev);
149static void media_check(unsigned long arg);
150static int el3_config(struct net_device *dev, struct ifmap *map);
151static int el3_open(struct net_device *dev);
152static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
153 struct net_device *dev);
154static irqreturn_t el3_interrupt(int irq, void *dev_id);
155static void update_stats(struct net_device *dev);
156static struct net_device_stats *el3_get_stats(struct net_device *dev);
157static int el3_rx(struct net_device *dev);
158static int el3_close(struct net_device *dev);
159static void el3_tx_timeout(struct net_device *dev);
160static void set_rx_mode(struct net_device *dev);
161static void set_multicast_list(struct net_device *dev);
162static const struct ethtool_ops netdev_ethtool_ops;
163
164static void tc589_detach(struct pcmcia_device *p_dev);
165
166
167
168
169
170
171
172
173
174static const struct net_device_ops el3_netdev_ops = {
175 .ndo_open = el3_open,
176 .ndo_stop = el3_close,
177 .ndo_start_xmit = el3_start_xmit,
178 .ndo_tx_timeout = el3_tx_timeout,
179 .ndo_set_config = el3_config,
180 .ndo_get_stats = el3_get_stats,
181 .ndo_set_multicast_list = set_multicast_list,
182 .ndo_change_mtu = eth_change_mtu,
183 .ndo_set_mac_address = eth_mac_addr,
184 .ndo_validate_addr = eth_validate_addr,
185};
186
187static int tc589_probe(struct pcmcia_device *link)
188{
189 struct el3_private *lp;
190 struct net_device *dev;
191
192 DEBUG(0, "3c589_attach()\n");
193
194
195 dev = alloc_etherdev(sizeof(struct el3_private));
196 if (!dev)
197 return -ENOMEM;
198 lp = netdev_priv(dev);
199 link->priv = dev;
200 lp->p_dev = link;
201
202 spin_lock_init(&lp->lock);
203 link->io.NumPorts1 = 16;
204 link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
205 link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
206 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
207 link->irq.Handler = &el3_interrupt;
208 link->irq.Instance = dev;
209 link->conf.Attributes = CONF_ENABLE_IRQ;
210 link->conf.IntType = INT_MEMORY_AND_IO;
211 link->conf.ConfigIndex = 1;
212
213 dev->netdev_ops = &el3_netdev_ops;
214 dev->watchdog_timeo = TX_TIMEOUT;
215
216 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
217
218 return tc589_config(link);
219}
220
221
222
223
224
225
226
227
228
229
230static void tc589_detach(struct pcmcia_device *link)
231{
232 struct net_device *dev = link->priv;
233
234 DEBUG(0, "3c589_detach(0x%p)\n", link);
235
236 if (link->dev_node)
237 unregister_netdev(dev);
238
239 tc589_release(link);
240
241 free_netdev(dev);
242}
243
244
245
246
247
248
249
250
251
252#define CS_CHECK(fn, ret) \
253do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
254
255static int tc589_config(struct pcmcia_device *link)
256{
257 struct net_device *dev = link->priv;
258 struct el3_private *lp = netdev_priv(dev);
259 tuple_t tuple;
260 __le16 buf[32];
261 __be16 *phys_addr;
262 int last_fn, last_ret, i, j, multi = 0, fifo;
263 unsigned int ioaddr;
264 char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
265
266 DEBUG(0, "3c589_config(0x%p)\n", link);
267
268 phys_addr = (__be16 *)dev->dev_addr;
269 tuple.Attributes = 0;
270 tuple.TupleData = (cisdata_t *)buf;
271 tuple.TupleDataMax = sizeof(buf);
272 tuple.TupleOffset = 0;
273 tuple.Attributes = TUPLE_RETURN_COMMON;
274
275
276 if (link->manf_id != MANFID_3COM)
277 printk(KERN_INFO "3c589_cs: hmmm, is this really a "
278 "3Com card??\n");
279 multi = (link->card_id == PRODID_3COM_3C562);
280
281
282 link->io.IOAddrLines = 16;
283 for (i = j = 0; j < 0x400; j += 0x10) {
284 if (multi && (j & 0x80)) continue;
285 link->io.BasePort1 = j ^ 0x300;
286 i = pcmcia_request_io(link, &link->io);
287 if (i == 0)
288 break;
289 }
290 if (i != 0) {
291 cs_error(link, RequestIO, i);
292 goto failed;
293 }
294 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
295 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
296
297 dev->irq = link->irq.AssignedIRQ;
298 dev->base_addr = link->io.BasePort1;
299 ioaddr = dev->base_addr;
300 EL3WINDOW(0);
301
302
303
304 tuple.DesiredTuple = 0x88;
305 if (pcmcia_get_first_tuple(link, &tuple) == 0) {
306 pcmcia_get_tuple_data(link, &tuple);
307 for (i = 0; i < 3; i++)
308 phys_addr[i] = htons(le16_to_cpu(buf[i]));
309 } else {
310 for (i = 0; i < 3; i++)
311 phys_addr[i] = htons(read_eeprom(ioaddr, i));
312 if (phys_addr[0] == htons(0x6060)) {
313 printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"
314 "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
315 goto failed;
316 }
317 }
318
319
320
321 outw(0x3f00, ioaddr + 8);
322 fifo = inl(ioaddr);
323
324
325 if ((if_port >= 0) && (if_port <= 3))
326 dev->if_port = if_port;
327 else
328 printk(KERN_ERR "3c589_cs: invalid if_port requested\n");
329
330 link->dev_node = &lp->node;
331 SET_NETDEV_DEV(dev, &handle_to_dev(link));
332
333 if (register_netdev(dev) != 0) {
334 printk(KERN_ERR "3c589_cs: register_netdev() failed\n");
335 link->dev_node = NULL;
336 goto failed;
337 }
338
339 strcpy(lp->node.dev_name, dev->name);
340
341 printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, "
342 "hw_addr %pM\n",
343 dev->name, (multi ? "562" : "589"), dev->base_addr, dev->irq,
344 dev->dev_addr);
345 printk(KERN_INFO " %dK FIFO split %s Rx:Tx, %s xcvr\n",
346 (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3],
347 if_names[dev->if_port]);
348 return 0;
349
350cs_failed:
351 cs_error(link, last_fn, last_ret);
352failed:
353 tc589_release(link);
354 return -ENODEV;
355}
356
357
358
359
360
361
362
363
364
365static void tc589_release(struct pcmcia_device *link)
366{
367 pcmcia_disable_device(link);
368}
369
370static int tc589_suspend(struct pcmcia_device *link)
371{
372 struct net_device *dev = link->priv;
373
374 if (link->open)
375 netif_device_detach(dev);
376
377 return 0;
378}
379
380static int tc589_resume(struct pcmcia_device *link)
381{
382 struct net_device *dev = link->priv;
383
384 if (link->open) {
385 tc589_reset(dev);
386 netif_device_attach(dev);
387 }
388
389 return 0;
390}
391
392
393
394
395
396
397static void tc589_wait_for_completion(struct net_device *dev, int cmd)
398{
399 int i = 100;
400 outw(cmd, dev->base_addr + EL3_CMD);
401 while (--i > 0)
402 if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
403 if (i == 0)
404 printk(KERN_WARNING "%s: command 0x%04x did not complete!\n",
405 dev->name, cmd);
406}
407
408
409
410
411
412static u16 read_eeprom(unsigned int ioaddr, int index)
413{
414 int i;
415 outw(EEPROM_READ + index, ioaddr + 10);
416
417 for (i = 1620; i >= 0; i--)
418 if ((inw(ioaddr + 10) & EEPROM_BUSY) == 0)
419 break;
420 return inw(ioaddr + 12);
421}
422
423
424
425
426
427static void tc589_set_xcvr(struct net_device *dev, int if_port)
428{
429 struct el3_private *lp = netdev_priv(dev);
430 unsigned int ioaddr = dev->base_addr;
431
432 EL3WINDOW(0);
433 switch (if_port) {
434 case 0: case 1: outw(0, ioaddr + 6); break;
435 case 2: outw(3<<14, ioaddr + 6); break;
436 case 3: outw(1<<14, ioaddr + 6); break;
437 }
438
439 outw((if_port == 2) ? StartCoax : StopCoax, ioaddr + EL3_CMD);
440
441 EL3WINDOW(4);
442 outw(MEDIA_LED | ((if_port < 2) ? MEDIA_TP : 0), ioaddr + WN4_MEDIA);
443 EL3WINDOW(1);
444 if (if_port == 2)
445 lp->media_status = ((dev->if_port == 0) ? 0x8000 : 0x4000);
446 else
447 lp->media_status = ((dev->if_port == 0) ? 0x4010 : 0x8800);
448}
449
450static void dump_status(struct net_device *dev)
451{
452 unsigned int ioaddr = dev->base_addr;
453 EL3WINDOW(1);
454 printk(KERN_INFO " irq status %04x, rx status %04x, tx status "
455 "%02x tx free %04x\n", inw(ioaddr+EL3_STATUS),
456 inw(ioaddr+RX_STATUS), inb(ioaddr+TX_STATUS),
457 inw(ioaddr+TX_FREE));
458 EL3WINDOW(4);
459 printk(KERN_INFO " diagnostics: fifo %04x net %04x ethernet %04x"
460 " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
461 inw(ioaddr+0x08), inw(ioaddr+0x0a));
462 EL3WINDOW(1);
463}
464
465
466static void tc589_reset(struct net_device *dev)
467{
468 unsigned int ioaddr = dev->base_addr;
469 int i;
470
471 EL3WINDOW(0);
472 outw(0x0001, ioaddr + 4);
473 outw(0x3f00, ioaddr + 8);
474
475
476 EL3WINDOW(2);
477 for (i = 0; i < 6; i++)
478 outb(dev->dev_addr[i], ioaddr + i);
479
480 tc589_set_xcvr(dev, dev->if_port);
481
482
483 outw(StatsDisable, ioaddr + EL3_CMD);
484 EL3WINDOW(6);
485 for (i = 0; i < 9; i++)
486 inb(ioaddr+i);
487 inw(ioaddr + 10);
488 inw(ioaddr + 12);
489
490
491 EL3WINDOW(1);
492
493 set_rx_mode(dev);
494 outw(StatsEnable, ioaddr + EL3_CMD);
495 outw(RxEnable, ioaddr + EL3_CMD);
496 outw(TxEnable, ioaddr + EL3_CMD);
497
498 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
499
500 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
501 ioaddr + EL3_CMD);
502 outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
503 | AdapterFailure, ioaddr + EL3_CMD);
504}
505
506static void netdev_get_drvinfo(struct net_device *dev,
507 struct ethtool_drvinfo *info)
508{
509 strcpy(info->driver, DRV_NAME);
510 strcpy(info->version, DRV_VERSION);
511 sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
512}
513
514#ifdef PCMCIA_DEBUG
515static u32 netdev_get_msglevel(struct net_device *dev)
516{
517 return pc_debug;
518}
519
520static void netdev_set_msglevel(struct net_device *dev, u32 level)
521{
522 pc_debug = level;
523}
524#endif
525
526static const struct ethtool_ops netdev_ethtool_ops = {
527 .get_drvinfo = netdev_get_drvinfo,
528#ifdef PCMCIA_DEBUG
529 .get_msglevel = netdev_get_msglevel,
530 .set_msglevel = netdev_set_msglevel,
531#endif
532};
533
534static int el3_config(struct net_device *dev, struct ifmap *map)
535{
536 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
537 if (map->port <= 3) {
538 dev->if_port = map->port;
539 printk(KERN_INFO "%s: switched to %s port\n",
540 dev->name, if_names[dev->if_port]);
541 tc589_set_xcvr(dev, dev->if_port);
542 } else
543 return -EINVAL;
544 }
545 return 0;
546}
547
548static int el3_open(struct net_device *dev)
549{
550 struct el3_private *lp = netdev_priv(dev);
551 struct pcmcia_device *link = lp->p_dev;
552
553 if (!pcmcia_dev_present(link))
554 return -ENODEV;
555
556 link->open++;
557 netif_start_queue(dev);
558
559 tc589_reset(dev);
560 init_timer(&lp->media);
561 lp->media.function = &media_check;
562 lp->media.data = (unsigned long) dev;
563 lp->media.expires = jiffies + HZ;
564 add_timer(&lp->media);
565
566 DEBUG(1, "%s: opened, status %4.4x.\n",
567 dev->name, inw(dev->base_addr + EL3_STATUS));
568
569 return 0;
570}
571
572static void el3_tx_timeout(struct net_device *dev)
573{
574 unsigned int ioaddr = dev->base_addr;
575
576 printk(KERN_WARNING "%s: Transmit timed out!\n", dev->name);
577 dump_status(dev);
578 dev->stats.tx_errors++;
579 dev->trans_start = jiffies;
580
581 tc589_wait_for_completion(dev, TxReset);
582 outw(TxEnable, ioaddr + EL3_CMD);
583 netif_wake_queue(dev);
584}
585
586static void pop_tx_status(struct net_device *dev)
587{
588 unsigned int ioaddr = dev->base_addr;
589 int i;
590
591
592 for (i = 32; i > 0; i--) {
593 u_char tx_status = inb(ioaddr + TX_STATUS);
594 if (!(tx_status & 0x84)) break;
595
596 if (tx_status & 0x30)
597 tc589_wait_for_completion(dev, TxReset);
598 if (tx_status & 0x38) {
599 DEBUG(1, "%s: transmit error: status 0x%02x\n",
600 dev->name, tx_status);
601 outw(TxEnable, ioaddr + EL3_CMD);
602 dev->stats.tx_aborted_errors++;
603 }
604 outb(0x00, ioaddr + TX_STATUS);
605 }
606}
607
608static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
609 struct net_device *dev)
610{
611 unsigned int ioaddr = dev->base_addr;
612 struct el3_private *priv = netdev_priv(dev);
613 unsigned long flags;
614
615 DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
616 "status %4.4x.\n", dev->name, (long)skb->len,
617 inw(ioaddr + EL3_STATUS));
618
619 spin_lock_irqsave(&priv->lock, flags);
620
621 dev->stats.tx_bytes += skb->len;
622
623
624 outw(skb->len, ioaddr + TX_FIFO);
625 outw(0x00, ioaddr + TX_FIFO);
626
627 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
628
629 dev->trans_start = jiffies;
630 if (inw(ioaddr + TX_FREE) <= 1536) {
631 netif_stop_queue(dev);
632
633 outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
634 }
635
636 pop_tx_status(dev);
637 spin_unlock_irqrestore(&priv->lock, flags);
638 dev_kfree_skb(skb);
639
640 return NETDEV_TX_OK;
641}
642
643
644static irqreturn_t el3_interrupt(int irq, void *dev_id)
645{
646 struct net_device *dev = (struct net_device *) dev_id;
647 struct el3_private *lp = netdev_priv(dev);
648 unsigned int ioaddr;
649 __u16 status;
650 int i = 0, handled = 1;
651
652 if (!netif_device_present(dev))
653 return IRQ_NONE;
654
655 ioaddr = dev->base_addr;
656
657 DEBUG(3, "%s: interrupt, status %4.4x.\n",
658 dev->name, inw(ioaddr + EL3_STATUS));
659
660 spin_lock(&lp->lock);
661 while ((status = inw(ioaddr + EL3_STATUS)) &
662 (IntLatch | RxComplete | StatsFull)) {
663 if ((status & 0xe000) != 0x2000) {
664 DEBUG(1, "%s: interrupt from dead card\n", dev->name);
665 handled = 0;
666 break;
667 }
668
669 if (status & RxComplete)
670 el3_rx(dev);
671
672 if (status & TxAvailable) {
673 DEBUG(3, " TX room bit was handled.\n");
674
675 outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
676 netif_wake_queue(dev);
677 }
678
679 if (status & TxComplete)
680 pop_tx_status(dev);
681
682 if (status & (AdapterFailure | RxEarly | StatsFull)) {
683
684 if (status & StatsFull)
685 update_stats(dev);
686 if (status & RxEarly) {
687 el3_rx(dev);
688 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
689 }
690 if (status & AdapterFailure) {
691 u16 fifo_diag;
692 EL3WINDOW(4);
693 fifo_diag = inw(ioaddr + 4);
694 EL3WINDOW(1);
695 printk(KERN_WARNING "%s: adapter failure, FIFO diagnostic"
696 " register %04x.\n", dev->name, fifo_diag);
697 if (fifo_diag & 0x0400) {
698
699 tc589_wait_for_completion(dev, TxReset);
700 outw(TxEnable, ioaddr + EL3_CMD);
701 }
702 if (fifo_diag & 0x2000) {
703
704 tc589_wait_for_completion(dev, RxReset);
705 set_rx_mode(dev);
706 outw(RxEnable, ioaddr + EL3_CMD);
707 }
708 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
709 }
710 }
711
712 if (++i > 10) {
713 printk(KERN_ERR "%s: infinite loop in interrupt, "
714 "status %4.4x.\n", dev->name, status);
715
716 outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
717 break;
718 }
719
720 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
721 }
722
723 lp->last_irq = jiffies;
724 spin_unlock(&lp->lock);
725 DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
726 dev->name, inw(ioaddr + EL3_STATUS));
727 return IRQ_RETVAL(handled);
728}
729
730static void media_check(unsigned long arg)
731{
732 struct net_device *dev = (struct net_device *)(arg);
733 struct el3_private *lp = netdev_priv(dev);
734 unsigned int ioaddr = dev->base_addr;
735 u16 media, errs;
736 unsigned long flags;
737
738 if (!netif_device_present(dev)) goto reschedule;
739
740
741
742 if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
743 (inb(ioaddr + EL3_TIMER) == 0xff)) {
744 if (!lp->fast_poll)
745 printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name);
746 el3_interrupt(dev->irq, dev);
747 lp->fast_poll = HZ;
748 }
749 if (lp->fast_poll) {
750 lp->fast_poll--;
751 lp->media.expires = jiffies + HZ/100;
752 add_timer(&lp->media);
753 return;
754 }
755
756
757
758 spin_lock_irqsave(&lp->lock, flags);
759 EL3WINDOW(4);
760 media = inw(ioaddr+WN4_MEDIA) & 0xc810;
761
762
763 if (time_before(jiffies, lp->last_irq + HZ)) {
764 media &= ~0x0010;
765 } else {
766
767 EL3WINDOW(6);
768 outw(StatsDisable, ioaddr + EL3_CMD);
769 errs = inb(ioaddr + 0);
770 outw(StatsEnable, ioaddr + EL3_CMD);
771 dev->stats.tx_carrier_errors += errs;
772 if (errs || (lp->media_status & 0x0010)) media |= 0x0010;
773 }
774
775 if (media != lp->media_status) {
776 if ((media & lp->media_status & 0x8000) &&
777 ((lp->media_status ^ media) & 0x0800))
778 printk(KERN_INFO "%s: %s link beat\n", dev->name,
779 (lp->media_status & 0x0800 ? "lost" : "found"));
780 else if ((media & lp->media_status & 0x4000) &&
781 ((lp->media_status ^ media) & 0x0010))
782 printk(KERN_INFO "%s: coax cable %s\n", dev->name,
783 (lp->media_status & 0x0010 ? "ok" : "problem"));
784 if (dev->if_port == 0) {
785 if (media & 0x8000) {
786 if (media & 0x0800)
787 printk(KERN_INFO "%s: flipped to 10baseT\n",
788 dev->name);
789 else
790 tc589_set_xcvr(dev, 2);
791 } else if (media & 0x4000) {
792 if (media & 0x0010)
793 tc589_set_xcvr(dev, 1);
794 else
795 printk(KERN_INFO "%s: flipped to 10base2\n",
796 dev->name);
797 }
798 }
799 lp->media_status = media;
800 }
801
802 EL3WINDOW(1);
803 spin_unlock_irqrestore(&lp->lock, flags);
804
805reschedule:
806 lp->media.expires = jiffies + HZ;
807 add_timer(&lp->media);
808}
809
810static struct net_device_stats *el3_get_stats(struct net_device *dev)
811{
812 struct el3_private *lp = netdev_priv(dev);
813 unsigned long flags;
814 struct pcmcia_device *link = lp->p_dev;
815
816 if (pcmcia_dev_present(link)) {
817 spin_lock_irqsave(&lp->lock, flags);
818 update_stats(dev);
819 spin_unlock_irqrestore(&lp->lock, flags);
820 }
821 return &dev->stats;
822}
823
824
825
826
827
828
829
830
831
832static void update_stats(struct net_device *dev)
833{
834 unsigned int ioaddr = dev->base_addr;
835
836 DEBUG(2, "%s: updating the statistics.\n", dev->name);
837
838 outw(StatsDisable, ioaddr + EL3_CMD);
839
840 EL3WINDOW(6);
841 dev->stats.tx_carrier_errors += inb(ioaddr + 0);
842 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1);
843 inb(ioaddr + 2);
844 dev->stats.collisions += inb(ioaddr + 3);
845 dev->stats.tx_window_errors += inb(ioaddr + 4);
846 dev->stats.rx_fifo_errors += inb(ioaddr + 5);
847 dev->stats.tx_packets += inb(ioaddr + 6);
848 inb(ioaddr + 7);
849 inb(ioaddr + 8);
850 inw(ioaddr + 10);
851 inw(ioaddr + 12);
852
853
854 EL3WINDOW(1);
855 outw(StatsEnable, ioaddr + EL3_CMD);
856}
857
858static int el3_rx(struct net_device *dev)
859{
860 unsigned int ioaddr = dev->base_addr;
861 int worklimit = 32;
862 short rx_status;
863
864 DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
865 dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
866 while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
867 worklimit > 0) {
868 worklimit--;
869 if (rx_status & 0x4000) {
870 short error = rx_status & 0x3800;
871 dev->stats.rx_errors++;
872 switch (error) {
873 case 0x0000: dev->stats.rx_over_errors++; break;
874 case 0x0800: dev->stats.rx_length_errors++; break;
875 case 0x1000: dev->stats.rx_frame_errors++; break;
876 case 0x1800: dev->stats.rx_length_errors++; break;
877 case 0x2000: dev->stats.rx_frame_errors++; break;
878 case 0x2800: dev->stats.rx_crc_errors++; break;
879 }
880 } else {
881 short pkt_len = rx_status & 0x7ff;
882 struct sk_buff *skb;
883
884 skb = dev_alloc_skb(pkt_len+5);
885
886 DEBUG(3, " Receiving packet size %d status %4.4x.\n",
887 pkt_len, rx_status);
888 if (skb != NULL) {
889 skb_reserve(skb, 2);
890 insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
891 (pkt_len+3)>>2);
892 skb->protocol = eth_type_trans(skb, dev);
893 netif_rx(skb);
894 dev->stats.rx_packets++;
895 dev->stats.rx_bytes += pkt_len;
896 } else {
897 DEBUG(1, "%s: couldn't allocate a sk_buff of"
898 " size %d.\n", dev->name, pkt_len);
899 dev->stats.rx_dropped++;
900 }
901 }
902
903 tc589_wait_for_completion(dev, RxDiscard);
904 }
905 if (worklimit == 0)
906 printk(KERN_WARNING "%s: too much work in el3_rx!\n", dev->name);
907 return 0;
908}
909
910static void set_rx_mode(struct net_device *dev)
911{
912 unsigned int ioaddr = dev->base_addr;
913 u16 opts = SetRxFilter | RxStation | RxBroadcast;
914
915 if (dev->flags & IFF_PROMISC)
916 opts |= RxMulticast | RxProm;
917 else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
918 opts |= RxMulticast;
919 outw(opts, ioaddr + EL3_CMD);
920}
921
922static void set_multicast_list(struct net_device *dev)
923{
924 struct el3_private *priv = netdev_priv(dev);
925 unsigned long flags;
926
927 spin_lock_irqsave(&priv->lock, flags);
928 set_rx_mode(dev);
929 spin_unlock_irqrestore(&priv->lock, flags);
930}
931
932static int el3_close(struct net_device *dev)
933{
934 struct el3_private *lp = netdev_priv(dev);
935 struct pcmcia_device *link = lp->p_dev;
936 unsigned int ioaddr = dev->base_addr;
937
938 DEBUG(1, "%s: shutting down ethercard.\n", dev->name);
939
940 if (pcmcia_dev_present(link)) {
941
942 outw(StatsDisable, ioaddr + EL3_CMD);
943
944
945 outw(RxDisable, ioaddr + EL3_CMD);
946 outw(TxDisable, ioaddr + EL3_CMD);
947
948 if (dev->if_port == 2)
949
950 outw(StopCoax, ioaddr + EL3_CMD);
951 else if (dev->if_port == 1) {
952
953 EL3WINDOW(4);
954 outw(0, ioaddr + WN4_MEDIA);
955 }
956
957
958 EL3WINDOW(0);
959
960 outw(0x0f00, ioaddr + WN0_IRQ);
961
962
963 if ((inw(ioaddr+EL3_STATUS) & 0xe000) == 0x2000)
964 update_stats(dev);
965 }
966
967 link->open--;
968 netif_stop_queue(dev);
969 del_timer_sync(&lp->media);
970
971 return 0;
972}
973
974static struct pcmcia_device_id tc589_ids[] = {
975 PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0101, 0x0562),
976 PCMCIA_MFC_DEVICE_PROD_ID1(0, "Motorola MARQUIS", 0xf03e4e77),
977 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0589),
978 PCMCIA_DEVICE_PROD_ID12("Farallon", "ENet", 0x58d93fc4, 0x992c2202),
979 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0035, "cis/3CXEM556.cis"),
980 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x003d, "cis/3CXEM556.cis"),
981 PCMCIA_DEVICE_NULL,
982};
983MODULE_DEVICE_TABLE(pcmcia, tc589_ids);
984
985static struct pcmcia_driver tc589_driver = {
986 .owner = THIS_MODULE,
987 .drv = {
988 .name = "3c589_cs",
989 },
990 .probe = tc589_probe,
991 .remove = tc589_detach,
992 .id_table = tc589_ids,
993 .suspend = tc589_suspend,
994 .resume = tc589_resume,
995};
996
997static int __init init_tc589(void)
998{
999 return pcmcia_register_driver(&tc589_driver);
1000}
1001
1002static void __exit exit_tc589(void)
1003{
1004 pcmcia_unregister_driver(&tc589_driver);
1005}
1006
1007module_init(init_tc589);
1008module_exit(exit_tc589);
1009