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