|
|
1.1 root 1: /*======================================================================
2:
3: A PCMCIA ethernet driver for the 3com 3c589 card.
4:
5: Copyright (C) 1999 David A. Hinds -- [email protected]
6:
7: 3c589_cs.c 1.167 2003/08/25 15:57:40
8:
9: The network driver code is based on Donald Becker's 3c589 code:
10:
11: Written 1994 by Donald Becker.
12: Copyright 1993 United States Government as represented by the
13: Director, National Security Agency. This software may be used and
14: distributed according to the terms of the GNU General Public License,
15: incorporated herein by reference.
16: Donald Becker may be reached at [email protected]
17:
18: ======================================================================*/
19:
20: #include <linux/module.h>
21: #include <linux/init.h>
22: #include <linux/kernel.h>
23: #include <linux/sched.h>
24: #include <linux/ptrace.h>
25: #include <linux/slab.h>
26: #include <linux/string.h>
27: #include <linux/timer.h>
28: #include <linux/interrupt.h>
29: #include <linux/in.h>
30: #include <linux/delay.h>
31: #include <asm/io.h>
32: #include <asm/system.h>
33: #include <asm/bitops.h>
34:
35: #include <linux/netdevice.h>
36: #include <linux/etherdevice.h>
37: #include <linux/skbuff.h>
38: #include <linux/if_arp.h>
39: #include <linux/ioport.h>
40:
41: #include <pcmcia/version.h>
42: #include <pcmcia/cs_types.h>
43: #include <pcmcia/cs.h>
44: #include <pcmcia/cistpl.h>
45: #include <pcmcia/cisreg.h>
46: #include <pcmcia/ciscode.h>
47: #include <pcmcia/ds.h>
48:
49: /* To minimize the size of the driver source I only define operating
50: constants if they are used several times. You'll need the manual
51: if you want to understand driver details. */
52: /* Offsets from base I/O address. */
53: #define EL3_DATA 0x00
54: #define EL3_TIMER 0x0a
55: #define EL3_CMD 0x0e
56: #define EL3_STATUS 0x0e
57:
58: #define EEPROM_READ 0x0080
59: #define EEPROM_BUSY 0x8000
60:
61: #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
62:
63: /* The top five bits written to EL3_CMD are a command, the lower
64: 11 bits are the parameter, if applicable. */
65: enum c509cmd {
66: TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
67: RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
68: TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
69: FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
70: SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
71: SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
72: StatsDisable = 22<<11, StopCoax = 23<<11,
73: };
74:
75: enum c509status {
76: IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
77: TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
78: IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000
79: };
80:
81: /* The SetRxFilter command accepts the following classes: */
82: enum RxFilter {
83: RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
84: };
85:
86: /* Register window 1 offsets, the window used in normal operation. */
87: #define TX_FIFO 0x00
88: #define RX_FIFO 0x00
89: #define RX_STATUS 0x08
90: #define TX_STATUS 0x0B
91: #define TX_FREE 0x0C /* Remaining free bytes in Tx buffer. */
92:
93: #define WN0_IRQ 0x08 /* Window 0: Set IRQ line in bits 12-15. */
94: #define WN4_MEDIA 0x0A /* Window 4: Various transcvr/media bits. */
95: #define MEDIA_TP 0x00C0 /* Enable link beat and jabber for 10baseT. */
96: #define MEDIA_LED 0x0001 /* Enable link light on 3C589E cards. */
97:
98: /* Time in jiffies before concluding Tx hung */
99: #define TX_TIMEOUT ((400*HZ)/1000)
100:
101: struct el3_private {
102: dev_link_t link;
103: struct net_device dev;
104: dev_node_t node;
105: struct net_device_stats stats;
106: /* For transceiver monitoring */
107: struct timer_list media;
108: u_short media_status;
109: u_short fast_poll;
110: u_long last_irq;
111: };
112:
113: static char *if_names[] = { "auto", "10baseT", "10base2", "AUI" };
114:
115: /*====================================================================*/
116:
117: /* Module parameters */
118:
119: MODULE_AUTHOR("David Hinds <[email protected]>");
120: MODULE_DESCRIPTION("3Com 3c589 series PCMCIA ethernet driver");
121: MODULE_LICENSE("GPL");
122:
123: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
124:
125: /* Special hook for setting if_port when module is loaded */
126: INT_MODULE_PARM(if_port, 0);
127:
128: /* Bit map of interrupts to choose from */
129: INT_MODULE_PARM(irq_mask, 0xdeb8);
130: static int irq_list[4] = { -1 };
131: MODULE_PARM(irq_list, "1-4i");
132:
133: #ifdef PCMCIA_DEBUG
134: INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
135: #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
136: static char *version =
137: "3c589_cs.c 1.167 2003/08/25 15:57:40 (David Hinds)";
138: #else
139: #define DEBUG(n, args...)
140: #endif
141:
142: /*====================================================================*/
143:
144: static void tc589_config(dev_link_t *link);
145: static void tc589_release(u_long arg);
146: static int tc589_event(event_t event, int priority,
147: event_callback_args_t *args);
148:
149: static u_short read_eeprom(ioaddr_t ioaddr, int index);
150: static void tc589_reset(struct net_device *dev);
151: static void media_check(u_long arg);
152: static int el3_config(struct net_device *dev, struct ifmap *map);
153: static int el3_open(struct net_device *dev);
154: static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
155: static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
156: static void update_stats(struct net_device *dev);
157: static struct net_device_stats *el3_get_stats(struct net_device *dev);
158: static int el3_rx(struct net_device *dev);
159: static int el3_close(struct net_device *dev);
160: static void el3_tx_timeout(struct net_device *dev);
161: static void set_multicast_list(struct net_device *dev);
162:
163: static dev_info_t dev_info = "3c589_cs";
164:
165: static dev_link_t *tc589_attach(void);
166: static void tc589_detach(dev_link_t *);
167:
168: static dev_link_t *dev_list = NULL;
169:
170: /*======================================================================
171:
172: This bit of code is used to avoid unregistering network devices
173: at inappropriate times. 2.2 and later kernels are fairly picky
174: about when this can happen.
175:
176: ======================================================================*/
177:
178: static void flush_stale_links(void)
179: {
180: dev_link_t *link, *next;
181: for (link = dev_list; link; link = next) {
182: next = link->next;
183: if (link->state & DEV_STALE_LINK)
184: tc589_detach(link);
185: }
186: }
187:
188: /*====================================================================*/
189:
190: static void cs_error(client_handle_t handle, int func, int ret)
191: {
192: error_info_t err = { func, ret };
193: CardServices(ReportError, handle, &err);
194: }
195:
196: /*======================================================================
197:
198: tc589_attach() creates an "instance" of the driver, allocating
199: local data structures for one device. The device is registered
200: with Card Services.
201:
202: ======================================================================*/
203:
204: static dev_link_t *tc589_attach(void)
205: {
206: struct el3_private *lp;
207: client_reg_t client_reg;
208: dev_link_t *link;
209: struct net_device *dev;
210: int i, ret;
211:
212: DEBUG(0, "3c589_attach()\n");
213: flush_stale_links();
214:
215: /* Create new ethernet device */
216: lp = kmalloc(sizeof(*lp), GFP_KERNEL);
217: if (!lp) return NULL;
218: memset(lp, 0, sizeof(*lp));
219: link = &lp->link; dev = &lp->dev;
220: link->priv = dev->priv = link->irq.Instance = lp;
221:
222: init_timer(&link->release);
223: link->release.function = &tc589_release;
224: link->release.data = (u_long)link;
225: link->io.NumPorts1 = 16;
226: link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
227: link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
228: link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
229: if (irq_list[0] == -1)
230: link->irq.IRQInfo2 = irq_mask;
231: else
232: for (i = 0; i < 4; i++)
233: link->irq.IRQInfo2 |= 1 << irq_list[i];
234: link->irq.Handler = &el3_interrupt;
235: link->conf.Attributes = CONF_ENABLE_IRQ;
236: link->conf.Vcc = 50;
237: link->conf.IntType = INT_MEMORY_AND_IO;
238: link->conf.ConfigIndex = 1;
239: link->conf.Present = PRESENT_OPTION;
240:
241: /* The EL3-specific entries in the device structure. */
242: dev->hard_start_xmit = &el3_start_xmit;
243: dev->set_config = &el3_config;
244: dev->get_stats = &el3_get_stats;
245: dev->set_multicast_list = &set_multicast_list;
246: ether_setup(dev);
247: init_dev_name(dev, lp->node);
248: dev->open = &el3_open;
249: dev->stop = &el3_close;
250: #ifdef HAVE_TX_TIMEOUT
251: dev->tx_timeout = el3_tx_timeout;
252: dev->watchdog_timeo = TX_TIMEOUT;
253: #endif
254:
255: /* Register with Card Services */
256: link->next = dev_list;
257: dev_list = link;
258: client_reg.dev_info = &dev_info;
259: client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
260: client_reg.EventMask =
261: CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
262: CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
263: CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
264: client_reg.event_handler = &tc589_event;
265: client_reg.Version = 0x0210;
266: client_reg.event_callback_args.client_data = link;
267: ret = CardServices(RegisterClient, &link->handle, &client_reg);
268: if (ret != 0) {
269: cs_error(link->handle, RegisterClient, ret);
270: tc589_detach(link);
271: return NULL;
272: }
273:
274: return link;
275: } /* tc589_attach */
276:
277: /*======================================================================
278:
279: This deletes a driver "instance". The device is de-registered
280: with Card Services. If it has been released, all local data
281: structures are freed. Otherwise, the structures will be freed
282: when the device is released.
283:
284: ======================================================================*/
285:
286: static void tc589_detach(dev_link_t *link)
287: {
288: struct el3_private *lp = link->priv;
289: dev_link_t **linkp;
290:
291: DEBUG(0, "3c589_detach(0x%p)\n", link);
292:
293: /* Locate device structure */
294: for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
295: if (*linkp == link) break;
296: if (*linkp == NULL)
297: return;
298:
299: del_timer(&link->release);
300: if (link->state & DEV_CONFIG) {
301: tc589_release((u_long)link);
302: if (link->state & DEV_STALE_CONFIG) {
303: link->state |= DEV_STALE_LINK;
304: return;
305: }
306: }
307:
308: if (link->handle)
309: CardServices(DeregisterClient, link->handle);
310:
311: /* Unlink device structure, free bits */
312: *linkp = link->next;
313: if (link->dev)
314: unregister_netdev(&lp->dev);
315: kfree(lp);
316:
317: } /* tc589_detach */
318:
319: /*======================================================================
320:
321: tc589_config() is scheduled to run after a CARD_INSERTION event
322: is received, to configure the PCMCIA socket, and to make the
323: ethernet device available to the system.
324:
325: ======================================================================*/
326:
327: #define CS_CHECK(fn, args...) \
328: while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
329:
330: static void tc589_config(dev_link_t *link)
331: {
332: client_handle_t handle = link->handle;
333: struct el3_private *lp = link->priv;
334: struct net_device *dev = &lp->dev;
335: tuple_t tuple;
336: cisparse_t parse;
337: u_short buf[32], *phys_addr;
338: int last_fn, last_ret, i, j, multi = 0;
339: ioaddr_t ioaddr;
340: char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
341:
342: DEBUG(0, "3c589_config(0x%p)\n", link);
343:
344: phys_addr = (u_short *)dev->dev_addr;
345: tuple.Attributes = 0;
346: tuple.DesiredTuple = CISTPL_CONFIG;
347: CS_CHECK(GetFirstTuple, handle, &tuple);
348: tuple.TupleData = (cisdata_t *)buf;
349: tuple.TupleDataMax = sizeof(buf);
350: tuple.TupleOffset = 0;
351: CS_CHECK(GetTupleData, handle, &tuple);
352: CS_CHECK(ParseTuple, handle, &tuple, &parse);
353: link->conf.ConfigBase = parse.config.base;
354: link->conf.Present = parse.config.rmask[0];
355:
356: /* Is this a 3c562? */
357: tuple.DesiredTuple = CISTPL_MANFID;
358: tuple.Attributes = TUPLE_RETURN_COMMON;
359: if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) &&
360: (CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS)) {
361: if (le16_to_cpu(buf[0]) != MANFID_3COM)
362: printk(KERN_INFO "3c589_cs: hmmm, is this really a "
363: "3Com card??\n");
364: multi = (le16_to_cpu(buf[1]) == PRODID_3COM_3C562);
365: }
366:
367: /* Configure card */
368: link->state |= DEV_CONFIG;
369:
370: /* For the 3c562, the base address must be xx00-xx7f */
371: link->io.IOAddrLines = 16;
372: for (i = j = 0; j < 0x400; j += 0x10) {
373: if (multi && (j & 0x80)) continue;
374: link->io.BasePort1 = j ^ 0x300;
375: i = CardServices(RequestIO, link->handle, &link->io);
376: if (i == CS_SUCCESS) break;
377: }
378: if (i != CS_SUCCESS) {
379: cs_error(link->handle, RequestIO, i);
380: goto failed;
381: }
382: CS_CHECK(RequestIRQ, link->handle, &link->irq);
383: CS_CHECK(RequestConfiguration, link->handle, &link->conf);
384:
385: dev->irq = link->irq.AssignedIRQ;
386: dev->base_addr = link->io.BasePort1;
387: if (register_netdev(dev) != 0) {
388: printk(KERN_NOTICE "3c589_cs: register_netdev() failed\n");
389: goto failed;
390: }
391:
392: ioaddr = dev->base_addr;
393: EL3WINDOW(0);
394:
395: /* The 3c589 has an extra EEPROM for configuration info, including
396: the hardware address. The 3c562 puts the address in the CIS. */
397: tuple.DesiredTuple = 0x88;
398: if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
399: CardServices(GetTupleData, handle, &tuple);
400: for (i = 0; i < 3; i++)
401: phys_addr[i] = htons(buf[i]);
402: } else {
403: for (i = 0; i < 3; i++)
404: phys_addr[i] = htons(read_eeprom(ioaddr, i));
405: if (phys_addr[0] == 0x6060) {
406: printk(KERN_NOTICE "3c589_cs: IO port conflict at 0x%03lx"
407: "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
408: goto failed;
409: }
410: }
411:
412: copy_dev_name(lp->node, dev);
413: link->dev = &lp->node;
414:
415: /* The address and resource configuration register aren't loaded from
416: the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. */
417: outw(0x3f00, ioaddr + 8);
418:
419: /* The if_port symbol can be set when the module is loaded */
420: if ((if_port >= 0) && (if_port <= 3))
421: dev->if_port = if_port;
422: else
423: printk(KERN_NOTICE "3c589_cs: invalid if_port requested\n");
424:
425: printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, hw_addr ",
426: dev->name, (multi ? "562" : "589"), dev->base_addr,
427: dev->irq);
428: for (i = 0; i < 6; i++)
429: printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
430: i = inl(ioaddr);
431: printk(KERN_INFO " %dK FIFO split %s Rx:Tx, %s xcvr\n",
432: (i & 7) ? 32 : 8, ram_split[(i >> 16) & 3],
433: if_names[dev->if_port]);
434: link->state &= ~DEV_CONFIG_PENDING;
435: return;
436:
437: cs_failed:
438: cs_error(link->handle, last_fn, last_ret);
439: failed:
440: tc589_release((u_long)link);
441: link->state &= ~DEV_CONFIG_PENDING;
442: return;
443:
444: } /* tc589_config */
445:
446: /*======================================================================
447:
448: After a card is removed, tc589_release() will unregister the net
449: device, and release the PCMCIA configuration. If the device is
450: still open, this will be postponed until it is closed.
451:
452: ======================================================================*/
453:
454: static void tc589_release(u_long arg)
455: {
456: dev_link_t *link = (dev_link_t *)arg;
457:
458: DEBUG(0, "3c589_release(0x%p)\n", link);
459:
460: if (link->open) {
461: DEBUG(1, "3c589_cs: release postponed, '%s' still open\n",
462: link->dev->dev_name);
463: link->state |= DEV_STALE_CONFIG;
464: return;
465: }
466:
467: CardServices(ReleaseConfiguration, link->handle);
468: CardServices(ReleaseIO, link->handle, &link->io);
469: CardServices(ReleaseIRQ, link->handle, &link->irq);
470:
471: link->state &= ~DEV_CONFIG;
472:
473: } /* tc589_release */
474:
475: /*======================================================================
476:
477: The card status event handler. Mostly, this schedules other
478: stuff to run after an event is received. A CARD_REMOVAL event
479: also sets some flags to discourage the net drivers from trying
480: to talk to the card any more.
481:
482: ======================================================================*/
483:
484: static int tc589_event(event_t event, int priority,
485: event_callback_args_t *args)
486: {
487: dev_link_t *link = args->client_data;
488: struct el3_private *lp = link->priv;
489: struct net_device *dev = &lp->dev;
490:
491: DEBUG(1, "3c589_event(0x%06x)\n", event);
492:
493: switch (event) {
494: case CS_EVENT_CARD_REMOVAL:
495: link->state &= ~DEV_PRESENT;
496: if (link->state & DEV_CONFIG) {
497: netif_device_detach(dev);
498: mod_timer(&link->release, jiffies + HZ/20);
499: }
500: break;
501: case CS_EVENT_CARD_INSERTION:
502: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
503: tc589_config(link);
504: break;
505: case CS_EVENT_PM_SUSPEND:
506: link->state |= DEV_SUSPEND;
507: /* Fall through... */
508: case CS_EVENT_RESET_PHYSICAL:
509: if (link->state & DEV_CONFIG) {
510: if (link->open)
511: netif_device_detach(dev);
512: CardServices(ReleaseConfiguration, link->handle);
513: }
514: break;
515: case CS_EVENT_PM_RESUME:
516: link->state &= ~DEV_SUSPEND;
517: /* Fall through... */
518: case CS_EVENT_CARD_RESET:
519: if (link->state & DEV_CONFIG) {
520: CardServices(RequestConfiguration, link->handle, &link->conf);
521: if (link->open) {
522: tc589_reset(dev);
523: netif_device_attach(dev);
524: }
525: }
526: break;
527: }
528: return 0;
529: } /* tc589_event */
530:
531: /*====================================================================*/
532:
533: /*
534: Use this for commands that may take time to finish
535: */
536: static void tc589_wait_for_completion(struct net_device *dev, int cmd)
537: {
538: int i = 100;
539: outw(cmd, dev->base_addr + EL3_CMD);
540: while (--i > 0)
541: if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
542: if (i == 0)
543: printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n",
544: dev->name, cmd);
545: }
546:
547: /*
548: Read a word from the EEPROM using the regular EEPROM access register.
549: Assume that we are in register window zero.
550: */
551: static u_short read_eeprom(ioaddr_t ioaddr, int index)
552: {
553: int i;
554: outw(EEPROM_READ + index, ioaddr + 10);
555: /* Reading the eeprom takes 162 us */
556: for (i = 1620; i >= 0; i--)
557: if ((inw(ioaddr + 10) & EEPROM_BUSY) == 0)
558: break;
559: return inw(ioaddr + 12);
560: }
561:
562: /*
563: Set transceiver type, perhaps to something other than what the user
564: specified in dev->if_port.
565: */
566: static void tc589_set_xcvr(struct net_device *dev, int if_port)
567: {
568: struct el3_private *lp = (struct el3_private *)dev->priv;
569: ioaddr_t ioaddr = dev->base_addr;
570:
571: EL3WINDOW(0);
572: switch (if_port) {
573: case 0: case 1: outw(0, ioaddr + 6); break;
574: case 2: outw(3<<14, ioaddr + 6); break;
575: case 3: outw(1<<14, ioaddr + 6); break;
576: }
577: /* On PCMCIA, this just turns on the LED */
578: outw((if_port == 2) ? StartCoax : StopCoax, ioaddr + EL3_CMD);
579: /* 10baseT interface, enable link beat and jabber check. */
580: EL3WINDOW(4);
581: outw(MEDIA_LED | ((if_port < 2) ? MEDIA_TP : 0), ioaddr + WN4_MEDIA);
582: EL3WINDOW(1);
583: if (if_port == 2)
584: lp->media_status = ((dev->if_port == 0) ? 0x8000 : 0x4000);
585: else
586: lp->media_status = ((dev->if_port == 0) ? 0x4010 : 0x8800);
587: }
588:
589: static void dump_status(struct net_device *dev)
590: {
591: ioaddr_t ioaddr = dev->base_addr;
592: EL3WINDOW(1);
593: printk(KERN_INFO " irq status %04x, rx status %04x, tx status "
594: "%02x tx free %04x\n", inw(ioaddr+EL3_STATUS),
595: inw(ioaddr+RX_STATUS), inb(ioaddr+TX_STATUS),
596: inw(ioaddr+TX_FREE));
597: EL3WINDOW(4);
598: printk(KERN_INFO " diagnostics: fifo %04x net %04x ethernet %04x"
599: " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
600: inw(ioaddr+0x08), inw(ioaddr+0x0a));
601: EL3WINDOW(1);
602: }
603:
604: /* Reset and restore all of the 3c589 registers. */
605: static void tc589_reset(struct net_device *dev)
606: {
607: ioaddr_t ioaddr = dev->base_addr;
608: int i;
609:
610: EL3WINDOW(0);
611: outw(0x0001, ioaddr + 4); /* Activate board. */
612: outw(0x3f00, ioaddr + 8); /* Set the IRQ line. */
613:
614: /* Set the station address in window 2. */
615: EL3WINDOW(2);
616: for (i = 0; i < 6; i++)
617: outb(dev->dev_addr[i], ioaddr + i);
618:
619: tc589_set_xcvr(dev, dev->if_port);
620:
621: /* Switch to the stats window, and clear all stats by reading. */
622: outw(StatsDisable, ioaddr + EL3_CMD);
623: EL3WINDOW(6);
624: for (i = 0; i < 9; i++)
625: inb(ioaddr+i);
626: inw(ioaddr + 10);
627: inw(ioaddr + 12);
628:
629: /* Switch to register set 1 for normal use. */
630: EL3WINDOW(1);
631:
632: /* Accept b-cast and phys addr only. */
633: outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
634: outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
635: outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
636: outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
637: /* Allow status bits to be seen. */
638: outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
639: /* Ack all pending events, and set active indicator mask. */
640: outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
641: ioaddr + EL3_CMD);
642: outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
643: | AdapterFailure, ioaddr + EL3_CMD);
644: }
645:
646: static int el3_config(struct net_device *dev, struct ifmap *map)
647: {
648: if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
649: if (map->port <= 3) {
650: dev->if_port = map->port;
651: printk(KERN_INFO "%s: switched to %s port\n",
652: dev->name, if_names[dev->if_port]);
653: tc589_set_xcvr(dev, dev->if_port);
654: } else
655: return -EINVAL;
656: }
657: return 0;
658: }
659:
660: static int el3_open(struct net_device *dev)
661: {
662: struct el3_private *lp = (struct el3_private *)dev->priv;
663: dev_link_t *link = &lp->link;
664:
665: if (!DEV_OK(link))
666: return -ENODEV;
667:
668: link->open++;
669: MOD_INC_USE_COUNT;
670: netif_start_queue(dev);
671: netif_mark_up(dev);
672:
673: tc589_reset(dev);
674: lp->media.function = &media_check;
675: lp->media.data = (u_long)lp;
676: lp->media.expires = jiffies + HZ;
677: add_timer(&lp->media);
678:
679: DEBUG(1, "%s: opened, status %4.4x.\n",
680: dev->name, inw(dev->base_addr + EL3_STATUS));
681:
682: return 0;
683: }
684:
685: static void el3_tx_timeout(struct net_device *dev)
686: {
687: struct el3_private *lp = (struct el3_private *)dev->priv;
688: ioaddr_t ioaddr = dev->base_addr;
689:
690: printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name);
691: dump_status(dev);
692: lp->stats.tx_errors++;
693: dev->trans_start = jiffies;
694: /* Issue TX_RESET and TX_START commands. */
695: tc589_wait_for_completion(dev, TxReset);
696: outw(TxEnable, ioaddr + EL3_CMD);
697: netif_wake_queue(dev);
698: }
699:
700: static void pop_tx_status(struct net_device *dev)
701: {
702: struct el3_private *lp = (struct el3_private *)dev->priv;
703: ioaddr_t ioaddr = dev->base_addr;
704: int i;
705:
706: /* Clear the Tx status stack. */
707: for (i = 32; i > 0; i--) {
708: u_char tx_status = inb(ioaddr + TX_STATUS);
709: if (!(tx_status & 0x84)) break;
710: /* reset transmitter on jabber error or underrun */
711: if (tx_status & 0x30)
712: tc589_wait_for_completion(dev, TxReset);
713: if (tx_status & 0x38) {
714: DEBUG(1, "%s: transmit error: status 0x%02x\n",
715: dev->name, tx_status);
716: outw(TxEnable, ioaddr + EL3_CMD);
717: lp->stats.tx_aborted_errors++;
718: }
719: outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
720: }
721: }
722:
723: static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
724: {
725: ioaddr_t ioaddr = dev->base_addr;
726:
727: tx_timeout_check(dev, el3_tx_timeout);
728: skb_tx_check(dev, skb);
729:
730: DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
731: "status %4.4x.\n", dev->name, (long)skb->len,
732: inw(ioaddr + EL3_STATUS));
733:
734: add_tx_bytes(&((struct el3_private *)dev->priv)->stats, skb->len);
735:
736: /* Put out the doubleword header... */
737: outw(skb->len, ioaddr + TX_FIFO);
738: outw(0x00, ioaddr + TX_FIFO);
739: /* ... and the packet rounded to a doubleword. */
740: outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
741:
742: dev->trans_start = jiffies;
743: if (inw(ioaddr + TX_FREE) > 1536) {
744: netif_start_queue(dev);
745: } else
746: /* Interrupt us when the FIFO has room for max-sized packet. */
747: outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
748:
749: DEV_KFREE_SKB(skb);
750: pop_tx_status(dev);
751:
752: return 0;
753: }
754:
755: /* The EL3 interrupt handler. */
756: static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
757: {
758: struct el3_private *lp = dev_id;
759: struct net_device *dev = &lp->dev;
760: ioaddr_t ioaddr, status;
761: int i = 0;
762:
763: if (!netif_device_present(dev))
764: return;
765: ioaddr = dev->base_addr;
766:
767: DEBUG(3, "%s: interrupt, status %4.4x.\n",
768: dev->name, inw(ioaddr + EL3_STATUS));
769:
770: while ((status = inw(ioaddr + EL3_STATUS)) &
771: (IntLatch | RxComplete | StatsFull)) {
772: if (!netif_device_present(dev) ||
773: ((status & 0xe000) != 0x2000)) {
774: DEBUG(1, "%s: interrupt from dead card\n", dev->name);
775: break;
776: }
777:
778: if (status & RxComplete)
779: el3_rx(dev);
780:
781: if (status & TxAvailable) {
782: DEBUG(3, " TX room bit was handled.\n");
783: /* There's room in the FIFO for a full-sized packet. */
784: outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
785: netif_wake_queue(dev);
786: }
787:
788: if (status & TxComplete)
789: pop_tx_status(dev);
790:
791: if (status & (AdapterFailure | RxEarly | StatsFull)) {
792: /* Handle all uncommon interrupts. */
793: if (status & StatsFull) /* Empty statistics. */
794: update_stats(dev);
795: if (status & RxEarly) { /* Rx early is unused. */
796: el3_rx(dev);
797: outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
798: }
799: if (status & AdapterFailure) {
800: u16 fifo_diag;
801: EL3WINDOW(4);
802: fifo_diag = inw(ioaddr + 4);
803: EL3WINDOW(1);
804: printk(KERN_NOTICE "%s: adapter failure, FIFO diagnostic"
805: " register %04x.\n", dev->name, fifo_diag);
806: if (fifo_diag & 0x0400) {
807: /* Tx overrun */
808: tc589_wait_for_completion(dev, TxReset);
809: outw(TxEnable, ioaddr + EL3_CMD);
810: }
811: if (fifo_diag & 0x2000) {
812: /* Rx underrun */
813: tc589_wait_for_completion(dev, RxReset);
814: set_multicast_list(dev);
815: outw(RxEnable, ioaddr + EL3_CMD);
816: }
817: outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
818: }
819: }
820:
821: if (++i > 10) {
822: printk(KERN_NOTICE "%s: infinite loop in interrupt, "
823: "status %4.4x.\n", dev->name, status);
824: /* Clear all interrupts */
825: outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
826: break;
827: }
828: /* Acknowledge the IRQ. */
829: outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
830: }
831:
832: lp->last_irq = jiffies;
833: DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
834: dev->name, inw(ioaddr + EL3_STATUS));
835: return;
836: }
837:
838: static void media_check(u_long arg)
839: {
840: struct el3_private *lp = (struct el3_private *)(arg);
841: struct net_device *dev = &lp->dev;
842: ioaddr_t ioaddr = dev->base_addr;
843: u_short media, errs;
844: u_long flags;
845:
846: if (!netif_device_present(dev)) goto reschedule;
847:
848: EL3WINDOW(1);
849: /* Check for pending interrupt with expired latency timer: with
850: this, we can limp along even if the interrupt is blocked */
851: if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
852: (inb(ioaddr + EL3_TIMER) == 0xff)) {
853: if (!lp->fast_poll)
854: printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
855: el3_interrupt(dev->irq, lp, NULL);
856: lp->fast_poll = HZ;
857: }
858: if (lp->fast_poll) {
859: lp->fast_poll--;
860: lp->media.expires = jiffies + 1;
861: add_timer(&lp->media);
862: return;
863: }
864:
865: save_flags(flags);
866: cli();
867: EL3WINDOW(4);
868: media = inw(ioaddr+WN4_MEDIA) & 0xc810;
869:
870: /* Ignore collisions unless we've had no irq's recently */
871: if (jiffies - lp->last_irq < HZ) {
872: media &= ~0x0010;
873: } else {
874: /* Try harder to detect carrier errors */
875: EL3WINDOW(6);
876: outw(StatsDisable, ioaddr + EL3_CMD);
877: errs = inb(ioaddr + 0);
878: outw(StatsEnable, ioaddr + EL3_CMD);
879: lp->stats.tx_carrier_errors += errs;
880: if (errs || (lp->media_status & 0x0010)) media |= 0x0010;
881: }
882:
883: if (media != lp->media_status) {
884: if ((media & lp->media_status & 0x8000) &&
885: ((lp->media_status ^ media) & 0x0800))
886: printk(KERN_INFO "%s: %s link beat\n", dev->name,
887: (lp->media_status & 0x0800 ? "lost" : "found"));
888: else if ((media & lp->media_status & 0x4000) &&
889: ((lp->media_status ^ media) & 0x0010))
890: printk(KERN_INFO "%s: coax cable %s\n", dev->name,
891: (lp->media_status & 0x0010 ? "ok" : "problem"));
892: if (dev->if_port == 0) {
893: if (media & 0x8000) {
894: if (media & 0x0800)
895: printk(KERN_INFO "%s: flipped to 10baseT\n",
896: dev->name);
897: else
898: tc589_set_xcvr(dev, 2);
899: } else if (media & 0x4000) {
900: if (media & 0x0010)
901: tc589_set_xcvr(dev, 1);
902: else
903: printk(KERN_INFO "%s: flipped to 10base2\n",
904: dev->name);
905: }
906: }
907: lp->media_status = media;
908: }
909:
910: EL3WINDOW(1);
911: restore_flags(flags);
912:
913: reschedule:
914: lp->media.expires = jiffies + HZ;
915: add_timer(&lp->media);
916: }
917:
918: static struct net_device_stats *el3_get_stats(struct net_device *dev)
919: {
920: struct el3_private *lp = (struct el3_private *)dev->priv;
921: unsigned long flags;
922: dev_link_t *link = &lp->link;
923:
924: if (DEV_OK(link)) {
925: save_flags(flags);
926: cli();
927: update_stats(dev);
928: restore_flags(flags);
929: }
930: return &lp->stats;
931: }
932:
933: /*
934: Update statistics. We change to register window 6, so this should be run
935: single-threaded if the device is active. This is expected to be a rare
936: operation, and it's simpler for the rest of the driver to assume that
937: window 1 is always valid rather than use a special window-state variable.
938: */
939: static void update_stats(struct net_device *dev)
940: {
941: struct el3_private *lp = (struct el3_private *)dev->priv;
942: ioaddr_t ioaddr = dev->base_addr;
943:
944: DEBUG(2, "%s: updating the statistics.\n", dev->name);
945: /* Turn off statistics updates while reading. */
946: outw(StatsDisable, ioaddr + EL3_CMD);
947: /* Switch to the stats window, and read everything. */
948: EL3WINDOW(6);
949: lp->stats.tx_carrier_errors += inb(ioaddr + 0);
950: lp->stats.tx_heartbeat_errors += inb(ioaddr + 1);
951: /* Multiple collisions. */ inb(ioaddr + 2);
952: lp->stats.collisions += inb(ioaddr + 3);
953: lp->stats.tx_window_errors += inb(ioaddr + 4);
954: lp->stats.rx_fifo_errors += inb(ioaddr + 5);
955: lp->stats.tx_packets += inb(ioaddr + 6);
956: /* Rx packets */ inb(ioaddr + 7);
957: /* Tx deferrals */ inb(ioaddr + 8);
958: /* Rx octets */ inw(ioaddr + 10);
959: /* Tx octets */ inw(ioaddr + 12);
960:
961: /* Back to window 1, and turn statistics back on. */
962: EL3WINDOW(1);
963: outw(StatsEnable, ioaddr + EL3_CMD);
964: }
965:
966: static int el3_rx(struct net_device *dev)
967: {
968: struct el3_private *lp = (struct el3_private *)dev->priv;
969: ioaddr_t ioaddr = dev->base_addr;
970: int worklimit = 32;
971: short rx_status;
972:
973: DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
974: dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
975: while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
976: (--worklimit >= 0)) {
977: if (rx_status & 0x4000) { /* Error, update stats. */
978: short error = rx_status & 0x3800;
979: lp->stats.rx_errors++;
980: switch (error) {
981: case 0x0000: lp->stats.rx_over_errors++; break;
982: case 0x0800: lp->stats.rx_length_errors++; break;
983: case 0x1000: lp->stats.rx_frame_errors++; break;
984: case 0x1800: lp->stats.rx_length_errors++; break;
985: case 0x2000: lp->stats.rx_frame_errors++; break;
986: case 0x2800: lp->stats.rx_crc_errors++; break;
987: }
988: } else {
989: short pkt_len = rx_status & 0x7ff;
990: struct sk_buff *skb;
991:
992: skb = dev_alloc_skb(pkt_len+5);
993:
994: DEBUG(3, " Receiving packet size %d status %4.4x.\n",
995: pkt_len, rx_status);
996: if (skb != NULL) {
997: skb->dev = dev;
998: skb_reserve(skb, 2);
999: insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
1000: (pkt_len+3)>>2);
1001: skb->protocol = eth_type_trans(skb, dev);
1002: netif_rx(skb);
1003: dev->last_rx = jiffies;
1004: lp->stats.rx_packets++;
1005: add_rx_bytes(&lp->stats, pkt_len);
1006: } else {
1007: DEBUG(1, "%s: couldn't allocate a sk_buff of"
1008: " size %d.\n", dev->name, pkt_len);
1009: lp->stats.rx_dropped++;
1010: }
1011: }
1012: /* Pop the top of the Rx FIFO */
1013: tc589_wait_for_completion(dev, RxDiscard);
1014: }
1015: if (worklimit == 0)
1016: printk(KERN_NOTICE "%s: too much work in el3_rx!\n", dev->name);
1017: return 0;
1018: }
1019:
1020: static void set_multicast_list(struct net_device *dev)
1021: {
1022: struct el3_private *lp = dev->priv;
1023: dev_link_t *link = &lp->link;
1024: ioaddr_t ioaddr = dev->base_addr;
1025: u_short opts = SetRxFilter | RxStation | RxBroadcast;
1026:
1027: if (!(DEV_OK(link))) return;
1028: if (dev->flags & IFF_PROMISC)
1029: opts |= RxMulticast | RxProm;
1030: else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
1031: opts |= RxMulticast;
1032: outw(opts, ioaddr + EL3_CMD);
1033: }
1034:
1035: static int el3_close(struct net_device *dev)
1036: {
1037: struct el3_private *lp = dev->priv;
1038: dev_link_t *link = &lp->link;
1039: ioaddr_t ioaddr = dev->base_addr;
1040:
1041: DEBUG(1, "%s: shutting down ethercard.\n", dev->name);
1042:
1043: if (DEV_OK(link)) {
1044: /* Turn off statistics ASAP. We update lp->stats below. */
1045: outw(StatsDisable, ioaddr + EL3_CMD);
1046:
1047: /* Disable the receiver and transmitter. */
1048: outw(RxDisable, ioaddr + EL3_CMD);
1049: outw(TxDisable, ioaddr + EL3_CMD);
1050:
1051: if (dev->if_port == 2)
1052: /* Turn off thinnet power. Green! */
1053: outw(StopCoax, ioaddr + EL3_CMD);
1054: else if (dev->if_port == 1) {
1055: /* Disable link beat and jabber */
1056: EL3WINDOW(4);
1057: outw(0, ioaddr + WN4_MEDIA);
1058: }
1059:
1060: /* Switching back to window 0 disables the IRQ. */
1061: EL3WINDOW(0);
1062: /* But we explicitly zero the IRQ line select anyway. */
1063: outw(0x0f00, ioaddr + WN0_IRQ);
1064:
1065: /* Check if the card still exists */
1066: if ((inw(ioaddr+EL3_STATUS) & 0xe000) == 0x2000)
1067: update_stats(dev);
1068: }
1069:
1070: link->open--;
1071: netif_stop_queue(dev);
1072: netif_mark_down(dev);
1073: del_timer(&lp->media);
1074: if (link->state & DEV_STALE_CONFIG)
1075: mod_timer(&link->release, jiffies + HZ/20);
1076:
1077: MOD_DEC_USE_COUNT;
1078:
1079: return 0;
1080: }
1081:
1082: /*====================================================================*/
1083:
1084: static int __init init_3c589_cs(void)
1085: {
1086: servinfo_t serv;
1087: DEBUG(0, "%s\n", version);
1088: CardServices(GetCardServicesInfo, &serv);
1089: if (serv.Revision != CS_RELEASE_CODE) {
1090: printk(KERN_NOTICE "3c589_cs: Card Services release "
1091: "does not match!\n");
1092: return -EINVAL;
1093: }
1094: register_pccard_driver(&dev_info, &tc589_attach, &tc589_detach);
1095: return 0;
1096: }
1097:
1098: static void __exit exit_3c589_cs(void)
1099: {
1100: DEBUG(0, "3c589_cs: unloading\n");
1101: unregister_pccard_driver(&dev_info);
1102: while (dev_list != NULL)
1103: tc589_detach(dev_list);
1104: }
1105:
1106: module_init(init_3c589_cs);
1107: module_exit(exit_3c589_cs);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.