blob: 17f1040e255ed931d54995076a72d7d89274a4e3 [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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/string.h>
32#include <linux/timer.h>
33#include <linux/delay.h>
34#include <linux/spinlock.h>
35#include <linux/ethtool.h>
36#include <linux/netdevice.h>
Stephen Hemminger3dd20512009-03-20 19:36:11 +000037#include <linux/etherdevice.h>
Komurob8ab2dc2006-03-26 07:31:55 +090038#include <linux/crc32.h>
Ben Hutchings0fa0ee052009-09-03 10:41:17 +000039#include <linux/mii.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include "../8390.h"
41
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <pcmcia/cistpl.h>
43#include <pcmcia/ciscode.h>
44#include <pcmcia/ds.h>
45#include <pcmcia/cisreg.h>
46
47#include <asm/io.h>
48#include <asm/system.h>
49#include <asm/byteorder.h>
50#include <asm/uaccess.h>
51
52#define AXNET_CMD 0x00
53#define AXNET_DATAPORT 0x10 /* NatSemi-defined port window offset. */
54#define AXNET_RESET 0x1f /* Issue a read to reset, a write to clear. */
55#define AXNET_MII_EEP 0x14 /* Offset of MII access port */
56#define AXNET_TEST 0x15 /* Offset of TEST Register port */
57#define AXNET_GPIO 0x17 /* Offset of General Purpose Register Port */
58
59#define AXNET_START_PG 0x40 /* First page of TX buffer */
60#define AXNET_STOP_PG 0x80 /* Last page +1 of RX ring */
61
62#define AXNET_RDC_TIMEOUT 0x02 /* Max wait in jiffies for Tx RDC */
63
64#define IS_AX88190 0x0001
65#define IS_AX88790 0x0002
66
67/*====================================================================*/
68
69/* Module parameters */
70
71MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
72MODULE_DESCRIPTION("Asix AX88190 PCMCIA ethernet driver");
73MODULE_LICENSE("GPL");
74
Linus Torvalds1da177e2005-04-16 15:20:36 -070075
76/*====================================================================*/
77
Dominik Brodowski15b99ac2006-03-31 17:26:06 +020078static int axnet_config(struct pcmcia_device *link);
Dominik Brodowskifba395e2006-03-31 17:21:06 +020079static void axnet_release(struct pcmcia_device *link);
Linus Torvalds1da177e2005-04-16 15:20:36 -070080static int axnet_open(struct net_device *dev);
81static int axnet_close(struct net_device *dev);
82static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
Stephen Hemmingerdbf02fa2009-08-31 19:50:49 +000083static netdev_tx_t axnet_start_xmit(struct sk_buff *skb,
84 struct net_device *dev);
Stephen Hemminger3dd20512009-03-20 19:36:11 +000085static struct net_device_stats *get_stats(struct net_device *dev);
86static void set_multicast_list(struct net_device *dev);
87static void axnet_tx_timeout(struct net_device *dev);
Jeff Garzik7282d492006-09-13 14:30:00 -040088static const struct ethtool_ops netdev_ethtool_ops;
David Howells7d12e782006-10-05 14:55:46 +010089static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -070090static void ei_watchdog(u_long arg);
91static void axnet_reset_8390(struct net_device *dev);
92
Olof Johansson906da802008-02-04 22:27:35 -080093static int mdio_read(unsigned int addr, int phy_id, int loc);
94static void mdio_write(unsigned int addr, int phy_id, int loc, int value);
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
96static void get_8390_hdr(struct net_device *,
97 struct e8390_pkt_hdr *, int);
98static void block_input(struct net_device *dev, int count,
99 struct sk_buff *skb, int ring_offset);
100static void block_output(struct net_device *dev, int count,
101 const u_char *buf, const int start_page);
102
Dominik Brodowskicc3b4862005-11-14 21:23:14 +0100103static void axnet_detach(struct pcmcia_device *p_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105static void AX88190_init(struct net_device *dev, int startp);
106static int ax_open(struct net_device *dev);
107static int ax_close(struct net_device *dev);
David Howells7d12e782006-10-05 14:55:46 +0100108static irqreturn_t ax_interrupt(int irq, void *dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109
110/*====================================================================*/
111
112typedef struct axnet_dev_t {
Dominik Brodowskifd238232006-03-05 10:45:09 +0100113 struct pcmcia_device *p_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114 caddr_t base;
115 struct timer_list watchdog;
116 int stale, fast_poll;
117 u_short link_status;
118 u_char duplex_flag;
119 int phy_id;
120 int flags;
121} axnet_dev_t;
122
123static inline axnet_dev_t *PRIV(struct net_device *dev)
124{
125 void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device);
126 return p;
127}
128
Stephen Hemminger3dd20512009-03-20 19:36:11 +0000129static const struct net_device_ops axnet_netdev_ops = {
130 .ndo_open = axnet_open,
131 .ndo_stop = axnet_close,
132 .ndo_do_ioctl = axnet_ioctl,
133 .ndo_start_xmit = axnet_start_xmit,
134 .ndo_tx_timeout = axnet_tx_timeout,
135 .ndo_get_stats = get_stats,
136 .ndo_set_multicast_list = set_multicast_list,
137 .ndo_change_mtu = eth_change_mtu,
138 .ndo_set_mac_address = eth_mac_addr,
139 .ndo_validate_addr = eth_validate_addr,
140};
141
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142/*======================================================================
143
144 axnet_attach() creates an "instance" of the driver, allocating
145 local data structures for one device. The device is registered
146 with Card Services.
147
148======================================================================*/
149
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200150static int axnet_probe(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151{
152 axnet_dev_t *info;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153 struct net_device *dev;
Stephen Hemminger3dd20512009-03-20 19:36:11 +0000154 struct ei_device *ei_local;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200156 dev_dbg(&link->dev, "axnet_attach()\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700157
Stephen Hemminger3dd20512009-03-20 19:36:11 +0000158 dev = alloc_etherdev(sizeof(struct ei_device) + sizeof(axnet_dev_t));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159 if (!dev)
Dominik Brodowskif8cfa612005-11-14 21:25:51 +0100160 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161
Stephen Hemminger3dd20512009-03-20 19:36:11 +0000162 ei_local = netdev_priv(dev);
163 spin_lock_init(&ei_local->page_lock);
164
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165 info = PRIV(dev);
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200166 info->p_dev = link;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700167 link->priv = dev;
Dominik Brodowski1ac71e52010-07-29 19:27:09 +0200168 link->config_flags |= CONF_ENABLE_IRQ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169
Stephen Hemminger3dd20512009-03-20 19:36:11 +0000170 dev->netdev_ops = &axnet_netdev_ops;
171
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
Stephen Hemminger3dd20512009-03-20 19:36:11 +0000173 dev->watchdog_timeo = TX_TIMEOUT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200175 return axnet_config(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176} /* axnet_attach */
177
178/*======================================================================
179
180 This deletes a driver "instance". The device is de-registered
181 with Card Services. If it has been released, all local data
182 structures are freed. Otherwise, the structures will be freed
183 when the device is released.
184
185======================================================================*/
186
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200187static void axnet_detach(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188{
189 struct net_device *dev = link->priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200191 dev_dbg(&link->dev, "axnet_detach(0x%p)\n", link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192
Dominik Brodowskic7c2fa02010-03-20 19:39:26 +0100193 unregister_netdev(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100195 axnet_release(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 free_netdev(dev);
198} /* axnet_detach */
199
200/*======================================================================
201
202 This probes for a card's hardware address by reading the PROM.
203
204======================================================================*/
205
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200206static int get_prom(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207{
208 struct net_device *dev = link->priv;
Olof Johansson906da802008-02-04 22:27:35 -0800209 unsigned int ioaddr = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210 int i, j;
211
212 /* This is based on drivers/net/ne.c */
213 struct {
214 u_char value, offset;
215 } program_seq[] = {
216 {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
217 {0x01, EN0_DCFG}, /* Set word-wide access. */
218 {0x00, EN0_RCNTLO}, /* Clear the count regs. */
219 {0x00, EN0_RCNTHI},
220 {0x00, EN0_IMR}, /* Mask completion irq. */
221 {0xFF, EN0_ISR},
222 {E8390_RXOFF|0x40, EN0_RXCR}, /* 0x60 Set to monitor */
223 {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
224 {0x10, EN0_RCNTLO},
225 {0x00, EN0_RCNTHI},
226 {0x00, EN0_RSARLO}, /* DMA starting at 0x0400. */
227 {0x04, EN0_RSARHI},
228 {E8390_RREAD+E8390_START, E8390_CMD},
229 };
230
231 /* Not much of a test, but the alternatives are messy */
Dominik Brodowski7feabb62010-07-29 18:35:47 +0200232 if (link->config_base != 0x03c0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233 return 0;
234
235 axnet_reset_8390(dev);
236 mdelay(10);
237
Denis Chengff8ac602007-09-02 18:30:18 +0800238 for (i = 0; i < ARRAY_SIZE(program_seq); i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
240
241 for (i = 0; i < 6; i += 2) {
242 j = inw(ioaddr + AXNET_DATAPORT);
243 dev->dev_addr[i] = j & 0xff;
244 dev->dev_addr[i+1] = j >> 8;
245 }
246 return 1;
247} /* get_prom */
248
249/*======================================================================
250
251 axnet_config() is scheduled to run after a CARD_INSERTION event
252 is received, to configure the PCMCIA socket, and to make the
253 ethernet device available to the system.
254
255======================================================================*/
256
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200257static int try_io_port(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258{
259 int j, ret;
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200260 link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
261 link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
262 if (link->resource[0]->end == 32) {
263 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
Dominik Brodowskieb141202010-03-07 12:21:16 +0100264 /* for master/slave multifunction cards */
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200265 if (link->resource[1]->end > 0)
266 link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 } else {
268 /* This should be two 16-port windows */
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200269 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
270 link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 }
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200272 if (link->resource[0]->start == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 for (j = 0; j < 0x400; j += 0x20) {
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200274 link->resource[0]->start = j ^ 0x300;
275 link->resource[1]->start = (j ^ 0x300) + 0x10;
276 link->io_lines = 16;
277 ret = pcmcia_request_io(link);
Dominik Brodowski4c89e882008-08-03 10:07:45 +0200278 if (ret == 0)
279 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 }
281 return ret;
282 } else {
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200283 return pcmcia_request_io(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284 }
285}
286
Dominik Brodowskib54bf942008-08-02 14:28:43 +0200287static int axnet_configcheck(struct pcmcia_device *p_dev,
288 cistpl_cftable_entry_t *cfg,
Dominik Brodowski8e2fc392008-08-02 15:30:31 +0200289 cistpl_cftable_entry_t *dflt,
Dominik Brodowskib54bf942008-08-02 14:28:43 +0200290 void *priv_data)
291{
292 int i;
293 cistpl_io_t *io = &cfg->io;
294
295 if (cfg->index == 0 || cfg->io.nwin == 0)
296 return -ENODEV;
297
Dominik Brodowski7feabb62010-07-29 18:35:47 +0200298 p_dev->config_index = 0x05;
Dominik Brodowskib54bf942008-08-02 14:28:43 +0200299 /* For multifunction cards, by convention, we configure the
300 network function with window 0, and serial with window 1 */
301 if (io->nwin > 1) {
302 i = (io->win[1].len > io->win[0].len);
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200303 p_dev->resource[1]->start = io->win[1-i].base;
304 p_dev->resource[1]->end = io->win[1-i].len;
Dominik Brodowskib54bf942008-08-02 14:28:43 +0200305 } else {
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200306 i = p_dev->resource[1]->end = 0;
Dominik Brodowskib54bf942008-08-02 14:28:43 +0200307 }
Dominik Brodowski90abdc32010-07-24 17:23:51 +0200308 p_dev->resource[0]->start = io->win[i].base;
309 p_dev->resource[0]->end = io->win[i].len;
310 p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
311 if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
Dominik Brodowskib54bf942008-08-02 14:28:43 +0200312 return try_io_port(p_dev);
313
314 return -ENODEV;
315}
316
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200317static int axnet_config(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700318{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 struct net_device *dev = link->priv;
320 axnet_dev_t *info = PRIV(dev);
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200321 int i, j, j2, ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200323 dev_dbg(&link->dev, "axnet_config(0x%p)\n", link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 /* don't trust the CIS on this; Linksys got it wrong */
Dominik Brodowski7feabb62010-07-29 18:35:47 +0200326 link->config_regs = 0x63;
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200327 ret = pcmcia_loop_config(link, axnet_configcheck, NULL);
328 if (ret != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 goto failed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330
Dominik Brodowskieb141202010-03-07 12:21:16 +0100331 if (!link->irq)
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200332 goto failed;
Dominik Brodowski1ac71e52010-07-29 19:27:09 +0200333
334 link->config_flags |= CONF_ENABLE_IRQ;
Dominik Brodowskifc301102010-07-29 16:19:39 +0200335 if (resource_size(link->resource[1]) == 8)
Dominik Brodowski1ac71e52010-07-29 19:27:09 +0200336 link->config_flags |= CONF_ENABLE_SPKR;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337
Dominik Brodowski1ac71e52010-07-29 19:27:09 +0200338 ret = pcmcia_enable_device(link);
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200339 if (ret)
340 goto failed;
341
Dominik Brodowskieb141202010-03-07 12:21:16 +0100342 dev->irq = link->irq;
Dominik Brodowski9a017a92010-07-24 15:58:54 +0200343 dev->base_addr = link->resource[0]->start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344
345 if (!get_prom(link)) {
346 printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
347 printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n");
348 goto failed;
349 }
350
351 ei_status.name = "AX88190";
352 ei_status.word16 = 1;
353 ei_status.tx_start_page = AXNET_START_PG;
354 ei_status.rx_start_page = AXNET_START_PG + TX_PAGES;
355 ei_status.stop_page = AXNET_STOP_PG;
356 ei_status.reset_8390 = &axnet_reset_8390;
357 ei_status.get_8390_hdr = &get_8390_hdr;
358 ei_status.block_input = &block_input;
359 ei_status.block_output = &block_output;
360
361 if (inb(dev->base_addr + AXNET_TEST) != 0)
362 info->flags |= IS_AX88790;
363 else
364 info->flags |= IS_AX88190;
365
366 if (info->flags & IS_AX88790)
367 outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */
368
369 for (i = 0; i < 32; i++) {
370 j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
Ken Kawasakiad3620a2009-04-04 14:49:07 +0000371 j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
372 if (j == j2) continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 if ((j != 0) && (j != 0xffff)) break;
374 }
375
376 /* Maybe PHY is in power down mode. (PPD_SET = 1)
377 Bit 2 of CCSR is active low. */
378 if (i == 32) {
Dominik Brodowski1d5cc192010-07-24 12:23:21 +0200379 pcmcia_write_config_byte(link, CISREG_CCSR, 0x04);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 for (i = 0; i < 32; i++) {
381 j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
Ken Kawasakiad3620a2009-04-04 14:49:07 +0000382 j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
383 if (j == j2) continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 if ((j != 0) && (j != 0xffff)) break;
385 }
386 }
387
388 info->phy_id = (i < 32) ? i : -1;
Dominik Brodowskidd2e5a12009-11-03 10:27:34 +0100389 SET_NETDEV_DEV(dev, &link->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390
391 if (register_netdev(dev) != 0) {
392 printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 goto failed;
394 }
395
Joe Perches0795af52007-10-03 17:59:30 -0700396 printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, "
Johannes Berge1749612008-10-27 15:59:26 -0700397 "hw_addr %pM\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 dev->name, ((info->flags & IS_AX88790) ? 7 : 1),
Joe Perches0795af52007-10-03 17:59:30 -0700399 dev->base_addr, dev->irq,
Johannes Berge1749612008-10-27 15:59:26 -0700400 dev->dev_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 if (info->phy_id != -1) {
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200402 dev_dbg(&link->dev, " MII transceiver at index %d, status %x.\n", info->phy_id, j);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403 } else {
404 printk(KERN_NOTICE " No MII transceivers found!\n");
405 }
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200406 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408failed:
409 axnet_release(link);
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200410 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411} /* axnet_config */
412
413/*======================================================================
414
415 After a card is removed, axnet_release() will unregister the net
416 device, and release the PCMCIA configuration. If the device is
417 still open, this will be postponed until it is closed.
418
419======================================================================*/
420
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200421static void axnet_release(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422{
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200423 pcmcia_disable_device(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424}
425
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200426static int axnet_suspend(struct pcmcia_device *link)
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100427{
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100428 struct net_device *dev = link->priv;
429
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100430 if (link->open)
431 netif_device_detach(dev);
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100432
433 return 0;
434}
435
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200436static int axnet_resume(struct pcmcia_device *link)
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100437{
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100438 struct net_device *dev = link->priv;
439
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100440 if (link->open) {
Dominik Brodowski8661bb52006-03-02 00:02:33 +0100441 axnet_reset_8390(dev);
442 AX88190_init(dev, 1);
443 netif_device_attach(dev);
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100444 }
445
446 return 0;
447}
448
449
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450/*======================================================================
451
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 MII interface support
453
454======================================================================*/
455
456#define MDIO_SHIFT_CLK 0x01
457#define MDIO_DATA_WRITE0 0x00
458#define MDIO_DATA_WRITE1 0x08
459#define MDIO_DATA_READ 0x04
460#define MDIO_MASK 0x0f
461#define MDIO_ENB_IN 0x02
462
Olof Johansson906da802008-02-04 22:27:35 -0800463static void mdio_sync(unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464{
465 int bits;
466 for (bits = 0; bits < 32; bits++) {
467 outb_p(MDIO_DATA_WRITE1, addr);
468 outb_p(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
469 }
470}
471
Olof Johansson906da802008-02-04 22:27:35 -0800472static int mdio_read(unsigned int addr, int phy_id, int loc)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473{
474 u_int cmd = (0xf6<<10)|(phy_id<<5)|loc;
475 int i, retval = 0;
476
477 mdio_sync(addr);
478 for (i = 14; i >= 0; i--) {
479 int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
480 outb_p(dat, addr);
481 outb_p(dat | MDIO_SHIFT_CLK, addr);
482 }
483 for (i = 19; i > 0; i--) {
484 outb_p(MDIO_ENB_IN, addr);
485 retval = (retval << 1) | ((inb_p(addr) & MDIO_DATA_READ) != 0);
486 outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
487 }
488 return (retval>>1) & 0xffff;
489}
490
Olof Johansson906da802008-02-04 22:27:35 -0800491static void mdio_write(unsigned int addr, int phy_id, int loc, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492{
493 u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
494 int i;
495
496 mdio_sync(addr);
497 for (i = 31; i >= 0; i--) {
498 int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
499 outb_p(dat, addr);
500 outb_p(dat | MDIO_SHIFT_CLK, addr);
501 }
502 for (i = 1; i >= 0; i--) {
503 outb_p(MDIO_ENB_IN, addr);
504 outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
505 }
506}
507
508/*====================================================================*/
509
510static int axnet_open(struct net_device *dev)
511{
Yoichi Yuasa59b34c12007-06-05 22:55:06 +0900512 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 axnet_dev_t *info = PRIV(dev);
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200514 struct pcmcia_device *link = info->p_dev;
Komuro54299ef2008-06-07 21:37:56 +0900515 unsigned int nic_base = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200517 dev_dbg(&link->dev, "axnet_open('%s')\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518
Dominik Brodowski9940ec32006-03-05 11:04:33 +0100519 if (!pcmcia_dev_present(link))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 return -ENODEV;
521
Komuro54299ef2008-06-07 21:37:56 +0900522 outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */
Yoichi Yuasa59b34c12007-06-05 22:55:06 +0900523 ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
524 if (ret)
525 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526
Yoichi Yuasa59b34c12007-06-05 22:55:06 +0900527 link->open++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528
529 info->link_status = 0x00;
530 init_timer(&info->watchdog);
531 info->watchdog.function = &ei_watchdog;
532 info->watchdog.data = (u_long)dev;
533 info->watchdog.expires = jiffies + HZ;
534 add_timer(&info->watchdog);
535
536 return ax_open(dev);
537} /* axnet_open */
538
539/*====================================================================*/
540
541static int axnet_close(struct net_device *dev)
542{
543 axnet_dev_t *info = PRIV(dev);
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200544 struct pcmcia_device *link = info->p_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200546 dev_dbg(&link->dev, "axnet_close('%s')\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547
548 ax_close(dev);
549 free_irq(dev->irq, dev);
550
551 link->open--;
552 netif_stop_queue(dev);
553 del_timer_sync(&info->watchdog);
554
555 return 0;
556} /* axnet_close */
557
558/*======================================================================
559
560 Hard reset the card. This used to pause for the same period that
561 a 8390 reset command required, but that shouldn't be necessary.
562
563======================================================================*/
564
565static void axnet_reset_8390(struct net_device *dev)
566{
Olof Johansson906da802008-02-04 22:27:35 -0800567 unsigned int nic_base = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 int i;
569
570 ei_status.txing = ei_status.dmaing = 0;
571
572 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD);
573
574 outb(inb(nic_base + AXNET_RESET), nic_base + AXNET_RESET);
575
576 for (i = 0; i < 100; i++) {
577 if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0)
578 break;
579 udelay(100);
580 }
581 outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
582
583 if (i == 100)
584 printk(KERN_ERR "%s: axnet_reset_8390() did not complete.\n",
585 dev->name);
586
587} /* axnet_reset_8390 */
588
589/*====================================================================*/
590
David Howells7d12e782006-10-05 14:55:46 +0100591static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592{
593 struct net_device *dev = dev_id;
594 PRIV(dev)->stale = 0;
David Howells7d12e782006-10-05 14:55:46 +0100595 return ax_interrupt(irq, dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596}
597
598static void ei_watchdog(u_long arg)
599{
600 struct net_device *dev = (struct net_device *)(arg);
601 axnet_dev_t *info = PRIV(dev);
Olof Johansson906da802008-02-04 22:27:35 -0800602 unsigned int nic_base = dev->base_addr;
603 unsigned int mii_addr = nic_base + AXNET_MII_EEP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604 u_short link;
605
606 if (!netif_device_present(dev)) goto reschedule;
607
608 /* Check for pending interrupt with expired latency timer: with
609 this, we can limp along even if the interrupt is blocked */
610 if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
611 if (!info->fast_poll)
612 printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
David Howells7d12e782006-10-05 14:55:46 +0100613 ei_irq_wrapper(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 info->fast_poll = HZ;
615 }
616 if (info->fast_poll) {
617 info->fast_poll--;
618 info->watchdog.expires = jiffies + 1;
619 add_timer(&info->watchdog);
620 return;
621 }
622
623 if (info->phy_id < 0)
624 goto reschedule;
625 link = mdio_read(mii_addr, info->phy_id, 1);
626 if (!link || (link == 0xffff)) {
627 printk(KERN_INFO "%s: MII is missing!\n", dev->name);
628 info->phy_id = -1;
629 goto reschedule;
630 }
631
632 link &= 0x0004;
633 if (link != info->link_status) {
634 u_short p = mdio_read(mii_addr, info->phy_id, 5);
635 printk(KERN_INFO "%s: %s link beat\n", dev->name,
636 (link) ? "found" : "lost");
637 if (link) {
638 info->duplex_flag = (p & 0x0140) ? 0x80 : 0x00;
639 if (p)
640 printk(KERN_INFO "%s: autonegotiation complete: "
641 "%sbaseT-%cD selected\n", dev->name,
642 ((p & 0x0180) ? "100" : "10"),
643 ((p & 0x0140) ? 'F' : 'H'));
644 else
645 printk(KERN_INFO "%s: link partner did not autonegotiate\n",
646 dev->name);
647 AX88190_init(dev, 1);
648 }
649 info->link_status = link;
650 }
651
652reschedule:
653 info->watchdog.expires = jiffies + HZ;
654 add_timer(&info->watchdog);
655}
656
657static void netdev_get_drvinfo(struct net_device *dev,
658 struct ethtool_drvinfo *info)
659{
660 strcpy(info->driver, "axnet_cs");
661}
662
Jeff Garzik7282d492006-09-13 14:30:00 -0400663static const struct ethtool_ops netdev_ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 .get_drvinfo = netdev_get_drvinfo,
665};
666
667/*====================================================================*/
668
669static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
670{
671 axnet_dev_t *info = PRIV(dev);
Ben Hutchings0fa0ee052009-09-03 10:41:17 +0000672 struct mii_ioctl_data *data = if_mii(rq);
Olof Johansson906da802008-02-04 22:27:35 -0800673 unsigned int mii_addr = dev->base_addr + AXNET_MII_EEP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 switch (cmd) {
675 case SIOCGMIIPHY:
Ben Hutchings0fa0ee052009-09-03 10:41:17 +0000676 data->phy_id = info->phy_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 case SIOCGMIIREG: /* Read MII PHY register. */
Ben Hutchings0fa0ee052009-09-03 10:41:17 +0000678 data->val_out = mdio_read(mii_addr, data->phy_id, data->reg_num & 0x1f);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 return 0;
680 case SIOCSMIIREG: /* Write MII PHY register. */
Ben Hutchings0fa0ee052009-09-03 10:41:17 +0000681 mdio_write(mii_addr, data->phy_id, data->reg_num & 0x1f, data->val_in);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 return 0;
683 }
684 return -EOPNOTSUPP;
685}
686
687/*====================================================================*/
688
689static void get_8390_hdr(struct net_device *dev,
690 struct e8390_pkt_hdr *hdr,
691 int ring_page)
692{
Olof Johansson906da802008-02-04 22:27:35 -0800693 unsigned int nic_base = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694
695 outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
696 outb_p(ring_page, nic_base + EN0_RSARHI);
697 outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
698
699 insw(nic_base + AXNET_DATAPORT, hdr,
700 sizeof(struct e8390_pkt_hdr)>>1);
701 /* Fix for big endian systems */
702 hdr->count = le16_to_cpu(hdr->count);
703
704}
705
706/*====================================================================*/
707
708static void block_input(struct net_device *dev, int count,
709 struct sk_buff *skb, int ring_offset)
710{
Olof Johansson906da802008-02-04 22:27:35 -0800711 unsigned int nic_base = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 int xfer_count = count;
713 char *buf = skb->data;
714
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715 if ((ei_debug > 4) && (count != 4))
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200716 pr_debug("%s: [bi=%d]\n", dev->name, count+4);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
718 outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
719 outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
720
721 insw(nic_base + AXNET_DATAPORT,buf,count>>1);
722 if (count & 0x01)
723 buf[count-1] = inb(nic_base + AXNET_DATAPORT), xfer_count++;
724
725}
726
727/*====================================================================*/
728
729static void block_output(struct net_device *dev, int count,
730 const u_char *buf, const int start_page)
731{
Olof Johansson906da802008-02-04 22:27:35 -0800732 unsigned int nic_base = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733
Dominik Brodowskidd0fab52009-10-24 15:51:05 +0200734 pr_debug("%s: [bo=%d]\n", dev->name, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735
736 /* Round the count up for word writes. Do we need to do this?
737 What effect will an odd byte count have on the 8390?
738 I should check someday. */
739 if (count & 0x01)
740 count++;
741
742 outb_p(0x00, nic_base + EN0_RSARLO);
743 outb_p(start_page, nic_base + EN0_RSARHI);
744 outb_p(E8390_RWRITE+E8390_START, nic_base + AXNET_CMD);
745 outsw(nic_base + AXNET_DATAPORT, buf, count>>1);
746}
747
Dominik Brodowskic414f752005-06-27 16:28:20 -0700748static struct pcmcia_device_id axnet_ids[] = {
749 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081),
750 PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301),
751 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0301),
752 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0303),
753 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309),
754 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106),
755 PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab),
Komuroc67eebd2006-08-16 13:54:11 +0900756 PCMCIA_DEVICE_MANF_CARD(0x021b, 0x0202),
Komurodad8c732007-09-30 10:28:14 +0900757 PCMCIA_DEVICE_MANF_CARD(0xffff, 0x1090),
Jesse Allen2fe22a82006-02-20 22:08:18 -0800758 PCMCIA_DEVICE_PROD_ID12("AmbiCom,Inc.", "Fast Ethernet PC Card(AMB8110)", 0x49b020a7, 0x119cc9fc),
Dominik Brodowskic414f752005-06-27 16:28:20 -0700759 PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef),
760 PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef),
761 PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1),
762 PCMCIA_DEVICE_PROD_ID12("CHEETAH ETHERCARD", "EN2228", 0x00fa7bc8, 0x00e990cc),
763 PCMCIA_DEVICE_PROD_ID12("CNet", "CNF301", 0xbc477dde, 0x78c5f40b),
764 PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEther PCC-TXD", 0x5261440f, 0x436768c5),
765 PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEtherII PCC-TXD", 0x5261440f, 0x730df72e),
Ken Kawasaki60bbc722010-02-27 13:34:20 +0000766 PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEther PCC-TXM", 0x5261440f, 0x3abbd061),
Dominik Brodowskic414f752005-06-27 16:28:20 -0700767 PCMCIA_DEVICE_PROD_ID12("Dynalink", "L100C16", 0x55632fd5, 0x66bc2a90),
Komuro2dcc9ff2008-08-30 12:13:33 +0900768 PCMCIA_DEVICE_PROD_ID12("IO DATA", "ETXPCM", 0x547e66dc, 0x233adac2),
Dominik Brodowskic414f752005-06-27 16:28:20 -0700769 PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V3)", 0x0733cc81, 0x232019a8),
770 PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC3-TX", 0x481e0094, 0xf91af609),
Cord Walter208fbec2008-11-20 13:46:57 +0000771 PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA411", 0x9aa79dc3, 0x40fad875),
Dominik Brodowskic414f752005-06-27 16:28:20 -0700772 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "100BASE", 0x281f1c5d, 0x7c2add04),
773 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEtherCard", 0x281f1c5d, 0x7ef26116),
774 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FEP501", 0x281f1c5d, 0x2e272058),
775 PCMCIA_DEVICE_PROD_ID14("Network Everywhere", "AX88190", 0x820a67b6, 0xab9be5ef),
Dominik Brodowskic414f752005-06-27 16:28:20 -0700776 PCMCIA_DEVICE_NULL,
777};
778MODULE_DEVICE_TABLE(pcmcia, axnet_ids);
779
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780static struct pcmcia_driver axnet_cs_driver = {
781 .owner = THIS_MODULE,
782 .drv = {
783 .name = "axnet_cs",
784 },
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200785 .probe = axnet_probe,
Dominik Brodowskicc3b4862005-11-14 21:23:14 +0100786 .remove = axnet_detach,
Dominik Brodowskic414f752005-06-27 16:28:20 -0700787 .id_table = axnet_ids,
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100788 .suspend = axnet_suspend,
789 .resume = axnet_resume,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790};
791
792static int __init init_axnet_cs(void)
793{
794 return pcmcia_register_driver(&axnet_cs_driver);
795}
796
797static void __exit exit_axnet_cs(void)
798{
799 pcmcia_unregister_driver(&axnet_cs_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800}
801
802module_init(init_axnet_cs);
803module_exit(exit_axnet_cs);
804
805/*====================================================================*/
806
807/* 8390.c: A general NS8390 ethernet driver core for linux. */
808/*
809 Written 1992-94 by Donald Becker.
810
811 Copyright 1993 United States Government as represented by the
812 Director, National Security Agency.
813
814 This software may be used and distributed according to the terms
815 of the GNU General Public License, incorporated herein by reference.
816
817 The author may be reached as becker@scyld.com, or C/O
818 Scyld Computing Corporation
819 410 Severn Ave., Suite 210
820 Annapolis MD 21403
821
822 This is the chip-specific code for many 8390-based ethernet adaptors.
823 This is not a complete driver, it must be combined with board-specific
824 code such as ne.c, wd.c, 3c503.c, etc.
825
826 Seeing how at least eight drivers use this code, (not counting the
827 PCMCIA ones either) it is easy to break some card by what seems like
828 a simple innocent change. Please contact me or Donald if you think
829 you have found something that needs changing. -- PG
830
831 Changelog:
832
833 Paul Gortmaker : remove set_bit lock, other cleanups.
834 Paul Gortmaker : add ei_get_8390_hdr() so we can pass skb's to
835 ei_block_input() for eth_io_copy_and_sum().
836 Paul Gortmaker : exchange static int ei_pingpong for a #define,
837 also add better Tx error handling.
838 Paul Gortmaker : rewrite Rx overrun handling as per NS specs.
839 Alexey Kuznetsov : use the 8390's six bit hash multicast filter.
840 Paul Gortmaker : tweak ANK's above multicast changes a bit.
841 Paul Gortmaker : update packet statistics for v2.1.x
842 Alan Cox : support arbitary stupid port mappings on the
843 68K Macintosh. Support >16bit I/O spaces
844 Paul Gortmaker : add kmod support for auto-loading of the 8390
845 module by all drivers that require it.
846 Alan Cox : Spinlocking work, added 'BUG_83C690'
847 Paul Gortmaker : Separate out Tx timeout code from Tx path.
848
849 Sources:
850 The National Semiconductor LAN Databook, and the 3Com 3c503 databook.
851
852 */
853
Hannes Eder6ae03852009-02-14 11:39:23 +0000854static const char version_8390[] = KERN_INFO \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855 "8390.c:v1.10cvs 9/23/94 Donald Becker (becker@scyld.com)\n";
856
857#include <linux/bitops.h>
858#include <asm/irq.h>
859#include <linux/fcntl.h>
860#include <linux/in.h>
861#include <linux/interrupt.h>
862
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863#define BUG_83C690
864
865/* These are the operational function interfaces to board-specific
866 routines.
867 void reset_8390(struct net_device *dev)
868 Resets the board associated with DEV, including a hardware reset of
869 the 8390. This is only called when there is a transmit timeout, and
870 it is always followed by 8390_init().
871 void block_output(struct net_device *dev, int count, const unsigned char *buf,
872 int start_page)
873 Write the COUNT bytes of BUF to the packet buffer at START_PAGE. The
874 "page" value uses the 8390's 256-byte pages.
875 void get_8390_hdr(struct net_device *dev, struct e8390_hdr *hdr, int ring_page)
876 Read the 4 byte, page aligned 8390 header. *If* there is a
877 subsequent read, it will be of the rest of the packet.
878 void block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
879 Read COUNT bytes from the packet buffer into the skb data area. Start
880 reading from RING_OFFSET, the address as the 8390 sees it. This will always
881 follow the read of the 8390 header.
882*/
883#define ei_reset_8390 (ei_local->reset_8390)
884#define ei_block_output (ei_local->block_output)
885#define ei_block_input (ei_local->block_input)
886#define ei_get_8390_hdr (ei_local->get_8390_hdr)
887
888/* use 0 for production, 1 for verification, >2 for debug */
889#ifndef ei_debug
890int ei_debug = 1;
891#endif
892
893/* Index to functions. */
894static void ei_tx_intr(struct net_device *dev);
895static void ei_tx_err(struct net_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896static void ei_receive(struct net_device *dev);
897static void ei_rx_overrun(struct net_device *dev);
898
899/* Routines generic to NS8390-based boards. */
900static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
901 int start_page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902static void do_set_multicast_list(struct net_device *dev);
903
904/*
905 * SMP and the 8390 setup.
906 *
907 * The 8390 isnt exactly designed to be multithreaded on RX/TX. There is
908 * a page register that controls bank and packet buffer access. We guard
909 * this with ei_local->page_lock. Nobody should assume or set the page other
910 * than zero when the lock is not held. Lock holders must restore page 0
911 * before unlocking. Even pure readers must take the lock to protect in
912 * page 0.
913 *
914 * To make life difficult the chip can also be very slow. We therefore can't
915 * just use spinlocks. For the longer lockups we disable the irq the device
916 * sits on and hold the lock. We must hold the lock because there is a dual
917 * processor case other than interrupts (get stats/set multicast list in
918 * parallel with each other and transmit).
919 *
920 * Note: in theory we can just disable the irq on the card _but_ there is
921 * a latency on SMP irq delivery. So we can easily go "disable irq" "sync irqs"
922 * enter lock, take the queued irq. So we waddle instead of flying.
923 *
924 * Finally by special arrangement for the purpose of being generally
925 * annoying the transmit function is called bh atomic. That places
926 * restrictions on the user context callers as disable_irq won't save
927 * them.
928 */
929
930/**
931 * ax_open - Open/initialize the board.
932 * @dev: network device to initialize
933 *
934 * This routine goes all-out, setting everything
935 * up anew at each open, even though many of these registers should only
936 * need to be set once at boot.
937 */
938static int ax_open(struct net_device *dev)
939{
940 unsigned long flags;
941 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
942
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 /*
944 * Grab the page lock so we own the register set, then call
945 * the init function.
946 */
947
948 spin_lock_irqsave(&ei_local->page_lock, flags);
949 AX88190_init(dev, 1);
950 /* Set the flag before we drop the lock, That way the IRQ arrives
951 after its set and we get no silly warnings */
952 netif_start_queue(dev);
953 spin_unlock_irqrestore(&ei_local->page_lock, flags);
954 ei_local->irqlock = 0;
955 return 0;
956}
957
958#define dev_lock(dev) (((struct ei_device *)netdev_priv(dev))->page_lock)
959
960/**
961 * ax_close - shut down network device
962 * @dev: network device to close
963 *
964 * Opposite of ax_open(). Only used when "ifconfig <devname> down" is done.
965 */
Richard Knutsson6b2e4382008-02-04 22:27:40 -0800966static int ax_close(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967{
968 unsigned long flags;
969
970 /*
971 * Hold the page lock during close
972 */
973
974 spin_lock_irqsave(&dev_lock(dev), flags);
975 AX88190_init(dev, 0);
976 spin_unlock_irqrestore(&dev_lock(dev), flags);
977 netif_stop_queue(dev);
978 return 0;
979}
980
981/**
David S. Miller70eb1bf2008-11-23 20:01:59 -0800982 * axnet_tx_timeout - handle transmit time out condition
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983 * @dev: network device which has apparently fallen asleep
984 *
985 * Called by kernel when device never acknowledges a transmit has
986 * completed (or failed) - i.e. never posted a Tx related interrupt.
987 */
988
David S. Miller70eb1bf2008-11-23 20:01:59 -0800989static void axnet_tx_timeout(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990{
991 long e8390_base = dev->base_addr;
992 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
Eric Dumazet1ae5dc32010-05-10 05:01:31 -0700993 int txsr, isr, tickssofar = jiffies - dev_trans_start(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994 unsigned long flags;
995
Paulius Zaleckas8e269162008-05-07 02:20:36 +0300996 dev->stats.tx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997
998 spin_lock_irqsave(&ei_local->page_lock, flags);
999 txsr = inb(e8390_base+EN0_TSR);
1000 isr = inb(e8390_base+EN0_ISR);
1001 spin_unlock_irqrestore(&ei_local->page_lock, flags);
1002
1003 printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
1004 dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
1005 (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
1006
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001007 if (!isr && !dev->stats.tx_packets)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 {
1009 /* The 8390 probably hasn't gotten on the cable yet. */
1010 ei_local->interface_num ^= 1; /* Try a different xcvr. */
1011 }
1012
1013 /* Ugly but a reset can be slow, yet must be protected */
1014
Komurobd5a9342007-11-11 11:04:36 +09001015 spin_lock_irqsave(&ei_local->page_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016
1017 /* Try to restart the card. Perhaps the user has fixed something. */
1018 ei_reset_8390(dev);
1019 AX88190_init(dev, 1);
1020
Komurobd5a9342007-11-11 11:04:36 +09001021 spin_unlock_irqrestore(&ei_local->page_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022 netif_wake_queue(dev);
1023}
1024
1025/**
David S. Miller70eb1bf2008-11-23 20:01:59 -08001026 * axnet_start_xmit - begin packet transmission
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027 * @skb: packet to be sent
1028 * @dev: network device to which packet is sent
1029 *
1030 * Sends a packet to an 8390 network device.
1031 */
1032
Stephen Hemmingerdbf02fa2009-08-31 19:50:49 +00001033static netdev_tx_t axnet_start_xmit(struct sk_buff *skb,
1034 struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035{
1036 long e8390_base = dev->base_addr;
1037 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1038 int length, send_length, output_page;
1039 unsigned long flags;
1040 u8 packet[ETH_ZLEN];
1041
1042 netif_stop_queue(dev);
1043
1044 length = skb->len;
1045
1046 /* Mask interrupts from the ethercard.
1047 SMP: We have to grab the lock here otherwise the IRQ handler
1048 on another CPU can flip window and race the IRQ mask set. We end
1049 up trashing the mcast filter not disabling irqs if we don't lock */
1050
1051 spin_lock_irqsave(&ei_local->page_lock, flags);
1052 outb_p(0x00, e8390_base + EN0_IMR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053
1054 /*
1055 * Slow phase with lock held.
1056 */
1057
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 ei_local->irqlock = 1;
1059
Richard Knutssonc61f26f2008-02-04 22:27:41 -08001060 send_length = max(length, ETH_ZLEN);
1061
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 /*
1063 * We have two Tx slots available for use. Find the first free
1064 * slot, and then perform some sanity checks. With two Tx bufs,
1065 * you get very close to transmitting back-to-back packets. With
1066 * only one Tx buf, the transmitter sits idle while you reload the
1067 * card, leaving a substantial gap between each transmitted packet.
1068 */
1069
1070 if (ei_local->tx1 == 0)
1071 {
1072 output_page = ei_local->tx_start_page;
1073 ei_local->tx1 = send_length;
1074 if (ei_debug && ei_local->tx2 > 0)
1075 printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
1076 dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
1077 }
1078 else if (ei_local->tx2 == 0)
1079 {
1080 output_page = ei_local->tx_start_page + TX_PAGES/2;
1081 ei_local->tx2 = send_length;
1082 if (ei_debug && ei_local->tx1 > 0)
1083 printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
1084 dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
1085 }
1086 else
1087 { /* We should never get here. */
1088 if (ei_debug)
1089 printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
1090 dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
1091 ei_local->irqlock = 0;
1092 netif_stop_queue(dev);
1093 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
Komurobd5a9342007-11-11 11:04:36 +09001094 spin_unlock_irqrestore(&ei_local->page_lock, flags);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001095 dev->stats.tx_errors++;
Patrick McHardy5b548142009-06-12 06:22:29 +00001096 return NETDEV_TX_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 }
1098
1099 /*
1100 * Okay, now upload the packet and trigger a send if the transmitter
1101 * isn't already sending. If it is busy, the interrupt handler will
1102 * trigger the send later, upon receiving a Tx done interrupt.
1103 */
1104
1105 if (length == skb->len)
1106 ei_block_output(dev, length, skb->data, output_page);
1107 else {
1108 memset(packet, 0, ETH_ZLEN);
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03001109 skb_copy_from_linear_data(skb, packet, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110 ei_block_output(dev, length, packet, output_page);
1111 }
1112
1113 if (! ei_local->txing)
1114 {
1115 ei_local->txing = 1;
1116 NS8390_trigger_send(dev, send_length, output_page);
1117 dev->trans_start = jiffies;
1118 if (output_page == ei_local->tx_start_page)
1119 {
1120 ei_local->tx1 = -1;
1121 ei_local->lasttx = -1;
1122 }
1123 else
1124 {
1125 ei_local->tx2 = -1;
1126 ei_local->lasttx = -2;
1127 }
1128 }
1129 else ei_local->txqueue++;
1130
1131 if (ei_local->tx1 && ei_local->tx2)
1132 netif_stop_queue(dev);
1133 else
1134 netif_start_queue(dev);
1135
1136 /* Turn 8390 interrupts back on. */
1137 ei_local->irqlock = 0;
1138 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1139
Komurobd5a9342007-11-11 11:04:36 +09001140 spin_unlock_irqrestore(&ei_local->page_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141
1142 dev_kfree_skb (skb);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001143 dev->stats.tx_bytes += send_length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144
Patrick McHardy6ed10652009-06-23 06:03:08 +00001145 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146}
1147
1148/**
1149 * ax_interrupt - handle the interrupts from an 8390
1150 * @irq: interrupt number
1151 * @dev_id: a pointer to the net_device
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 *
1153 * Handle the ether interface interrupts. We pull packets from
1154 * the 8390 via the card specific functions and fire them at the networking
1155 * stack. We also handle transmit completions and wake the transmit path if
1156 * necessary. We also update the counters and do other housekeeping as
1157 * needed.
1158 */
1159
David Howells7d12e782006-10-05 14:55:46 +01001160static irqreturn_t ax_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161{
1162 struct net_device *dev = dev_id;
1163 long e8390_base;
1164 int interrupts, nr_serviced = 0, i;
1165 struct ei_device *ei_local;
1166 int handled = 0;
Ken Kawasakiab83a382010-07-10 01:18:13 +00001167 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 e8390_base = dev->base_addr;
Jeff Garzikc31f28e2006-10-06 14:56:04 -04001170 ei_local = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171
1172 /*
1173 * Protect the irq test too.
1174 */
1175
Ken Kawasakiab83a382010-07-10 01:18:13 +00001176 spin_lock_irqsave(&ei_local->page_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177
1178 if (ei_local->irqlock)
1179 {
1180#if 1 /* This might just be an interrupt for a PCI device sharing this line */
1181 /* The "irqlock" check is only for testing. */
1182 printk(ei_local->irqlock
1183 ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
1184 : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
1185 dev->name, inb_p(e8390_base + EN0_ISR),
1186 inb_p(e8390_base + EN0_IMR));
1187#endif
Ken Kawasakiab83a382010-07-10 01:18:13 +00001188 spin_unlock_irqrestore(&ei_local->page_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 return IRQ_NONE;
1190 }
1191
1192 if (ei_debug > 3)
1193 printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
1194 inb_p(e8390_base + EN0_ISR));
1195
1196 outb_p(0x00, e8390_base + EN0_ISR);
1197 ei_local->irqlock = 1;
1198
1199 /* !!Assumption!! -- we stay in page 0. Don't break this. */
Joe Perches8e95a202009-12-03 07:58:21 +00001200 while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0 &&
1201 ++nr_serviced < MAX_SERVICE)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 {
1203 if (!netif_running(dev) || (interrupts == 0xff)) {
1204 if (ei_debug > 1)
1205 printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
1206 outb_p(interrupts, e8390_base + EN0_ISR);
1207 interrupts = 0;
1208 break;
1209 }
1210 handled = 1;
1211
1212 /* AX88190 bug fix. */
1213 outb_p(interrupts, e8390_base + EN0_ISR);
1214 for (i = 0; i < 10; i++) {
1215 if (!(inb(e8390_base + EN0_ISR) & interrupts))
1216 break;
1217 outb_p(0, e8390_base + EN0_ISR);
1218 outb_p(interrupts, e8390_base + EN0_ISR);
1219 }
1220 if (interrupts & ENISR_OVER)
1221 ei_rx_overrun(dev);
1222 else if (interrupts & (ENISR_RX+ENISR_RX_ERR))
1223 {
1224 /* Got a good (?) packet. */
1225 ei_receive(dev);
1226 }
1227 /* Push the next to-transmit packet through. */
1228 if (interrupts & ENISR_TX)
1229 ei_tx_intr(dev);
1230 else if (interrupts & ENISR_TX_ERR)
1231 ei_tx_err(dev);
1232
1233 if (interrupts & ENISR_COUNTERS)
1234 {
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001235 dev->stats.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0);
1236 dev->stats.rx_crc_errors += inb_p(e8390_base + EN0_COUNTER1);
1237 dev->stats.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 }
1239 }
1240
Komuro36c86bd2008-03-01 10:52:03 +09001241 if (interrupts && ei_debug > 3)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242 {
1243 handled = 1;
1244 if (nr_serviced >= MAX_SERVICE)
1245 {
1246 /* 0xFF is valid for a card removal */
1247 if(interrupts!=0xFF)
1248 printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
1249 dev->name, interrupts);
1250 outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
1251 } else {
1252 printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
1253 outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
1254 }
1255 }
1256
1257 /* Turn 8390 interrupts back on. */
1258 ei_local->irqlock = 0;
1259 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1260
Ken Kawasakiab83a382010-07-10 01:18:13 +00001261 spin_unlock_irqrestore(&ei_local->page_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 return IRQ_RETVAL(handled);
1263}
1264
1265/**
1266 * ei_tx_err - handle transmitter error
1267 * @dev: network device which threw the exception
1268 *
1269 * A transmitter error has happened. Most likely excess collisions (which
1270 * is a fairly normal condition). If the error is one where the Tx will
1271 * have been aborted, we try and send another one right away, instead of
1272 * letting the failed packet sit and collect dust in the Tx buffer. This
1273 * is a much better solution as it avoids kernel based Tx timeouts, and
1274 * an unnecessary card reset.
1275 *
1276 * Called with lock held.
1277 */
1278
1279static void ei_tx_err(struct net_device *dev)
1280{
1281 long e8390_base = dev->base_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 unsigned char txsr = inb_p(e8390_base+EN0_TSR);
1283 unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
1284
1285#ifdef VERBOSE_ERROR_DUMP
1286 printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
1287 if (txsr & ENTSR_ABT)
1288 printk("excess-collisions ");
1289 if (txsr & ENTSR_ND)
1290 printk("non-deferral ");
1291 if (txsr & ENTSR_CRS)
1292 printk("lost-carrier ");
1293 if (txsr & ENTSR_FU)
1294 printk("FIFO-underrun ");
1295 if (txsr & ENTSR_CDH)
1296 printk("lost-heartbeat ");
1297 printk("\n");
1298#endif
1299
1300 if (tx_was_aborted)
1301 ei_tx_intr(dev);
1302 else
1303 {
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001304 dev->stats.tx_errors++;
1305 if (txsr & ENTSR_CRS) dev->stats.tx_carrier_errors++;
1306 if (txsr & ENTSR_CDH) dev->stats.tx_heartbeat_errors++;
1307 if (txsr & ENTSR_OWC) dev->stats.tx_window_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308 }
1309}
1310
1311/**
1312 * ei_tx_intr - transmit interrupt handler
1313 * @dev: network device for which tx intr is handled
1314 *
1315 * We have finished a transmit: check for errors and then trigger the next
1316 * packet to be sent. Called with lock held.
1317 */
1318
1319static void ei_tx_intr(struct net_device *dev)
1320{
1321 long e8390_base = dev->base_addr;
1322 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1323 int status = inb(e8390_base + EN0_TSR);
1324
1325 /*
1326 * There are two Tx buffers, see which one finished, and trigger
1327 * the send of another one if it exists.
1328 */
1329 ei_local->txqueue--;
1330
1331 if (ei_local->tx1 < 0)
1332 {
1333 if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
1334 printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
1335 ei_local->name, ei_local->lasttx, ei_local->tx1);
1336 ei_local->tx1 = 0;
1337 if (ei_local->tx2 > 0)
1338 {
1339 ei_local->txing = 1;
1340 NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
1341 dev->trans_start = jiffies;
1342 ei_local->tx2 = -1,
1343 ei_local->lasttx = 2;
1344 }
1345 else ei_local->lasttx = 20, ei_local->txing = 0;
1346 }
1347 else if (ei_local->tx2 < 0)
1348 {
1349 if (ei_local->lasttx != 2 && ei_local->lasttx != -2)
1350 printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
1351 ei_local->name, ei_local->lasttx, ei_local->tx2);
1352 ei_local->tx2 = 0;
1353 if (ei_local->tx1 > 0)
1354 {
1355 ei_local->txing = 1;
1356 NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
1357 dev->trans_start = jiffies;
1358 ei_local->tx1 = -1;
1359 ei_local->lasttx = 1;
1360 }
1361 else
1362 ei_local->lasttx = 10, ei_local->txing = 0;
1363 }
1364// else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n",
1365// dev->name, ei_local->lasttx);
1366
1367 /* Minimize Tx latency: update the statistics after we restart TXing. */
1368 if (status & ENTSR_COL)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001369 dev->stats.collisions++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001370 if (status & ENTSR_PTX)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001371 dev->stats.tx_packets++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372 else
1373 {
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001374 dev->stats.tx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375 if (status & ENTSR_ABT)
1376 {
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001377 dev->stats.tx_aborted_errors++;
1378 dev->stats.collisions += 16;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379 }
1380 if (status & ENTSR_CRS)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001381 dev->stats.tx_carrier_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 if (status & ENTSR_FU)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001383 dev->stats.tx_fifo_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001384 if (status & ENTSR_CDH)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001385 dev->stats.tx_heartbeat_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386 if (status & ENTSR_OWC)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001387 dev->stats.tx_window_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388 }
1389 netif_wake_queue(dev);
1390}
1391
1392/**
1393 * ei_receive - receive some packets
1394 * @dev: network device with which receive will be run
1395 *
1396 * We have a good packet(s), get it/them out of the buffers.
1397 * Called with lock held.
1398 */
1399
1400static void ei_receive(struct net_device *dev)
1401{
1402 long e8390_base = dev->base_addr;
1403 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1404 unsigned char rxing_page, this_frame, next_frame;
1405 unsigned short current_offset;
1406 int rx_pkt_count = 0;
1407 struct e8390_pkt_hdr rx_frame;
1408
1409 while (++rx_pkt_count < 10)
1410 {
1411 int pkt_len, pkt_stat;
1412
1413 /* Get the rx page (incoming packet pointer). */
1414 rxing_page = inb_p(e8390_base + EN1_CURPAG -1);
1415
1416 /* Remove one frame from the ring. Boundary is always a page behind. */
1417 this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
1418 if (this_frame >= ei_local->stop_page)
1419 this_frame = ei_local->rx_start_page;
1420
1421 /* Someday we'll omit the previous, iff we never get this message.
1422 (There is at least one clone claimed to have a problem.)
1423
1424 Keep quiet if it looks like a card removal. One problem here
1425 is that some clones crash in roughly the same way.
1426 */
1427 if (ei_debug > 0 && this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
1428 printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
1429 dev->name, this_frame, ei_local->current_page);
1430
1431 if (this_frame == rxing_page) /* Read all the frames? */
1432 break; /* Done for now */
1433
1434 current_offset = this_frame << 8;
1435 ei_get_8390_hdr(dev, &rx_frame, this_frame);
1436
1437 pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr);
1438 pkt_stat = rx_frame.status;
1439
1440 next_frame = this_frame + 1 + ((pkt_len+4)>>8);
1441
1442 if (pkt_len < 60 || pkt_len > 1518)
1443 {
1444 if (ei_debug)
1445 printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
1446 dev->name, rx_frame.count, rx_frame.status,
1447 rx_frame.next);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001448 dev->stats.rx_errors++;
1449 dev->stats.rx_length_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 }
1451 else if ((pkt_stat & 0x0F) == ENRSR_RXOK)
1452 {
1453 struct sk_buff *skb;
1454
1455 skb = dev_alloc_skb(pkt_len+2);
1456 if (skb == NULL)
1457 {
1458 if (ei_debug > 1)
1459 printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
1460 dev->name, pkt_len);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001461 dev->stats.rx_dropped++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 break;
1463 }
1464 else
1465 {
1466 skb_reserve(skb,2); /* IP headers on 16 byte boundaries */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 skb_put(skb, pkt_len); /* Make room */
1468 ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame));
1469 skb->protocol=eth_type_trans(skb,dev);
1470 netif_rx(skb);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001471 dev->stats.rx_packets++;
1472 dev->stats.rx_bytes += pkt_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473 if (pkt_stat & ENRSR_PHY)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001474 dev->stats.multicast++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 }
1476 }
1477 else
1478 {
1479 if (ei_debug)
1480 printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
1481 dev->name, rx_frame.status, rx_frame.next,
1482 rx_frame.count);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001483 dev->stats.rx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 /* NB: The NIC counts CRC, frame and missed errors. */
1485 if (pkt_stat & ENRSR_FO)
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001486 dev->stats.rx_fifo_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487 }
1488 next_frame = rx_frame.next;
1489
1490 /* This _should_ never happen: it's here for avoiding bad clones. */
1491 if (next_frame >= ei_local->stop_page) {
1492 printk("%s: next frame inconsistency, %#2x\n", dev->name,
1493 next_frame);
1494 next_frame = ei_local->rx_start_page;
1495 }
1496 ei_local->current_page = next_frame;
1497 outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
1498 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499}
1500
1501/**
1502 * ei_rx_overrun - handle receiver overrun
1503 * @dev: network device which threw exception
1504 *
1505 * We have a receiver overrun: we have to kick the 8390 to get it started
1506 * again. Problem is that you have to kick it exactly as NS prescribes in
1507 * the updated datasheets, or "the NIC may act in an unpredictable manner."
1508 * This includes causing "the NIC to defer indefinitely when it is stopped
1509 * on a busy network." Ugh.
1510 * Called with lock held. Don't call this with the interrupts off or your
1511 * computer will hate you - it takes 10ms or so.
1512 */
1513
1514static void ei_rx_overrun(struct net_device *dev)
1515{
Komuroff768cd2006-04-09 11:21:10 +09001516 axnet_dev_t *info = PRIV(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 long e8390_base = dev->base_addr;
1518 unsigned char was_txing, must_resend = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519
1520 /*
1521 * Record whether a Tx was in progress and then issue the
1522 * stop command.
1523 */
1524 was_txing = inb_p(e8390_base+E8390_CMD) & E8390_TRANS;
1525 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1526
1527 if (ei_debug > 1)
1528 printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name);
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001529 dev->stats.rx_over_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530
1531 /*
1532 * Wait a full Tx time (1.2ms) + some guard time, NS says 1.6ms total.
1533 * Early datasheets said to poll the reset bit, but now they say that
1534 * it "is not a reliable indicator and subsequently should be ignored."
1535 * We wait at least 10ms.
1536 */
1537
1538 mdelay(10);
1539
1540 /*
1541 * Reset RBCR[01] back to zero as per magic incantation.
1542 */
1543 outb_p(0x00, e8390_base+EN0_RCNTLO);
1544 outb_p(0x00, e8390_base+EN0_RCNTHI);
1545
1546 /*
1547 * See if any Tx was interrupted or not. According to NS, this
1548 * step is vital, and skipping it will cause no end of havoc.
1549 */
1550
1551 if (was_txing)
1552 {
1553 unsigned char tx_completed = inb_p(e8390_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR);
1554 if (!tx_completed)
1555 must_resend = 1;
1556 }
1557
1558 /*
1559 * Have to enter loopback mode and then restart the NIC before
1560 * you are allowed to slurp packets up off the ring.
1561 */
1562 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1563 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
1564
1565 /*
1566 * Clear the Rx ring of all the debris, and ack the interrupt.
1567 */
1568 ei_receive(dev);
1569
1570 /*
1571 * Leave loopback mode, and resend any packet that got stopped.
1572 */
1573 outb_p(E8390_TXCONFIG | info->duplex_flag, e8390_base + EN0_TXCR);
1574 if (must_resend)
1575 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, e8390_base + E8390_CMD);
1576}
1577
1578/*
1579 * Collect the stats. This is called unlocked and from several contexts.
1580 */
1581
1582static struct net_device_stats *get_stats(struct net_device *dev)
1583{
1584 long ioaddr = dev->base_addr;
1585 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1586 unsigned long flags;
1587
1588 /* If the card is stopped, just return the present stats. */
1589 if (!netif_running(dev))
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001590 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591
1592 spin_lock_irqsave(&ei_local->page_lock,flags);
1593 /* Read the counter registers, assuming we are in page 0. */
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001594 dev->stats.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
1595 dev->stats.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1);
1596 dev->stats.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597 spin_unlock_irqrestore(&ei_local->page_lock, flags);
1598
Paulius Zaleckas8e269162008-05-07 02:20:36 +03001599 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600}
1601
Komurob8ab2dc2006-03-26 07:31:55 +09001602/*
1603 * Form the 64 bit 8390 multicast table from the linked list of addresses
1604 * associated with this dev structure.
1605 */
1606
1607static inline void make_mc_bits(u8 *bits, struct net_device *dev)
1608{
Jiri Pirko22bedad2010-04-01 21:22:57 +00001609 struct netdev_hw_addr *ha;
Komurob8ab2dc2006-03-26 07:31:55 +09001610 u32 crc;
1611
Jiri Pirko22bedad2010-04-01 21:22:57 +00001612 netdev_for_each_mc_addr(ha, dev) {
1613 crc = ether_crc(ETH_ALEN, ha->addr);
Komurob8ab2dc2006-03-26 07:31:55 +09001614 /*
1615 * The 8390 uses the 6 most significant bits of the
1616 * CRC to index the multicast table.
1617 */
1618 bits[crc>>29] |= (1<<((crc>>26)&7));
1619 }
1620}
1621
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622/**
1623 * do_set_multicast_list - set/clear multicast filter
1624 * @dev: net device for which multicast filter is adjusted
1625 *
Komurob8ab2dc2006-03-26 07:31:55 +09001626 * Set or clear the multicast filter for this adaptor.
1627 * Must be called with lock held.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 */
1629
1630static void do_set_multicast_list(struct net_device *dev)
1631{
1632 long e8390_base = dev->base_addr;
Komurob8ab2dc2006-03-26 07:31:55 +09001633 int i;
1634 struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
1635
1636 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) {
1637 memset(ei_local->mcfilter, 0, 8);
Jiri Pirko91fea582010-02-19 08:48:47 +00001638 if (!netdev_mc_empty(dev))
Komurob8ab2dc2006-03-26 07:31:55 +09001639 make_mc_bits(ei_local->mcfilter, dev);
1640 } else {
1641 /* set to accept-all */
1642 memset(ei_local->mcfilter, 0xFF, 8);
1643 }
1644
Komurob8ab2dc2006-03-26 07:31:55 +09001645 outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
1646 for(i = 0; i < 8; i++)
1647 {
1648 outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i));
1649 }
1650 outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651
1652 if(dev->flags&IFF_PROMISC)
1653 outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR);
Jiri Pirko91fea582010-02-19 08:48:47 +00001654 else if (dev->flags & IFF_ALLMULTI || !netdev_mc_empty(dev))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655 outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR);
1656 else
1657 outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
Komurof9057032006-04-30 09:54:13 +09001658
1659 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001660}
1661
1662/*
1663 * Called without lock held. This is invoked from user context and may
1664 * be parallel to just about everything else. Its also fairly quick and
1665 * not called too often. Must protect against both bh and irq users
1666 */
1667
1668static void set_multicast_list(struct net_device *dev)
1669{
1670 unsigned long flags;
1671
1672 spin_lock_irqsave(&dev_lock(dev), flags);
1673 do_set_multicast_list(dev);
1674 spin_unlock_irqrestore(&dev_lock(dev), flags);
1675}
1676
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677/* This page of functions should be 8390 generic */
1678/* Follow National Semi's recommendations for initializing the "NIC". */
1679
1680/**
1681 * AX88190_init - initialize 8390 hardware
1682 * @dev: network device to initialize
1683 * @startp: boolean. non-zero value to initiate chip processing
1684 *
1685 * Must be called with lock held.
1686 */
1687
1688static void AX88190_init(struct net_device *dev, int startp)
1689{
1690 axnet_dev_t *info = PRIV(dev);
1691 long e8390_base = dev->base_addr;
1692 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1693 int i;
1694 int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
1695
1696 if(sizeof(struct e8390_pkt_hdr)!=4)
1697 panic("8390.c: header struct mispacked\n");
1698 /* Follow National Semi's recommendations for initing the DP83902. */
1699 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD); /* 0x21 */
1700 outb_p(endcfg, e8390_base + EN0_DCFG); /* 0x48 or 0x49 */
1701 /* Clear the remote byte count registers. */
1702 outb_p(0x00, e8390_base + EN0_RCNTLO);
1703 outb_p(0x00, e8390_base + EN0_RCNTHI);
1704 /* Set to monitor and loopback mode -- this is vital!. */
1705 outb_p(E8390_RXOFF|0x40, e8390_base + EN0_RXCR); /* 0x60 */
1706 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR); /* 0x02 */
1707 /* Set the transmit page and receive ring. */
1708 outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
1709 ei_local->tx1 = ei_local->tx2 = 0;
1710 outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
1711 outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY); /* 3c503 says 0x3f,NS0x26*/
1712 ei_local->current_page = ei_local->rx_start_page; /* assert boundary+1 */
1713 outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
1714 /* Clear the pending interrupts and mask. */
1715 outb_p(0xFF, e8390_base + EN0_ISR);
1716 outb_p(0x00, e8390_base + EN0_IMR);
1717
1718 /* Copy the station address into the DS8390 registers. */
1719
1720 outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD); /* 0x61 */
1721 for(i = 0; i < 6; i++)
1722 {
1723 outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
1724 if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
1725 printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
1726 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727
1728 outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
1729 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1730
1731 netif_start_queue(dev);
1732 ei_local->tx1 = ei_local->tx2 = 0;
1733 ei_local->txing = 0;
1734
Ken Kawasakiad3620a2009-04-04 14:49:07 +00001735 if (info->flags & IS_AX88790) /* select Internal PHY */
1736 outb(0x10, e8390_base + AXNET_GPIO);
1737
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738 if (startp)
1739 {
1740 outb_p(0xff, e8390_base + EN0_ISR);
1741 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1742 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1743 outb_p(E8390_TXCONFIG | info->duplex_flag,
1744 e8390_base + EN0_TXCR); /* xmit on. */
1745 /* 3c503 TechMan says rxconfig only after the NIC is started. */
1746 outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR); /* rx on, */
1747 do_set_multicast_list(dev); /* (re)load the mcast table */
1748 }
1749}
1750
1751/* Trigger a transmit start, assuming the length is valid.
1752 Always called with the page lock held */
1753
1754static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1755 int start_page)
1756{
1757 long e8390_base = dev->base_addr;
1758 struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev);
1759
1760 if (inb_p(e8390_base) & E8390_TRANS)
1761 {
1762 printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
1763 dev->name);
1764 return;
1765 }
1766 outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
1767 outb_p(length >> 8, e8390_base + EN0_TCNTHI);
1768 outb_p(start_page, e8390_base + EN0_TPSR);
1769 outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base+E8390_CMD);
1770}