]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/net/pcmcia/3c589_cs.c
pcmcia: move config_{base,index,regs} to struct pcmcia_device
[mirror_ubuntu-artful-kernel.git] / drivers / net / pcmcia / 3c589_cs.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A PCMCIA ethernet driver for the 3com 3c589 card.
f64e9697 4
1da177e4
LT
5 Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
6
7 3c589_cs.c 1.162 2001/10/13 00:08:50
8
9 The network driver code is based on Donald Becker's 3c589 code:
f64e9697 10
1da177e4
LT
11 Written 1994 by Donald Becker.
12 Copyright 1993 United States Government as represented by the
13 Director, National Security Agency. This software may be used and
14 distributed according to the terms of the GNU General Public License,
15 incorporated herein by reference.
16 Donald Becker may be reached at becker@scyld.com
f64e9697 17
113aa838 18 Updated for 2.5.x by Alan Cox <alan@lxorguk.ukuu.org.uk>
1da177e4
LT
19
20======================================================================*/
21
22#define DRV_NAME "3c589_cs"
23#define DRV_VERSION "1.162-ac"
24
25#include <linux/module.h>
26#include <linux/init.h>
27#include <linux/kernel.h>
28#include <linux/ptrace.h>
29#include <linux/slab.h>
30#include <linux/string.h>
31#include <linux/timer.h>
32#include <linux/interrupt.h>
33#include <linux/in.h>
34#include <linux/delay.h>
35#include <linux/ethtool.h>
36#include <linux/netdevice.h>
37#include <linux/etherdevice.h>
38#include <linux/skbuff.h>
39#include <linux/if_arp.h>
40#include <linux/ioport.h>
41#include <linux/bitops.h>
ff5688ae 42#include <linux/jiffies.h>
1da177e4 43
1da177e4
LT
44#include <pcmcia/cs.h>
45#include <pcmcia/cistpl.h>
46#include <pcmcia/cisreg.h>
47#include <pcmcia/ciscode.h>
48#include <pcmcia/ds.h>
49
50#include <asm/uaccess.h>
51#include <asm/io.h>
52#include <asm/system.h>
53
54/* To minimize the size of the driver source I only define operating
55 constants if they are used several times. You'll need the manual
56 if you want to understand driver details. */
57/* Offsets from base I/O address. */
58#define EL3_DATA 0x00
59#define EL3_TIMER 0x0a
60#define EL3_CMD 0x0e
61#define EL3_STATUS 0x0e
62
63#define EEPROM_READ 0x0080
64#define EEPROM_BUSY 0x8000
65
66#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
67
68/* The top five bits written to EL3_CMD are a command, the lower
69 11 bits are the parameter, if applicable. */
70enum c509cmd {
f64e9697
AK
71 TotalReset = 0<<11,
72 SelectWindow = 1<<11,
73 StartCoax = 2<<11,
74 RxDisable = 3<<11,
75 RxEnable = 4<<11,
76 RxReset = 5<<11,
77 RxDiscard = 8<<11,
78 TxEnable = 9<<11,
79 TxDisable = 10<<11,
80 TxReset = 11<<11,
81 FakeIntr = 12<<11,
82 AckIntr = 13<<11,
83 SetIntrEnb = 14<<11,
84 SetStatusEnb = 15<<11,
85 SetRxFilter = 16<<11,
86 SetRxThreshold = 17<<11,
87 SetTxThreshold = 18<<11,
88 SetTxStart = 19<<11,
89 StatsEnable = 21<<11,
90 StatsDisable = 22<<11,
91 StopCoax = 23<<11
1da177e4
LT
92};
93
94enum c509status {
f64e9697
AK
95 IntLatch = 0x0001,
96 AdapterFailure = 0x0002,
97 TxComplete = 0x0004,
98 TxAvailable = 0x0008,
99 RxComplete = 0x0010,
100 RxEarly = 0x0020,
101 IntReq = 0x0040,
102 StatsFull = 0x0080,
103 CmdBusy = 0x1000
1da177e4
LT
104};
105
106/* The SetRxFilter command accepts the following classes: */
107enum RxFilter {
f64e9697
AK
108 RxStation = 1,
109 RxMulticast = 2,
110 RxBroadcast = 4,
111 RxProm = 8
1da177e4
LT
112};
113
114/* Register window 1 offsets, the window used in normal operation. */
115#define TX_FIFO 0x00
116#define RX_FIFO 0x00
f64e9697
AK
117#define RX_STATUS 0x08
118#define TX_STATUS 0x0B
1da177e4
LT
119#define TX_FREE 0x0C /* Remaining free bytes in Tx buffer. */
120
121#define WN0_IRQ 0x08 /* Window 0: Set IRQ line in bits 12-15. */
122#define WN4_MEDIA 0x0A /* Window 4: Various transcvr/media bits. */
123#define MEDIA_TP 0x00C0 /* Enable link beat and jabber for 10baseT. */
124#define MEDIA_LED 0x0001 /* Enable link light on 3C589E cards. */
125
126/* Time in jiffies before concluding Tx hung */
127#define TX_TIMEOUT ((400*HZ)/1000)
128
129struct el3_private {
fd238232 130 struct pcmcia_device *p_dev;
f64e9697
AK
131 /* For transceiver monitoring */
132 struct timer_list media;
133 u16 media_status;
134 u16 fast_poll;
135 unsigned long last_irq;
136 spinlock_t lock;
1da177e4
LT
137};
138
21c0f275 139static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" };
1da177e4
LT
140
141/*====================================================================*/
142
143/* Module parameters */
144
145MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
146MODULE_DESCRIPTION("3Com 3c589 series PCMCIA ethernet driver");
147MODULE_LICENSE("GPL");
148
149#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
150
151/* Special hook for setting if_port when module is loaded */
152INT_MODULE_PARM(if_port, 0);
153
1da177e4
LT
154
155/*====================================================================*/
156
15b99ac1 157static int tc589_config(struct pcmcia_device *link);
fba395ee 158static void tc589_release(struct pcmcia_device *link);
1da177e4 159
906da809 160static u16 read_eeprom(unsigned int ioaddr, int index);
1da177e4
LT
161static void tc589_reset(struct net_device *dev);
162static void media_check(unsigned long arg);
163static int el3_config(struct net_device *dev, struct ifmap *map);
164static int el3_open(struct net_device *dev);
dbf02fae
SH
165static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
166 struct net_device *dev);
7d12e780 167static irqreturn_t el3_interrupt(int irq, void *dev_id);
1da177e4
LT
168static void update_stats(struct net_device *dev);
169static struct net_device_stats *el3_get_stats(struct net_device *dev);
170static int el3_rx(struct net_device *dev);
171static int el3_close(struct net_device *dev);
172static void el3_tx_timeout(struct net_device *dev);
e445bb4e 173static void set_rx_mode(struct net_device *dev);
1da177e4 174static void set_multicast_list(struct net_device *dev);
7282d491 175static const struct ethtool_ops netdev_ethtool_ops;
1da177e4 176
cc3b4866 177static void tc589_detach(struct pcmcia_device *p_dev);
1da177e4 178
1da177e4
LT
179/*======================================================================
180
181 tc589_attach() creates an "instance" of the driver, allocating
182 local data structures for one device. The device is registered
183 with Card Services.
184
185======================================================================*/
186
97161d4b 187static const struct net_device_ops el3_netdev_ops = {
f64e9697
AK
188 .ndo_open = el3_open,
189 .ndo_stop = el3_close,
97161d4b 190 .ndo_start_xmit = el3_start_xmit,
f64e9697 191 .ndo_tx_timeout = el3_tx_timeout,
97161d4b
SH
192 .ndo_set_config = el3_config,
193 .ndo_get_stats = el3_get_stats,
194 .ndo_set_multicast_list = set_multicast_list,
195 .ndo_change_mtu = eth_change_mtu,
f64e9697 196 .ndo_set_mac_address = eth_mac_addr,
97161d4b
SH
197 .ndo_validate_addr = eth_validate_addr,
198};
199
15b99ac1 200static int tc589_probe(struct pcmcia_device *link)
1da177e4
LT
201{
202 struct el3_private *lp;
1da177e4 203 struct net_device *dev;
1da177e4 204
dd0fab5b 205 dev_dbg(&link->dev, "3c589_attach()\n");
f8cfa618 206
1da177e4
LT
207 /* Create new ethernet device */
208 dev = alloc_etherdev(sizeof(struct el3_private));
209 if (!dev)
f8cfa618 210 return -ENOMEM;
1da177e4 211 lp = netdev_priv(dev);
1da177e4 212 link->priv = dev;
fba395ee 213 lp->p_dev = link;
1da177e4
LT
214
215 spin_lock_init(&lp->lock);
90abdc3b
DB
216 link->resource[0]->end = 16;
217 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
eb14120f 218
1da177e4 219 link->conf.Attributes = CONF_ENABLE_IRQ;
7feabb64 220 link->config_index = 1;
f8cfa618 221
97161d4b 222 dev->netdev_ops = &el3_netdev_ops;
1da177e4 223 dev->watchdog_timeo = TX_TIMEOUT;
97161d4b 224
1da177e4
LT
225 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
226
15b99ac1 227 return tc589_config(link);
1da177e4
LT
228} /* tc589_attach */
229
230/*======================================================================
231
232 This deletes a driver "instance". The device is de-registered
233 with Card Services. If it has been released, all local data
234 structures are freed. Otherwise, the structures will be freed
235 when the device is released.
236
237======================================================================*/
238
fba395ee 239static void tc589_detach(struct pcmcia_device *link)
1da177e4
LT
240{
241 struct net_device *dev = link->priv;
b4635811 242
dd0fab5b 243 dev_dbg(&link->dev, "3c589_detach\n");
1da177e4 244
c7c2fa07 245 unregister_netdev(dev);
1da177e4 246
e2d40963 247 tc589_release(link);
cc3b4866 248
1da177e4
LT
249 free_netdev(dev);
250} /* tc589_detach */
251
252/*======================================================================
253
254 tc589_config() is scheduled to run after a CARD_INSERTION event
255 is received, to configure the PCMCIA socket, and to make the
256 ethernet device available to the system.
f64e9697 257
1da177e4
LT
258======================================================================*/
259
15b99ac1 260static int tc589_config(struct pcmcia_device *link)
1da177e4 261{
1da177e4 262 struct net_device *dev = link->priv;
b1e247ad 263 __be16 *phys_addr;
dd0fab5b 264 int ret, i, j, multi = 0, fifo;
906da809 265 unsigned int ioaddr;
1da177e4 266 char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
dddfbd82
DB
267 u8 *buf;
268 size_t len;
f64e9697 269
dd0fab5b 270 dev_dbg(&link->dev, "3c589_config\n");
1da177e4 271
b1e247ad 272 phys_addr = (__be16 *)dev->dev_addr;
efd50585
DB
273 /* Is this a 3c562? */
274 if (link->manf_id != MANFID_3COM)
1da177e4
LT
275 printk(KERN_INFO "3c589_cs: hmmm, is this really a "
276 "3Com card??\n");
efd50585 277 multi = (link->card_id == PRODID_3COM_3C562);
1da177e4 278
90abdc3b
DB
279 link->io_lines = 16;
280
1da177e4 281 /* For the 3c562, the base address must be xx00-xx7f */
1da177e4
LT
282 for (i = j = 0; j < 0x400; j += 0x10) {
283 if (multi && (j & 0x80)) continue;
90abdc3b
DB
284 link->resource[0]->start = j ^ 0x300;
285 i = pcmcia_request_io(link);
4c89e88b
DB
286 if (i == 0)
287 break;
1da177e4 288 }
dd0fab5b 289 if (i != 0)
1da177e4 290 goto failed;
dd0fab5b 291
eb14120f 292 ret = pcmcia_request_irq(link, el3_interrupt);
dd0fab5b
DB
293 if (ret)
294 goto failed;
295
296 ret = pcmcia_request_configuration(link, &link->conf);
297 if (ret)
298 goto failed;
f64e9697 299
eb14120f 300 dev->irq = link->irq;
9a017a91 301 dev->base_addr = link->resource[0]->start;
1da177e4
LT
302 ioaddr = dev->base_addr;
303 EL3WINDOW(0);
304
305 /* The 3c589 has an extra EEPROM for configuration info, including
306 the hardware address. The 3c562 puts the address in the CIS. */
dddfbd82
DB
307 len = pcmcia_get_tuple(link, 0x88, &buf);
308 if (buf && len >= 6) {
309 for (i = 0; i < 3; i++)
310 phys_addr[i] = htons(le16_to_cpu(buf[i*2]));
311 kfree(buf);
1da177e4 312 } else {
dddfbd82 313 kfree(buf); /* 0 < len < 6 */
1da177e4
LT
314 for (i = 0; i < 3; i++)
315 phys_addr[i] = htons(read_eeprom(ioaddr, i));
b1e247ad 316 if (phys_addr[0] == htons(0x6060)) {
1da177e4
LT
317 printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"
318 "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
319 goto failed;
320 }
321 }
322
323 /* The address and resource configuration register aren't loaded from
324 the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. */
325 outw(0x3f00, ioaddr + 8);
326 fifo = inl(ioaddr);
327
328 /* The if_port symbol can be set when the module is loaded */
329 if ((if_port >= 0) && (if_port <= 3))
330 dev->if_port = if_port;
331 else
332 printk(KERN_ERR "3c589_cs: invalid if_port requested\n");
f64e9697 333
dd2e5a15 334 SET_NETDEV_DEV(dev, &link->dev);
1da177e4
LT
335
336 if (register_netdev(dev) != 0) {
337 printk(KERN_ERR "3c589_cs: register_netdev() failed\n");
1da177e4
LT
338 goto failed;
339 }
340
f64e9697
AK
341 netdev_info(dev, "3Com 3c%s, io %#3lx, irq %d, hw_addr %pM\n",
342 (multi ? "562" : "589"), dev->base_addr, dev->irq,
343 dev->dev_addr);
344 netdev_info(dev, " %dK FIFO split %s Rx:Tx, %s xcvr\n",
345 (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3],
346 if_names[dev->if_port]);
15b99ac1 347 return 0;
1da177e4 348
1da177e4
LT
349failed:
350 tc589_release(link);
15b99ac1 351 return -ENODEV;
1da177e4
LT
352} /* tc589_config */
353
354/*======================================================================
355
356 After a card is removed, tc589_release() will unregister the net
357 device, and release the PCMCIA configuration. If the device is
358 still open, this will be postponed until it is closed.
f64e9697 359
1da177e4
LT
360======================================================================*/
361
fba395ee 362static void tc589_release(struct pcmcia_device *link)
1da177e4 363{
fba395ee 364 pcmcia_disable_device(link);
1da177e4
LT
365}
366
fba395ee 367static int tc589_suspend(struct pcmcia_device *link)
98e4c28b 368{
98e4c28b
DB
369 struct net_device *dev = link->priv;
370
e2d40963 371 if (link->open)
8661bb5b 372 netif_device_detach(dev);
98e4c28b
DB
373
374 return 0;
375}
376
fba395ee 377static int tc589_resume(struct pcmcia_device *link)
98e4c28b 378{
98e4c28b
DB
379 struct net_device *dev = link->priv;
380
f64e9697 381 if (link->open) {
8661bb5b
DB
382 tc589_reset(dev);
383 netif_device_attach(dev);
98e4c28b
DB
384 }
385
386 return 0;
387}
388
1da177e4
LT
389/*====================================================================*/
390
391/*
392 Use this for commands that may take time to finish
393*/
394static void tc589_wait_for_completion(struct net_device *dev, int cmd)
395{
396 int i = 100;
397 outw(cmd, dev->base_addr + EL3_CMD);
398 while (--i > 0)
399 if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
400 if (i == 0)
f64e9697 401 netdev_warn(dev, "command 0x%04x did not complete!\n", cmd);
1da177e4
LT
402}
403
404/*
405 Read a word from the EEPROM using the regular EEPROM access register.
406 Assume that we are in register window zero.
407*/
906da809 408static u16 read_eeprom(unsigned int ioaddr, int index)
1da177e4
LT
409{
410 int i;
411 outw(EEPROM_READ + index, ioaddr + 10);
412 /* Reading the eeprom takes 162 us */
413 for (i = 1620; i >= 0; i--)
414 if ((inw(ioaddr + 10) & EEPROM_BUSY) == 0)
415 break;
416 return inw(ioaddr + 12);
417}
418
419/*
420 Set transceiver type, perhaps to something other than what the user
421 specified in dev->if_port.
422*/
423static void tc589_set_xcvr(struct net_device *dev, int if_port)
424{
425 struct el3_private *lp = netdev_priv(dev);
906da809 426 unsigned int ioaddr = dev->base_addr;
f64e9697 427
1da177e4
LT
428 EL3WINDOW(0);
429 switch (if_port) {
430 case 0: case 1: outw(0, ioaddr + 6); break;
431 case 2: outw(3<<14, ioaddr + 6); break;
432 case 3: outw(1<<14, ioaddr + 6); break;
433 }
434 /* On PCMCIA, this just turns on the LED */
435 outw((if_port == 2) ? StartCoax : StopCoax, ioaddr + EL3_CMD);
436 /* 10baseT interface, enable link beat and jabber check. */
437 EL3WINDOW(4);
438 outw(MEDIA_LED | ((if_port < 2) ? MEDIA_TP : 0), ioaddr + WN4_MEDIA);
439 EL3WINDOW(1);
440 if (if_port == 2)
441 lp->media_status = ((dev->if_port == 0) ? 0x8000 : 0x4000);
442 else
443 lp->media_status = ((dev->if_port == 0) ? 0x4010 : 0x8800);
444}
445
446static void dump_status(struct net_device *dev)
447{
906da809 448 unsigned int ioaddr = dev->base_addr;
1da177e4 449 EL3WINDOW(1);
f64e9697
AK
450 netdev_info(dev, " irq status %04x, rx status %04x, tx status %02x tx free %04x\n",
451 inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS),
452 inb(ioaddr+TX_STATUS), inw(ioaddr+TX_FREE));
1da177e4 453 EL3WINDOW(4);
f64e9697
AK
454 netdev_info(dev, " diagnostics: fifo %04x net %04x ethernet %04x media %04x\n",
455 inw(ioaddr+0x04), inw(ioaddr+0x06), inw(ioaddr+0x08),
456 inw(ioaddr+0x0a));
1da177e4
LT
457 EL3WINDOW(1);
458}
459
460/* Reset and restore all of the 3c589 registers. */
461static void tc589_reset(struct net_device *dev)
462{
906da809 463 unsigned int ioaddr = dev->base_addr;
1da177e4 464 int i;
f64e9697 465
1da177e4 466 EL3WINDOW(0);
f64e9697 467 outw(0x0001, ioaddr + 4); /* Activate board. */
1da177e4 468 outw(0x3f00, ioaddr + 8); /* Set the IRQ line. */
f64e9697 469
1da177e4
LT
470 /* Set the station address in window 2. */
471 EL3WINDOW(2);
472 for (i = 0; i < 6; i++)
473 outb(dev->dev_addr[i], ioaddr + i);
474
475 tc589_set_xcvr(dev, dev->if_port);
f64e9697 476
1da177e4
LT
477 /* Switch to the stats window, and clear all stats by reading. */
478 outw(StatsDisable, ioaddr + EL3_CMD);
479 EL3WINDOW(6);
480 for (i = 0; i < 9; i++)
481 inb(ioaddr+i);
482 inw(ioaddr + 10);
483 inw(ioaddr + 12);
f64e9697 484
1da177e4
LT
485 /* Switch to register set 1 for normal use. */
486 EL3WINDOW(1);
487
e445bb4e 488 set_rx_mode(dev);
1da177e4
LT
489 outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
490 outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
491 outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
492 /* Allow status bits to be seen. */
493 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
494 /* Ack all pending events, and set active indicator mask. */
495 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
496 ioaddr + EL3_CMD);
497 outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
498 | AdapterFailure, ioaddr + EL3_CMD);
499}
500
501static void netdev_get_drvinfo(struct net_device *dev,
502 struct ethtool_drvinfo *info)
503{
504 strcpy(info->driver, DRV_NAME);
505 strcpy(info->version, DRV_VERSION);
506 sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
507}
508
7282d491 509static const struct ethtool_ops netdev_ethtool_ops = {
1da177e4 510 .get_drvinfo = netdev_get_drvinfo,
1da177e4
LT
511};
512
513static int el3_config(struct net_device *dev, struct ifmap *map)
514{
515 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
516 if (map->port <= 3) {
517 dev->if_port = map->port;
f64e9697 518 netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
1da177e4
LT
519 tc589_set_xcvr(dev, dev->if_port);
520 } else
521 return -EINVAL;
522 }
523 return 0;
524}
525
526static int el3_open(struct net_device *dev)
527{
528 struct el3_private *lp = netdev_priv(dev);
fba395ee 529 struct pcmcia_device *link = lp->p_dev;
f64e9697 530
9940ec36 531 if (!pcmcia_dev_present(link))
1da177e4
LT
532 return -ENODEV;
533
534 link->open++;
535 netif_start_queue(dev);
f64e9697 536
1da177e4
LT
537 tc589_reset(dev);
538 init_timer(&lp->media);
539 lp->media.function = &media_check;
540 lp->media.data = (unsigned long) dev;
541 lp->media.expires = jiffies + HZ;
542 add_timer(&lp->media);
543
dd0fab5b 544 dev_dbg(&link->dev, "%s: opened, status %4.4x.\n",
1da177e4 545 dev->name, inw(dev->base_addr + EL3_STATUS));
f64e9697 546
1da177e4
LT
547 return 0;
548}
549
550static void el3_tx_timeout(struct net_device *dev)
551{
906da809 552 unsigned int ioaddr = dev->base_addr;
f64e9697
AK
553
554 netdev_warn(dev, "Transmit timed out!\n");
1da177e4 555 dump_status(dev);
cd65284f 556 dev->stats.tx_errors++;
1ae5dc34 557 dev->trans_start = jiffies; /* prevent tx timeout */
1da177e4
LT
558 /* Issue TX_RESET and TX_START commands. */
559 tc589_wait_for_completion(dev, TxReset);
560 outw(TxEnable, ioaddr + EL3_CMD);
561 netif_wake_queue(dev);
562}
563
564static void pop_tx_status(struct net_device *dev)
565{
906da809 566 unsigned int ioaddr = dev->base_addr;
1da177e4 567 int i;
f64e9697 568
1da177e4
LT
569 /* Clear the Tx status stack. */
570 for (i = 32; i > 0; i--) {
571 u_char tx_status = inb(ioaddr + TX_STATUS);
572 if (!(tx_status & 0x84)) break;
573 /* reset transmitter on jabber error or underrun */
574 if (tx_status & 0x30)
f64e9697 575 tc589_wait_for_completion(dev, TxReset);
1da177e4 576 if (tx_status & 0x38) {
f64e9697
AK
577 netdev_dbg(dev, "transmit error: status 0x%02x\n", tx_status);
578 outw(TxEnable, ioaddr + EL3_CMD);
579 dev->stats.tx_aborted_errors++;
1da177e4
LT
580 }
581 outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
582 }
583}
584
dbf02fae
SH
585static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
586 struct net_device *dev)
1da177e4 587{
906da809 588 unsigned int ioaddr = dev->base_addr;
1da177e4 589 struct el3_private *priv = netdev_priv(dev);
d08d2839 590 unsigned long flags;
1da177e4 591
f64e9697
AK
592 netdev_dbg(dev, "el3_start_xmit(length = %ld) called, status %4.4x.\n",
593 (long)skb->len, inw(ioaddr + EL3_STATUS));
1da177e4 594
f64e9697 595 spin_lock_irqsave(&priv->lock, flags);
d08d2839 596
cd65284f 597 dev->stats.tx_bytes += skb->len;
1da177e4
LT
598
599 /* Put out the doubleword header... */
600 outw(skb->len, ioaddr + TX_FIFO);
601 outw(0x00, ioaddr + TX_FIFO);
602 /* ... and the packet rounded to a doubleword. */
603 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
604
1da177e4
LT
605 if (inw(ioaddr + TX_FREE) <= 1536) {
606 netif_stop_queue(dev);
607 /* Interrupt us when the FIFO has room for max-sized packet. */
608 outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
609 }
610
1da177e4 611 pop_tx_status(dev);
f64e9697 612 spin_unlock_irqrestore(&priv->lock, flags);
63ac9b91 613 dev_kfree_skb(skb);
f64e9697 614
6ed10654 615 return NETDEV_TX_OK;
1da177e4
LT
616}
617
618/* The EL3 interrupt handler. */
7d12e780 619static irqreturn_t el3_interrupt(int irq, void *dev_id)
1da177e4
LT
620{
621 struct net_device *dev = (struct net_device *) dev_id;
622 struct el3_private *lp = netdev_priv(dev);
906da809 623 unsigned int ioaddr;
1da177e4
LT
624 __u16 status;
625 int i = 0, handled = 1;
f64e9697 626
1da177e4
LT
627 if (!netif_device_present(dev))
628 return IRQ_NONE;
629
630 ioaddr = dev->base_addr;
631
f64e9697 632 netdev_dbg(dev, "interrupt, status %4.4x.\n", inw(ioaddr + EL3_STATUS));
1da177e4 633
f64e9697 634 spin_lock(&lp->lock);
1da177e4
LT
635 while ((status = inw(ioaddr + EL3_STATUS)) &
636 (IntLatch | RxComplete | StatsFull)) {
637 if ((status & 0xe000) != 0x2000) {
f64e9697
AK
638 netdev_dbg(dev, "interrupt from dead card\n");
639 handled = 0;
640 break;
1da177e4 641 }
1da177e4 642 if (status & RxComplete)
f64e9697 643 el3_rx(dev);
1da177e4 644 if (status & TxAvailable) {
f64e9697
AK
645 netdev_dbg(dev, " TX room bit was handled.\n");
646 /* There's room in the FIFO for a full-sized packet. */
647 outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
648 netif_wake_queue(dev);
1da177e4 649 }
1da177e4 650 if (status & TxComplete)
f64e9697 651 pop_tx_status(dev);
1da177e4
LT
652 if (status & (AdapterFailure | RxEarly | StatsFull)) {
653 /* Handle all uncommon interrupts. */
654 if (status & StatsFull) /* Empty statistics. */
655 update_stats(dev);
656 if (status & RxEarly) { /* Rx early is unused. */
657 el3_rx(dev);
658 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
659 }
660 if (status & AdapterFailure) {
661 u16 fifo_diag;
662 EL3WINDOW(4);
663 fifo_diag = inw(ioaddr + 4);
664 EL3WINDOW(1);
f64e9697
AK
665 netdev_warn(dev, "adapter failure, FIFO diagnostic register %04x.\n",
666 fifo_diag);
1da177e4
LT
667 if (fifo_diag & 0x0400) {
668 /* Tx overrun */
669 tc589_wait_for_completion(dev, TxReset);
670 outw(TxEnable, ioaddr + EL3_CMD);
671 }
672 if (fifo_diag & 0x2000) {
673 /* Rx underrun */
674 tc589_wait_for_completion(dev, RxReset);
e445bb4e 675 set_rx_mode(dev);
1da177e4
LT
676 outw(RxEnable, ioaddr + EL3_CMD);
677 }
678 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
679 }
680 }
1da177e4 681 if (++i > 10) {
f64e9697
AK
682 netdev_err(dev, "infinite loop in interrupt, status %4.4x.\n",
683 status);
684 /* Clear all interrupts */
685 outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
686 break;
1da177e4
LT
687 }
688 /* Acknowledge the IRQ. */
689 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
690 }
1da177e4 691 lp->last_irq = jiffies;
f64e9697
AK
692 spin_unlock(&lp->lock);
693 netdev_dbg(dev, "exiting interrupt, status %4.4x.\n",
694 inw(ioaddr + EL3_STATUS));
1da177e4
LT
695 return IRQ_RETVAL(handled);
696}
697
698static void media_check(unsigned long arg)
699{
700 struct net_device *dev = (struct net_device *)(arg);
701 struct el3_private *lp = netdev_priv(dev);
906da809 702 unsigned int ioaddr = dev->base_addr;
1da177e4
LT
703 u16 media, errs;
704 unsigned long flags;
705
706 if (!netif_device_present(dev)) goto reschedule;
707
1da177e4
LT
708 /* Check for pending interrupt with expired latency timer: with
709 this, we can limp along even if the interrupt is blocked */
710 if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
711 (inb(ioaddr + EL3_TIMER) == 0xff)) {
712 if (!lp->fast_poll)
f64e9697 713 netdev_warn(dev, "interrupt(s) dropped!\n");
671c8806
KK
714
715 local_irq_save(flags);
d08d2839 716 el3_interrupt(dev->irq, dev);
671c8806
KK
717 local_irq_restore(flags);
718
1da177e4
LT
719 lp->fast_poll = HZ;
720 }
721 if (lp->fast_poll) {
722 lp->fast_poll--;
723 lp->media.expires = jiffies + HZ/100;
724 add_timer(&lp->media);
725 return;
726 }
727
728 /* lp->lock guards the EL3 window. Window should always be 1 except
729 when the lock is held */
f64e9697 730 spin_lock_irqsave(&lp->lock, flags);
1da177e4
LT
731 EL3WINDOW(4);
732 media = inw(ioaddr+WN4_MEDIA) & 0xc810;
733
734 /* Ignore collisions unless we've had no irq's recently */
ff5688ae 735 if (time_before(jiffies, lp->last_irq + HZ)) {
1da177e4
LT
736 media &= ~0x0010;
737 } else {
738 /* Try harder to detect carrier errors */
739 EL3WINDOW(6);
740 outw(StatsDisable, ioaddr + EL3_CMD);
741 errs = inb(ioaddr + 0);
742 outw(StatsEnable, ioaddr + EL3_CMD);
cd65284f 743 dev->stats.tx_carrier_errors += errs;
1da177e4
LT
744 if (errs || (lp->media_status & 0x0010)) media |= 0x0010;
745 }
746
747 if (media != lp->media_status) {
748 if ((media & lp->media_status & 0x8000) &&
749 ((lp->media_status ^ media) & 0x0800))
f64e9697
AK
750 netdev_info(dev, "%s link beat\n",
751 (lp->media_status & 0x0800 ? "lost" : "found"));
1da177e4
LT
752 else if ((media & lp->media_status & 0x4000) &&
753 ((lp->media_status ^ media) & 0x0010))
f64e9697
AK
754 netdev_info(dev, "coax cable %s\n",
755 (lp->media_status & 0x0010 ? "ok" : "problem"));
1da177e4
LT
756 if (dev->if_port == 0) {
757 if (media & 0x8000) {
758 if (media & 0x0800)
f64e9697 759 netdev_info(dev, "flipped to 10baseT\n");
1da177e4 760 else
f64e9697 761 tc589_set_xcvr(dev, 2);
1da177e4
LT
762 } else if (media & 0x4000) {
763 if (media & 0x0010)
764 tc589_set_xcvr(dev, 1);
765 else
f64e9697 766 netdev_info(dev, "flipped to 10base2\n");
1da177e4
LT
767 }
768 }
769 lp->media_status = media;
770 }
f64e9697 771
1da177e4 772 EL3WINDOW(1);
f64e9697 773 spin_unlock_irqrestore(&lp->lock, flags);
1da177e4
LT
774
775reschedule:
776 lp->media.expires = jiffies + HZ;
777 add_timer(&lp->media);
778}
779
780static struct net_device_stats *el3_get_stats(struct net_device *dev)
781{
782 struct el3_private *lp = netdev_priv(dev);
783 unsigned long flags;
fba395ee 784 struct pcmcia_device *link = lp->p_dev;
1da177e4 785
9940ec36 786 if (pcmcia_dev_present(link)) {
f64e9697 787 spin_lock_irqsave(&lp->lock, flags);
1da177e4
LT
788 update_stats(dev);
789 spin_unlock_irqrestore(&lp->lock, flags);
790 }
cd65284f 791 return &dev->stats;
1da177e4
LT
792}
793
794/*
795 Update statistics. We change to register window 6, so this should be run
796 single-threaded if the device is active. This is expected to be a rare
797 operation, and it's simpler for the rest of the driver to assume that
798 window 1 is always valid rather than use a special window-state variable.
f64e9697 799
1da177e4
LT
800 Caller must hold the lock for this
801*/
802static void update_stats(struct net_device *dev)
803{
906da809 804 unsigned int ioaddr = dev->base_addr;
1da177e4 805
f64e9697 806 netdev_dbg(dev, "updating the statistics.\n");
1da177e4
LT
807 /* Turn off statistics updates while reading. */
808 outw(StatsDisable, ioaddr + EL3_CMD);
809 /* Switch to the stats window, and read everything. */
810 EL3WINDOW(6);
f64e9697 811 dev->stats.tx_carrier_errors += inb(ioaddr + 0);
cd65284f 812 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1);
f64e9697 813 /* Multiple collisions. */ inb(ioaddr + 2);
cd65284f
PZ
814 dev->stats.collisions += inb(ioaddr + 3);
815 dev->stats.tx_window_errors += inb(ioaddr + 4);
816 dev->stats.rx_fifo_errors += inb(ioaddr + 5);
817 dev->stats.tx_packets += inb(ioaddr + 6);
1da177e4
LT
818 /* Rx packets */ inb(ioaddr + 7);
819 /* Tx deferrals */ inb(ioaddr + 8);
820 /* Rx octets */ inw(ioaddr + 10);
821 /* Tx octets */ inw(ioaddr + 12);
f64e9697 822
1da177e4
LT
823 /* Back to window 1, and turn statistics back on. */
824 EL3WINDOW(1);
825 outw(StatsEnable, ioaddr + EL3_CMD);
826}
827
828static int el3_rx(struct net_device *dev)
829{
906da809 830 unsigned int ioaddr = dev->base_addr;
1da177e4
LT
831 int worklimit = 32;
832 short rx_status;
f64e9697
AK
833
834 netdev_dbg(dev, "in rx_packet(), status %4.4x, rx_status %4.4x.\n",
835 inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
1da177e4 836 while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
b9bdcd9b
RK
837 worklimit > 0) {
838 worklimit--;
1da177e4
LT
839 if (rx_status & 0x4000) { /* Error, update stats. */
840 short error = rx_status & 0x3800;
cd65284f 841 dev->stats.rx_errors++;
1da177e4 842 switch (error) {
cd65284f
PZ
843 case 0x0000: dev->stats.rx_over_errors++; break;
844 case 0x0800: dev->stats.rx_length_errors++; break;
845 case 0x1000: dev->stats.rx_frame_errors++; break;
846 case 0x1800: dev->stats.rx_length_errors++; break;
847 case 0x2000: dev->stats.rx_frame_errors++; break;
848 case 0x2800: dev->stats.rx_crc_errors++; break;
1da177e4
LT
849 }
850 } else {
851 short pkt_len = rx_status & 0x7ff;
852 struct sk_buff *skb;
f64e9697 853
1da177e4 854 skb = dev_alloc_skb(pkt_len+5);
f64e9697
AK
855
856 netdev_dbg(dev, " Receiving packet size %d status %4.4x.\n",
857 pkt_len, rx_status);
1da177e4 858 if (skb != NULL) {
1da177e4
LT
859 skb_reserve(skb, 2);
860 insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
861 (pkt_len+3)>>2);
862 skb->protocol = eth_type_trans(skb, dev);
863 netif_rx(skb);
cd65284f
PZ
864 dev->stats.rx_packets++;
865 dev->stats.rx_bytes += pkt_len;
1da177e4 866 } else {
f64e9697
AK
867 netdev_dbg(dev, "couldn't allocate a sk_buff of size %d.\n",
868 pkt_len);
cd65284f 869 dev->stats.rx_dropped++;
1da177e4
LT
870 }
871 }
872 /* Pop the top of the Rx FIFO */
873 tc589_wait_for_completion(dev, RxDiscard);
874 }
875 if (worklimit == 0)
f64e9697 876 netdev_warn(dev, "too much work in el3_rx!\n");
1da177e4
LT
877 return 0;
878}
879
e445bb4e 880static void set_rx_mode(struct net_device *dev)
1da177e4 881{
906da809 882 unsigned int ioaddr = dev->base_addr;
1da177e4
LT
883 u16 opts = SetRxFilter | RxStation | RxBroadcast;
884
1da177e4
LT
885 if (dev->flags & IFF_PROMISC)
886 opts |= RxMulticast | RxProm;
4cd24eaf 887 else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI))
1da177e4
LT
888 opts |= RxMulticast;
889 outw(opts, ioaddr + EL3_CMD);
890}
891
e445bb4e
KK
892static void set_multicast_list(struct net_device *dev)
893{
894 struct el3_private *priv = netdev_priv(dev);
895 unsigned long flags;
896
897 spin_lock_irqsave(&priv->lock, flags);
898 set_rx_mode(dev);
899 spin_unlock_irqrestore(&priv->lock, flags);
900}
901
1da177e4
LT
902static int el3_close(struct net_device *dev)
903{
904 struct el3_private *lp = netdev_priv(dev);
fba395ee 905 struct pcmcia_device *link = lp->p_dev;
906da809 906 unsigned int ioaddr = dev->base_addr;
f64e9697 907
dd0fab5b 908 dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
1da177e4 909
9940ec36 910 if (pcmcia_dev_present(link)) {
cd65284f 911 /* Turn off statistics ASAP. We update dev->stats below. */
1da177e4 912 outw(StatsDisable, ioaddr + EL3_CMD);
f64e9697 913
1da177e4
LT
914 /* Disable the receiver and transmitter. */
915 outw(RxDisable, ioaddr + EL3_CMD);
916 outw(TxDisable, ioaddr + EL3_CMD);
f64e9697 917
1da177e4
LT
918 if (dev->if_port == 2)
919 /* Turn off thinnet power. Green! */
920 outw(StopCoax, ioaddr + EL3_CMD);
921 else if (dev->if_port == 1) {
922 /* Disable link beat and jabber */
923 EL3WINDOW(4);
924 outw(0, ioaddr + WN4_MEDIA);
925 }
f64e9697 926
1da177e4
LT
927 /* Switching back to window 0 disables the IRQ. */
928 EL3WINDOW(0);
929 /* But we explicitly zero the IRQ line select anyway. */
930 outw(0x0f00, ioaddr + WN0_IRQ);
f64e9697 931
1da177e4
LT
932 /* Check if the card still exists */
933 if ((inw(ioaddr+EL3_STATUS) & 0xe000) == 0x2000)
934 update_stats(dev);
935 }
936
937 link->open--;
938 netif_stop_queue(dev);
939 del_timer_sync(&lp->media);
f64e9697 940
1da177e4
LT
941 return 0;
942}
943
7ffec58c
DB
944static struct pcmcia_device_id tc589_ids[] = {
945 PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0101, 0x0562),
946 PCMCIA_MFC_DEVICE_PROD_ID1(0, "Motorola MARQUIS", 0xf03e4e77),
947 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0589),
948 PCMCIA_DEVICE_PROD_ID12("Farallon", "ENet", 0x58d93fc4, 0x992c2202),
f0a3a153
KK
949 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0035, "cis/3CXEM556.cis"),
950 PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x003d, "cis/3CXEM556.cis"),
7ffec58c
DB
951 PCMCIA_DEVICE_NULL,
952};
953MODULE_DEVICE_TABLE(pcmcia, tc589_ids);
954
1da177e4
LT
955static struct pcmcia_driver tc589_driver = {
956 .owner = THIS_MODULE,
957 .drv = {
958 .name = "3c589_cs",
959 },
15b99ac1 960 .probe = tc589_probe,
cc3b4866 961 .remove = tc589_detach,
f64e9697 962 .id_table = tc589_ids,
98e4c28b
DB
963 .suspend = tc589_suspend,
964 .resume = tc589_resume,
1da177e4
LT
965};
966
967static int __init init_tc589(void)
968{
969 return pcmcia_register_driver(&tc589_driver);
970}
971
972static void __exit exit_tc589(void)
973{
974 pcmcia_unregister_driver(&tc589_driver);
1da177e4
LT
975}
976
977module_init(init_tc589);
978module_exit(exit_tc589);