|
|
1.1 root 1: /*======================================================================
2:
3: A PCMCIA ethernet driver for Asix AX88190-based cards
4:
5: The Asix AX88190 is a NS8390-derived chipset with a few nasty
6: idiosyncracies that make it very inconvenient to support with a
7: standard 8390 driver. This driver is based on pcnet_cs, with the
8: tweaked 8390 code grafted on the end. Much of what I did was to
9: clean up and update a similar driver supplied by Asix, which was
10: adapted by William Lee, [email protected].
11:
12: Copyright (C) 2001 David A. Hinds -- [email protected]
13:
14: axnet_cs.c 1.31 2003/08/25 15:57:40
15:
16: The network driver code is based on Donald Becker's NE2000 code:
17:
18: Written 1992,1993 by Donald Becker.
19: Copyright 1993 United States Government as represented by the
20: Director, National Security Agency. This software may be used and
21: distributed according to the terms of the GNU General Public License,
22: incorporated herein by reference.
23: Donald Becker may be reached at [email protected]
24:
25: ======================================================================*/
26:
27: #include <linux/kernel.h>
28: #include <linux/module.h>
29: #include <linux/init.h>
30: #include <linux/sched.h>
31: #include <linux/ptrace.h>
32: #include <linux/slab.h>
33: #include <linux/string.h>
34: #include <linux/timer.h>
35: #include <linux/delay.h>
36: #include <linux/spinlock.h>
37: #include <asm/io.h>
38: #include <asm/system.h>
39: #include <asm/byteorder.h>
40: #include <asm/uaccess.h>
41:
42: #include <linux/netdevice.h>
43: #include "ax8390.h"
44:
45: #include <pcmcia/version.h>
46: #include <pcmcia/cs_types.h>
47: #include <pcmcia/cs.h>
48: #include <pcmcia/cistpl.h>
49: #include <pcmcia/ciscode.h>
50: #include <pcmcia/ds.h>
51: #include <pcmcia/cisreg.h>
52:
53: #define AXNET_CMD 0x00
54: #define AXNET_DATAPORT 0x10 /* NatSemi-defined port window offset. */
55: #define AXNET_RESET 0x1f /* Issue a read to reset, a write to clear. */
56: #define AXNET_MII_EEP 0x14 /* Offset of MII access port */
57: #define AXNET_TEST 0x15 /* Offset of TEST Register port */
58: #define AXNET_GPIO 0x17 /* Offset of General Purpose Register Port */
59:
60: #define AXNET_START_PG 0x40 /* First page of TX buffer */
61: #define AXNET_STOP_PG 0x80 /* Last page +1 of RX ring */
62:
63: #define AXNET_RDC_TIMEOUT 0x02 /* Max wait in jiffies for Tx RDC */
64:
65: #define IS_AX88190 0x0001
66: #define IS_AX88790 0x0002
67:
68: /*====================================================================*/
69:
70: /* Module parameters */
71:
72: MODULE_AUTHOR("David Hinds <[email protected]>");
73: MODULE_DESCRIPTION("Asix AX88190 PCMCIA ethernet driver");
74: MODULE_LICENSE("GPL");
75:
76: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
77:
78: /* Bit map of interrupts to choose from */
79: INT_MODULE_PARM(irq_mask, 0xdeb8);
80: static int irq_list[4] = { -1 };
81: MODULE_PARM(irq_list, "1-4i");
82:
83: #ifdef PCMCIA_DEBUG
84: INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
85: #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
86: static char *version =
87: "axnet_cs.c 1.31 2003/08/25 15:57:40 (David Hinds)";
88: #else
89: #define DEBUG(n, args...)
90: #endif
91:
92: /*====================================================================*/
93:
94: static void axnet_config(dev_link_t *link);
95: static void axnet_release(u_long arg);
96: static int axnet_event(event_t event, int priority,
97: event_callback_args_t *args);
98: static int axnet_open(struct net_device *dev);
99: static int axnet_close(struct net_device *dev);
100: static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
101: static void ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs);
102: static void ei_watchdog(u_long arg);
103: static void axnet_reset_8390(struct net_device *dev);
104:
105: static int mdio_read(ioaddr_t addr, int phy_id, int loc);
106: static void mdio_write(ioaddr_t addr, int phy_id, int loc, int value);
107:
108: static void get_8390_hdr(struct net_device *,
109: struct e8390_pkt_hdr *, int);
110: static void block_input(struct net_device *dev, int count,
111: struct sk_buff *skb, int ring_offset);
112: static void block_output(struct net_device *dev, int count,
113: const u_char *buf, const int start_page);
114:
115: static dev_link_t *axnet_attach(void);
116: static void axnet_detach(dev_link_t *);
117:
118: static dev_info_t dev_info = "axnet_cs";
119: static dev_link_t *dev_list;
120:
121: static int axdev_init(struct net_device *dev);
122: static void AX88190_init(struct net_device *dev, int startp);
123: static int ax_open(struct net_device *dev);
124: static int ax_close(struct net_device *dev);
125: static void ax_interrupt(int irq, void *dev_id, struct pt_regs *regs);
126:
127: /*====================================================================*/
128:
129: typedef struct axnet_dev_t {
130: struct net_device dev; /* so &dev == &axnet_dev_t */
131: dev_link_t link;
132: dev_node_t node;
133: caddr_t base;
134: struct timer_list watchdog;
135: int stale, fast_poll;
136: u_short link_status;
137: u_char duplex_flag;
138: int phy_id;
139: int flags;
140: } axnet_dev_t;
141:
142: /*======================================================================
143:
144: This bit of code is used to avoid unregistering network devices
145: at inappropriate times. 2.2 and later kernels are fairly picky
146: about when this can happen.
147:
148: ======================================================================*/
149:
150: static void flush_stale_links(void)
151: {
152: dev_link_t *link, *next;
153: for (link = dev_list; link; link = next) {
154: next = link->next;
155: if (link->state & DEV_STALE_LINK)
156: axnet_detach(link);
157: }
158: }
159:
160: /*====================================================================*/
161:
162: static void cs_error(client_handle_t handle, int func, int ret)
163: {
164: error_info_t err = { func, ret };
165: CardServices(ReportError, handle, &err);
166: }
167:
168: /*======================================================================
169:
170: We never need to do anything when a axnet device is "initialized"
171: by the net software, because we only register already-found cards.
172:
173: ======================================================================*/
174:
175: static int axnet_init(struct net_device *dev)
176: {
177: return 0;
178: }
179:
180: /*======================================================================
181:
182: axnet_attach() creates an "instance" of the driver, allocating
183: local data structures for one device. The device is registered
184: with Card Services.
185:
186: ======================================================================*/
187:
188: static dev_link_t *axnet_attach(void)
189: {
190: axnet_dev_t *info;
191: dev_link_t *link;
192: struct net_device *dev;
193: client_reg_t client_reg;
194: int i, ret;
195:
196: DEBUG(0, "axnet_attach()\n");
197: flush_stale_links();
198:
199: /* Create new ethernet device */
200: info = kmalloc(sizeof(*info), GFP_KERNEL);
201: if (!info) return NULL;
202: memset(info, 0, sizeof(*info));
203: link = &info->link; dev = &info->dev;
204: link->priv = info;
205:
206: init_timer(&link->release);
207: link->release.function = &axnet_release;
208: link->release.data = (u_long)link;
209: link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
210: link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
211: if (irq_list[0] == -1)
212: link->irq.IRQInfo2 = irq_mask;
213: else
214: for (i = 0; i < 4; i++)
215: link->irq.IRQInfo2 |= 1 << irq_list[i];
216: link->conf.Attributes = CONF_ENABLE_IRQ;
217: link->conf.IntType = INT_MEMORY_AND_IO;
218:
219: axdev_init(dev);
220: init_dev_name(dev, info->node);
221: dev->init = &axnet_init;
222: dev->open = &axnet_open;
223: dev->stop = &axnet_close;
224: dev->do_ioctl = &axnet_ioctl;
225:
226: /* Register with Card Services */
227: link->next = dev_list;
228: dev_list = link;
229: client_reg.dev_info = &dev_info;
230: client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
231: client_reg.EventMask =
232: CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
233: CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
234: CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
235: client_reg.event_handler = &axnet_event;
236: client_reg.Version = 0x0210;
237: client_reg.event_callback_args.client_data = link;
238: ret = CardServices(RegisterClient, &link->handle, &client_reg);
239: if (ret != CS_SUCCESS) {
240: cs_error(link->handle, RegisterClient, ret);
241: axnet_detach(link);
242: return NULL;
243: }
244:
245: return link;
246: } /* axnet_attach */
247:
248: /*======================================================================
249:
250: This deletes a driver "instance". The device is de-registered
251: with Card Services. If it has been released, all local data
252: structures are freed. Otherwise, the structures will be freed
253: when the device is released.
254:
255: ======================================================================*/
256:
257: static void axnet_detach(dev_link_t *link)
258: {
259: axnet_dev_t *info = link->priv;
260: dev_link_t **linkp;
261:
262: DEBUG(0, "axnet_detach(0x%p)\n", link);
263:
264: /* Locate device structure */
265: for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
266: if (*linkp == link) break;
267: if (*linkp == NULL)
268: return;
269:
270: del_timer(&link->release);
271: if (link->state & DEV_CONFIG) {
272: axnet_release((u_long)link);
273: if (link->state & DEV_STALE_CONFIG) {
274: link->state |= DEV_STALE_LINK;
275: return;
276: }
277: }
278:
279: if (link->handle)
280: CardServices(DeregisterClient, link->handle);
281:
282: /* Unlink device structure, free bits */
283: *linkp = link->next;
284: if (link->dev)
285: unregister_netdev(&info->dev);
286: kfree(info);
287:
288: } /* axnet_detach */
289:
290: /*======================================================================
291:
292: This probes for a card's hardware address by reading the PROM.
293:
294: ======================================================================*/
295:
296: static int get_prom(dev_link_t *link)
297: {
298: struct net_device *dev = link->priv;
299: ioaddr_t ioaddr = dev->base_addr;
300: int i, j;
301:
302: /* This is based on drivers/net/ne.c */
303: struct {
304: u_char value, offset;
305: } program_seq[] = {
306: {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
307: {0x01, EN0_DCFG}, /* Set word-wide access. */
308: {0x00, EN0_RCNTLO}, /* Clear the count regs. */
309: {0x00, EN0_RCNTHI},
310: {0x00, EN0_IMR}, /* Mask completion irq. */
311: {0xFF, EN0_ISR},
312: {E8390_RXOFF|0x40, EN0_RXCR}, /* 0x60 Set to monitor */
313: {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
314: {0x10, EN0_RCNTLO},
315: {0x00, EN0_RCNTHI},
316: {0x00, EN0_RSARLO}, /* DMA starting at 0x0400. */
317: {0x04, EN0_RSARHI},
318: {E8390_RREAD+E8390_START, E8390_CMD},
319: };
320:
321: /* Not much of a test, but the alternatives are messy */
322: if (link->conf.ConfigBase != 0x03c0)
323: return 0;
324:
325: axnet_reset_8390(dev);
326: mdelay(10);
327:
328: for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
329: outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
330:
331: for (i = 0; i < 6; i += 2) {
332: j = inw(ioaddr + AXNET_DATAPORT);
333: dev->dev_addr[i] = j & 0xff;
334: dev->dev_addr[i+1] = j >> 8;
335: }
336: return 1;
337: } /* get_prom */
338:
339: /*======================================================================
340:
341: axnet_config() is scheduled to run after a CARD_INSERTION event
342: is received, to configure the PCMCIA socket, and to make the
343: ethernet device available to the system.
344:
345: ======================================================================*/
346:
347: #define CS_CHECK(fn, args...) \
348: while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
349:
350: #define CFG_CHECK(fn, args...) \
351: if (CardServices(fn, args) != 0) goto next_entry
352:
353: static int try_io_port(dev_link_t *link)
354: {
355: int j, ret;
356: if (link->io.NumPorts1 == 32) {
357: link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
358: if (link->io.NumPorts2 > 0) {
359: /* for master/slave multifunction cards */
360: link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
361: link->irq.Attributes =
362: IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
363: }
364: } else {
365: /* This should be two 16-port windows */
366: link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
367: link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
368: }
369: if (link->io.BasePort1 == 0) {
370: link->io.IOAddrLines = 16;
371: for (j = 0; j < 0x400; j += 0x20) {
372: link->io.BasePort1 = j ^ 0x300;
373: link->io.BasePort2 = (j ^ 0x300) + 0x10;
374: ret = CardServices(RequestIO, link->handle, &link->io);
375: if (ret == CS_SUCCESS) return ret;
376: }
377: return ret;
378: } else {
379: return CardServices(RequestIO, link->handle, &link->io);
380: }
381: }
382:
383: static void axnet_config(dev_link_t *link)
384: {
385: client_handle_t handle = link->handle;
386: axnet_dev_t *info = link->priv;
387: struct net_device *dev = &info->dev;
388: tuple_t tuple;
389: cisparse_t parse;
390: int i, j, last_ret, last_fn;
391: u_short buf[64];
392: config_info_t conf;
393:
394: DEBUG(0, "axnet_config(0x%p)\n", link);
395:
396: tuple.Attributes = 0;
397: tuple.TupleData = (cisdata_t *)buf;
398: tuple.TupleDataMax = sizeof(buf);
399: tuple.TupleOffset = 0;
400: tuple.DesiredTuple = CISTPL_CONFIG;
401: CS_CHECK(GetFirstTuple, handle, &tuple);
402: CS_CHECK(GetTupleData, handle, &tuple);
403: CS_CHECK(ParseTuple, handle, &tuple, &parse);
404: link->conf.ConfigBase = parse.config.base;
405: /* don't trust the CIS on this; Linksys got it wrong */
406: link->conf.Present = 0x63;
407:
408: /* Configure card */
409: link->state |= DEV_CONFIG;
410:
411: /* Look up current Vcc */
412: CS_CHECK(GetConfigurationInfo, handle, &conf);
413: link->conf.Vcc = conf.Vcc;
414:
415: tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
416: tuple.Attributes = 0;
417: CS_CHECK(GetFirstTuple, handle, &tuple);
418: while (last_ret == CS_SUCCESS) {
419: cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
420: cistpl_io_t *io = &(parse.cftable_entry.io);
421:
422: CFG_CHECK(GetTupleData, handle, &tuple);
423: CFG_CHECK(ParseTuple, handle, &tuple, &parse);
424: if ((cfg->index == 0) || (cfg->io.nwin == 0))
425: goto next_entry;
426:
427: link->conf.ConfigIndex = 0x05;
428: /* For multifunction cards, by convention, we configure the
429: network function with window 0, and serial with window 1 */
430: if (io->nwin > 1) {
431: i = (io->win[1].len > io->win[0].len);
432: link->io.BasePort2 = io->win[1-i].base;
433: link->io.NumPorts2 = io->win[1-i].len;
434: } else {
435: i = link->io.NumPorts2 = 0;
436: }
437: link->io.BasePort1 = io->win[i].base;
438: link->io.NumPorts1 = io->win[i].len;
439: link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
440: if (link->io.NumPorts1 + link->io.NumPorts2 >= 32) {
441: last_ret = try_io_port(link);
442: if (last_ret == CS_SUCCESS) break;
443: }
444: next_entry:
445: last_ret = CardServices(GetNextTuple, handle, &tuple);
446: }
447: if (last_ret != CS_SUCCESS) {
448: cs_error(handle, RequestIO, last_ret);
449: goto failed;
450: }
451:
452: CS_CHECK(RequestIRQ, handle, &link->irq);
453:
454: if (link->io.NumPorts2 == 8) {
455: link->conf.Attributes |= CONF_ENABLE_SPKR;
456: link->conf.Status = CCSR_AUDIO_ENA;
457: }
458:
459: CS_CHECK(RequestConfiguration, handle, &link->conf);
460: dev->irq = link->irq.AssignedIRQ;
461: dev->base_addr = link->io.BasePort1;
462: if (register_netdev(dev) != 0) {
463: printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
464: goto failed;
465: }
466:
467: if (!get_prom(link)) {
468: printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
469: printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n");
470: unregister_netdev(dev);
471: goto failed;
472: }
473:
474: ei_status.name = "AX88190";
475: ei_status.word16 = 1;
476: ei_status.tx_start_page = AXNET_START_PG;
477: ei_status.rx_start_page = AXNET_START_PG + TX_PAGES;
478: ei_status.stop_page = AXNET_STOP_PG;
479: ei_status.reset_8390 = &axnet_reset_8390;
480: ei_status.get_8390_hdr = &get_8390_hdr;
481: ei_status.block_input = &block_input;
482: ei_status.block_output = &block_output;
483:
484: copy_dev_name(info->node, dev);
485: link->dev = &info->node;
486:
487: if (inb(dev->base_addr + AXNET_TEST) != 0)
488: info->flags |= IS_AX88790;
489: else
490: info->flags |= IS_AX88190;
491:
492: printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, hw_addr ",
493: dev->name, ((info->flags & IS_AX88790) ? 7 : 1),
494: dev->base_addr, dev->irq);
495: for (i = 0; i < 6; i++)
496: printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
497:
498: if (info->flags & IS_AX88790)
499: outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */
500:
501: for (i = 0; i < 32; i++) {
502: j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
503: if ((j != 0) && (j != 0xffff)) break;
504: }
505:
506:
507: /* Maybe PHY is in power down mode. (PPD_SET = 1)
508: Bit 2 of CCSR is active low. */
509: if (i == 32) {
510: conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
511: CardServices(AccessConfigurationRegister, link->handle, ®);
512: for (i = 0; i < 32; i++) {
513: j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
514: if ((j != 0) && (j != 0xffff)) break;
515: }
516: }
517:
518: info->phy_id = (i < 32) ? i : -1;
519: if (i < 32) {
520: DEBUG(0, " MII transceiver at index %d, status %x.\n", i, j);
521: } else {
522: printk(KERN_NOTICE " No MII transceivers found!\n");
523: }
524:
525: link->state &= ~DEV_CONFIG_PENDING;
526: return;
527:
528: cs_failed:
529: cs_error(link->handle, last_fn, last_ret);
530: failed:
531: axnet_release((u_long)link);
532: link->state &= ~DEV_CONFIG_PENDING;
533: return;
534: } /* axnet_config */
535:
536: /*======================================================================
537:
538: After a card is removed, axnet_release() will unregister the net
539: device, and release the PCMCIA configuration. If the device is
540: still open, this will be postponed until it is closed.
541:
542: ======================================================================*/
543:
544: static void axnet_release(u_long arg)
545: {
546: dev_link_t *link = (dev_link_t *)arg;
547:
548: DEBUG(0, "axnet_release(0x%p)\n", link);
549:
550: if (link->open) {
551: DEBUG(1, "axnet_cs: release postponed, '%s' still open\n",
552: ((axnet_dev_t *)(link->priv))->node.dev_name);
553: link->state |= DEV_STALE_CONFIG;
554: return;
555: }
556:
557: CardServices(ReleaseConfiguration, link->handle);
558: CardServices(ReleaseIO, link->handle, &link->io);
559: CardServices(ReleaseIRQ, link->handle, &link->irq);
560:
561: link->state &= ~DEV_CONFIG;
562:
563: } /* axnet_release */
564:
565: /*======================================================================
566:
567: The card status event handler. Mostly, this schedules other
568: stuff to run after an event is received. A CARD_REMOVAL event
569: also sets some flags to discourage the net drivers from trying
570: to talk to the card any more.
571:
572: ======================================================================*/
573:
574: static int axnet_event(event_t event, int priority,
575: event_callback_args_t *args)
576: {
577: dev_link_t *link = args->client_data;
578: axnet_dev_t *info = link->priv;
579:
580: DEBUG(2, "axnet_event(0x%06x)\n", event);
581:
582: switch (event) {
583: case CS_EVENT_CARD_REMOVAL:
584: link->state &= ~DEV_PRESENT;
585: if (link->state & DEV_CONFIG) {
586: netif_device_detach(&info->dev);
587: mod_timer(&link->release, jiffies + HZ/20);
588: }
589: break;
590: case CS_EVENT_CARD_INSERTION:
591: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
592: axnet_config(link);
593: break;
594: case CS_EVENT_PM_SUSPEND:
595: link->state |= DEV_SUSPEND;
596: /* Fall through... */
597: case CS_EVENT_RESET_PHYSICAL:
598: if (link->state & DEV_CONFIG) {
599: if (link->open)
600: netif_device_detach(&info->dev);
601: CardServices(ReleaseConfiguration, link->handle);
602: }
603: break;
604: case CS_EVENT_PM_RESUME:
605: link->state &= ~DEV_SUSPEND;
606: /* Fall through... */
607: case CS_EVENT_CARD_RESET:
608: if (link->state & DEV_CONFIG) {
609: CardServices(RequestConfiguration, link->handle, &link->conf);
610: if (link->open) {
611: axnet_reset_8390(&info->dev);
612: AX88190_init(&info->dev, 1);
613: netif_device_attach(&info->dev);
614: }
615: }
616: break;
617: }
618: return 0;
619: } /* axnet_event */
620:
621: /*======================================================================
622:
623: MII interface support
624:
625: ======================================================================*/
626:
627: #define MDIO_SHIFT_CLK 0x01
628: #define MDIO_DATA_WRITE0 0x00
629: #define MDIO_DATA_WRITE1 0x08
630: #define MDIO_DATA_READ 0x04
631: #define MDIO_MASK 0x0f
632: #define MDIO_ENB_IN 0x02
633:
634: static void mdio_sync(ioaddr_t addr)
635: {
636: int bits;
637: for (bits = 0; bits < 32; bits++) {
638: outb_p(MDIO_DATA_WRITE1, addr);
639: outb_p(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
640: }
641: }
642:
643: static int mdio_read(ioaddr_t addr, int phy_id, int loc)
644: {
645: u_int cmd = (0xf6<<10)|(phy_id<<5)|loc;
646: int i, retval = 0;
647:
648: mdio_sync(addr);
649: for (i = 14; i >= 0; i--) {
650: int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
651: outb_p(dat, addr);
652: outb_p(dat | MDIO_SHIFT_CLK, addr);
653: }
654: for (i = 19; i > 0; i--) {
655: outb_p(MDIO_ENB_IN, addr);
656: retval = (retval << 1) | ((inb_p(addr) & MDIO_DATA_READ) != 0);
657: outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
658: }
659: return (retval>>1) & 0xffff;
660: }
661:
662: static void mdio_write(ioaddr_t addr, int phy_id, int loc, int value)
663: {
664: u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
665: int i;
666:
667: mdio_sync(addr);
668: for (i = 31; i >= 0; i--) {
669: int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
670: outb_p(dat, addr);
671: outb_p(dat | MDIO_SHIFT_CLK, addr);
672: }
673: for (i = 1; i >= 0; i--) {
674: outb_p(MDIO_ENB_IN, addr);
675: outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
676: }
677: }
678:
679: /*====================================================================*/
680:
681: static int axnet_open(struct net_device *dev)
682: {
683: axnet_dev_t *info = (axnet_dev_t *)dev;
684: dev_link_t *link = &info->link;
685:
686: DEBUG(2, "axnet_open('%s')\n", dev->name);
687:
688: if (!DEV_OK(link))
689: return -ENODEV;
690:
691: link->open++;
692: MOD_INC_USE_COUNT;
693:
694: request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, dev_info, dev);
695:
696: info->link_status = 0x00;
697: info->watchdog.function = &ei_watchdog;
698: info->watchdog.data = (u_long)info;
699: info->watchdog.expires = jiffies + HZ;
700: add_timer(&info->watchdog);
701:
702: return ax_open(dev);
703: } /* axnet_open */
704:
705: /*====================================================================*/
706:
707: static int axnet_close(struct net_device *dev)
708: {
709: axnet_dev_t *info = (axnet_dev_t *)dev;
710: dev_link_t *link = &info->link;
711:
712: DEBUG(2, "axnet_close('%s')\n", dev->name);
713:
714: ax_close(dev);
715: free_irq(dev->irq, dev);
716:
717: link->open--;
718: netif_stop_queue(dev);
719: netif_mark_down(dev);
720: del_timer(&info->watchdog);
721: if (link->state & DEV_STALE_CONFIG)
722: mod_timer(&link->release, jiffies + HZ/20);
723:
724: MOD_DEC_USE_COUNT;
725:
726: return 0;
727: } /* axnet_close */
728:
729: /*======================================================================
730:
731: Hard reset the card. This used to pause for the same period that
732: a 8390 reset command required, but that shouldn't be necessary.
733:
734: ======================================================================*/
735:
736: static void axnet_reset_8390(struct net_device *dev)
737: {
738: ioaddr_t nic_base = dev->base_addr;
739: int i;
740:
741: ei_status.txing = ei_status.dmaing = 0;
742:
743: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD);
744:
745: outb(inb(nic_base + AXNET_RESET), nic_base + AXNET_RESET);
746:
747: for (i = 0; i < 100; i++) {
748: if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0)
749: break;
750: udelay(100);
751: }
752: outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
753:
754: if (i == 100)
755: printk(KERN_ERR "%s: axnet_reset_8390() did not complete.\n",
756: dev->name);
757:
758: } /* axnet_reset_8390 */
759:
760: /*====================================================================*/
761:
762: static void ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs)
763: {
764: axnet_dev_t *info = dev_id;
765: info->stale = 0;
766: ax_interrupt(irq, dev_id, regs);
767: }
768:
769: static void ei_watchdog(u_long arg)
770: {
771: axnet_dev_t *info = (axnet_dev_t *)(arg);
772: struct net_device *dev = &info->dev;
773: ioaddr_t nic_base = dev->base_addr;
774: ioaddr_t mii_addr = nic_base + AXNET_MII_EEP;
775: u_short link;
776:
777: if (!netif_device_present(dev)) goto reschedule;
778:
779: /* Check for pending interrupt with expired latency timer: with
780: this, we can limp along even if the interrupt is blocked */
781: if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
782: if (!info->fast_poll)
783: printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
784: ei_irq_wrapper(dev->irq, dev, NULL);
785: info->fast_poll = HZ;
786: }
787: if (info->fast_poll) {
788: info->fast_poll--;
789: info->watchdog.expires = jiffies + 1;
790: add_timer(&info->watchdog);
791: return;
792: }
793:
794: if (info->phy_id < 0)
795: goto reschedule;
796: link = mdio_read(mii_addr, info->phy_id, 1);
797: if (!link || (link == 0xffff)) {
798: printk(KERN_INFO "%s: MII is missing!\n", dev->name);
799: info->phy_id = -1;
800: goto reschedule;
801: }
802:
803: link &= 0x0004;
804: if (link != info->link_status) {
805: u_short p = mdio_read(mii_addr, info->phy_id, 5);
806: printk(KERN_INFO "%s: %s link beat\n", dev->name,
807: (link) ? "found" : "lost");
808: if (link) {
809: info->duplex_flag = (p & 0x0140) ? 0x80 : 0x00;
810: if (p)
811: printk(KERN_INFO "%s: autonegotiation complete: "
812: "%sbaseT-%cD selected\n", dev->name,
813: ((p & 0x0180) ? "100" : "10"),
814: ((p & 0x0140) ? 'F' : 'H'));
815: else
816: printk(KERN_INFO "%s: link partner did not autonegotiate\n",
817: dev->name);
818: AX88190_init(dev, 1);
819: }
820: info->link_status = link;
821: }
822:
823: reschedule:
824: info->watchdog.expires = jiffies + HZ;
825: add_timer(&info->watchdog);
826: }
827:
828: /*====================================================================*/
829:
830: static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
831: {
832: axnet_dev_t *info = (axnet_dev_t *)dev;
833: u16 *data = (u16 *)&rq->ifr_data;
834: ioaddr_t mii_addr = dev->base_addr + AXNET_MII_EEP;
835: switch (cmd) {
836: case SIOCDEVPRIVATE:
837: data[0] = info->phy_id;
838: case SIOCDEVPRIVATE+1:
839: data[3] = mdio_read(mii_addr, data[0], data[1] & 0x1f);
840: return 0;
841: case SIOCDEVPRIVATE+2:
842: if (!capable(CAP_NET_ADMIN))
843: return -EPERM;
844: mdio_write(mii_addr, data[0], data[1] & 0x1f, data[2]);
845: return 0;
846: }
847: return -EOPNOTSUPP;
848: }
849:
850: /*====================================================================*/
851:
852: static void get_8390_hdr(struct net_device *dev,
853: struct e8390_pkt_hdr *hdr,
854: int ring_page)
855: {
856: ioaddr_t nic_base = dev->base_addr;
857:
858: outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
859: outb_p(ring_page, nic_base + EN0_RSARHI);
860: outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
861:
862: insw(nic_base + AXNET_DATAPORT, hdr,
863: sizeof(struct e8390_pkt_hdr)>>1);
864: /* Fix for big endian systems */
865: hdr->count = le16_to_cpu(hdr->count);
866:
867: }
868:
869: /*====================================================================*/
870:
871: static void block_input(struct net_device *dev, int count,
872: struct sk_buff *skb, int ring_offset)
873: {
874: ioaddr_t nic_base = dev->base_addr;
875: int xfer_count = count;
876: char *buf = skb->data;
877:
878: #ifdef PCMCIA_DEBUG
879: if ((ei_debug > 4) && (count != 4))
880: printk(KERN_DEBUG "%s: [bi=%d]\n", dev->name, count+4);
881: #endif
882: outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
883: outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
884: outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
885:
886: insw(nic_base + AXNET_DATAPORT,buf,count>>1);
887: if (count & 0x01)
888: buf[count-1] = inb(nic_base + AXNET_DATAPORT), xfer_count++;
889:
890: }
891:
892: /*====================================================================*/
893:
894: static void block_output(struct net_device *dev, int count,
895: const u_char *buf, const int start_page)
896: {
897: ioaddr_t nic_base = dev->base_addr;
898:
899: #ifdef PCMCIA_DEBUG
900: if (ei_debug > 4)
901: printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
902: #endif
903:
904: /* Round the count up for word writes. Do we need to do this?
905: What effect will an odd byte count have on the 8390?
906: I should check someday. */
907: if (count & 0x01)
908: count++;
909:
910: outb_p(0x00, nic_base + EN0_RSARLO);
911: outb_p(start_page, nic_base + EN0_RSARHI);
912: outb_p(E8390_RWRITE+E8390_START, nic_base + AXNET_CMD);
913: outsw(nic_base + AXNET_DATAPORT, buf, count>>1);
914: }
915:
916: /*====================================================================*/
917:
918: static int __init init_axnet_cs(void)
919: {
920: servinfo_t serv;
921: DEBUG(0, "%s\n", version);
922: CardServices(GetCardServicesInfo, &serv);
923: if (serv.Revision != CS_RELEASE_CODE) {
924: printk(KERN_NOTICE "axnet_cs: Card Services release "
925: "does not match!\n");
926: return -EINVAL;
927: }
928: register_pccard_driver(&dev_info, &axnet_attach, &axnet_detach);
929: return 0;
930: }
931:
932: static void __exit exit_axnet_cs(void)
933: {
934: DEBUG(0, "axnet_cs: unloading\n");
935: unregister_pccard_driver(&dev_info);
936: while (dev_list != NULL)
937: axnet_detach(dev_list);
938: }
939:
940: module_init(init_axnet_cs);
941: module_exit(exit_axnet_cs);
942:
943: /*====================================================================*/
944:
945: /* 8390.c: A general NS8390 ethernet driver core for linux. */
946: /*
947: Written 1992-94 by Donald Becker.
948:
949: Copyright 1993 United States Government as represented by the
950: Director, National Security Agency.
951:
952: This software may be used and distributed according to the terms
953: of the GNU General Public License, incorporated herein by reference.
954:
955: The author may be reached as [email protected], or C/O
956: Scyld Computing Corporation
957: 410 Severn Ave., Suite 210
958: Annapolis MD 21403
959:
960: This is the chip-specific code for many 8390-based ethernet adaptors.
961: This is not a complete driver, it must be combined with board-specific
962: code such as ne.c, wd.c, 3c503.c, etc.
963:
964: Seeing how at least eight drivers use this code, (not counting the
965: PCMCIA ones either) it is easy to break some card by what seems like
966: a simple innocent change. Please contact me or Donald if you think
967: you have found something that needs changing. -- PG
968:
969: Changelog:
970:
971: Paul Gortmaker : remove set_bit lock, other cleanups.
972: Paul Gortmaker : add ei_get_8390_hdr() so we can pass skb's to
973: ei_block_input() for eth_io_copy_and_sum().
974: Paul Gortmaker : exchange static int ei_pingpong for a #define,
975: also add better Tx error handling.
976: Paul Gortmaker : rewrite Rx overrun handling as per NS specs.
977: Alexey Kuznetsov : use the 8390's six bit hash multicast filter.
978: Paul Gortmaker : tweak ANK's above multicast changes a bit.
979: Paul Gortmaker : update packet statistics for v2.1.x
980: Alan Cox : support arbitary stupid port mappings on the
981: 68K Macintosh. Support >16bit I/O spaces
982: Paul Gortmaker : add kmod support for auto-loading of the 8390
983: module by all drivers that require it.
984: Alan Cox : Spinlocking work, added 'BUG_83C690'
985: Paul Gortmaker : Separate out Tx timeout code from Tx path.
986:
987: Sources:
988: The National Semiconductor LAN Databook, and the 3Com 3c503 databook.
989:
990: */
991:
992: static const char *version_8390 =
993: "8390.c:v1.10cvs 9/23/94 Donald Becker ([email protected])\n";
994:
995: #include <asm/uaccess.h>
996: #include <asm/bitops.h>
997: #include <asm/irq.h>
998: #include <linux/fcntl.h>
999: #include <linux/in.h>
1000: #include <linux/interrupt.h>
1001:
1002: #include <linux/etherdevice.h>
1003:
1004: #define BUG_83C690
1005:
1006: /* These are the operational function interfaces to board-specific
1007: routines.
1008: void reset_8390(struct net_device *dev)
1009: Resets the board associated with DEV, including a hardware reset of
1010: the 8390. This is only called when there is a transmit timeout, and
1011: it is always followed by 8390_init().
1012: void block_output(struct net_device *dev, int count, const unsigned char *buf,
1013: int start_page)
1014: Write the COUNT bytes of BUF to the packet buffer at START_PAGE. The
1015: "page" value uses the 8390's 256-byte pages.
1016: void get_8390_hdr(struct net_device *dev, struct e8390_hdr *hdr, int ring_page)
1017: Read the 4 byte, page aligned 8390 header. *If* there is a
1018: subsequent read, it will be of the rest of the packet.
1019: void block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
1020: Read COUNT bytes from the packet buffer into the skb data area. Start
1021: reading from RING_OFFSET, the address as the 8390 sees it. This will always
1022: follow the read of the 8390 header.
1023: */
1024: #define ei_reset_8390 (ei_local->reset_8390)
1025: #define ei_block_output (ei_local->block_output)
1026: #define ei_block_input (ei_local->block_input)
1027: #define ei_get_8390_hdr (ei_local->get_8390_hdr)
1028:
1029: /* use 0 for production, 1 for verification, >2 for debug */
1030: #ifndef ei_debug
1031: int ei_debug = 1;
1032: #endif
1033:
1034: /* Index to functions. */
1035: static void ei_tx_intr(struct net_device *dev);
1036: static void ei_tx_err(struct net_device *dev);
1037: static void ei_tx_timeout(struct net_device *dev);
1038: static void ei_receive(struct net_device *dev);
1039: static void ei_rx_overrun(struct net_device *dev);
1040:
1041: /* Routines generic to NS8390-based boards. */
1042: static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1043: int start_page);
1044: static void set_multicast_list(struct net_device *dev);
1045: static void do_set_multicast_list(struct net_device *dev);
1046:
1047: /*
1048: * SMP and the 8390 setup.
1049: *
1050: * The 8390 isnt exactly designed to be multithreaded on RX/TX. There is
1051: * a page register that controls bank and packet buffer access. We guard
1052: * this with ei_local->page_lock. Nobody should assume or set the page other
1053: * than zero when the lock is not held. Lock holders must restore page 0
1054: * before unlocking. Even pure readers must take the lock to protect in
1055: * page 0.
1056: *
1057: * To make life difficult the chip can also be very slow. We therefore can't
1058: * just use spinlocks. For the longer lockups we disable the irq the device
1059: * sits on and hold the lock. We must hold the lock because there is a dual
1060: * processor case other than interrupts (get stats/set multicast list in
1061: * parallel with each other and transmit).
1062: *
1063: * Note: in theory we can just disable the irq on the card _but_ there is
1064: * a latency on SMP irq delivery. So we can easily go "disable irq" "sync irqs"
1065: * enter lock, take the queued irq. So we waddle instead of flying.
1066: *
1067: * Finally by special arrangement for the purpose of being generally
1068: * annoying the transmit function is called bh atomic. That places
1069: * restrictions on the user context callers as disable_irq won't save
1070: * them.
1071: */
1072:
1073: /**
1074: * ax_open - Open/initialize the board.
1075: * @dev: network device to initialize
1076: *
1077: * This routine goes all-out, setting everything
1078: * up anew at each open, even though many of these registers should only
1079: * need to be set once at boot.
1080: */
1081: static int ax_open(struct net_device *dev)
1082: {
1083: unsigned long flags;
1084: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1085:
1086: /* This can't happen unless somebody forgot to call axdev_init(). */
1087: if (ei_local == NULL)
1088: {
1089: printk(KERN_EMERG "%s: ax_open passed a non-existent device!\n", dev->name);
1090: return -ENXIO;
1091: }
1092:
1093: #ifdef HAVE_TX_TIMEOUT
1094: /* The card I/O part of the driver (e.g. 3c503) can hook a Tx timeout
1095: wrapper that does e.g. media check & then calls ei_tx_timeout. */
1096: if (dev->tx_timeout == NULL)
1097: dev->tx_timeout = ei_tx_timeout;
1098: if (dev->watchdog_timeo <= 0)
1099: dev->watchdog_timeo = TX_TIMEOUT;
1100: #endif
1101:
1102: /*
1103: * Grab the page lock so we own the register set, then call
1104: * the init function.
1105: */
1106:
1107: spin_lock_irqsave(&ei_local->page_lock, flags);
1108: AX88190_init(dev, 1);
1109: /* Set the flag before we drop the lock, That way the IRQ arrives
1110: after its set and we get no silly warnings */
1111: netif_mark_up(dev);
1112: netif_start_queue(dev);
1113: spin_unlock_irqrestore(&ei_local->page_lock, flags);
1114: ei_local->irqlock = 0;
1115: return 0;
1116: }
1117:
1118: #define dev_lock(dev) (((struct ei_device *)(dev)->priv)->page_lock)
1119:
1120: /**
1121: * ax_close - shut down network device
1122: * @dev: network device to close
1123: *
1124: * Opposite of ax_open(). Only used when "ifconfig <devname> down" is done.
1125: */
1126: int ax_close(struct net_device *dev)
1127: {
1128: unsigned long flags;
1129:
1130: /*
1131: * Hold the page lock during close
1132: */
1133:
1134: spin_lock_irqsave(&dev_lock(dev), flags);
1135: AX88190_init(dev, 0);
1136: spin_unlock_irqrestore(&dev_lock(dev), flags);
1137: netif_stop_queue(dev);
1138: return 0;
1139: }
1140:
1141: /**
1142: * ei_tx_timeout - handle transmit time out condition
1143: * @dev: network device which has apparently fallen asleep
1144: *
1145: * Called by kernel when device never acknowledges a transmit has
1146: * completed (or failed) - i.e. never posted a Tx related interrupt.
1147: */
1148:
1149: void ei_tx_timeout(struct net_device *dev)
1150: {
1151: long e8390_base = dev->base_addr;
1152: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1153: int txsr, isr, tickssofar = jiffies - dev->trans_start;
1154: unsigned long flags;
1155:
1156: ei_local->stat.tx_errors++;
1157:
1158: spin_lock_irqsave(&ei_local->page_lock, flags);
1159: txsr = inb(e8390_base+EN0_TSR);
1160: isr = inb(e8390_base+EN0_ISR);
1161: spin_unlock_irqrestore(&ei_local->page_lock, flags);
1162:
1163: printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
1164: dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
1165: (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
1166:
1167: if (!isr && !ei_local->stat.tx_packets)
1168: {
1169: /* The 8390 probably hasn't gotten on the cable yet. */
1170: ei_local->interface_num ^= 1; /* Try a different xcvr. */
1171: }
1172:
1173: /* Ugly but a reset can be slow, yet must be protected */
1174:
1175: disable_irq_nosync(dev->irq);
1176: spin_lock(&ei_local->page_lock);
1177:
1178: /* Try to restart the card. Perhaps the user has fixed something. */
1179: ei_reset_8390(dev);
1180: AX88190_init(dev, 1);
1181:
1182: spin_unlock(&ei_local->page_lock);
1183: enable_irq(dev->irq);
1184: netif_wake_queue(dev);
1185: }
1186:
1187: /**
1188: * ei_start_xmit - begin packet transmission
1189: * @skb: packet to be sent
1190: * @dev: network device to which packet is sent
1191: *
1192: * Sends a packet to an 8390 network device.
1193: */
1194:
1195: static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
1196: {
1197: long e8390_base = dev->base_addr;
1198: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1199: int length, send_length, output_page;
1200: unsigned long flags;
1201:
1202: tx_timeout_check(dev, ei_tx_timeout);
1203: skb_tx_check(dev, skb);
1204:
1205: length = skb->len;
1206:
1207: /* Mask interrupts from the ethercard.
1208: SMP: We have to grab the lock here otherwise the IRQ handler
1209: on another CPU can flip window and race the IRQ mask set. We end
1210: up trashing the mcast filter not disabling irqs if we dont lock */
1211:
1212: spin_lock_irqsave(&ei_local->page_lock, flags);
1213: outb_p(0x00, e8390_base + EN0_IMR);
1214: spin_unlock_irqrestore(&ei_local->page_lock, flags);
1215:
1216: /*
1217: * Slow phase with lock held.
1218: */
1219:
1220: disable_irq_nosync(dev->irq);
1221:
1222: spin_lock(&ei_local->page_lock);
1223:
1224: ei_local->irqlock = 1;
1225:
1226: send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
1227:
1228: /*
1229: * We have two Tx slots available for use. Find the first free
1230: * slot, and then perform some sanity checks. With two Tx bufs,
1231: * you get very close to transmitting back-to-back packets. With
1232: * only one Tx buf, the transmitter sits idle while you reload the
1233: * card, leaving a substantial gap between each transmitted packet.
1234: */
1235:
1236: if (ei_local->tx1 == 0)
1237: {
1238: output_page = ei_local->tx_start_page;
1239: ei_local->tx1 = send_length;
1240: if (ei_debug && ei_local->tx2 > 0)
1241: printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
1242: dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
1243: }
1244: else if (ei_local->tx2 == 0)
1245: {
1246: output_page = ei_local->tx_start_page + TX_1X_PAGES;
1247: ei_local->tx2 = send_length;
1248: if (ei_debug && ei_local->tx1 > 0)
1249: printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
1250: dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
1251: }
1252: else
1253: { /* We should never get here. */
1254: if (ei_debug)
1255: printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
1256: dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
1257: ei_local->irqlock = 0;
1258: netif_stop_queue(dev);
1259: outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1260: spin_unlock(&ei_local->page_lock);
1261: enable_irq(dev->irq);
1262: ei_local->stat.tx_errors++;
1263: return 1;
1264: }
1265:
1266: /*
1267: * Okay, now upload the packet and trigger a send if the transmitter
1268: * isn't already sending. If it is busy, the interrupt handler will
1269: * trigger the send later, upon receiving a Tx done interrupt.
1270: */
1271:
1272: ei_block_output(dev, length, skb->data, output_page);
1273: if (! ei_local->txing)
1274: {
1275: ei_local->txing = 1;
1276: NS8390_trigger_send(dev, send_length, output_page);
1277: dev->trans_start = jiffies;
1278: if (output_page == ei_local->tx_start_page)
1279: {
1280: ei_local->tx1 = -1;
1281: ei_local->lasttx = -1;
1282: }
1283: else
1284: {
1285: ei_local->tx2 = -1;
1286: ei_local->lasttx = -2;
1287: }
1288: }
1289: else ei_local->txqueue++;
1290:
1291: if (ei_local->tx1 && ei_local->tx2)
1292: netif_stop_queue(dev);
1293: else
1294: netif_start_queue(dev);
1295:
1296: /* Turn 8390 interrupts back on. */
1297: ei_local->irqlock = 0;
1298: outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1299:
1300: spin_unlock(&ei_local->page_lock);
1301: enable_irq(dev->irq);
1302:
1303: DEV_KFREE_SKB (skb);
1304: add_tx_bytes(&ei_local->stat, send_length);
1305:
1306: return 0;
1307: }
1308:
1309: /**
1310: * ax_interrupt - handle the interrupts from an 8390
1311: * @irq: interrupt number
1312: * @dev_id: a pointer to the net_device
1313: * @regs: unused
1314: *
1315: * Handle the ether interface interrupts. We pull packets from
1316: * the 8390 via the card specific functions and fire them at the networking
1317: * stack. We also handle transmit completions and wake the transmit path if
1318: * neccessary. We also update the counters and do other housekeeping as
1319: * needed.
1320: */
1321:
1322: static void ax_interrupt(int irq, void *dev_id, struct pt_regs * regs)
1323: {
1324: struct net_device *dev = dev_id;
1325: long e8390_base;
1326: int interrupts, nr_serviced = 0, i;
1327: struct ei_device *ei_local;
1328:
1329: if (dev == NULL)
1330: {
1331: printk ("net_interrupt(): irq %d for unknown device.\n", irq);
1332: return;
1333: }
1334:
1335: e8390_base = dev->base_addr;
1336: ei_local = (struct ei_device *) dev->priv;
1337:
1338: /*
1339: * Protect the irq test too.
1340: */
1341:
1342: spin_lock(&ei_local->page_lock);
1343:
1344: if (ei_local->irqlock)
1345: {
1346: #if 1 /* This might just be an interrupt for a PCI device sharing this line */
1347: /* The "irqlock" check is only for testing. */
1348: printk(ei_local->irqlock
1349: ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
1350: : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
1351: dev->name, inb_p(e8390_base + EN0_ISR),
1352: inb_p(e8390_base + EN0_IMR));
1353: #endif
1354: spin_unlock(&ei_local->page_lock);
1355: return;
1356: }
1357:
1358: if (ei_debug > 3)
1359: printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
1360: inb_p(e8390_base + EN0_ISR));
1361:
1362: outb_p(0x00, e8390_base + EN0_ISR);
1363: ei_local->irqlock = 1;
1364:
1365: /* !!Assumption!! -- we stay in page 0. Don't break this. */
1366: while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
1367: && ++nr_serviced < MAX_SERVICE)
1368: {
1369: if (!netif_running(dev) || (interrupts == 0xff)) {
1370: if (ei_debug > 1)
1371: printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
1372: outb_p(interrupts, e8390_base + EN0_ISR);
1373: interrupts = 0;
1374: break;
1375: }
1376: /* AX88190 bug fix. */
1377: outb_p(interrupts, e8390_base + EN0_ISR);
1378: for (i = 0; i < 10; i++) {
1379: if (!(inb(e8390_base + EN0_ISR) & interrupts))
1380: break;
1381: outb_p(0, e8390_base + EN0_ISR);
1382: outb_p(interrupts, e8390_base + EN0_ISR);
1383: }
1384: if (interrupts & ENISR_OVER)
1385: ei_rx_overrun(dev);
1386: else if (interrupts & (ENISR_RX+ENISR_RX_ERR))
1387: {
1388: /* Got a good (?) packet. */
1389: ei_receive(dev);
1390: }
1391: /* Push the next to-transmit packet through. */
1392: if (interrupts & ENISR_TX)
1393: ei_tx_intr(dev);
1394: else if (interrupts & ENISR_TX_ERR)
1395: ei_tx_err(dev);
1396:
1397: if (interrupts & ENISR_COUNTERS)
1398: {
1399: ei_local->stat.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0);
1400: ei_local->stat.rx_crc_errors += inb_p(e8390_base + EN0_COUNTER1);
1401: ei_local->stat.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2);
1402: }
1403: }
1404:
1405: if (interrupts && ei_debug)
1406: {
1407: if (nr_serviced >= MAX_SERVICE)
1408: {
1409: /* 0xFF is valid for a card removal */
1410: if(interrupts!=0xFF)
1411: printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
1412: dev->name, interrupts);
1413: outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
1414: } else {
1415: printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
1416: outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
1417: }
1418: }
1419:
1420: /* Turn 8390 interrupts back on. */
1421: ei_local->irqlock = 0;
1422: outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1423:
1424: spin_unlock(&ei_local->page_lock);
1425: return;
1426: }
1427:
1428: /**
1429: * ei_tx_err - handle transmitter error
1430: * @dev: network device which threw the exception
1431: *
1432: * A transmitter error has happened. Most likely excess collisions (which
1433: * is a fairly normal condition). If the error is one where the Tx will
1434: * have been aborted, we try and send another one right away, instead of
1435: * letting the failed packet sit and collect dust in the Tx buffer. This
1436: * is a much better solution as it avoids kernel based Tx timeouts, and
1437: * an unnecessary card reset.
1438: *
1439: * Called with lock held.
1440: */
1441:
1442: static void ei_tx_err(struct net_device *dev)
1443: {
1444: long e8390_base = dev->base_addr;
1445: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1446: unsigned char txsr = inb_p(e8390_base+EN0_TSR);
1447: unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
1448:
1449: #ifdef VERBOSE_ERROR_DUMP
1450: printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
1451: if (txsr & ENTSR_ABT)
1452: printk("excess-collisions ");
1453: if (txsr & ENTSR_ND)
1454: printk("non-deferral ");
1455: if (txsr & ENTSR_CRS)
1456: printk("lost-carrier ");
1457: if (txsr & ENTSR_FU)
1458: printk("FIFO-underrun ");
1459: if (txsr & ENTSR_CDH)
1460: printk("lost-heartbeat ");
1461: printk("\n");
1462: #endif
1463:
1464: if (tx_was_aborted)
1465: ei_tx_intr(dev);
1466: else
1467: {
1468: ei_local->stat.tx_errors++;
1469: if (txsr & ENTSR_CRS) ei_local->stat.tx_carrier_errors++;
1470: if (txsr & ENTSR_CDH) ei_local->stat.tx_heartbeat_errors++;
1471: if (txsr & ENTSR_OWC) ei_local->stat.tx_window_errors++;
1472: }
1473: }
1474:
1475: /**
1476: * ei_tx_intr - transmit interrupt handler
1477: * @dev: network device for which tx intr is handled
1478: *
1479: * We have finished a transmit: check for errors and then trigger the next
1480: * packet to be sent. Called with lock held.
1481: */
1482:
1483: static void ei_tx_intr(struct net_device *dev)
1484: {
1485: long e8390_base = dev->base_addr;
1486: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1487: int status = inb(e8390_base + EN0_TSR);
1488:
1489: /*
1490: * There are two Tx buffers, see which one finished, and trigger
1491: * the send of another one if it exists.
1492: */
1493: ei_local->txqueue--;
1494:
1495: if (ei_local->tx1 < 0)
1496: {
1497: if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
1498: printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
1499: ei_local->name, ei_local->lasttx, ei_local->tx1);
1500: ei_local->tx1 = 0;
1501: if (ei_local->tx2 > 0)
1502: {
1503: ei_local->txing = 1;
1504: NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
1505: dev->trans_start = jiffies;
1506: ei_local->tx2 = -1,
1507: ei_local->lasttx = 2;
1508: }
1509: else ei_local->lasttx = 20, ei_local->txing = 0;
1510: }
1511: else if (ei_local->tx2 < 0)
1512: {
1513: if (ei_local->lasttx != 2 && ei_local->lasttx != -2)
1514: printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
1515: ei_local->name, ei_local->lasttx, ei_local->tx2);
1516: ei_local->tx2 = 0;
1517: if (ei_local->tx1 > 0)
1518: {
1519: ei_local->txing = 1;
1520: NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
1521: dev->trans_start = jiffies;
1522: ei_local->tx1 = -1;
1523: ei_local->lasttx = 1;
1524: }
1525: else
1526: ei_local->lasttx = 10, ei_local->txing = 0;
1527: }
1528: // else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n",
1529: // dev->name, ei_local->lasttx);
1530:
1531: /* Minimize Tx latency: update the statistics after we restart TXing. */
1532: if (status & ENTSR_COL)
1533: ei_local->stat.collisions++;
1534: if (status & ENTSR_PTX)
1535: ei_local->stat.tx_packets++;
1536: else
1537: {
1538: ei_local->stat.tx_errors++;
1539: if (status & ENTSR_ABT)
1540: {
1541: ei_local->stat.tx_aborted_errors++;
1542: ei_local->stat.collisions += 16;
1543: }
1544: if (status & ENTSR_CRS)
1545: ei_local->stat.tx_carrier_errors++;
1546: if (status & ENTSR_FU)
1547: ei_local->stat.tx_fifo_errors++;
1548: if (status & ENTSR_CDH)
1549: ei_local->stat.tx_heartbeat_errors++;
1550: if (status & ENTSR_OWC)
1551: ei_local->stat.tx_window_errors++;
1552: }
1553: netif_wake_queue(dev);
1554: }
1555:
1556: /**
1557: * ei_receive - receive some packets
1558: * @dev: network device with which receive will be run
1559: *
1560: * We have a good packet(s), get it/them out of the buffers.
1561: * Called with lock held.
1562: */
1563:
1564: static void ei_receive(struct net_device *dev)
1565: {
1566: long e8390_base = dev->base_addr;
1567: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1568: unsigned char rxing_page, this_frame, next_frame;
1569: unsigned short current_offset;
1570: int rx_pkt_count = 0;
1571: struct e8390_pkt_hdr rx_frame;
1572:
1573: while (++rx_pkt_count < 10)
1574: {
1575: int pkt_len, pkt_stat;
1576:
1577: /* Get the rx page (incoming packet pointer). */
1578: rxing_page = inb_p(e8390_base + EN1_CURPAG -1);
1579:
1580: /* Remove one frame from the ring. Boundary is always a page behind. */
1581: this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
1582: if (this_frame >= ei_local->stop_page)
1583: this_frame = ei_local->rx_start_page;
1584:
1585: /* Someday we'll omit the previous, iff we never get this message.
1586: (There is at least one clone claimed to have a problem.)
1587:
1588: Keep quiet if it looks like a card removal. One problem here
1589: is that some clones crash in roughly the same way.
1590: */
1591: if (ei_debug > 0 && this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
1592: printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
1593: dev->name, this_frame, ei_local->current_page);
1594:
1595: if (this_frame == rxing_page) /* Read all the frames? */
1596: break; /* Done for now */
1597:
1598: current_offset = this_frame << 8;
1599: ei_get_8390_hdr(dev, &rx_frame, this_frame);
1600:
1601: pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr);
1602: pkt_stat = rx_frame.status;
1603:
1604: next_frame = this_frame + 1 + ((pkt_len+4)>>8);
1605:
1606: if (pkt_len < 60 || pkt_len > 1518)
1607: {
1608: if (ei_debug)
1609: printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
1610: dev->name, rx_frame.count, rx_frame.status,
1611: rx_frame.next);
1612: ei_local->stat.rx_errors++;
1613: ei_local->stat.rx_length_errors++;
1614: }
1615: else if ((pkt_stat & 0x0F) == ENRSR_RXOK)
1616: {
1617: struct sk_buff *skb;
1618:
1619: skb = dev_alloc_skb(pkt_len+2);
1620: if (skb == NULL)
1621: {
1622: if (ei_debug > 1)
1623: printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
1624: dev->name, pkt_len);
1625: ei_local->stat.rx_dropped++;
1626: break;
1627: }
1628: else
1629: {
1630: skb_reserve(skb,2); /* IP headers on 16 byte boundaries */
1631: skb->dev = dev;
1632: skb_put(skb, pkt_len); /* Make room */
1633: ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame));
1634: skb->protocol=eth_type_trans(skb,dev);
1635: netif_rx(skb);
1636: dev->last_rx = jiffies;
1637: ei_local->stat.rx_packets++;
1638: add_rx_bytes(&ei_local->stat, pkt_len);
1639: if (pkt_stat & ENRSR_PHY)
1640: ei_local->stat.multicast++;
1641: }
1642: }
1643: else
1644: {
1645: if (ei_debug)
1646: printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
1647: dev->name, rx_frame.status, rx_frame.next,
1648: rx_frame.count);
1649: ei_local->stat.rx_errors++;
1650: /* NB: The NIC counts CRC, frame and missed errors. */
1651: if (pkt_stat & ENRSR_FO)
1652: ei_local->stat.rx_fifo_errors++;
1653: }
1654: next_frame = rx_frame.next;
1655:
1656: /* This _should_ never happen: it's here for avoiding bad clones. */
1657: if (next_frame >= ei_local->stop_page) {
1658: printk("%s: next frame inconsistency, %#2x\n", dev->name,
1659: next_frame);
1660: next_frame = ei_local->rx_start_page;
1661: }
1662: ei_local->current_page = next_frame;
1663: outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
1664: }
1665:
1666: return;
1667: }
1668:
1669: /**
1670: * ei_rx_overrun - handle receiver overrun
1671: * @dev: network device which threw exception
1672: *
1673: * We have a receiver overrun: we have to kick the 8390 to get it started
1674: * again. Problem is that you have to kick it exactly as NS prescribes in
1675: * the updated datasheets, or "the NIC may act in an unpredictable manner."
1676: * This includes causing "the NIC to defer indefinitely when it is stopped
1677: * on a busy network." Ugh.
1678: * Called with lock held. Don't call this with the interrupts off or your
1679: * computer will hate you - it takes 10ms or so.
1680: */
1681:
1682: static void ei_rx_overrun(struct net_device *dev)
1683: {
1684: axnet_dev_t *info = (axnet_dev_t *)dev;
1685: long e8390_base = dev->base_addr;
1686: unsigned char was_txing, must_resend = 0;
1687: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1688:
1689: /*
1690: * Record whether a Tx was in progress and then issue the
1691: * stop command.
1692: */
1693: was_txing = inb_p(e8390_base+E8390_CMD) & E8390_TRANS;
1694: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1695:
1696: if (ei_debug > 1)
1697: printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name);
1698: ei_local->stat.rx_over_errors++;
1699:
1700: /*
1701: * Wait a full Tx time (1.2ms) + some guard time, NS says 1.6ms total.
1702: * Early datasheets said to poll the reset bit, but now they say that
1703: * it "is not a reliable indicator and subsequently should be ignored."
1704: * We wait at least 10ms.
1705: */
1706:
1707: mdelay(10);
1708:
1709: /*
1710: * Reset RBCR[01] back to zero as per magic incantation.
1711: */
1712: outb_p(0x00, e8390_base+EN0_RCNTLO);
1713: outb_p(0x00, e8390_base+EN0_RCNTHI);
1714:
1715: /*
1716: * See if any Tx was interrupted or not. According to NS, this
1717: * step is vital, and skipping it will cause no end of havoc.
1718: */
1719:
1720: if (was_txing)
1721: {
1722: unsigned char tx_completed = inb_p(e8390_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR);
1723: if (!tx_completed)
1724: must_resend = 1;
1725: }
1726:
1727: /*
1728: * Have to enter loopback mode and then restart the NIC before
1729: * you are allowed to slurp packets up off the ring.
1730: */
1731: outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1732: outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
1733:
1734: /*
1735: * Clear the Rx ring of all the debris, and ack the interrupt.
1736: */
1737: ei_receive(dev);
1738:
1739: /*
1740: * Leave loopback mode, and resend any packet that got stopped.
1741: */
1742: outb_p(E8390_TXCONFIG | info->duplex_flag, e8390_base + EN0_TXCR);
1743: if (must_resend)
1744: outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, e8390_base + E8390_CMD);
1745: }
1746:
1747: /*
1748: * Collect the stats. This is called unlocked and from several contexts.
1749: */
1750:
1751: static struct net_device_stats *get_stats(struct net_device *dev)
1752: {
1753: long ioaddr = dev->base_addr;
1754: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1755: unsigned long flags;
1756:
1757: /* If the card is stopped, just return the present stats. */
1758: if (!netif_running(dev))
1759: return &ei_local->stat;
1760:
1761: spin_lock_irqsave(&ei_local->page_lock,flags);
1762: /* Read the counter registers, assuming we are in page 0. */
1763: ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
1764: ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1);
1765: ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
1766: spin_unlock_irqrestore(&ei_local->page_lock, flags);
1767:
1768: return &ei_local->stat;
1769: }
1770:
1771: /**
1772: * do_set_multicast_list - set/clear multicast filter
1773: * @dev: net device for which multicast filter is adjusted
1774: *
1775: * Set or clear the multicast filter for this adaptor. May be called
1776: * from a BH in 2.1.x. Must be called with lock held.
1777: */
1778:
1779: static void do_set_multicast_list(struct net_device *dev)
1780: {
1781: long e8390_base = dev->base_addr;
1782:
1783: if(dev->flags&IFF_PROMISC)
1784: outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR);
1785: else if(dev->flags&IFF_ALLMULTI || dev->mc_list)
1786: outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR);
1787: else
1788: outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
1789: }
1790:
1791: /*
1792: * Called without lock held. This is invoked from user context and may
1793: * be parallel to just about everything else. Its also fairly quick and
1794: * not called too often. Must protect against both bh and irq users
1795: */
1796:
1797: static void set_multicast_list(struct net_device *dev)
1798: {
1799: unsigned long flags;
1800:
1801: spin_lock_irqsave(&dev_lock(dev), flags);
1802: do_set_multicast_list(dev);
1803: spin_unlock_irqrestore(&dev_lock(dev), flags);
1804: }
1805:
1806: /**
1807: * axdev_init - init rest of 8390 device struct
1808: * @dev: network device structure to init
1809: *
1810: * Initialize the rest of the 8390 device structure. Do NOT __init
1811: * this, as it is used by 8390 based modular drivers too.
1812: */
1813:
1814: static int axdev_init(struct net_device *dev)
1815: {
1816: if (ei_debug > 1)
1817: printk(version_8390);
1818:
1819: if (dev->priv == NULL)
1820: {
1821: struct ei_device *ei_local;
1822:
1823: dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
1824: if (dev->priv == NULL)
1825: return -ENOMEM;
1826: memset(dev->priv, 0, sizeof(struct ei_device));
1827: ei_local = (struct ei_device *)dev->priv;
1828: spin_lock_init(&ei_local->page_lock);
1829: }
1830:
1831: dev->hard_start_xmit = &ei_start_xmit;
1832: dev->get_stats = get_stats;
1833: dev->set_multicast_list = &set_multicast_list;
1834:
1835: ether_setup(dev);
1836:
1837: return 0;
1838: }
1839:
1840: /* This page of functions should be 8390 generic */
1841: /* Follow National Semi's recommendations for initializing the "NIC". */
1842:
1843: /**
1844: * AX88190_init - initialize 8390 hardware
1845: * @dev: network device to initialize
1846: * @startp: boolean. non-zero value to initiate chip processing
1847: *
1848: * Must be called with lock held.
1849: */
1850:
1851: static void AX88190_init(struct net_device *dev, int startp)
1852: {
1853: axnet_dev_t *info = (axnet_dev_t *)dev;
1854: long e8390_base = dev->base_addr;
1855: struct ei_device *ei_local = (struct ei_device *) dev->priv;
1856: int i;
1857: int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
1858:
1859: if(sizeof(struct e8390_pkt_hdr)!=4)
1860: panic("8390.c: header struct mispacked\n");
1861: /* Follow National Semi's recommendations for initing the DP83902. */
1862: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD); /* 0x21 */
1863: outb_p(endcfg, e8390_base + EN0_DCFG); /* 0x48 or 0x49 */
1864: /* Clear the remote byte count registers. */
1865: outb_p(0x00, e8390_base + EN0_RCNTLO);
1866: outb_p(0x00, e8390_base + EN0_RCNTHI);
1867: /* Set to monitor and loopback mode -- this is vital!. */
1868: outb_p(E8390_RXOFF|0x40, e8390_base + EN0_RXCR); /* 0x60 */
1869: outb_p(E8390_TXOFF, e8390_base + EN0_TXCR); /* 0x02 */
1870: /* Set the transmit page and receive ring. */
1871: outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
1872: ei_local->tx1 = ei_local->tx2 = 0;
1873: outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
1874: outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY); /* 3c503 says 0x3f,NS0x26*/
1875: ei_local->current_page = ei_local->rx_start_page; /* assert boundary+1 */
1876: outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
1877: /* Clear the pending interrupts and mask. */
1878: outb_p(0xFF, e8390_base + EN0_ISR);
1879: outb_p(0x00, e8390_base + EN0_IMR);
1880:
1881: /* Copy the station address into the DS8390 registers. */
1882:
1883: outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD); /* 0x61 */
1884: for(i = 0; i < 6; i++)
1885: {
1886: outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
1887: if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
1888: printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
1889: }
1890: /*
1891: * Initialize the multicast list to accept-all. If we enable multicast
1892: * the higher levels can do the filtering.
1893: */
1894: for (i = 0; i < 8; i++)
1895: outb_p(0xff, e8390_base + EN1_MULT + i);
1896:
1897: outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
1898: outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1899:
1900: netif_start_queue(dev);
1901: ei_local->tx1 = ei_local->tx2 = 0;
1902: ei_local->txing = 0;
1903:
1904: if (startp)
1905: {
1906: outb_p(0xff, e8390_base + EN0_ISR);
1907: outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1908: outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1909: outb_p(E8390_TXCONFIG | info->duplex_flag,
1910: e8390_base + EN0_TXCR); /* xmit on. */
1911: /* 3c503 TechMan says rxconfig only after the NIC is started. */
1912: outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR); /* rx on, */
1913: do_set_multicast_list(dev); /* (re)load the mcast table */
1914: }
1915: }
1916:
1917: /* Trigger a transmit start, assuming the length is valid.
1918: Always called with the page lock held */
1919:
1920: static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1921: int start_page)
1922: {
1923: long e8390_base = dev->base_addr;
1924: struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) dev->priv;
1925:
1926: if (inb_p(e8390_base) & E8390_TRANS)
1927: {
1928: printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
1929: dev->name);
1930: return;
1931: }
1932: outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
1933: outb_p(length >> 8, e8390_base + EN0_TCNTHI);
1934: outb_p(start_page, e8390_base + EN0_TPSR);
1935: outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base+E8390_CMD);
1936: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.