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