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