[PATCH] pcmcia: embed dev_link_t into struct pcmcia_device
[safe/jmp/linux-2.6] / drivers / net / pcmcia / pcnet_cs.c
1 /*======================================================================
2
3     A PCMCIA ethernet driver for NS8390-based cards
4
5     This driver supports the D-Link DE-650 and Linksys EthernetCard
6     cards, the newer D-Link and Linksys combo cards, Accton EN2212
7     cards, the RPTI EP400, and the PreMax PE-200 in non-shared-memory
8     mode, and the IBM Credit Card Adapter, the NE4100, the Thomas
9     Conrad ethernet card, and the Kingston KNE-PCM/x in shared-memory
10     mode.  It will also handle the Socket EA card in either mode.
11
12     Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
13
14     pcnet_cs.c 1.153 2003/11/09 18:53:09
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     Based also on Keith Moore's changes to Don Becker's code, for IBM
26     CCAE support.  Drivers merged back together, and shared-memory
27     Socket EA support added, by Ken Raeburn, September 1995.
28
29 ======================================================================*/
30
31 #include <linux/kernel.h>
32 #include <linux/module.h>
33 #include <linux/init.h>
34 #include <linux/ptrace.h>
35 #include <linux/slab.h>
36 #include <linux/string.h>
37 #include <linux/timer.h>
38 #include <linux/delay.h>
39 #include <linux/ethtool.h>
40 #include <linux/netdevice.h>
41 #include <../drivers/net/8390.h>
42
43 #include <pcmcia/cs_types.h>
44 #include <pcmcia/cs.h>
45 #include <pcmcia/cistpl.h>
46 #include <pcmcia/ciscode.h>
47 #include <pcmcia/ds.h>
48 #include <pcmcia/cisreg.h>
49
50 #include <asm/io.h>
51 #include <asm/system.h>
52 #include <asm/byteorder.h>
53 #include <asm/uaccess.h>
54
55 #define PCNET_CMD       0x00
56 #define PCNET_DATAPORT  0x10    /* NatSemi-defined port window offset. */
57 #define PCNET_RESET     0x1f    /* Issue a read to reset, a write to clear. */
58 #define PCNET_MISC      0x18    /* For IBM CCAE and Socket EA cards */
59
60 #define PCNET_START_PG  0x40    /* First page of TX buffer */
61 #define PCNET_STOP_PG   0x80    /* Last page +1 of RX ring */
62
63 /* Socket EA cards have a larger packet buffer */
64 #define SOCKET_START_PG 0x01
65 #define SOCKET_STOP_PG  0xff
66
67 #define PCNET_RDC_TIMEOUT (2*HZ/100)    /* Max wait in jiffies for Tx RDC */
68
69 static const char *if_names[] = { "auto", "10baseT", "10base2"};
70
71 #ifdef PCMCIA_DEBUG
72 static int pc_debug = PCMCIA_DEBUG;
73 module_param(pc_debug, int, 0);
74 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
75 static char *version =
76 "pcnet_cs.c 1.153 2003/11/09 18:53:09 (David Hinds)";
77 #else
78 #define DEBUG(n, args...)
79 #endif
80
81 /*====================================================================*/
82
83 /* Module parameters */
84
85 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
86 MODULE_DESCRIPTION("NE2000 compatible PCMCIA ethernet driver");
87 MODULE_LICENSE("GPL");
88
89 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
90
91 INT_MODULE_PARM(if_port,        1);     /* Transceiver type */
92 INT_MODULE_PARM(use_big_buf,    1);     /* use 64K packet buffer? */
93 INT_MODULE_PARM(mem_speed,      0);     /* shared mem speed, in ns */
94 INT_MODULE_PARM(delay_output,   0);     /* pause after xmit? */
95 INT_MODULE_PARM(delay_time,     4);     /* in usec */
96 INT_MODULE_PARM(use_shmem,      -1);    /* use shared memory? */
97 INT_MODULE_PARM(full_duplex,    0);     /* full duplex? */
98
99 /* Ugh!  Let the user hardwire the hardware address for queer cards */
100 static int hw_addr[6] = { 0, /* ... */ };
101 module_param_array(hw_addr, int, NULL, 0);
102
103 /*====================================================================*/
104
105 static void mii_phy_probe(struct net_device *dev);
106 static void pcnet_config(dev_link_t *link);
107 static void pcnet_release(dev_link_t *link);
108 static int pcnet_open(struct net_device *dev);
109 static int pcnet_close(struct net_device *dev);
110 static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
111 static struct ethtool_ops netdev_ethtool_ops;
112 static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs);
113 static void ei_watchdog(u_long arg);
114 static void pcnet_reset_8390(struct net_device *dev);
115 static int set_config(struct net_device *dev, struct ifmap *map);
116 static int setup_shmem_window(dev_link_t *link, int start_pg,
117                               int stop_pg, int cm_offset);
118 static int setup_dma_config(dev_link_t *link, int start_pg,
119                             int stop_pg);
120
121 static void pcnet_detach(struct pcmcia_device *p_dev);
122
123 static dev_info_t dev_info = "pcnet_cs";
124
125 /*====================================================================*/
126
127 typedef struct hw_info_t {
128     u_int       offset;
129     u_char      a0, a1, a2;
130     u_int       flags;
131 } hw_info_t;
132
133 #define DELAY_OUTPUT    0x01
134 #define HAS_MISC_REG    0x02
135 #define USE_BIG_BUF     0x04
136 #define HAS_IBM_MISC    0x08
137 #define IS_DL10019      0x10
138 #define IS_DL10022      0x20
139 #define HAS_MII         0x40
140 #define USE_SHMEM       0x80    /* autodetected */
141
142 #define AM79C9XX_HOME_PHY       0x00006B90  /* HomePNA PHY */
143 #define AM79C9XX_ETH_PHY        0x00006B70  /* 10baseT PHY */
144 #define MII_PHYID_REV_MASK      0xfffffff0
145 #define MII_PHYID_REG1          0x02
146 #define MII_PHYID_REG2          0x03
147
148 static hw_info_t hw_info[] = {
149     { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT }, 
150     { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 },
151     { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 },
152     { /* ASANTE FriendlyNet */ 0x4910, 0x00, 0x00, 0x94,
153       DELAY_OUTPUT | HAS_IBM_MISC },
154     { /* Danpex EN-6200P2 */ 0x0110, 0x00, 0x40, 0xc7, 0 },
155     { /* DataTrek NetCard */ 0x0ff0, 0x00, 0x20, 0xe8, 0 },
156     { /* Dayna CommuniCard E */ 0x0110, 0x00, 0x80, 0x19, 0 },
157     { /* D-Link DE-650 */ 0x0040, 0x00, 0x80, 0xc8, 0 },
158     { /* EP-210 Ethernet */ 0x0110, 0x00, 0x40, 0x33, 0 },
159     { /* EP4000 Ethernet */ 0x01c0, 0x00, 0x00, 0xb4, 0 },
160     { /* Epson EEN10B */ 0x0ff0, 0x00, 0x00, 0x48,
161       HAS_MISC_REG | HAS_IBM_MISC },
162     { /* ELECOM Laneed LD-CDWA */ 0xb8, 0x08, 0x00, 0x42, 0 },
163     { /* Hypertec Ethernet */ 0x01c0, 0x00, 0x40, 0x4c, 0 },
164     { /* IBM CCAE */ 0x0ff0, 0x08, 0x00, 0x5a,
165       HAS_MISC_REG | HAS_IBM_MISC },
166     { /* IBM CCAE */ 0x0ff0, 0x00, 0x04, 0xac,
167       HAS_MISC_REG | HAS_IBM_MISC },
168     { /* IBM CCAE */ 0x0ff0, 0x00, 0x06, 0x29,
169       HAS_MISC_REG | HAS_IBM_MISC },
170     { /* IBM FME */ 0x0374, 0x08, 0x00, 0x5a,
171       HAS_MISC_REG | HAS_IBM_MISC },
172     { /* IBM FME */ 0x0374, 0x00, 0x04, 0xac,
173       HAS_MISC_REG | HAS_IBM_MISC },
174     { /* Kansai KLA-PCM/T */ 0x0ff0, 0x00, 0x60, 0x87,
175       HAS_MISC_REG | HAS_IBM_MISC },
176     { /* NSC DP83903 */ 0x0374, 0x08, 0x00, 0x17,
177       HAS_MISC_REG | HAS_IBM_MISC },
178     { /* NSC DP83903 */ 0x0374, 0x00, 0xc0, 0xa8,
179       HAS_MISC_REG | HAS_IBM_MISC },
180     { /* NSC DP83903 */ 0x0374, 0x00, 0xa0, 0xb0,
181       HAS_MISC_REG | HAS_IBM_MISC },
182     { /* NSC DP83903 */ 0x0198, 0x00, 0x20, 0xe0,
183       HAS_MISC_REG | HAS_IBM_MISC },
184     { /* I-O DATA PCLA/T */ 0x0ff0, 0x00, 0xa0, 0xb0, 0 },
185     { /* Katron PE-520 */ 0x0110, 0x00, 0x40, 0xf6, 0 },
186     { /* Kingston KNE-PCM/x */ 0x0ff0, 0x00, 0xc0, 0xf0,
187       HAS_MISC_REG | HAS_IBM_MISC },
188     { /* Kingston KNE-PCM/x */ 0x0ff0, 0xe2, 0x0c, 0x0f,
189       HAS_MISC_REG | HAS_IBM_MISC },
190     { /* Kingston KNE-PC2 */ 0x0180, 0x00, 0xc0, 0xf0, 0 },
191     { /* Maxtech PCN2000 */ 0x5000, 0x00, 0x00, 0xe8, 0 },
192     { /* NDC Instant-Link */ 0x003a, 0x00, 0x80, 0xc6, 0 },
193     { /* NE2000 Compatible */ 0x0ff0, 0x00, 0xa0, 0x0c, 0 },
194     { /* Network General Sniffer */ 0x0ff0, 0x00, 0x00, 0x65,
195       HAS_MISC_REG | HAS_IBM_MISC },
196     { /* Panasonic VEL211 */ 0x0ff0, 0x00, 0x80, 0x45, 
197       HAS_MISC_REG | HAS_IBM_MISC },
198     { /* PreMax PE-200 */ 0x07f0, 0x00, 0x20, 0xe0, 0 },
199     { /* RPTI EP400 */ 0x0110, 0x00, 0x40, 0x95, 0 },
200     { /* SCM Ethernet */ 0x0ff0, 0x00, 0x20, 0xcb, 0 },
201     { /* Socket EA */ 0x4000, 0x00, 0xc0, 0x1b,
202       DELAY_OUTPUT | HAS_MISC_REG | USE_BIG_BUF },
203     { /* Socket LP-E CF+ */ 0x01c0, 0x00, 0xc0, 0x1b, 0 },
204     { /* SuperSocket RE450T */ 0x0110, 0x00, 0xe0, 0x98, 0 },
205     { /* Volktek NPL-402CT */ 0x0060, 0x00, 0x40, 0x05, 0 },
206     { /* NEC PC-9801N-J12 */ 0x0ff0, 0x00, 0x00, 0x4c, 0 },
207     { /* PCMCIA Technology OEM */ 0x01c8, 0x00, 0xa0, 0x0c, 0 }
208 };
209
210 #define NR_INFO         (sizeof(hw_info)/sizeof(hw_info_t))
211
212 static hw_info_t default_info = { 0, 0, 0, 0, 0 };
213 static hw_info_t dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII };
214 static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII };
215
216 typedef struct pcnet_dev_t {
217         struct pcmcia_device    *p_dev;
218     dev_node_t          node;
219     u_int               flags;
220     void                __iomem *base;
221     struct timer_list   watchdog;
222     int                 stale, fast_poll;
223     u_char              phy_id;
224     u_char              eth_phy, pna_phy;
225     u_short             link_status;
226     u_long              mii_reset;
227 } pcnet_dev_t;
228
229 static inline pcnet_dev_t *PRIV(struct net_device *dev)
230 {
231         char *p = netdev_priv(dev);
232         return (pcnet_dev_t *)(p + sizeof(struct ei_device));
233 }
234
235 /*======================================================================
236
237     pcnet_attach() creates an "instance" of the driver, allocating
238     local data structures for one device.  The device is registered
239     with Card Services.
240
241 ======================================================================*/
242
243 static int pcnet_probe(struct pcmcia_device *p_dev)
244 {
245     pcnet_dev_t *info;
246     struct net_device *dev;
247     dev_link_t *link = dev_to_instance(p_dev);
248
249     DEBUG(0, "pcnet_attach()\n");
250
251     /* Create new ethernet device */
252     dev = __alloc_ei_netdev(sizeof(pcnet_dev_t));
253     if (!dev) return -ENOMEM;
254     info = PRIV(dev);
255     info->p_dev = p_dev;
256     link->priv = dev;
257
258     link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
259     link->irq.IRQInfo1 = IRQ_LEVEL_ID;
260     link->conf.Attributes = CONF_ENABLE_IRQ;
261     link->conf.IntType = INT_MEMORY_AND_IO;
262
263     SET_MODULE_OWNER(dev);
264     dev->open = &pcnet_open;
265     dev->stop = &pcnet_close;
266     dev->set_config = &set_config;
267
268     link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
269     pcnet_config(link);
270
271     return 0;
272 } /* pcnet_attach */
273
274 /*======================================================================
275
276     This deletes a driver "instance".  The device is de-registered
277     with Card Services.  If it has been released, all local data
278     structures are freed.  Otherwise, the structures will be freed
279     when the device is released.
280
281 ======================================================================*/
282
283 static void pcnet_detach(struct pcmcia_device *p_dev)
284 {
285         dev_link_t *link = dev_to_instance(p_dev);
286         struct net_device *dev = link->priv;
287
288         DEBUG(0, "pcnet_detach(0x%p)\n", link);
289
290         if (link->dev_node)
291                 unregister_netdev(dev);
292
293         if (link->state & DEV_CONFIG)
294                 pcnet_release(link);
295
296         free_netdev(dev);
297 } /* pcnet_detach */
298
299 /*======================================================================
300
301     This probes for a card's hardware address, for card types that
302     encode this information in their CIS.
303
304 ======================================================================*/
305
306 static hw_info_t *get_hwinfo(dev_link_t *link)
307 {
308     struct net_device *dev = link->priv;
309     win_req_t req;
310     memreq_t mem;
311     u_char __iomem *base, *virt;
312     int i, j;
313
314     /* Allocate a small memory window */
315     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
316     req.Base = 0; req.Size = 0;
317     req.AccessSpeed = 0;
318     i = pcmcia_request_window(&link->handle, &req, &link->win);
319     if (i != CS_SUCCESS) {
320         cs_error(link->handle, RequestWindow, i);
321         return NULL;
322     }
323
324     virt = ioremap(req.Base, req.Size);
325     mem.Page = 0;
326     for (i = 0; i < NR_INFO; i++) {
327         mem.CardOffset = hw_info[i].offset & ~(req.Size-1);
328         pcmcia_map_mem_page(link->win, &mem);
329         base = &virt[hw_info[i].offset & (req.Size-1)];
330         if ((readb(base+0) == hw_info[i].a0) &&
331             (readb(base+2) == hw_info[i].a1) &&
332             (readb(base+4) == hw_info[i].a2))
333             break;
334     }
335     if (i < NR_INFO) {
336         for (j = 0; j < 6; j++)
337             dev->dev_addr[j] = readb(base + (j<<1));
338     }
339     
340     iounmap(virt);
341     j = pcmcia_release_window(link->win);
342     if (j != CS_SUCCESS)
343         cs_error(link->handle, ReleaseWindow, j);
344     return (i < NR_INFO) ? hw_info+i : NULL;
345 } /* get_hwinfo */
346
347 /*======================================================================
348
349     This probes for a card's hardware address by reading the PROM.
350     It checks the address against a list of known types, then falls
351     back to a simple NE2000 clone signature check.
352
353 ======================================================================*/
354
355 static hw_info_t *get_prom(dev_link_t *link)
356 {
357     struct net_device *dev = link->priv;
358     kio_addr_t ioaddr = dev->base_addr;
359     u_char prom[32];
360     int i, j;
361
362     /* This is lifted straight from drivers/net/ne.c */
363     struct {
364         u_char value, offset;
365     } program_seq[] = {
366         {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
367         {0x48,  EN0_DCFG},      /* Set byte-wide (0x48) access. */
368         {0x00,  EN0_RCNTLO},    /* Clear the count regs. */
369         {0x00,  EN0_RCNTHI},
370         {0x00,  EN0_IMR},       /* Mask completion irq. */
371         {0xFF,  EN0_ISR},
372         {E8390_RXOFF, EN0_RXCR},        /* 0x20  Set to monitor */
373         {E8390_TXOFF, EN0_TXCR},        /* 0x02  and loopback mode. */
374         {32,    EN0_RCNTLO},
375         {0x00,  EN0_RCNTHI},
376         {0x00,  EN0_RSARLO},    /* DMA starting at 0x0000. */
377         {0x00,  EN0_RSARHI},
378         {E8390_RREAD+E8390_START, E8390_CMD},
379     };
380
381     pcnet_reset_8390(dev);
382     mdelay(10);
383
384     for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
385         outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
386
387     for (i = 0; i < 32; i++)
388         prom[i] = inb(ioaddr + PCNET_DATAPORT);
389     for (i = 0; i < NR_INFO; i++) {
390         if ((prom[0] == hw_info[i].a0) &&
391             (prom[2] == hw_info[i].a1) &&
392             (prom[4] == hw_info[i].a2))
393             break;
394     }
395     if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) {
396         for (j = 0; j < 6; j++)
397             dev->dev_addr[j] = prom[j<<1];
398         return (i < NR_INFO) ? hw_info+i : &default_info;
399     }
400     return NULL;
401 } /* get_prom */
402
403 /*======================================================================
404
405     For DL10019 based cards, like the Linksys EtherFast
406
407 ======================================================================*/
408
409 static hw_info_t *get_dl10019(dev_link_t *link)
410 {
411     struct net_device *dev = link->priv;
412     int i;
413     u_char sum;
414
415     for (sum = 0, i = 0x14; i < 0x1c; i++)
416         sum += inb_p(dev->base_addr + i);
417     if (sum != 0xff)
418         return NULL;
419     for (i = 0; i < 6; i++)
420         dev->dev_addr[i] = inb_p(dev->base_addr + 0x14 + i);
421     i = inb(dev->base_addr + 0x1f);
422     return ((i == 0x91)||(i == 0x99)) ? &dl10022_info : &dl10019_info;
423 }
424
425 /*======================================================================
426
427     For Asix AX88190 based cards
428
429 ======================================================================*/
430
431 static hw_info_t *get_ax88190(dev_link_t *link)
432 {
433     struct net_device *dev = link->priv;
434     kio_addr_t ioaddr = dev->base_addr;
435     int i, j;
436
437     /* Not much of a test, but the alternatives are messy */
438     if (link->conf.ConfigBase != 0x03c0)
439         return NULL;
440
441     outb_p(0x01, ioaddr + EN0_DCFG);    /* Set word-wide access. */
442     outb_p(0x00, ioaddr + EN0_RSARLO);  /* DMA starting at 0x0400. */
443     outb_p(0x04, ioaddr + EN0_RSARHI);
444     outb_p(E8390_RREAD+E8390_START, ioaddr + E8390_CMD);
445
446     for (i = 0; i < 6; i += 2) {
447         j = inw(ioaddr + PCNET_DATAPORT);
448         dev->dev_addr[i] = j & 0xff;
449         dev->dev_addr[i+1] = j >> 8;
450     }
451     printk(KERN_NOTICE "pcnet_cs: this is an AX88190 card!\n");
452     printk(KERN_NOTICE "pcnet_cs: use axnet_cs instead.\n");
453     return NULL;
454 }
455
456 /*======================================================================
457
458     This should be totally unnecessary... but when we can't figure
459     out the hardware address any other way, we'll let the user hard
460     wire it when the module is initialized.
461
462 ======================================================================*/
463
464 static hw_info_t *get_hwired(dev_link_t *link)
465 {
466     struct net_device *dev = link->priv;
467     int i;
468
469     for (i = 0; i < 6; i++)
470         if (hw_addr[i] != 0) break;
471     if (i == 6)
472         return NULL;
473
474     for (i = 0; i < 6; i++)
475         dev->dev_addr[i] = hw_addr[i];
476
477     return &default_info;
478 } /* get_hwired */
479
480 /*======================================================================
481
482     pcnet_config() is scheduled to run after a CARD_INSERTION event
483     is received, to configure the PCMCIA socket, and to make the
484     ethernet device available to the system.
485
486 ======================================================================*/
487
488 #define CS_CHECK(fn, ret) \
489 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
490
491 static int try_io_port(dev_link_t *link)
492 {
493     int j, ret;
494     if (link->io.NumPorts1 == 32) {
495         link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
496         if (link->io.NumPorts2 > 0) {
497             /* for master/slave multifunction cards */
498             link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
499             link->irq.Attributes = 
500                 IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
501         }
502     } else {
503         /* This should be two 16-port windows */
504         link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
505         link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
506     }
507     if (link->io.BasePort1 == 0) {
508         link->io.IOAddrLines = 16;
509         for (j = 0; j < 0x400; j += 0x20) {
510             link->io.BasePort1 = j ^ 0x300;
511             link->io.BasePort2 = (j ^ 0x300) + 0x10;
512             ret = pcmcia_request_io(link->handle, &link->io);
513             if (ret == CS_SUCCESS) return ret;
514         }
515         return ret;
516     } else {
517         return pcmcia_request_io(link->handle, &link->io);
518     }
519 }
520
521 static void pcnet_config(dev_link_t *link)
522 {
523     client_handle_t handle = link->handle;
524     struct net_device *dev = link->priv;
525     pcnet_dev_t *info = PRIV(dev);
526     tuple_t tuple;
527     cisparse_t parse;
528     int i, last_ret, last_fn, start_pg, stop_pg, cm_offset;
529     int manfid = 0, prodid = 0, has_shmem = 0;
530     u_short buf[64];
531     hw_info_t *hw_info;
532
533     DEBUG(0, "pcnet_config(0x%p)\n", link);
534
535     tuple.Attributes = 0;
536     tuple.TupleData = (cisdata_t *)buf;
537     tuple.TupleDataMax = sizeof(buf);
538     tuple.TupleOffset = 0;
539     tuple.DesiredTuple = CISTPL_CONFIG;
540     CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
541     CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
542     CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
543     link->conf.ConfigBase = parse.config.base;
544     link->conf.Present = parse.config.rmask[0];
545
546     /* Configure card */
547     link->state |= DEV_CONFIG;
548
549     tuple.DesiredTuple = CISTPL_MANFID;
550     tuple.Attributes = TUPLE_RETURN_COMMON;
551     if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
552         (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) {
553         manfid = le16_to_cpu(buf[0]);
554         prodid = le16_to_cpu(buf[1]);
555     }
556     
557     tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
558     tuple.Attributes = 0;
559     CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
560     while (last_ret == CS_SUCCESS) {
561         cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
562         cistpl_io_t *io = &(parse.cftable_entry.io);
563         
564         if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
565                         pcmcia_parse_tuple(handle, &tuple, &parse) != 0 ||
566                         cfg->index == 0 || cfg->io.nwin == 0)
567                 goto next_entry;
568         
569         link->conf.ConfigIndex = cfg->index;
570         /* For multifunction cards, by convention, we configure the
571            network function with window 0, and serial with window 1 */
572         if (io->nwin > 1) {
573             i = (io->win[1].len > io->win[0].len);
574             link->io.BasePort2 = io->win[1-i].base;
575             link->io.NumPorts2 = io->win[1-i].len;
576         } else {
577             i = link->io.NumPorts2 = 0;
578         }
579         has_shmem = ((cfg->mem.nwin == 1) &&
580                      (cfg->mem.win[0].len >= 0x4000));
581         link->io.BasePort1 = io->win[i].base;
582         link->io.NumPorts1 = io->win[i].len;
583         link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
584         if (link->io.NumPorts1 + link->io.NumPorts2 >= 32) {
585             last_ret = try_io_port(link);
586             if (last_ret == CS_SUCCESS) break;
587         }
588     next_entry:
589         last_ret = pcmcia_get_next_tuple(handle, &tuple);
590     }
591     if (last_ret != CS_SUCCESS) {
592         cs_error(handle, RequestIO, last_ret);
593         goto failed;
594     }
595
596     CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
597     
598     if (link->io.NumPorts2 == 8) {
599         link->conf.Attributes |= CONF_ENABLE_SPKR;
600         link->conf.Status = CCSR_AUDIO_ENA;
601     }
602     if ((manfid == MANFID_IBM) &&
603         (prodid == PRODID_IBM_HOME_AND_AWAY))
604         link->conf.ConfigIndex |= 0x10;
605     
606     CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
607     dev->irq = link->irq.AssignedIRQ;
608     dev->base_addr = link->io.BasePort1;
609     if (info->flags & HAS_MISC_REG) {
610         if ((if_port == 1) || (if_port == 2))
611             dev->if_port = if_port;
612         else
613             printk(KERN_NOTICE "pcnet_cs: invalid if_port requested\n");
614     } else {
615         dev->if_port = 0;
616     }
617
618     hw_info = get_hwinfo(link);
619     if (hw_info == NULL)
620         hw_info = get_prom(link);
621     if (hw_info == NULL)
622         hw_info = get_dl10019(link);
623     if (hw_info == NULL)
624         hw_info = get_ax88190(link);
625     if (hw_info == NULL)
626         hw_info = get_hwired(link);
627     
628     if (hw_info == NULL) {
629         printk(KERN_NOTICE "pcnet_cs: unable to read hardware net"
630                " address for io base %#3lx\n", dev->base_addr);
631         goto failed;
632     }
633
634     info->flags = hw_info->flags;
635     /* Check for user overrides */
636     info->flags |= (delay_output) ? DELAY_OUTPUT : 0;
637     if ((manfid == MANFID_SOCKET) &&
638         ((prodid == PRODID_SOCKET_LPE) ||
639          (prodid == PRODID_SOCKET_LPE_CF) ||
640          (prodid == PRODID_SOCKET_EIO)))
641         info->flags &= ~USE_BIG_BUF;
642     if (!use_big_buf)
643         info->flags &= ~USE_BIG_BUF;
644     
645     if (info->flags & USE_BIG_BUF) {
646         start_pg = SOCKET_START_PG;
647         stop_pg = SOCKET_STOP_PG;
648         cm_offset = 0x10000;
649     } else {
650         start_pg = PCNET_START_PG;
651         stop_pg = PCNET_STOP_PG;
652         cm_offset = 0;
653     }
654
655     /* has_shmem is ignored if use_shmem != -1 */
656     if ((use_shmem == 0) || (!has_shmem && (use_shmem == -1)) ||
657         (setup_shmem_window(link, start_pg, stop_pg, cm_offset) != 0))
658         setup_dma_config(link, start_pg, stop_pg);
659
660     ei_status.name = "NE2000";
661     ei_status.word16 = 1;
662     ei_status.reset_8390 = &pcnet_reset_8390;
663
664     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
665
666     if (info->flags & (IS_DL10019|IS_DL10022)) {
667         u_char id = inb(dev->base_addr + 0x1a);
668         dev->do_ioctl = &ei_ioctl;
669         mii_phy_probe(dev);
670         if ((id == 0x30) && !info->pna_phy && (info->eth_phy == 4))
671             info->eth_phy = 0;
672     }
673
674     link->dev_node = &info->node;
675     link->state &= ~DEV_CONFIG_PENDING;
676     SET_NETDEV_DEV(dev, &handle_to_dev(handle));
677
678 #ifdef CONFIG_NET_POLL_CONTROLLER
679     dev->poll_controller = ei_poll;
680 #endif
681
682     if (register_netdev(dev) != 0) {
683         printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n");
684         link->dev_node = NULL;
685         goto failed;
686     }
687
688     strcpy(info->node.dev_name, dev->name);
689
690     if (info->flags & (IS_DL10019|IS_DL10022)) {
691         u_char id = inb(dev->base_addr + 0x1a);
692         printk(KERN_INFO "%s: NE2000 (DL100%d rev %02x): ",
693                dev->name, ((info->flags & IS_DL10022) ? 22 : 19), id);
694         if (info->pna_phy)
695             printk("PNA, ");
696     } else {
697         printk(KERN_INFO "%s: NE2000 Compatible: ", dev->name);
698     }
699     printk("io %#3lx, irq %d,", dev->base_addr, dev->irq);
700     if (info->flags & USE_SHMEM)
701         printk (" mem %#5lx,", dev->mem_start);
702     if (info->flags & HAS_MISC_REG)
703         printk(" %s xcvr,", if_names[dev->if_port]);
704     printk(" hw_addr ");
705     for (i = 0; i < 6; i++)
706         printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
707     return;
708
709 cs_failed:
710     cs_error(link->handle, last_fn, last_ret);
711 failed:
712     pcnet_release(link);
713     link->state &= ~DEV_CONFIG_PENDING;
714     return;
715 } /* pcnet_config */
716
717 /*======================================================================
718
719     After a card is removed, pcnet_release() will unregister the net
720     device, and release the PCMCIA configuration.  If the device is
721     still open, this will be postponed until it is closed.
722
723 ======================================================================*/
724
725 static void pcnet_release(dev_link_t *link)
726 {
727         pcnet_dev_t *info = PRIV(link->priv);
728
729         DEBUG(0, "pcnet_release(0x%p)\n", link);
730
731         if (info->flags & USE_SHMEM)
732                 iounmap(info->base);
733
734         pcmcia_disable_device(link->handle);
735 }
736
737 /*======================================================================
738
739     The card status event handler.  Mostly, this schedules other
740     stuff to run after an event is received.  A CARD_REMOVAL event
741     also sets some flags to discourage the net drivers from trying
742     to talk to the card any more.
743
744 ======================================================================*/
745
746 static int pcnet_suspend(struct pcmcia_device *p_dev)
747 {
748         dev_link_t *link = dev_to_instance(p_dev);
749         struct net_device *dev = link->priv;
750
751         if ((link->state & DEV_CONFIG) && (link->open))
752                 netif_device_detach(dev);
753
754         return 0;
755 }
756
757 static int pcnet_resume(struct pcmcia_device *p_dev)
758 {
759         dev_link_t *link = dev_to_instance(p_dev);
760         struct net_device *dev = link->priv;
761
762         if ((link->state & DEV_CONFIG) && (link->open)) {
763                 pcnet_reset_8390(dev);
764                 NS8390_init(dev, 1);
765                 netif_device_attach(dev);
766         }
767
768         return 0;
769 }
770
771
772 /*======================================================================
773
774     MII interface support for DL10019 and DL10022 based cards
775
776     On the DL10019, the MII IO direction bit is 0x10; on the DL10022
777     it is 0x20.  Setting both bits seems to work on both card types.
778
779 ======================================================================*/
780
781 #define DLINK_GPIO              0x1c
782 #define DLINK_DIAG              0x1d
783 #define DLINK_EEPROM            0x1e
784
785 #define MDIO_SHIFT_CLK          0x80
786 #define MDIO_DATA_OUT           0x40
787 #define MDIO_DIR_WRITE          0x30
788 #define MDIO_DATA_WRITE0        (MDIO_DIR_WRITE)
789 #define MDIO_DATA_WRITE1        (MDIO_DIR_WRITE | MDIO_DATA_OUT)
790 #define MDIO_DATA_READ          0x10
791 #define MDIO_MASK               0x0f
792
793 static void mdio_sync(kio_addr_t addr)
794 {
795     int bits, mask = inb(addr) & MDIO_MASK;
796     for (bits = 0; bits < 32; bits++) {
797         outb(mask | MDIO_DATA_WRITE1, addr);
798         outb(mask | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
799     }
800 }
801
802 static int mdio_read(kio_addr_t addr, int phy_id, int loc)
803 {
804     u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
805     int i, retval = 0, mask = inb(addr) & MDIO_MASK;
806
807     mdio_sync(addr);
808     for (i = 13; i >= 0; i--) {
809         int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
810         outb(mask | dat, addr);
811         outb(mask | dat | MDIO_SHIFT_CLK, addr);
812     }
813     for (i = 19; i > 0; i--) {
814         outb(mask, addr);
815         retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
816         outb(mask | MDIO_SHIFT_CLK, addr);
817     }
818     return (retval>>1) & 0xffff;
819 }
820
821 static void mdio_write(kio_addr_t addr, int phy_id, int loc, int value)
822 {
823     u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
824     int i, mask = inb(addr) & MDIO_MASK;
825
826     mdio_sync(addr);
827     for (i = 31; i >= 0; i--) {
828         int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
829         outb(mask | dat, addr);
830         outb(mask | dat | MDIO_SHIFT_CLK, addr);
831     }
832     for (i = 1; i >= 0; i--) {
833         outb(mask, addr);
834         outb(mask | MDIO_SHIFT_CLK, addr);
835     }
836 }
837
838 static void mdio_reset(kio_addr_t addr, int phy_id)
839 {
840     outb_p(0x08, addr);
841     outb_p(0x0c, addr);
842     outb_p(0x08, addr);
843     outb_p(0x0c, addr);
844     outb_p(0x00, addr);
845 }
846
847 /*======================================================================
848
849     EEPROM access routines for DL10019 and DL10022 based cards
850
851 ======================================================================*/
852
853 #define EE_EEP          0x40
854 #define EE_ASIC         0x10
855 #define EE_CS           0x08
856 #define EE_CK           0x04
857 #define EE_DO           0x02
858 #define EE_DI           0x01
859 #define EE_ADOT         0x01    /* DataOut for ASIC */
860 #define EE_READ_CMD     0x06
861
862 #define DL19FDUPLX      0x0400  /* DL10019 Full duplex mode */
863
864 static int read_eeprom(kio_addr_t ioaddr, int location)
865 {
866     int i, retval = 0;
867     kio_addr_t ee_addr = ioaddr + DLINK_EEPROM;
868     int read_cmd = location | (EE_READ_CMD << 8);
869
870     outb(0, ee_addr);
871     outb(EE_EEP|EE_CS, ee_addr);
872
873     /* Shift the read command bits out. */
874     for (i = 10; i >= 0; i--) {
875         short dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
876         outb_p(EE_EEP|EE_CS|dataval, ee_addr);
877         outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr);
878     }
879     outb(EE_EEP|EE_CS, ee_addr);
880
881     for (i = 16; i > 0; i--) {
882         outb_p(EE_EEP|EE_CS | EE_CK, ee_addr);
883         retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0);
884         outb_p(EE_EEP|EE_CS, ee_addr);
885     }
886
887     /* Terminate the EEPROM access. */
888     outb(0, ee_addr);
889     return retval;
890 }
891
892 /*
893     The internal ASIC registers can be changed by EEPROM READ access
894     with EE_ASIC bit set.
895     In ASIC mode, EE_ADOT is used to output the data to the ASIC.
896 */
897
898 static void write_asic(kio_addr_t ioaddr, int location, short asic_data)
899 {
900         int i;
901         kio_addr_t ee_addr = ioaddr + DLINK_EEPROM;
902         short dataval;
903         int read_cmd = location | (EE_READ_CMD << 8);
904
905         asic_data |= read_eeprom(ioaddr, location);
906
907         outb(0, ee_addr);
908         outb(EE_ASIC|EE_CS|EE_DI, ee_addr);
909
910         read_cmd = read_cmd >> 1;
911
912         /* Shift the read command bits out. */
913         for (i = 9; i >= 0; i--) {
914                 dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
915                 outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
916                 outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr);
917                 outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
918         }
919         // sync
920         outb(EE_ASIC|EE_CS, ee_addr);
921         outb(EE_ASIC|EE_CS|EE_CK, ee_addr);
922         outb(EE_ASIC|EE_CS, ee_addr);
923
924         for (i = 15; i >= 0; i--) {
925                 dataval = (asic_data & (1 << i)) ? EE_ADOT : 0;
926                 outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
927                 outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr);
928                 outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
929         }
930
931         /* Terminate the ASIC access. */
932         outb(EE_ASIC|EE_DI, ee_addr);
933         outb(EE_ASIC|EE_DI| EE_CK, ee_addr);
934         outb(EE_ASIC|EE_DI, ee_addr);
935
936         outb(0, ee_addr);
937 }
938
939 /*====================================================================*/
940
941 static void set_misc_reg(struct net_device *dev)
942 {
943     kio_addr_t nic_base = dev->base_addr;
944     pcnet_dev_t *info = PRIV(dev);
945     u_char tmp;
946     
947     if (info->flags & HAS_MISC_REG) {
948         tmp = inb_p(nic_base + PCNET_MISC) & ~3;
949         if (dev->if_port == 2)
950             tmp |= 1;
951         if (info->flags & USE_BIG_BUF)
952             tmp |= 2;
953         if (info->flags & HAS_IBM_MISC)
954             tmp |= 8;
955         outb_p(tmp, nic_base + PCNET_MISC);
956     }
957     if (info->flags & IS_DL10022) {
958         if (info->flags & HAS_MII) {
959             mdio_reset(nic_base + DLINK_GPIO, info->eth_phy);
960             /* Restart MII autonegotiation */
961             mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000);
962             mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200);
963             info->mii_reset = jiffies;
964         } else {
965             outb(full_duplex ? 4 : 0, nic_base + DLINK_DIAG);
966         }
967     } else if (info->flags & IS_DL10019) {
968         /* Advertise 100F, 100H, 10F, 10H */
969         mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1);
970         /* Restart MII autonegotiation */
971         mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000);
972         mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200);
973     }
974 }
975
976 /*====================================================================*/
977
978 static void mii_phy_probe(struct net_device *dev)
979 {
980     pcnet_dev_t *info = PRIV(dev);
981     kio_addr_t mii_addr = dev->base_addr + DLINK_GPIO;
982     int i;
983     u_int tmp, phyid;
984
985     for (i = 31; i >= 0; i--) {
986         tmp = mdio_read(mii_addr, i, 1);
987         if ((tmp == 0) || (tmp == 0xffff))
988             continue;
989         tmp = mdio_read(mii_addr, i, MII_PHYID_REG1);
990         phyid = tmp << 16;
991         phyid |= mdio_read(mii_addr, i, MII_PHYID_REG2);
992         phyid &= MII_PHYID_REV_MASK;
993         DEBUG(0, "%s: MII at %d is 0x%08x\n", dev->name, i, phyid);
994         if (phyid == AM79C9XX_HOME_PHY) {
995             info->pna_phy = i;
996         } else if (phyid != AM79C9XX_ETH_PHY) {
997             info->eth_phy = i;
998         }
999     }
1000 }
1001
1002 static int pcnet_open(struct net_device *dev)
1003 {
1004     pcnet_dev_t *info = PRIV(dev);
1005     dev_link_t *link = info->p_dev;
1006
1007     DEBUG(2, "pcnet_open('%s')\n", dev->name);
1008
1009     if (!DEV_OK(link))
1010         return -ENODEV;
1011
1012     link->open++;
1013
1014     set_misc_reg(dev);
1015     request_irq(dev->irq, ei_irq_wrapper, SA_SHIRQ, dev_info, dev);
1016
1017     info->phy_id = info->eth_phy;
1018     info->link_status = 0x00;
1019     init_timer(&info->watchdog);
1020     info->watchdog.function = &ei_watchdog;
1021     info->watchdog.data = (u_long)dev;
1022     info->watchdog.expires = jiffies + HZ;
1023     add_timer(&info->watchdog);
1024
1025     return ei_open(dev);
1026 } /* pcnet_open */
1027
1028 /*====================================================================*/
1029
1030 static int pcnet_close(struct net_device *dev)
1031 {
1032     pcnet_dev_t *info = PRIV(dev);
1033     dev_link_t *link = info->p_dev;
1034
1035     DEBUG(2, "pcnet_close('%s')\n", dev->name);
1036
1037     ei_close(dev);
1038     free_irq(dev->irq, dev);
1039     
1040     link->open--;
1041     netif_stop_queue(dev);
1042     del_timer_sync(&info->watchdog);
1043
1044     return 0;
1045 } /* pcnet_close */
1046
1047 /*======================================================================
1048
1049     Hard reset the card.  This used to pause for the same period that
1050     a 8390 reset command required, but that shouldn't be necessary.
1051
1052 ======================================================================*/
1053
1054 static void pcnet_reset_8390(struct net_device *dev)
1055 {
1056     kio_addr_t nic_base = dev->base_addr;
1057     int i;
1058
1059     ei_status.txing = ei_status.dmaing = 0;
1060
1061     outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD);
1062
1063     outb(inb(nic_base + PCNET_RESET), nic_base + PCNET_RESET);
1064
1065     for (i = 0; i < 100; i++) {
1066         if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0)
1067             break;
1068         udelay(100);
1069     }
1070     outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
1071     
1072     if (i == 100)
1073         printk(KERN_ERR "%s: pcnet_reset_8390() did not complete.\n",
1074                dev->name);
1075     set_misc_reg(dev);
1076     
1077 } /* pcnet_reset_8390 */
1078
1079 /*====================================================================*/
1080
1081 static int set_config(struct net_device *dev, struct ifmap *map)
1082 {
1083     pcnet_dev_t *info = PRIV(dev);
1084     if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
1085         if (!(info->flags & HAS_MISC_REG))
1086             return -EOPNOTSUPP;
1087         else if ((map->port < 1) || (map->port > 2))
1088             return -EINVAL;
1089         dev->if_port = map->port;
1090         printk(KERN_INFO "%s: switched to %s port\n",
1091                dev->name, if_names[dev->if_port]);
1092         NS8390_init(dev, 1);
1093     }
1094     return 0;
1095 }
1096
1097 /*====================================================================*/
1098
1099 static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs)
1100 {
1101     struct net_device *dev = dev_id;
1102     pcnet_dev_t *info;
1103     irqreturn_t ret = ei_interrupt(irq, dev_id, regs);
1104
1105     if (ret == IRQ_HANDLED) {
1106             info = PRIV(dev);
1107             info->stale = 0;
1108     }
1109     return ret;
1110 }
1111
1112 static void ei_watchdog(u_long arg)
1113 {
1114     struct net_device *dev = (struct net_device *)arg;
1115     pcnet_dev_t *info = PRIV(dev);
1116     kio_addr_t nic_base = dev->base_addr;
1117     kio_addr_t mii_addr = nic_base + DLINK_GPIO;
1118     u_short link;
1119
1120     if (!netif_device_present(dev)) goto reschedule;
1121
1122     /* Check for pending interrupt with expired latency timer: with
1123        this, we can limp along even if the interrupt is blocked */
1124     outb_p(E8390_NODMA+E8390_PAGE0, nic_base + E8390_CMD);
1125     if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
1126         if (!info->fast_poll)
1127             printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
1128         ei_irq_wrapper(dev->irq, dev, NULL);
1129         info->fast_poll = HZ;
1130     }
1131     if (info->fast_poll) {
1132         info->fast_poll--;
1133         info->watchdog.expires = jiffies + 1;
1134         add_timer(&info->watchdog);
1135         return;
1136     }
1137
1138     if (!(info->flags & HAS_MII))
1139         goto reschedule;
1140
1141     mdio_read(mii_addr, info->phy_id, 1);
1142     link = mdio_read(mii_addr, info->phy_id, 1);
1143     if (!link || (link == 0xffff)) {
1144         if (info->eth_phy) {
1145             info->phy_id = info->eth_phy = 0;
1146         } else {
1147             printk(KERN_INFO "%s: MII is missing!\n", dev->name);
1148             info->flags &= ~HAS_MII;
1149         }
1150         goto reschedule;
1151     }
1152
1153     link &= 0x0004;
1154     if (link != info->link_status) {
1155         u_short p = mdio_read(mii_addr, info->phy_id, 5);
1156         printk(KERN_INFO "%s: %s link beat\n", dev->name,
1157                (link) ? "found" : "lost");
1158         if (link && (info->flags & IS_DL10022)) {
1159             /* Disable collision detection on full duplex links */
1160             outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
1161         } else if (link && (info->flags & IS_DL10019)) {
1162             /* Disable collision detection on full duplex links */
1163             write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0);
1164         }
1165         if (link) {
1166             if (info->phy_id == info->eth_phy) {
1167                 if (p)
1168                     printk(KERN_INFO "%s: autonegotiation complete: "
1169                            "%sbaseT-%cD selected\n", dev->name,
1170                            ((p & 0x0180) ? "100" : "10"),
1171                            ((p & 0x0140) ? 'F' : 'H'));
1172                 else
1173                     printk(KERN_INFO "%s: link partner did not "
1174                            "autonegotiate\n", dev->name);
1175             }
1176             NS8390_init(dev, 1);
1177         }
1178         info->link_status = link;
1179     }
1180     if (info->pna_phy && time_after(jiffies, info->mii_reset + 6*HZ)) {
1181         link = mdio_read(mii_addr, info->eth_phy, 1) & 0x0004;
1182         if (((info->phy_id == info->pna_phy) && link) ||
1183             ((info->phy_id != info->pna_phy) && !link)) {
1184             /* isolate this MII and try flipping to the other one */
1185             mdio_write(mii_addr, info->phy_id, 0, 0x0400);
1186             info->phy_id ^= info->pna_phy ^ info->eth_phy;
1187             printk(KERN_INFO "%s: switched to %s transceiver\n", dev->name,
1188                    (info->phy_id == info->eth_phy) ? "ethernet" : "PNA");
1189             mdio_write(mii_addr, info->phy_id, 0,
1190                        (info->phy_id == info->eth_phy) ? 0x1000 : 0);
1191             info->link_status = 0;
1192             info->mii_reset = jiffies;
1193         }
1194     }
1195
1196 reschedule:
1197     info->watchdog.expires = jiffies + HZ;
1198     add_timer(&info->watchdog);
1199 }
1200
1201 /*====================================================================*/
1202
1203 static void netdev_get_drvinfo(struct net_device *dev,
1204                                struct ethtool_drvinfo *info)
1205 {
1206         strcpy(info->driver, "pcnet_cs");
1207 }
1208
1209 static struct ethtool_ops netdev_ethtool_ops = {
1210         .get_drvinfo            = netdev_get_drvinfo,
1211 };
1212
1213 /*====================================================================*/
1214
1215
1216 static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1217 {
1218     pcnet_dev_t *info = PRIV(dev);
1219     u16 *data = (u16 *)&rq->ifr_ifru;
1220     kio_addr_t mii_addr = dev->base_addr + DLINK_GPIO;
1221     switch (cmd) {
1222     case SIOCGMIIPHY:
1223         data[0] = info->phy_id;
1224     case SIOCGMIIREG:           /* Read MII PHY register. */
1225         data[3] = mdio_read(mii_addr, data[0], data[1] & 0x1f);
1226         return 0;
1227     case SIOCSMIIREG:           /* Write MII PHY register. */
1228         if (!capable(CAP_NET_ADMIN))
1229             return -EPERM;
1230         mdio_write(mii_addr, data[0], data[1] & 0x1f, data[2]);
1231         return 0;
1232     }
1233     return -EOPNOTSUPP;
1234 }
1235
1236 /*====================================================================*/
1237
1238 static void dma_get_8390_hdr(struct net_device *dev,
1239                              struct e8390_pkt_hdr *hdr,
1240                              int ring_page)
1241 {
1242     kio_addr_t nic_base = dev->base_addr;
1243
1244     if (ei_status.dmaing) {
1245         printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input."
1246                "[DMAstat:%1x][irqlock:%1x]\n",
1247                dev->name, ei_status.dmaing, ei_status.irqlock);
1248         return;
1249     }
1250     
1251     ei_status.dmaing |= 0x01;
1252     outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD);
1253     outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
1254     outb_p(0, nic_base + EN0_RCNTHI);
1255     outb_p(0, nic_base + EN0_RSARLO);           /* On page boundary */
1256     outb_p(ring_page, nic_base + EN0_RSARHI);
1257     outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD);
1258
1259     insw(nic_base + PCNET_DATAPORT, hdr,
1260             sizeof(struct e8390_pkt_hdr)>>1);
1261     /* Fix for big endian systems */
1262     hdr->count = le16_to_cpu(hdr->count);
1263
1264     outb_p(ENISR_RDC, nic_base + EN0_ISR);      /* Ack intr. */
1265     ei_status.dmaing &= ~0x01;
1266 }
1267
1268 /*====================================================================*/
1269
1270 static void dma_block_input(struct net_device *dev, int count,
1271                             struct sk_buff *skb, int ring_offset)
1272 {
1273     kio_addr_t nic_base = dev->base_addr;
1274     int xfer_count = count;
1275     char *buf = skb->data;
1276
1277 #ifdef PCMCIA_DEBUG
1278     if ((ei_debug > 4) && (count != 4))
1279         printk(KERN_DEBUG "%s: [bi=%d]\n", dev->name, count+4);
1280 #endif
1281     if (ei_status.dmaing) {
1282         printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input."
1283                "[DMAstat:%1x][irqlock:%1x]\n",
1284                dev->name, ei_status.dmaing, ei_status.irqlock);
1285         return;
1286     }
1287     ei_status.dmaing |= 0x01;
1288     outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD);
1289     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
1290     outb_p(count >> 8, nic_base + EN0_RCNTHI);
1291     outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
1292     outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
1293     outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD);
1294
1295     insw(nic_base + PCNET_DATAPORT,buf,count>>1);
1296     if (count & 0x01)
1297         buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++;
1298
1299     /* This was for the ALPHA version only, but enough people have been
1300        encountering problems that it is still here. */
1301 #ifdef PCMCIA_DEBUG
1302     if (ei_debug > 4) {         /* DMA termination address check... */
1303         int addr, tries = 20;
1304         do {
1305             /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
1306                -- it's broken for Rx on some cards! */
1307             int high = inb_p(nic_base + EN0_RSARHI);
1308             int low = inb_p(nic_base + EN0_RSARLO);
1309             addr = (high << 8) + low;
1310             if (((ring_offset + xfer_count) & 0xff) == (addr & 0xff))
1311                 break;
1312         } while (--tries > 0);
1313         if (tries <= 0)
1314             printk(KERN_NOTICE "%s: RX transfer address mismatch,"
1315                    "%#4.4x (expected) vs. %#4.4x (actual).\n",
1316                    dev->name, ring_offset + xfer_count, addr);
1317     }
1318 #endif
1319     outb_p(ENISR_RDC, nic_base + EN0_ISR);      /* Ack intr. */
1320     ei_status.dmaing &= ~0x01;
1321 } /* dma_block_input */
1322
1323 /*====================================================================*/
1324
1325 static void dma_block_output(struct net_device *dev, int count,
1326                              const u_char *buf, const int start_page)
1327 {
1328     kio_addr_t nic_base = dev->base_addr;
1329     pcnet_dev_t *info = PRIV(dev);
1330 #ifdef PCMCIA_DEBUG
1331     int retries = 0;
1332 #endif
1333     u_long dma_start;
1334
1335 #ifdef PCMCIA_DEBUG
1336     if (ei_debug > 4)
1337         printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
1338 #endif
1339
1340     /* Round the count up for word writes.  Do we need to do this?
1341        What effect will an odd byte count have on the 8390?
1342        I should check someday. */
1343     if (count & 0x01)
1344         count++;
1345     if (ei_status.dmaing) {
1346         printk(KERN_NOTICE "%s: DMAing conflict in dma_block_output."
1347                "[DMAstat:%1x][irqlock:%1x]\n",
1348                dev->name, ei_status.dmaing, ei_status.irqlock);
1349         return;
1350     }
1351     ei_status.dmaing |= 0x01;
1352     /* We should already be in page 0, but to be safe... */
1353     outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base+PCNET_CMD);
1354
1355 #ifdef PCMCIA_DEBUG
1356   retry:
1357 #endif
1358
1359     outb_p(ENISR_RDC, nic_base + EN0_ISR);
1360
1361     /* Now the normal output. */
1362     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
1363     outb_p(count >> 8,   nic_base + EN0_RCNTHI);
1364     outb_p(0x00, nic_base + EN0_RSARLO);
1365     outb_p(start_page, nic_base + EN0_RSARHI);
1366
1367     outb_p(E8390_RWRITE+E8390_START, nic_base + PCNET_CMD);
1368     outsw(nic_base + PCNET_DATAPORT, buf, count>>1);
1369
1370     dma_start = jiffies;
1371
1372 #ifdef PCMCIA_DEBUG
1373     /* This was for the ALPHA version only, but enough people have been
1374        encountering problems that it is still here. */
1375     if (ei_debug > 4) { /* DMA termination address check... */
1376         int addr, tries = 20;
1377         do {
1378             int high = inb_p(nic_base + EN0_RSARHI);
1379             int low = inb_p(nic_base + EN0_RSARLO);
1380             addr = (high << 8) + low;
1381             if ((start_page << 8) + count == addr)
1382                 break;
1383         } while (--tries > 0);
1384         if (tries <= 0) {
1385             printk(KERN_NOTICE "%s: Tx packet transfer address mismatch,"
1386                    "%#4.4x (expected) vs. %#4.4x (actual).\n",
1387                    dev->name, (start_page << 8) + count, addr);
1388             if (retries++ == 0)
1389                 goto retry;
1390         }
1391     }
1392 #endif
1393
1394     while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
1395         if (time_after(jiffies, dma_start + PCNET_RDC_TIMEOUT)) {
1396             printk(KERN_NOTICE "%s: timeout waiting for Tx RDC.\n",
1397                    dev->name);
1398             pcnet_reset_8390(dev);
1399             NS8390_init(dev, 1);
1400             break;
1401         }
1402
1403     outb_p(ENISR_RDC, nic_base + EN0_ISR);      /* Ack intr. */
1404     if (info->flags & DELAY_OUTPUT)
1405         udelay((long)delay_time);
1406     ei_status.dmaing &= ~0x01;
1407 }
1408
1409 /*====================================================================*/
1410
1411 static int setup_dma_config(dev_link_t *link, int start_pg,
1412                             int stop_pg)
1413 {
1414     struct net_device *dev = link->priv;
1415
1416     ei_status.tx_start_page = start_pg;
1417     ei_status.rx_start_page = start_pg + TX_PAGES;
1418     ei_status.stop_page = stop_pg;
1419
1420     /* set up block i/o functions */
1421     ei_status.get_8390_hdr = &dma_get_8390_hdr;
1422     ei_status.block_input = &dma_block_input;
1423     ei_status.block_output = &dma_block_output;
1424
1425     return 0;
1426 }
1427
1428 /*====================================================================*/
1429
1430 static void copyin(void *dest, void __iomem *src, int c)
1431 {
1432     u_short *d = dest;
1433     u_short __iomem *s = src;
1434     int odd;
1435
1436     if (c <= 0)
1437         return;
1438     odd = (c & 1); c >>= 1;
1439
1440     if (c) {
1441         do { *d++ = __raw_readw(s++); } while (--c);
1442     }
1443     /* get last byte by fetching a word and masking */
1444     if (odd)
1445         *((u_char *)d) = readw(s) & 0xff;
1446 }
1447
1448 static void copyout(void __iomem *dest, const void *src, int c)
1449 {
1450     u_short __iomem *d = dest;
1451     const u_short *s = src;
1452     int odd;
1453
1454     if (c <= 0)
1455         return;
1456     odd = (c & 1); c >>= 1;
1457
1458     if (c) {
1459         do { __raw_writew(*s++, d++); } while (--c);
1460     }
1461     /* copy last byte doing a read-modify-write */
1462     if (odd)
1463         writew((readw(d) & 0xff00) | *(u_char *)s, d);
1464 }
1465
1466 /*====================================================================*/
1467
1468 static void shmem_get_8390_hdr(struct net_device *dev,
1469                                struct e8390_pkt_hdr *hdr,
1470                                int ring_page)
1471 {
1472     void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8)
1473                                 + (ring_page << 8)
1474                                 - (ei_status.rx_start_page << 8);
1475     
1476     copyin(hdr, xfer_start, sizeof(struct e8390_pkt_hdr));
1477     /* Fix for big endian systems */
1478     hdr->count = le16_to_cpu(hdr->count);
1479 }
1480
1481 /*====================================================================*/
1482
1483 static void shmem_block_input(struct net_device *dev, int count,
1484                               struct sk_buff *skb, int ring_offset)
1485 {
1486     void __iomem *base = ei_status.mem;
1487     unsigned long offset = (TX_PAGES<<8) + ring_offset
1488                                 - (ei_status.rx_start_page << 8);
1489     char *buf = skb->data;
1490     
1491     if (offset + count > ei_status.priv) {
1492         /* We must wrap the input move. */
1493         int semi_count = ei_status.priv - offset;
1494         copyin(buf, base + offset, semi_count);
1495         buf += semi_count;
1496         offset = TX_PAGES<<8;
1497         count -= semi_count;
1498     }
1499     copyin(buf, base + offset, count);
1500 }
1501
1502 /*====================================================================*/
1503
1504 static void shmem_block_output(struct net_device *dev, int count,
1505                                const u_char *buf, const int start_page)
1506 {
1507     void __iomem *shmem = ei_status.mem + (start_page << 8);
1508     shmem -= ei_status.tx_start_page << 8;
1509     copyout(shmem, buf, count);
1510 }
1511
1512 /*====================================================================*/
1513
1514 static int setup_shmem_window(dev_link_t *link, int start_pg,
1515                               int stop_pg, int cm_offset)
1516 {
1517     struct net_device *dev = link->priv;
1518     pcnet_dev_t *info = PRIV(dev);
1519     win_req_t req;
1520     memreq_t mem;
1521     int i, window_size, offset, last_ret, last_fn;
1522
1523     window_size = (stop_pg - start_pg) << 8;
1524     if (window_size > 32 * 1024)
1525         window_size = 32 * 1024;
1526
1527     /* Make sure it's a power of two.  */
1528     while ((window_size & (window_size - 1)) != 0)
1529         window_size += window_size & ~(window_size - 1);
1530
1531     /* Allocate a memory window */
1532     req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
1533     req.Attributes |= WIN_USE_WAIT;
1534     req.Base = 0; req.Size = window_size;
1535     req.AccessSpeed = mem_speed;
1536     CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
1537
1538     mem.CardOffset = (start_pg << 8) + cm_offset;
1539     offset = mem.CardOffset % window_size;
1540     mem.CardOffset -= offset;
1541     mem.Page = 0;
1542     CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
1543
1544     /* Try scribbling on the buffer */
1545     info->base = ioremap(req.Base, window_size);
1546     for (i = 0; i < (TX_PAGES<<8); i += 2)
1547         __raw_writew((i>>1), info->base+offset+i);
1548     udelay(100);
1549     for (i = 0; i < (TX_PAGES<<8); i += 2)
1550         if (__raw_readw(info->base+offset+i) != (i>>1)) break;
1551     pcnet_reset_8390(dev);
1552     if (i != (TX_PAGES<<8)) {
1553         iounmap(info->base);
1554         pcmcia_release_window(link->win);
1555         info->base = NULL; link->win = NULL;
1556         goto failed;
1557     }
1558     
1559     ei_status.mem = info->base + offset;
1560     ei_status.priv = req.Size;
1561     dev->mem_start = (u_long)ei_status.mem;
1562     dev->mem_end = dev->mem_start + req.Size;
1563
1564     ei_status.tx_start_page = start_pg;
1565     ei_status.rx_start_page = start_pg + TX_PAGES;
1566     ei_status.stop_page = start_pg + ((req.Size - offset) >> 8);
1567
1568     /* set up block i/o functions */
1569     ei_status.get_8390_hdr = &shmem_get_8390_hdr;
1570     ei_status.block_input = &shmem_block_input;
1571     ei_status.block_output = &shmem_block_output;
1572
1573     info->flags |= USE_SHMEM;
1574     return 0;
1575
1576 cs_failed:
1577     cs_error(link->handle, last_fn, last_ret);
1578 failed:
1579     return 1;
1580 }
1581
1582 /*====================================================================*/
1583
1584 static struct pcmcia_device_id pcnet_ids[] = {
1585         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0057, 0x0021),
1586         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0104, 0x000a),
1587         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0xea15),
1588         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0x3341),
1589         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0xc0ab),
1590         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x021b, 0x0101),
1591         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x08a1, 0xc0ab),
1592         PCMCIA_PFC_DEVICE_PROD_ID12(0, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
1593         PCMCIA_PFC_DEVICE_PROD_ID12(0, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
1594         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
1595         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
1596         PCMCIA_PFC_DEVICE_PROD_ID12(0, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
1597         PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
1598         PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
1599         PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away 28.8 PC Card       ", 0xb569a6e5, 0x5bd4ff2c),
1600         PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
1601         PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
1602         PCMCIA_MFC_DEVICE_PROD_ID123(0, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
1603         PCMCIA_MFC_DEVICE_PROD_ID2(0, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
1604         PCMCIA_DEVICE_MANF_CARD(0x0057, 0x1004),
1605         PCMCIA_DEVICE_MANF_CARD(0x0104, 0x000d),
1606         PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0075),
1607         PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0145),
1608         PCMCIA_DEVICE_MANF_CARD(0x0149, 0x0230),
1609         PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530),
1610 /*      PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab), conflict with axnet_cs */
1611         PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110),
1612         PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328),
1613         PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041),
1614         PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452),
1615 /*      PCMCIA_DEVICE_MANF_CARD(0x021b, 0x0202), conflict with axnet_cs */
1616         PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300),
1617         PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0307),
1618         PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030a),
1619         PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1103),
1620         PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1121),
1621         PCMCIA_DEVICE_PROD_ID12("2408LAN", "Ethernet", 0x352fff7f, 0x00b2e941),
1622         PCMCIA_DEVICE_PROD_ID123("Cardwell", "PCMCIA", "ETHERNET", 0x9533672e, 0x281f1c5d, 0x3ff7175b),
1623         PCMCIA_DEVICE_PROD_ID123("CNet  ", "CN30BC", "ETHERNET", 0x9fe55d3d, 0x85601198, 0x3ff7175b),
1624         PCMCIA_DEVICE_PROD_ID123("Digital", "Ethernet", "Adapter", 0x9999ab35, 0x00b2e941, 0x4b0d829e),
1625         PCMCIA_DEVICE_PROD_ID123("Edimax Technology Inc.", "PCMCIA", "Ethernet Card", 0x738a0019, 0x281f1c5d, 0x5e9d92c0),
1626         PCMCIA_DEVICE_PROD_ID123("EFA   ", "EFA207", "ETHERNET", 0x3d294be4, 0xeb9aab6c, 0x3ff7175b),
1627         PCMCIA_DEVICE_PROD_ID123("I-O DATA", "PCLA", "ETHERNET", 0x1d55d7ec, 0xe4c64d34, 0x3ff7175b),
1628         PCMCIA_DEVICE_PROD_ID123("IO DATA", "PCLATE", "ETHERNET", 0x547e66dc, 0x6b260753, 0x3ff7175b),
1629         PCMCIA_DEVICE_PROD_ID123("KingMax Technology Inc.", "EN10-T2", "PCMCIA Ethernet Card", 0x932b7189, 0x699e4436, 0x6f6652e0),
1630         PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2216", 0x281f1c5d, 0xd4cd2f20, 0xb87add82),
1631         PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2620", 0x281f1c5d, 0xd4cd2f20, 0x7d3d83a8),
1632         PCMCIA_DEVICE_PROD_ID1("2412LAN", 0x67f236ab),
1633         PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2212", 0xdfc6b5b2, 0xcb112a11),
1634         PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2216-PCMCIA-ETHERNET", 0xdfc6b5b2, 0x5542bfff),
1635         PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA100-PCM-T V2 100/10M LAN PC Card", 0xbb7fbdd7, 0xcd91cc68),
1636         PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA100-PCM V2", 0x36634a66, 0xc6d05997),
1637         PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8),
1638         PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA-PCM V3", 0x36634a66, 0x62241d96),
1639         PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8010", 0x5070a7f9, 0x82f96e96),
1640         PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8610", 0x5070a7f9, 0x86741224),
1641         PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002", 0x93b15570, 0x75ec3efb),
1642         PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002T", 0x93b15570, 0x461c5247),
1643         PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8010", 0x93b15570, 0x82f96e96),
1644         PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet", 0x578ba6e7, 0x0a9888c1),
1645         PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet 10/100", 0x578ba6e7, 0x939fedbd),
1646         PCMCIA_DEVICE_PROD_ID12("AROWANA", "PCMCIA Ethernet LAN Card", 0x313adbc8, 0x08d9f190),
1647         PCMCIA_DEVICE_PROD_ID12("ASANTE", "FriendlyNet PC Card", 0x3a7ade0f, 0x41c64504),
1648         PCMCIA_DEVICE_PROD_ID12("Billionton", "LNT-10TB", 0x552ab682, 0xeeb1ba6a),
1649         PCMCIA_DEVICE_PROD_ID12("CF", "10Base-Ethernet", 0x44ebf863, 0x93ae4d79),
1650         PCMCIA_DEVICE_PROD_ID12("CNet", "CN40BC Ethernet", 0xbc477dde, 0xfba775a7),
1651         PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "BASEline PCMCIA 10 MBit Ethernetadapter", 0xfa2e424d, 0xe9190d8a),
1652         PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "FASTline PCMCIA 10/100 Fast-Ethernet", 0xfa2e424d, 0x3953d9b9),
1653         PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722),
1654         PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2),
1655         PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd),
1656         PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d),
1657         PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa),
1658         PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9),
1659         PCMCIA_DEVICE_PROD_ID12("Corega,K.K.", "Ethernet LAN Card", 0x110d26d9, 0x9fd2f0a2),
1660         PCMCIA_DEVICE_PROD_ID12("corega,K.K.", "Ethernet LAN Card", 0x9791a90e, 0x9fd2f0a2),
1661         PCMCIA_DEVICE_PROD_ID12("CouplerlessPCMCIA", "100BASE", 0xee5af0ad, 0x7c2add04),
1662         PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-010", 0x77008979, 0x9d8d445d),
1663         PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-110E 10/100M LAN Card", 0x77008979, 0xfd184814),
1664         PCMCIA_DEVICE_PROD_ID12("DataTrek.", "NetCard ", 0x5cd66d9d, 0x84697ce0),
1665         PCMCIA_DEVICE_PROD_ID12("Dayna Communications, Inc.", "CommuniCard E", 0x0c629325, 0xb4e7dbaf),
1666         PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100", 0x697403d8, 0xe160b995),
1667         PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100 Dongless", 0x697403d8, 0xa6d3b233),
1668         PCMCIA_DEVICE_PROD_ID12("DIGITAL", "DEPCM-XX", 0x69616cb3, 0xe600e76e),
1669         PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-650", 0x1a424a1c, 0xf28c8398),
1670         PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660", 0x1a424a1c, 0xd9a1d05b),
1671         PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660+", 0x1a424a1c, 0x50dcd0ec),
1672         PCMCIA_DEVICE_PROD_ID12("D-Link", "DFE-650", 0x1a424a1c, 0x0f0073f9),
1673         PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 PC Card", 0x725b842d, 0xf1efee84),
1674         PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 Port Attached PC Card", 0x725b842d, 0x2db1f8e9),
1675         PCMCIA_DEVICE_PROD_ID12("Dynalink", "L10BC", 0x55632fd5, 0xdc65f2b1),
1676         PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10BC", 0x6a26d1cf, 0xdc65f2b1),
1677         PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10C", 0x6a26d1cf, 0xc4f84efb),
1678         PCMCIA_DEVICE_PROD_ID12("E-CARD", "E-CARD", 0x6701da11, 0x6701da11),
1679         PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet 10BaseT card", 0x53c864c6, 0xedd059f6),
1680         PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet Combo card", 0x53c864c6, 0x929c486c),
1681         PCMCIA_DEVICE_PROD_ID12("Ethernet", "Adapter", 0x00b2e941, 0x4b0d829e),
1682         PCMCIA_DEVICE_PROD_ID12("Ethernet Adapter", "E2000 PCMCIA Ethernet", 0x96767301, 0x71fbbc61),
1683         PCMCIA_DEVICE_PROD_ID12("Ethernet PCMCIA adapter", "EP-210", 0x8dd86181, 0xf2b52517),
1684         PCMCIA_DEVICE_PROD_ID12("Fast Ethernet", "Adapter", 0xb4be14e3, 0x4b0d829e),
1685         PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2000", 0x2a151fac, 0xf00555cb),
1686         PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2220", 0x2a151fac, 0xc1b7e327),
1687         PCMCIA_DEVICE_PROD_ID12("GVC", "NIC-2000p", 0x76e171bd, 0x6eb1c947),
1688         PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941),
1689         PCMCIA_DEVICE_PROD_ID12("IC-CARD", "IC-CARD", 0x60cb09a6, 0x60cb09a6),
1690         PCMCIA_DEVICE_PROD_ID12("IC-CARD+", "IC-CARD+", 0x93693494, 0x93693494),
1691         PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCETTX", 0x547e66dc, 0x6fc5459b),
1692         PCMCIA_DEVICE_PROD_ID12("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0),
1693         PCMCIA_DEVICE_PROD_ID12("KANSAI ELECTRIC CO.,LTD", "KLA-PCM/T", 0xb18dc3b4, 0xcc51a956),
1694         PCMCIA_DEVICE_PROD_ID12("KCI", "PE520 PCMCIA Ethernet Adapter", 0xa89b87d3, 0x1eb88e64),
1695         PCMCIA_DEVICE_PROD_ID12("KINGMAX", "EN10T2T", 0x7bcb459a, 0xa5c81fa5),
1696         PCMCIA_DEVICE_PROD_ID12("Kingston", "KNE-PC2", 0x1128e633, 0xce2a89b3),
1697         PCMCIA_DEVICE_PROD_ID12("Kingston Technology Corp.", "EtheRx PC Card Ethernet Adapter", 0x313c7be3, 0x0afb54a2),
1698         PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-10/100CD", 0x1b7827b2, 0xcda71d1c),
1699         PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDF", 0x1b7827b2, 0xfec71e40),
1700         PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDL/T", 0x1b7827b2, 0x79fba4f7),
1701         PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDS", 0x1b7827b2, 0x931afaab),
1702         PCMCIA_DEVICE_PROD_ID12("Linksys", "Combo PCMCIA EthernetCard (EC2T)", 0x0733cc81, 0x32ee8c78),
1703         PCMCIA_DEVICE_PROD_ID12("LINKSYS", "E-CARD", 0xf7cb0b07, 0x6701da11),
1704         PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 Integrated PC Card (PCM100)", 0x0733cc81, 0x453c3f9d),
1705         PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389),
1706         PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9),
1707         PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a),
1708         PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737),
1709         PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TE", 0x88fcdeda, 0x0e714bee),
1710         PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922),
1711         PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0),
1712         PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578),
1713         PCMCIA_DEVICE_PROD_ID12("Macsense", "MPC-10", 0xd830297f, 0xd265c307),
1714         PCMCIA_DEVICE_PROD_ID12("Matsushita Electric Industrial Co.,LTD.", "CF-VEL211", 0x44445376, 0x8ded41d4),
1715         PCMCIA_DEVICE_PROD_ID12("MAXTECH", "PCN2000", 0x78d64bc0, 0xca0ca4b8),
1716         PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-T", 0x481e0094, 0xa2eb0cf3),
1717         PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-TX", 0x481e0094, 0x41a6916c),
1718         PCMCIA_DEVICE_PROD_ID12("Microcom C.E.", "Travel Card LAN 10/100", 0x4b91cec7, 0xe70220d6),
1719         PCMCIA_DEVICE_PROD_ID12("Microdyne", "NE4200", 0x2e6da59b, 0x0478e472),
1720         PCMCIA_DEVICE_PROD_ID12("MIDORI ELEC.", "LT-PCMT", 0x648d55c1, 0xbde526c7),
1721         PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover 4100", 0x36e1191f, 0x60c229b9),
1722         PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover NE4100", 0x36e1191f, 0xa6617ec8),
1723         PCMCIA_DEVICE_PROD_ID12("NEC", "PC-9801N-J12", 0x18df0ba0, 0xbc912d76),
1724         PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA410TX", 0x9aa79dc3, 0x60e5bc0e),
1725         PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA411", 0x9aa79dc3, 0x40fad875),
1726         PCMCIA_DEVICE_PROD_ID12("Network Everywhere", "Fast Ethernet 10/100 PC Card", 0x820a67b6, 0x31ed1a5f),
1727         PCMCIA_DEVICE_PROD_ID12("NextCom K.K.", "Next Hawk", 0xaedaec74, 0xad050ef1),
1728         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100Mbps Ethernet Card", 0x281f1c5d, 0x6e41773b),
1729         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet", 0x281f1c5d, 0x00b2e941),
1730         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET", 0x281f1c5d, 0x3ff7175b),
1731         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet 10BaseT Card", 0x281f1c5d, 0x4de2f6c8),
1732         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Card", 0x281f1c5d, 0x5e9d92c0),
1733         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Combo card", 0x281f1c5d, 0x929c486c),
1734         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET V1.0", 0x281f1c5d, 0x4d8817c8),
1735         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEthernet", 0x281f1c5d, 0xfe871eeb),
1736         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast-Ethernet", 0x281f1c5d, 0x45f1f3b4),
1737         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FAST ETHERNET CARD", 0x281f1c5d, 0xec5dbca7),
1738         PCMCIA_DEVICE_PROD_ID12("PCMCIA LAN", "Ethernet", 0x7500e246, 0x00b2e941),
1739         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "LNT-10TN", 0x281f1c5d, 0xe707f641),
1740         PCMCIA_DEVICE_PROD_ID12("PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
1741         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "UE2212", 0x281f1c5d, 0xbf17199b),
1742         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "    Ethernet NE2000 Compatible", 0x281f1c5d, 0x42d5d7e1),
1743         PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10baseT 3.3V", 0xebf91155, 0x30074c80),
1744         PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10BaseT 3.3V", 0xebf91155, 0x7f5a4f50),
1745         PCMCIA_DEVICE_PROD_ID12("Psion Dacom", "Gold Card Ethernet", 0xf5f025c2, 0x3a30e110),
1746         PCMCIA_DEVICE_PROD_ID12("=RELIA==", "Ethernet", 0xcdd0644a, 0x00b2e941),
1747         PCMCIA_DEVICE_PROD_ID12("RP", "1625B Ethernet NE2000 Compatible", 0xe3e66e22, 0xb96150df),
1748         PCMCIA_DEVICE_PROD_ID12("RPTI", "EP400 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4a7e2ae0),
1749         PCMCIA_DEVICE_PROD_ID12("RPTI", "EP401 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4bcbd7fd),
1750         PCMCIA_DEVICE_PROD_ID12("RPTI LTD.", "EP400", 0xc53ac515, 0x81e39388),
1751         PCMCIA_DEVICE_PROD_ID12("SCM", "Ethernet Combo card", 0xbdc3b102, 0x929c486c),
1752         PCMCIA_DEVICE_PROD_ID12("Seiko Epson Corp.", "Ethernet", 0x09928730, 0x00b2e941),
1753         PCMCIA_DEVICE_PROD_ID12("SMC", "EZCard-10-PCMCIA", 0xc4f8b18b, 0xfb21d265),
1754         PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision D", 0xc70a4760, 0x2ade483e),
1755         PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision E", 0xc70a4760, 0x5dd978a8),
1756         PCMCIA_DEVICE_PROD_ID12("TDK", "LAK-CD031 for PCMCIA", 0x1eae9475, 0x0ed386fa),
1757         PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE450T", 0x466b05f0, 0x8b74bc4f),
1758         PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE550T", 0x466b05f0, 0x33c8db2a),
1759         PCMCIA_DEVICE_PROD_ID13("Hypertec",  "EP401", 0x8787bec7, 0xf6e4a31e),
1760         PCMCIA_DEVICE_PROD_ID13("KingMax Technology Inc.", "Ethernet Card", 0x932b7189, 0x5e9d92c0),
1761         PCMCIA_DEVICE_PROD_ID13("LONGSHINE", "EP401", 0xf866b0b0, 0xf6e4a31e),
1762         PCMCIA_DEVICE_PROD_ID13("Xircom", "CFE-10", 0x2e3ee845, 0x22a49f89),
1763         PCMCIA_DEVICE_PROD_ID1("CyQ've 10 Base-T LAN CARD", 0x94faf360),
1764         PCMCIA_DEVICE_PROD_ID1("EP-210 PCMCIA LAN CARD.", 0x8850b4de),
1765         PCMCIA_DEVICE_PROD_ID1("ETHER-C16", 0x06a8514f),
1766         PCMCIA_DEVICE_PROD_ID1("IC-CARD", 0x60cb09a6),
1767         PCMCIA_DEVICE_PROD_ID1("NE2000 Compatible", 0x75b8ad5a),
1768         PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078),
1769         /* too generic! */
1770         /* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */
1771         PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "PCMLM28.cis"),
1772         PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "PCMLM28.cis"),
1773         PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "PCMLM28.cis"),
1774         PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "PCMLM28.cis"),
1775         PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "PCMLM28.cis"),
1776         PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
1777         PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
1778         PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"),
1779         PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "LA-PCM.cis"),
1780         PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
1781         PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"),
1782         PCMCIA_DEVICE_CIS_PROD_ID12("PMX   ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
1783         PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"),
1784         PCMCIA_DEVICE_NULL
1785 };
1786 MODULE_DEVICE_TABLE(pcmcia, pcnet_ids);
1787
1788 static struct pcmcia_driver pcnet_driver = {
1789         .drv            = {
1790                 .name   = "pcnet_cs",
1791         },
1792         .probe          = pcnet_probe,
1793         .remove         = pcnet_detach,
1794         .owner          = THIS_MODULE,
1795         .id_table       = pcnet_ids,
1796         .suspend        = pcnet_suspend,
1797         .resume         = pcnet_resume,
1798 };
1799
1800 static int __init init_pcnet_cs(void)
1801 {
1802     return pcmcia_register_driver(&pcnet_driver);
1803 }
1804
1805 static void __exit exit_pcnet_cs(void)
1806 {
1807     DEBUG(0, "pcnet_cs: unloading\n");
1808     pcmcia_unregister_driver(&pcnet_driver);
1809 }
1810
1811 module_init(init_pcnet_cs);
1812 module_exit(exit_pcnet_cs);