|
|
1.1 root 1: /* 3c574.c: A PCMCIA ethernet driver for the 3com 3c574 "RoadRunner".
2:
3: Written 1993-1998 by
4: Donald Becker, [email protected], (driver core) and
5: David Hinds, [email protected] (from his PC card code).
6:
7: This software may be used and distributed according to the terms of
8: the GNU General Public License, incorporated herein by reference.
9:
10: This driver derives from Donald Becker's 3c509 core, which has the
11: following copyright:
12: Copyright 1993 United States Government as represented by the
13: Director, National Security Agency.
14:
15: */
16:
17: /*
18: Theory of Operation
19:
20: I. Board Compatibility
21:
22: This device driver is designed for the 3Com 3c574 PC card Fast Ethernet
23: Adapter.
24:
25: II. Board-specific settings
26:
27: None -- PC cards are autoconfigured.
28:
29: III. Driver operation
30:
31: The 3c574 uses a Boomerang-style interface, without the bus-master capability.
32: See the Boomerang driver and documentation for most details.
33:
34: IV. Notes and chip documentation.
35:
36: Two added registers are used to enhance PIO performance, RunnerRdCtrl and
37: RunnerWrCtrl. These are 11 bit down-counters that are preloaded with the
38: count of word (16 bits) reads or writes the driver is about to do to the Rx
39: or Tx FIFO. The chip is then able to hide the internal-PCI-bus to PC-card
40: translation latency by buffering the I/O operations with an 8 word FIFO.
41: Note: No other chip accesses are permitted when this buffer is used.
42:
43: A second enhancement is that both attribute and common memory space
44: 0x0800-0x0fff can translated to the PIO FIFO. Thus memory operations (faster
45: with *some* PCcard bridges) may be used instead of I/O operations.
46: This is enabled by setting the 0x10 bit in the PCMCIA LAN COR.
47:
48: Some slow PC card bridges work better if they never see a WAIT signal.
49: This is configured by setting the 0x20 bit in the PCMCIA LAN COR.
50: Only do this after testing that it is reliable and improves performance.
51:
52: The upper five bits of RunnerRdCtrl are used to window into PCcard
53: configuration space registers. Window 0 is the regular Boomerang/Odie
54: register set, 1-5 are various PC card control registers, and 16-31 are
55: the (reversed!) CIS table.
56:
57: A final note: writing the InternalConfig register in window 3 with an
58: invalid ramWidth is Very Bad.
59:
60: V. References
61:
62: http://www.scyld.com/expert/NWay.html
63: http://www.national.com/pf/DP/DP83840.html
64:
65: Thanks to Terry Murphy of 3Com for providing development information for
66: earlier 3Com products.
67:
68: */
69:
70: #include <linux/module.h>
71: #include <linux/kernel.h>
72: #include <linux/init.h>
73: #include <linux/sched.h>
74: #include <linux/slab.h>
75: #include <linux/string.h>
76: #include <linux/timer.h>
77: #include <linux/interrupt.h>
78: #include <linux/in.h>
79: #include <linux/delay.h>
80: #include <asm/io.h>
81: #include <asm/system.h>
82: #include <asm/bitops.h>
83:
84: #include <linux/netdevice.h>
85: #include <linux/etherdevice.h>
86: #include <linux/skbuff.h>
87: #include <linux/if_arp.h>
88: #include <linux/ioport.h>
89:
90: #include <pcmcia/version.h>
91: #include <pcmcia/cs_types.h>
92: #include <pcmcia/cs.h>
93: #include <pcmcia/cistpl.h>
94: #include <pcmcia/cisreg.h>
95: #include <pcmcia/ciscode.h>
96: #include <pcmcia/ds.h>
97: #include <pcmcia/mem_op.h>
98:
99: /*====================================================================*/
100:
101: /* Module parameters */
102:
103: MODULE_AUTHOR("David Hinds <[email protected]>");
104: MODULE_DESCRIPTION("3Com 3c574 series PCMCIA ethernet driver");
105: MODULE_LICENSE("GPL");
106:
107: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
108:
109: /* Now-standard PC card module parameters. */
110: INT_MODULE_PARM(irq_mask, 0xdeb8);
111: static int irq_list[4] = { -1 };
112: MODULE_PARM(irq_list, "1-4i");
113:
114: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
115: INT_MODULE_PARM(max_interrupt_work, 32);
116:
117: /* Force full duplex modes? */
118: INT_MODULE_PARM(full_duplex, 0);
119:
120: /* Autodetect link polarity reversal? */
121: INT_MODULE_PARM(auto_polarity, 1);
122:
123: #ifdef PCMCIA_DEBUG
124: INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
125: #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
126: static char *version =
127: "3c574_cs.c 1.70 2003/08/25 15:57:40 Donald Becker/David Hinds, [email protected].\n";
128: #else
129: #define DEBUG(n, args...)
130: #endif
131:
132: /*====================================================================*/
133:
134: /* Time in jiffies before concluding the transmitter is hung. */
135: #define TX_TIMEOUT ((800*HZ)/1000)
136:
137: /* To minimize the size of the driver source and make the driver more
138: readable not all constants are symbolically defined.
139: You'll need the manual if you want to understand driver details anyway. */
140: /* Offsets from base I/O address. */
141: #define EL3_DATA 0x00
142: #define EL3_CMD 0x0e
143: #define EL3_STATUS 0x0e
144:
145: #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
146:
147: /* The top five bits written to EL3_CMD are a command, the lower
148: 11 bits are the parameter, if applicable. */
149: enum el3_cmds {
150: TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
151: RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
152: TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
153: FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
154: SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
155: SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
156: StatsDisable = 22<<11, StopCoax = 23<<11,
157: };
158:
159: enum elxl_status {
160: IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
161: TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
162: IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000 };
163:
164: /* The SetRxFilter command accepts the following classes: */
165: enum RxFilter {
166: RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
167: };
168:
169: enum Window0 {
170: Wn0EepromCmd = 10, Wn0EepromData = 12, /* EEPROM command/address, data. */
171: IntrStatus=0x0E, /* Valid in all windows. */
172: };
173: /* These assumes the larger EEPROM. */
174: enum Win0_EEPROM_cmds {
175: EEPROM_Read = 0x200, EEPROM_WRITE = 0x100, EEPROM_ERASE = 0x300,
176: EEPROM_EWENB = 0x30, /* Enable erasing/writing for 10 msec. */
177: EEPROM_EWDIS = 0x00, /* Disable EWENB before 10 msec timeout. */
178: };
179:
180: /* Register window 1 offsets, the window used in normal operation.
181: On the "Odie" this window is always mapped at offsets 0x10-0x1f.
182: Except for TxFree, which is overlapped by RunnerWrCtrl. */
183: enum Window1 {
184: TX_FIFO = 0x10, RX_FIFO = 0x10, RxErrors = 0x14,
185: RxStatus = 0x18, Timer=0x1A, TxStatus = 0x1B,
186: TxFree = 0x0C, /* Remaining free bytes in Tx buffer. */
187: RunnerRdCtrl = 0x16, RunnerWrCtrl = 0x1c,
188: };
189:
190: enum Window3 { /* Window 3: MAC/config bits. */
191: Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
192: };
193: union wn3_config {
194: int i;
195: struct w3_config_fields {
196: unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
197: int pad8:8;
198: unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1;
199: int pad24:7;
200: } u;
201: };
202:
203: enum Window4 { /* Window 4: Xcvr/media bits. */
204: Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,
205: };
206:
207:
208: #define MEDIA_TP 0x00C0 /* Enable link beat and jabber for 10baseT. */
209:
210: struct el3_private {
211: dev_link_t link;
212: struct net_device dev;
213: dev_node_t node;
214: struct net_device_stats stats;
215: u16 advertising, partner; /* NWay media advertisement */
216: unsigned char phys; /* MII device address */
217: unsigned int
218: autoselect:1, default_media:3; /* Read from the EEPROM/Wn3_Config. */
219: /* for transceiver monitoring */
220: struct timer_list media;
221: u_short media_status;
222: u_short fast_poll;
223: u_long last_irq;
224: };
225:
226: /* Set iff a MII transceiver on any interface requires mdio preamble.
227: This only set with the original DP83840 on older 3c905 boards, so the extra
228: code size of a per-interface flag is not worthwhile. */
229: static char mii_preamble_required = 0;
230:
231: /* Index of functions. */
232:
233: static void tc574_config(dev_link_t *link);
234: static void tc574_release(u_long arg);
235: static int tc574_event(event_t event, int priority,
236: event_callback_args_t *args);
237:
238: static void mdio_sync(ioaddr_t ioaddr, int bits);
239: static int mdio_read(ioaddr_t ioaddr, int phy_id, int location);
240: static void mdio_write(ioaddr_t ioaddr, int phy_id, int location, int value);
241: static u_short read_eeprom(ioaddr_t ioaddr, int index);
242: static void tc574_wait_for_completion(struct net_device *dev, int cmd);
243:
244: static void tc574_reset(struct net_device *dev);
245: static void media_check(u_long arg);
246: static int el3_open(struct net_device *dev);
247: static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
248: static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
249: static void update_stats(struct net_device *dev);
250: static struct net_device_stats *el3_get_stats(struct net_device *dev);
251: static int el3_rx(struct net_device *dev, int worklimit);
252: static int el3_close(struct net_device *dev);
253: static void el3_tx_timeout(struct net_device *dev);
254: static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
255: static void set_rx_mode(struct net_device *dev);
256:
257: static dev_info_t dev_info = "3c574_cs";
258:
259: static dev_link_t *tc574_attach(void);
260: static void tc574_detach(dev_link_t *);
261:
262: static dev_link_t *dev_list = NULL;
263:
264: static void flush_stale_links(void)
265: {
266: dev_link_t *link, *next;
267: for (link = dev_list; link; link = next) {
268: next = link->next;
269: if (link->state & DEV_STALE_LINK)
270: tc574_detach(link);
271: }
272: }
273:
274: static void cs_error(client_handle_t handle, int func, int ret)
275: {
276: #if CS_RELEASE_CODE < 0x2911
277: CardServices(ReportError, dev_info, (void *)func, (void *)ret);
278: #else
279: error_info_t err = { func, ret };
280: CardServices(ReportError, handle, &err);
281: #endif
282: }
283:
284: /*
285: tc574_attach() creates an "instance" of the driver, allocating
286: local data structures for one device. The device is registered
287: with Card Services.
288: */
289:
290: static dev_link_t *tc574_attach(void)
291: {
292: struct el3_private *lp;
293: client_reg_t client_reg;
294: dev_link_t *link;
295: struct net_device *dev;
296: int i, ret;
297:
298: DEBUG(0, "3c574_attach()\n");
299: flush_stale_links();
300:
301: /* Create the PC card device object. */
302: lp = kmalloc(sizeof(*lp), GFP_KERNEL);
303: if (!lp) return NULL;
304: memset(lp, 0, sizeof(*lp));
305: link = &lp->link; dev = &lp->dev;
306: link->priv = dev->priv = link->irq.Instance = lp;
307:
308: init_timer(&link->release);
309: link->release.function = &tc574_release;
310: link->release.data = (u_long)link;
311: link->io.NumPorts1 = 32;
312: link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
313: link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
314: link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
315: if (irq_list[0] == -1)
316: link->irq.IRQInfo2 = irq_mask;
317: else
318: for (i = 0; i < 4; i++)
319: link->irq.IRQInfo2 |= 1 << irq_list[i];
320: link->irq.Handler = &el3_interrupt;
321: link->conf.Attributes = CONF_ENABLE_IRQ;
322: link->conf.Vcc = 50;
323: link->conf.IntType = INT_MEMORY_AND_IO;
324: link->conf.ConfigIndex = 1;
325: link->conf.Present = PRESENT_OPTION;
326:
327: /* The EL3-specific entries in the device structure. */
328: dev->hard_start_xmit = &el3_start_xmit;
329: dev->get_stats = &el3_get_stats;
330: dev->do_ioctl = &el3_ioctl;
331: dev->set_multicast_list = &set_rx_mode;
332: ether_setup(dev);
333: init_dev_name(dev, lp->node);
334: dev->open = &el3_open;
335: dev->stop = &el3_close;
336: #ifdef HAVE_TX_TIMEOUT
337: dev->tx_timeout = el3_tx_timeout;
338: dev->watchdog_timeo = TX_TIMEOUT;
339: #endif
340:
341: /* Register with Card Services */
342: link->next = dev_list;
343: dev_list = link;
344: client_reg.dev_info = &dev_info;
345: client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
346: client_reg.EventMask =
347: CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
348: CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
349: CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
350: client_reg.event_handler = &tc574_event;
351: client_reg.Version = 0x0210;
352: client_reg.event_callback_args.client_data = link;
353: ret = CardServices(RegisterClient, &link->handle, &client_reg);
354: if (ret != 0) {
355: cs_error(link->handle, RegisterClient, ret);
356: tc574_detach(link);
357: return NULL;
358: }
359:
360: return link;
361: } /* tc574_attach */
362:
363: /*
364:
365: This deletes a driver "instance". The device is de-registered
366: with Card Services. If it has been released, all local data
367: structures are freed. Otherwise, the structures will be freed
368: when the device is released.
369:
370: */
371:
372: static void tc574_detach(dev_link_t *link)
373: {
374: struct el3_private *lp = link->priv;
375: dev_link_t **linkp;
376:
377: DEBUG(0, "3c574_detach(0x%p)\n", link);
378:
379: /* Locate device structure */
380: for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
381: if (*linkp == link) break;
382: if (*linkp == NULL)
383: return;
384:
385: del_timer(&link->release);
386: if (link->state & DEV_CONFIG) {
387: tc574_release((u_long)link);
388: if (link->state & DEV_STALE_CONFIG) {
389: link->state |= DEV_STALE_LINK;
390: return;
391: }
392: }
393:
394: if (link->handle)
395: CardServices(DeregisterClient, link->handle);
396:
397: /* Unlink device structure, free bits */
398: *linkp = link->next;
399: if (link->dev)
400: unregister_netdev(&lp->dev);
401: kfree(lp);
402:
403: } /* tc574_detach */
404:
405: /*
406: tc574_config() is scheduled to run after a CARD_INSERTION event
407: is received, to configure the PCMCIA socket, and to make the
408: ethernet device available to the system.
409: */
410:
411: #define CS_CHECK(fn, args...) \
412: while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
413:
414: static void tc574_config(dev_link_t *link)
415: {
416: client_handle_t handle = link->handle;
417: struct el3_private *lp = link->priv;
418: struct net_device *dev = &lp->dev;
419: tuple_t tuple;
420: cisparse_t parse;
421: u_short buf[32];
422: int last_fn, last_ret, i, j;
423: ioaddr_t ioaddr;
424: u16 *phys_addr;
425: char *cardname;
426:
427: phys_addr = (u16 *)dev->dev_addr;
428:
429: DEBUG(0, "3c574_config(0x%p)\n", link);
430:
431: tuple.Attributes = 0;
432: tuple.DesiredTuple = CISTPL_CONFIG;
433: CS_CHECK(GetFirstTuple, handle, &tuple);
434: tuple.TupleData = (cisdata_t *)buf;
435: tuple.TupleDataMax = 64;
436: tuple.TupleOffset = 0;
437: CS_CHECK(GetTupleData, handle, &tuple);
438: CS_CHECK(ParseTuple, handle, &tuple, &parse);
439: link->conf.ConfigBase = parse.config.base;
440: link->conf.Present = parse.config.rmask[0];
441:
442: /* Configure card */
443: link->state |= DEV_CONFIG;
444:
445: link->io.IOAddrLines = 16;
446: for (i = j = 0; j < 0x400; j += 0x20) {
447: link->io.BasePort1 = j ^ 0x300;
448: i = CardServices(RequestIO, link->handle, &link->io);
449: if (i == CS_SUCCESS) break;
450: }
451: if (i != CS_SUCCESS) {
452: cs_error(link->handle, RequestIO, i);
453: goto failed;
454: }
455: CS_CHECK(RequestIRQ, link->handle, &link->irq);
456: CS_CHECK(RequestConfiguration, link->handle, &link->conf);
457:
458: dev->irq = link->irq.AssignedIRQ;
459: dev->base_addr = link->io.BasePort1;
460:
461: if (register_netdev(dev) != 0) {
462: printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n");
463: goto failed;
464: }
465:
466: ioaddr = dev->base_addr;
467: copy_dev_name(lp->node, dev);
468: link->dev = &lp->node;
469:
470: /* The 3c574 normally uses an EEPROM for configuration info, including
471: the hardware address. The future products may include a modem chip
472: and put the address in the CIS. */
473: tuple.DesiredTuple = 0x88;
474: if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
475: CardServices(GetTupleData, handle, &tuple);
476: for (i = 0; i < 3; i++)
477: phys_addr[i] = htons(buf[i]);
478: } else {
479: EL3WINDOW(0);
480: for (i = 0; i < 3; i++)
481: phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
482: if (phys_addr[0] == 0x6060) {
483: printk(KERN_NOTICE "3c574_cs: IO port conflict at 0x%03lx"
484: "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
485: goto failed;
486: }
487: }
488: tuple.DesiredTuple = CISTPL_VERS_1;
489: if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS &&
490: CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS &&
491: CardServices(ParseTuple, handle, &tuple, &parse) == CS_SUCCESS) {
492: cardname = parse.version_1.str + parse.version_1.ofs[1];
493: } else
494: cardname = "3Com 3c574";
495:
496: printk(KERN_INFO "%s: %s at io %#3lx, irq %d, hw_addr ",
497: dev->name, cardname, dev->base_addr, dev->irq);
498:
499: for (i = 0; i < 6; i++)
500: printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : ".\n"));
501:
502: {
503: u_char mcr, *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
504: union wn3_config config;
505: outw(2<<11, ioaddr + RunnerRdCtrl);
506: mcr = inb(ioaddr + 2);
507: outw(0<<11, ioaddr + RunnerRdCtrl);
508: printk(KERN_INFO " ASIC rev %d,", mcr>>3);
509: EL3WINDOW(3);
510: config.i = inl(ioaddr + Wn3_Config);
511: printk(" %dK FIFO split %s Rx:Tx, %sMII interface.\n",
512: 8 << config.u.ram_size, ram_split[config.u.ram_split],
513: config.u.autoselect ? "autoselect " : "");
514: lp->default_media = config.u.xcvr;
515: lp->autoselect = config.u.autoselect;
516: }
517:
518: {
519: int phy;
520:
521: /* Roadrunner only: Turn on the MII transceiver */
522: outw(0x8040, ioaddr + Wn3_Options);
523: mdelay(1);
524: outw(0xc040, ioaddr + Wn3_Options);
525: tc574_wait_for_completion(dev, TxReset);
526: tc574_wait_for_completion(dev, RxReset);
527: mdelay(1);
528: outw(0x8040, ioaddr + Wn3_Options);
529:
530: EL3WINDOW(4);
531: for (phy = 1; phy <= 32; phy++) {
532: int mii_status;
533: mdio_sync(ioaddr, 32);
534: mii_status = mdio_read(ioaddr, phy & 0x1f, 1);
535: if (mii_status != 0xffff) {
536: lp->phys = phy & 0x1f;
537: DEBUG(0, " MII transceiver at index %d, status %x.\n",
538: phy, mii_status);
539: if ((mii_status & 0x0040) == 0)
540: mii_preamble_required = 1;
541: break;
542: }
543: }
544: if (phy > 32) {
545: printk(KERN_NOTICE " No MII transceivers found!\n");
546: goto failed;
547: }
548: i = mdio_read(ioaddr, lp->phys, 16) | 0x40;
549: mdio_write(ioaddr, lp->phys, 16, i);
550: lp->advertising = mdio_read(ioaddr, lp->phys, 4);
551: if (full_duplex) {
552: /* Only advertise the FD media types. */
553: lp->advertising &= ~0x02a0;
554: mdio_write(ioaddr, lp->phys, 4, lp->advertising);
555: }
556: }
557:
558: link->state &= ~DEV_CONFIG_PENDING;
559: return;
560:
561: cs_failed:
562: cs_error(link->handle, last_fn, last_ret);
563: failed:
564: tc574_release((u_long)link);
565: link->state &= ~DEV_CONFIG_PENDING;
566: return;
567:
568: } /* tc574_config */
569:
570: /*
571: After a card is removed, tc574_release() will unregister the net
572: device, and release the PCMCIA configuration. If the device is
573: still open, this will be postponed until it is closed.
574: */
575:
576: static void tc574_release(u_long arg)
577: {
578: dev_link_t *link = (dev_link_t *)arg;
579:
580: DEBUG(0, "3c574_release(0x%p)\n", link);
581:
582: if (link->open) {
583: DEBUG(1, "3c574_cs: release postponed, '%s' still open\n",
584: link->dev->dev_name);
585: link->state |= DEV_STALE_CONFIG;
586: return;
587: }
588:
589: CardServices(ReleaseConfiguration, link->handle);
590: CardServices(ReleaseIO, link->handle, &link->io);
591: CardServices(ReleaseIRQ, link->handle, &link->irq);
592:
593: link->state &= ~DEV_CONFIG;
594:
595: } /* tc574_release */
596:
597: /*
598: The card status event handler. Mostly, this schedules other
599: stuff to run after an event is received. A CARD_REMOVAL event
600: also sets some flags to discourage the net drivers from trying
601: to talk to the card any more.
602: */
603:
604: static int tc574_event(event_t event, int priority,
605: event_callback_args_t *args)
606: {
607: dev_link_t *link = args->client_data;
608: struct el3_private *lp = link->priv;
609: struct net_device *dev = &lp->dev;
610:
611: DEBUG(1, "3c574_event(0x%06x)\n", event);
612:
613: switch (event) {
614: case CS_EVENT_CARD_REMOVAL:
615: link->state &= ~DEV_PRESENT;
616: if (link->state & DEV_CONFIG) {
617: netif_device_detach(dev);
618: mod_timer(&link->release, jiffies + HZ/20);
619: }
620: break;
621: case CS_EVENT_CARD_INSERTION:
622: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
623: tc574_config(link);
624: break;
625: case CS_EVENT_PM_SUSPEND:
626: link->state |= DEV_SUSPEND;
627: /* Fall through... */
628: case CS_EVENT_RESET_PHYSICAL:
629: if (link->state & DEV_CONFIG) {
630: if (link->open)
631: netif_device_detach(dev);
632: CardServices(ReleaseConfiguration, link->handle);
633: }
634: break;
635: case CS_EVENT_PM_RESUME:
636: link->state &= ~DEV_SUSPEND;
637: /* Fall through... */
638: case CS_EVENT_CARD_RESET:
639: if (link->state & DEV_CONFIG) {
640: CardServices(RequestConfiguration, link->handle, &link->conf);
641: if (link->open) {
642: tc574_reset(dev);
643: netif_device_attach(dev);
644: }
645: }
646: break;
647: }
648: return 0;
649: } /* tc574_event */
650:
651: static void dump_status(struct net_device *dev)
652: {
653: ioaddr_t ioaddr = dev->base_addr;
654: EL3WINDOW(1);
655: printk(KERN_INFO " irq status %04x, rx status %04x, tx status "
656: "%02x, tx free %04x\n", inw(ioaddr+EL3_STATUS),
657: inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
658: inw(ioaddr+TxFree));
659: EL3WINDOW(4);
660: printk(KERN_INFO " diagnostics: fifo %04x net %04x ethernet %04x"
661: " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
662: inw(ioaddr+0x08), inw(ioaddr+0x0a));
663: EL3WINDOW(1);
664: }
665:
666: /*
667: Use this for commands that may take time to finish
668: */
669: static void tc574_wait_for_completion(struct net_device *dev, int cmd)
670: {
671: int i = 1500;
672: outw(cmd, dev->base_addr + EL3_CMD);
673: while (--i > 0)
674: if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
675: if (i == 0)
676: printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n",
677: dev->name, cmd);
678: }
679:
680: /* Read a word from the EEPROM using the regular EEPROM access register.
681: Assume that we are in register window zero.
682: */
683: static u_short read_eeprom(ioaddr_t ioaddr, int index)
684: {
685: int timer;
686: outw(EEPROM_Read + index, ioaddr + Wn0EepromCmd);
687: /* Pause for at least 162 usec for the read to take place. */
688: for (timer = 1620; timer >= 0; timer--) {
689: if ((inw(ioaddr + Wn0EepromCmd) & 0x8000) == 0)
690: break;
691: }
692: return inw(ioaddr + Wn0EepromData);
693: }
694:
695: /* MII transceiver control section.
696: Read and write the MII registers using software-generated serial
697: MDIO protocol. See the MII specifications or DP83840A data sheet
698: for details.
699: The maxium data clock rate is 2.5 Mhz. The timing is easily met by the
700: slow PC card interface. */
701:
702: #define MDIO_SHIFT_CLK 0x01
703: #define MDIO_DIR_WRITE 0x04
704: #define MDIO_DATA_WRITE0 (0x00 | MDIO_DIR_WRITE)
705: #define MDIO_DATA_WRITE1 (0x02 | MDIO_DIR_WRITE)
706: #define MDIO_DATA_READ 0x02
707: #define MDIO_ENB_IN 0x00
708:
709: /* Generate the preamble required for initial synchronization and
710: a few older transceivers. */
711: static void mdio_sync(ioaddr_t ioaddr, int bits)
712: {
713: int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
714:
715: /* Establish sync by sending at least 32 logic ones. */
716: while (-- bits >= 0) {
717: outw(MDIO_DATA_WRITE1, mdio_addr);
718: outw(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
719: }
720: }
721:
722: static int mdio_read(ioaddr_t ioaddr, int phy_id, int location)
723: {
724: int i;
725: int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
726: unsigned int retval = 0;
727: int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
728:
729: if (mii_preamble_required)
730: mdio_sync(ioaddr, 32);
731:
732: /* Shift the read command bits out. */
733: for (i = 14; i >= 0; i--) {
734: int dataval = (read_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
735: outw(dataval, mdio_addr);
736: outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
737: }
738: /* Read the two transition, 16 data, and wire-idle bits. */
739: for (i = 19; i > 0; i--) {
740: outw(MDIO_ENB_IN, mdio_addr);
741: retval = (retval << 1) | ((inw(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
742: outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
743: }
744: return (retval>>1) & 0xffff;
745: }
746:
747: static void mdio_write(ioaddr_t ioaddr, int phy_id, int location, int value)
748: {
749: int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value;
750: int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
751: int i;
752:
753: if (mii_preamble_required)
754: mdio_sync(ioaddr, 32);
755:
756: /* Shift the command bits out. */
757: for (i = 31; i >= 0; i--) {
758: int dataval = (write_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
759: outw(dataval, mdio_addr);
760: outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
761: }
762: /* Leave the interface idle. */
763: for (i = 1; i >= 0; i--) {
764: outw(MDIO_ENB_IN, mdio_addr);
765: outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
766: }
767:
768: return;
769: }
770:
771: /* Reset and restore all of the 3c574 registers. */
772: static void tc574_reset(struct net_device *dev)
773: {
774: struct el3_private *lp = (struct el3_private *)dev->priv;
775: int i, ioaddr = dev->base_addr;
776:
777: tc574_wait_for_completion(dev, TotalReset|0x10);
778:
779: /* Clear any transactions in progress. */
780: outw(0, ioaddr + RunnerWrCtrl);
781: outw(0, ioaddr + RunnerRdCtrl);
782:
783: /* Set the station address and mask. */
784: EL3WINDOW(2);
785: for (i = 0; i < 6; i++)
786: outb(dev->dev_addr[i], ioaddr + i);
787: for (; i < 12; i+=2)
788: outw(0, ioaddr + i);
789:
790: /* Reset config options */
791: EL3WINDOW(3);
792: outb((dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
793: outl((lp->autoselect ? 0x01000000 : 0) | 0x0062001b,
794: ioaddr + Wn3_Config);
795:
796: /* Roadrunner only: Turn on the MII transceiver. */
797: outw(0x8040, ioaddr + Wn3_Options);
798: mdelay(1);
799: outw(0xc040, ioaddr + Wn3_Options);
800: tc574_wait_for_completion(dev, TxReset);
801: tc574_wait_for_completion(dev, RxReset);
802: mdelay(1);
803: outw(0x8040, ioaddr + Wn3_Options);
804:
805: /* Switch to the stats window, and clear all stats by reading. */
806: outw(StatsDisable, ioaddr + EL3_CMD);
807: EL3WINDOW(6);
808: for (i = 0; i < 10; i++)
809: inb(ioaddr + i);
810: inw(ioaddr + 10);
811: inw(ioaddr + 12);
812: EL3WINDOW(4);
813: inb(ioaddr + 12);
814: inb(ioaddr + 13);
815:
816: /* .. enable any extra statistics bits.. */
817: outw(0x0040, ioaddr + Wn4_NetDiag);
818: /* .. re-sync MII and re-fill what NWay is advertising. */
819: mdio_sync(ioaddr, 32);
820: mdio_write(ioaddr, lp->phys, 4, lp->advertising);
821: if (!auto_polarity) {
822: /* works for TDK 78Q2120 series MII's */
823: int i = mdio_read(ioaddr, lp->phys, 16) | 0x20;
824: mdio_write(ioaddr, lp->phys, 16, i);
825: }
826:
827: /* Switch to register set 1 for normal use, just for TxFree. */
828: EL3WINDOW(1);
829:
830: set_rx_mode(dev);
831: outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
832: outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
833: outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
834: /* Allow status bits to be seen. */
835: outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
836: /* Ack all pending events, and set active indicator mask. */
837: outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
838: ioaddr + EL3_CMD);
839: outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
840: | AdapterFailure | RxEarly, ioaddr + EL3_CMD);
841: }
842:
843: static int el3_open(struct net_device *dev)
844: {
845: struct el3_private *lp = (struct el3_private *)dev->priv;
846: dev_link_t *link = &lp->link;
847:
848: if (!DEV_OK(link))
849: return -ENODEV;
850:
851: link->open++;
852: MOD_INC_USE_COUNT;
853: netif_start_queue(dev);
854: netif_mark_up(dev);
855:
856: tc574_reset(dev);
857: lp->media.function = &media_check;
858: lp->media.data = (u_long)lp;
859: lp->media.expires = jiffies + HZ;
860: add_timer(&lp->media);
861:
862: DEBUG(2, "%s: opened, status %4.4x.\n",
863: dev->name, inw(dev->base_addr + EL3_STATUS));
864:
865: return 0;
866: }
867:
868: static void el3_tx_timeout(struct net_device *dev)
869: {
870: struct el3_private *lp = (struct el3_private *)dev->priv;
871: ioaddr_t ioaddr = dev->base_addr;
872:
873: printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name);
874: dump_status(dev);
875: lp->stats.tx_errors++;
876: dev->trans_start = jiffies;
877: /* Issue TX_RESET and TX_START commands. */
878: tc574_wait_for_completion(dev, TxReset);
879: outw(TxEnable, ioaddr + EL3_CMD);
880: netif_wake_queue(dev);
881: }
882:
883: static void pop_tx_status(struct net_device *dev)
884: {
885: struct el3_private *lp = (struct el3_private *)dev->priv;
886: ioaddr_t ioaddr = dev->base_addr;
887: int i;
888:
889: /* Clear the Tx status stack. */
890: for (i = 32; i > 0; i--) {
891: u_char tx_status = inb(ioaddr + TxStatus);
892: if (!(tx_status & 0x84)) break;
893: /* reset transmitter on jabber error or underrun */
894: if (tx_status & 0x30)
895: tc574_wait_for_completion(dev, TxReset);
896: if (tx_status & 0x38) {
897: DEBUG(1, "%s: transmit error: status 0x%02x\n",
898: dev->name, tx_status);
899: outw(TxEnable, ioaddr + EL3_CMD);
900: lp->stats.tx_aborted_errors++;
901: }
902: outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
903: }
904: }
905:
906: static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
907: {
908: ioaddr_t ioaddr = dev->base_addr;
909:
910: tx_timeout_check(dev, el3_tx_timeout);
911: skb_tx_check(dev, skb);
912:
913: DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
914: "status %4.4x.\n", dev->name, (long)skb->len,
915: inw(ioaddr + EL3_STATUS));
916:
917: outw(skb->len, ioaddr + TX_FIFO);
918: outw(0, ioaddr + TX_FIFO);
919: outsl(ioaddr + TX_FIFO, skb->data, (skb->len+3)>>2);
920:
921: dev->trans_start = jiffies;
922:
923: /* TxFree appears only in Window 1, not offset 0x1c. */
924: if (inw(ioaddr + TxFree) > 1536) {
925: netif_start_queue(dev);
926: } else
927: /* Interrupt us when the FIFO has room for max-sized packet.
928: The threshold is in units of dwords. */
929: outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
930:
931: DEV_KFREE_SKB (skb);
932: pop_tx_status(dev);
933:
934: return 0;
935: }
936:
937: /* The EL3 interrupt handler. */
938: static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
939: {
940: struct el3_private *lp = dev_id;
941: struct net_device *dev = &lp->dev;
942: ioaddr_t ioaddr, status;
943: int work_budget = max_interrupt_work;
944:
945: if (!netif_device_present(dev))
946: return;
947: ioaddr = dev->base_addr;
948:
949: DEBUG(3, "%s: interrupt, status %4.4x.\n",
950: dev->name, inw(ioaddr + EL3_STATUS));
951:
952: while ((status = inw(ioaddr + EL3_STATUS)) &
953: (IntLatch | RxComplete | RxEarly | StatsFull)) {
954: if (!netif_device_present(dev) ||
955: ((status & 0xe000) != 0x2000)) {
956: DEBUG(1, "%s: Interrupt from dead card\n", dev->name);
957: break;
958: }
959:
960: if (status & RxComplete)
961: work_budget = el3_rx(dev, work_budget);
962:
963: if (status & TxAvailable) {
964: DEBUG(3, " TX room bit was handled.\n");
965: /* There's room in the FIFO for a full-sized packet. */
966: outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
967: netif_wake_queue(dev);
968: }
969:
970: if (status & TxComplete)
971: pop_tx_status(dev);
972:
973: if (status & (AdapterFailure | RxEarly | StatsFull)) {
974: /* Handle all uncommon interrupts. */
975: if (status & StatsFull)
976: update_stats(dev);
977: if (status & RxEarly) {
978: work_budget = el3_rx(dev, work_budget);
979: outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
980: }
981: if (status & AdapterFailure) {
982: u16 fifo_diag;
983: EL3WINDOW(4);
984: fifo_diag = inw(ioaddr + Wn4_FIFODiag);
985: EL3WINDOW(1);
986: printk(KERN_NOTICE "%s: adapter failure, FIFO diagnostic"
987: " register %04x.\n", dev->name, fifo_diag);
988: if (fifo_diag & 0x0400) {
989: /* Tx overrun */
990: tc574_wait_for_completion(dev, TxReset);
991: outw(TxEnable, ioaddr + EL3_CMD);
992: }
993: if (fifo_diag & 0x2000) {
994: /* Rx underrun */
995: tc574_wait_for_completion(dev, RxReset);
996: set_rx_mode(dev);
997: outw(RxEnable, ioaddr + EL3_CMD);
998: }
999: outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
1000: }
1001: }
1002:
1003: if (--work_budget < 0) {
1004: DEBUG(0, "%s: Too much work in interrupt, "
1005: "status %4.4x.\n", dev->name, status);
1006: /* Clear all interrupts */
1007: outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
1008: break;
1009: }
1010: /* Acknowledge the IRQ. */
1011: outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
1012: }
1013:
1014: DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
1015: dev->name, inw(ioaddr + EL3_STATUS));
1016: return;
1017: }
1018:
1019: /*
1020: This timer serves two purposes: to check for missed interrupts
1021: (and as a last resort, poll the NIC for events), and to monitor
1022: the MII, reporting changes in cable status.
1023: */
1024: static void media_check(u_long arg)
1025: {
1026: struct el3_private *lp = (struct el3_private *)arg;
1027: struct net_device *dev = &lp->dev;
1028: ioaddr_t ioaddr = dev->base_addr;
1029: u_long flags;
1030: u_short /* cable, */ media, partner;
1031:
1032: if (!netif_device_present(dev))
1033: goto reschedule;
1034:
1035: /* Check for pending interrupt with expired latency timer: with
1036: this, we can limp along even if the interrupt is blocked */
1037: if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
1038: (inb(ioaddr + Timer) == 0xff)) {
1039: if (!lp->fast_poll)
1040: printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
1041: el3_interrupt(dev->irq, lp, NULL);
1042: lp->fast_poll = HZ;
1043: }
1044: if (lp->fast_poll) {
1045: lp->fast_poll--;
1046: lp->media.expires = jiffies + 2;
1047: add_timer(&lp->media);
1048: return;
1049: }
1050:
1051: save_flags(flags);
1052: cli();
1053: #if 0
1054: outw(2<<11, ioaddr + RunnerRdCtrl);
1055: cable = inb(ioaddr);
1056: outb(0x20, ioaddr);
1057: outw(0, ioaddr + RunnerRdCtrl);
1058: #endif
1059: EL3WINDOW(4);
1060: media = mdio_read(ioaddr, lp->phys, 1);
1061: partner = mdio_read(ioaddr, lp->phys, 5);
1062: EL3WINDOW(1);
1063: restore_flags(flags);
1064:
1065: #if 0
1066: if (cable & 0x20)
1067: printk(KERN_INFO "%s: cable %s\n", dev->name,
1068: ((cable & 0x08) ? "fixed" : "problem"));
1069: #endif
1070: if (media != lp->media_status) {
1071: if ((media ^ lp->media_status) & 0x0004)
1072: printk(KERN_INFO "%s: %s link beat\n", dev->name,
1073: (lp->media_status & 0x0004) ? "lost" : "found");
1074: if ((media ^ lp->media_status) & 0x0020) {
1075: lp->partner = 0;
1076: if (lp->media_status & 0x0020) {
1077: printk(KERN_INFO "%s: autonegotiation restarted\n",
1078: dev->name);
1079: } else if (partner) {
1080: partner &= lp->advertising;
1081: lp->partner = partner;
1082: printk(KERN_INFO "%s: autonegotiation complete: "
1083: "%sbaseT-%cD selected\n", dev->name,
1084: ((partner & 0x0180) ? "100" : "10"),
1085: ((partner & 0x0140) ? 'F' : 'H'));
1086: } else {
1087: printk(KERN_INFO "%s: link partner did not autonegotiate\n",
1088: dev->name);
1089: }
1090:
1091: EL3WINDOW(3);
1092: outb((partner & 0x0140 ? 0x20 : 0) |
1093: (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
1094: EL3WINDOW(1);
1095:
1096: }
1097: if (media & 0x0010)
1098: printk(KERN_INFO "%s: remote fault detected\n",
1099: dev->name);
1100: if (media & 0x0002)
1101: printk(KERN_INFO "%s: jabber detected\n", dev->name);
1102: lp->media_status = media;
1103: }
1104:
1105: reschedule:
1106: lp->media.expires = jiffies + HZ;
1107: add_timer(&lp->media);
1108: }
1109:
1110: static struct net_device_stats *el3_get_stats(struct net_device *dev)
1111: {
1112: struct el3_private *lp = (struct el3_private *)dev->priv;
1113:
1114: if (netif_device_present(dev))
1115: update_stats(dev);
1116: return &lp->stats;
1117: }
1118:
1119: /* Update statistics.
1120: Suprisingly this need not be run single-threaded, but it effectively is.
1121: The counters clear when read, so the adds must merely be atomic.
1122: */
1123: static void update_stats(struct net_device *dev)
1124: {
1125: struct el3_private *lp = (struct el3_private *)dev->priv;
1126: ioaddr_t ioaddr = dev->base_addr;
1127: u8 rx, tx, up;
1128:
1129: DEBUG(2, "%s: updating the statistics.\n", dev->name);
1130:
1131: if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
1132: return;
1133:
1134: /* Unlike the 3c509 we need not turn off stats updates while reading. */
1135: /* Switch to the stats window, and read everything. */
1136: EL3WINDOW(6);
1137: lp->stats.tx_carrier_errors += inb(ioaddr + 0);
1138: lp->stats.tx_heartbeat_errors += inb(ioaddr + 1);
1139: /* Multiple collisions. */ inb(ioaddr + 2);
1140: lp->stats.collisions += inb(ioaddr + 3);
1141: lp->stats.tx_window_errors += inb(ioaddr + 4);
1142: lp->stats.rx_fifo_errors += inb(ioaddr + 5);
1143: lp->stats.tx_packets += inb(ioaddr + 6);
1144: up = inb(ioaddr + 9);
1145: lp->stats.tx_packets += (up&0x30) << 4;
1146: /* Rx packets */ inb(ioaddr + 7);
1147: /* Tx deferrals */ inb(ioaddr + 8);
1148: rx = inw(ioaddr + 10);
1149: tx = inw(ioaddr + 12);
1150:
1151: EL3WINDOW(4);
1152: /* BadSSD */ inb(ioaddr + 12);
1153: up = inb(ioaddr + 13);
1154:
1155: add_tx_bytes(&lp->stats, tx + ((up & 0xf0) << 12));
1156:
1157: EL3WINDOW(1);
1158: }
1159:
1160: static int el3_rx(struct net_device *dev, int worklimit)
1161: {
1162: struct el3_private *lp = (struct el3_private *)dev->priv;
1163: ioaddr_t ioaddr = dev->base_addr;
1164: short rx_status;
1165:
1166: DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
1167: dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
1168: while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
1169: (--worklimit >= 0)) {
1170: if (rx_status & 0x4000) { /* Error, update stats. */
1171: short error = rx_status & 0x3800;
1172: lp->stats.rx_errors++;
1173: switch (error) {
1174: case 0x0000: lp->stats.rx_over_errors++; break;
1175: case 0x0800: lp->stats.rx_length_errors++; break;
1176: case 0x1000: lp->stats.rx_frame_errors++; break;
1177: case 0x1800: lp->stats.rx_length_errors++; break;
1178: case 0x2000: lp->stats.rx_frame_errors++; break;
1179: case 0x2800: lp->stats.rx_crc_errors++; break;
1180: }
1181: } else {
1182: short pkt_len = rx_status & 0x7ff;
1183: struct sk_buff *skb;
1184:
1185: skb = dev_alloc_skb(pkt_len+5);
1186:
1187: DEBUG(3, " Receiving packet size %d status %4.4x.\n",
1188: pkt_len, rx_status);
1189: if (skb != NULL) {
1190: skb->dev = dev;
1191: skb_reserve(skb, 2);
1192: insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
1193: ((pkt_len+3)>>2));
1194: skb->protocol = eth_type_trans(skb, dev);
1195: netif_rx(skb);
1196: dev->last_rx = jiffies;
1197: lp->stats.rx_packets++;
1198: add_rx_bytes(&lp->stats, pkt_len);
1199: } else {
1200: DEBUG(1, "%s: couldn't allocate a sk_buff of"
1201: " size %d.\n", dev->name, pkt_len);
1202: lp->stats.rx_dropped++;
1203: }
1204: }
1205: tc574_wait_for_completion(dev, RxDiscard);
1206: }
1207:
1208: return worklimit;
1209: }
1210:
1211: /* Provide ioctl() calls to examine the MII xcvr state. */
1212: static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1213: {
1214: struct el3_private *lp = (struct el3_private *)dev->priv;
1215: ioaddr_t ioaddr = dev->base_addr;
1216: u16 *data = (u16 *)&rq->ifr_data;
1217: int phy = lp->phys & 0x1f;
1218:
1219: DEBUG(2, "%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
1220: dev->name, rq->ifr_ifrn.ifrn_name, cmd,
1221: data[0], data[1], data[2], data[3]);
1222:
1223: switch(cmd) {
1224: case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */
1225: data[0] = phy;
1226: case SIOCDEVPRIVATE+1: /* Read the specified MII register. */
1227: {
1228: int saved_window;
1229: long flags;
1230:
1231: save_flags(flags);
1232: cli();
1233: saved_window = inw(ioaddr + EL3_CMD) >> 13;
1234: EL3WINDOW(4);
1235: data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f);
1236: EL3WINDOW(saved_window);
1237: restore_flags(flags);
1238: return 0;
1239: }
1240: case SIOCDEVPRIVATE+2: /* Write the specified MII register */
1241: {
1242: int saved_window;
1243: long flags;
1244:
1245: if (!capable(CAP_NET_ADMIN))
1246: return -EPERM;
1247: save_flags(flags);
1248: cli();
1249: saved_window = inw(ioaddr + EL3_CMD) >> 13;
1250: EL3WINDOW(4);
1251: mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]);
1252: EL3WINDOW(saved_window);
1253: restore_flags(flags);
1254: return 0;
1255: }
1256: default:
1257: return -EOPNOTSUPP;
1258: }
1259: }
1260:
1261: /* The Odie chip has a 64 bin multicast filter, but the bit layout is not
1262: documented. Until it is we revert to receiving all multicast frames when
1263: any multicast reception is desired.
1264: Note: My other drivers emit a log message whenever promiscuous mode is
1265: entered to help detect password sniffers. This is less desirable on
1266: typical PC card machines, so we omit the message.
1267: */
1268:
1269: static void set_rx_mode(struct net_device *dev)
1270: {
1271: ioaddr_t ioaddr = dev->base_addr;
1272:
1273: if (dev->flags & IFF_PROMISC)
1274: outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1275: ioaddr + EL3_CMD);
1276: else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
1277: outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
1278: else
1279: outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1280: }
1281:
1282: static int el3_close(struct net_device *dev)
1283: {
1284: ioaddr_t ioaddr = dev->base_addr;
1285: struct el3_private *lp = dev->priv;
1286: dev_link_t *link = &lp->link;
1287:
1288: DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
1289:
1290: if (DEV_OK(link)) {
1291: /* Turn off statistics ASAP. We update lp->stats below. */
1292: outw(StatsDisable, ioaddr + EL3_CMD);
1293:
1294: /* Disable the receiver and transmitter. */
1295: outw(RxDisable, ioaddr + EL3_CMD);
1296: outw(TxDisable, ioaddr + EL3_CMD);
1297:
1298: /* Note: Switching to window 0 may disable the IRQ. */
1299: EL3WINDOW(0);
1300:
1301: update_stats(dev);
1302: }
1303:
1304: link->open--;
1305: netif_stop_queue(dev);
1306: netif_mark_down(dev);
1307: del_timer(&lp->media);
1308: if (link->state & DEV_STALE_CONFIG)
1309: mod_timer(&link->release, jiffies + HZ/20);
1310:
1311: MOD_DEC_USE_COUNT;
1312:
1313: return 0;
1314: }
1315:
1316: static int __init init_3c574_cs(void)
1317: {
1318: servinfo_t serv;
1319:
1320: DEBUG(0, "%s\n", version);
1321: CardServices(GetCardServicesInfo, &serv);
1322: if (serv.Revision != CS_RELEASE_CODE) {
1323: printk(KERN_NOTICE "3c574_cs: Card Services release "
1324: "does not match!\n");
1325: return -EINVAL;
1326: }
1327: register_pccard_driver(&dev_info, &tc574_attach, &tc574_detach);
1328: return 0;
1329: }
1330:
1331: static void __exit exit_3c574_cs(void)
1332: {
1333: DEBUG(0, "3c574_cs: unloading\n");
1334: unregister_pccard_driver(&dev_info);
1335: while (dev_list != NULL)
1336: tc574_detach(dev_list);
1337: }
1338:
1339: module_init(init_3c574_cs);
1340: module_exit(exit_3c574_cs);
1341:
1342: /*
1343: * Local variables:
1344: * compile-command: "make 3c574_cs.o"
1345: * c-indent-level: 4
1346: * c-basic-offset: 4
1347: * tab-width: 4
1348: * End:
1349: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.