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