OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [pcmcia/] [pcnet_cs.c] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.