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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [pcmcia/] [smc91c92_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 SMC91c92-based cards.
4
 
5
    This driver supports Megahertz PCMCIA ethernet cards; and
6
    Megahertz, Motorola, Ositech, and Psion Dacom ethernet/modem
7
    multifunction cards.
8
 
9
    Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
10
 
11
    smc91c92_cs.c 1.122 2002/10/25 06:26:39
12
 
13
    This driver contains code written by Donald Becker
14
    (becker@scyld.com), Rowan Hughes (x-csrdh@jcu.edu.au),
15
    David Hinds (dahinds@users.sourceforge.net), and Erik Stahlman
16
    (erik@vt.edu).  Donald wrote the SMC 91c92 code using parts of
17
    Erik's SMC 91c94 driver.  Rowan wrote a similar driver, and I've
18
    incorporated some parts of his driver here.  I (Dave) wrote most
19
    of the PCMCIA glue code, and the Ositech support code.  Kelly
20
    Stephens (kstephen@holli.com) added support for the Motorola
21
    Mariner, with help from Allen Brost.
22
 
23
    This software may be used and distributed according to the terms of
24
    the GNU General Public License, incorporated herein by reference.
25
 
26
======================================================================*/
27
 
28
#include <linux/module.h>
29
#include <linux/kernel.h>
30
#include <linux/init.h>
31
#include <linux/slab.h>
32
#include <linux/string.h>
33
#include <linux/timer.h>
34
#include <linux/interrupt.h>
35
#include <linux/delay.h>
36
#include <linux/crc32.h>
37
#include <linux/netdevice.h>
38
#include <linux/etherdevice.h>
39
#include <linux/skbuff.h>
40
#include <linux/if_arp.h>
41
#include <linux/ioport.h>
42
#include <linux/ethtool.h>
43
#include <linux/mii.h>
44
#include <linux/jiffies.h>
45
 
46
#include <pcmcia/cs_types.h>
47
#include <pcmcia/cs.h>
48
#include <pcmcia/cistpl.h>
49
#include <pcmcia/cisreg.h>
50
#include <pcmcia/ciscode.h>
51
#include <pcmcia/ds.h>
52
#include <pcmcia/ss.h>
53
 
54
#include <asm/io.h>
55
#include <asm/system.h>
56
#include <asm/uaccess.h>
57
 
58
/* Ositech Seven of Diamonds firmware */
59
#include "ositech.h"
60
 
61
/*====================================================================*/
62
 
63
static const char *if_names[] = { "auto", "10baseT", "10base2"};
64
 
65
/* Module parameters */
66
 
67
MODULE_DESCRIPTION("SMC 91c92 series PCMCIA ethernet driver");
68
MODULE_LICENSE("GPL");
69
 
70
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
71
 
72
/*
73
  Transceiver/media type.
74
 
75
   1 = 10baseT (and autoselect if #define AUTOSELECT),
76
   2 = AUI/10base2,
77
*/
78
INT_MODULE_PARM(if_port, 0);
79
 
80
#ifdef PCMCIA_DEBUG
81
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
82
static const char *version =
83
"smc91c92_cs.c 1.123 2006/11/09 Donald Becker, becker@scyld.com.\n";
84
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
85
#else
86
#define DEBUG(n, args...)
87
#endif
88
 
89
#define DRV_NAME        "smc91c92_cs"
90
#define DRV_VERSION     "1.123"
91
 
92
/*====================================================================*/
93
 
94
/* Operational parameter that usually are not changed. */
95
 
96
/* Time in jiffies before concluding Tx hung */
97
#define TX_TIMEOUT              ((400*HZ)/1000)
98
 
99
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
100
#define INTR_WORK               4
101
 
102
/* Times to check the check the chip before concluding that it doesn't
103
   currently have room for another Tx packet. */
104
#define MEMORY_WAIT_TIME        8
105
 
106
struct smc_private {
107
        struct pcmcia_device    *p_dev;
108
    spinlock_t                  lock;
109
    u_short                     manfid;
110
    u_short                     cardid;
111
    struct net_device_stats     stats;
112
    dev_node_t                  node;
113
    struct sk_buff              *saved_skb;
114
    int                         packets_waiting;
115
    void                        __iomem *base;
116
    u_short                     cfg;
117
    struct timer_list           media;
118
    int                         watchdog, tx_err;
119
    u_short                     media_status;
120
    u_short                     fast_poll;
121
    u_short                     link_status;
122
    struct mii_if_info          mii_if;
123
    int                         duplex;
124
    int                         rx_ovrn;
125
};
126
 
127
struct smc_cfg_mem {
128
    tuple_t tuple;
129
    cisparse_t parse;
130
    u_char buf[255];
131
};
132
 
133
/* Special definitions for Megahertz multifunction cards */
134
#define MEGAHERTZ_ISR           0x0380
135
 
136
/* Special function registers for Motorola Mariner */
137
#define MOT_LAN                 0x0000
138
#define MOT_UART                0x0020
139
#define MOT_EEPROM              0x20
140
 
141
#define MOT_NORMAL \
142
(COR_LEVEL_REQ | COR_FUNC_ENA | COR_ADDR_DECODE | COR_IREQ_ENA)
143
 
144
/* Special function registers for Ositech cards */
145
#define OSITECH_AUI_CTL         0x0c
146
#define OSITECH_PWRDOWN         0x0d
147
#define OSITECH_RESET           0x0e
148
#define OSITECH_ISR             0x0f
149
#define OSITECH_AUI_PWR         0x0c
150
#define OSITECH_RESET_ISR       0x0e
151
 
152
#define OSI_AUI_PWR             0x40
153
#define OSI_LAN_PWRDOWN         0x02
154
#define OSI_MODEM_PWRDOWN       0x01
155
#define OSI_LAN_RESET           0x02
156
#define OSI_MODEM_RESET         0x01
157
 
158
/* Symbolic constants for the SMC91c9* series chips, from Erik Stahlman. */
159
#define BANK_SELECT             14              /* Window select register. */
160
#define SMC_SELECT_BANK(x)  { outw(x, ioaddr + BANK_SELECT); }
161
 
162
/* Bank 0 registers. */
163
#define TCR             0        /* transmit control register */
164
#define  TCR_CLEAR      0        /* do NOTHING */
165
#define  TCR_ENABLE     0x0001  /* if this is 1, we can transmit */
166
#define  TCR_PAD_EN     0x0080  /* pads short packets to 64 bytes */
167
#define  TCR_MONCSN     0x0400  /* Monitor Carrier. */
168
#define  TCR_FDUPLX     0x0800  /* Full duplex mode. */
169
#define  TCR_NORMAL TCR_ENABLE | TCR_PAD_EN
170
 
171
#define EPH             2       /* Ethernet Protocol Handler report. */
172
#define  EPH_TX_SUC     0x0001
173
#define  EPH_SNGLCOL    0x0002
174
#define  EPH_MULCOL     0x0004
175
#define  EPH_LTX_MULT   0x0008
176
#define  EPH_16COL      0x0010
177
#define  EPH_SQET       0x0020
178
#define  EPH_LTX_BRD    0x0040
179
#define  EPH_TX_DEFR    0x0080
180
#define  EPH_LAT_COL    0x0200
181
#define  EPH_LOST_CAR   0x0400
182
#define  EPH_EXC_DEF    0x0800
183
#define  EPH_CTR_ROL    0x1000
184
#define  EPH_RX_OVRN    0x2000
185
#define  EPH_LINK_OK    0x4000
186
#define  EPH_TX_UNRN    0x8000
187
#define MEMINFO         8       /* Memory Information Register */
188
#define MEMCFG          10      /* Memory Configuration Register */
189
 
190
/* Bank 1 registers. */
191
#define CONFIG                  0
192
#define  CFG_MII_SELECT         0x8000  /* 91C100 only */
193
#define  CFG_NO_WAIT            0x1000
194
#define  CFG_FULL_STEP          0x0400
195
#define  CFG_SET_SQLCH          0x0200
196
#define  CFG_AUI_SELECT         0x0100
197
#define  CFG_16BIT              0x0080
198
#define  CFG_DIS_LINK           0x0040
199
#define  CFG_STATIC             0x0030
200
#define  CFG_IRQ_SEL_1          0x0004
201
#define  CFG_IRQ_SEL_0          0x0002
202
#define BASE_ADDR               2
203
#define ADDR0                   4
204
#define GENERAL                 10
205
#define CONTROL                 12
206
#define  CTL_STORE              0x0001
207
#define  CTL_RELOAD             0x0002
208
#define  CTL_EE_SELECT          0x0004
209
#define  CTL_TE_ENABLE          0x0020
210
#define  CTL_CR_ENABLE          0x0040
211
#define  CTL_LE_ENABLE          0x0080
212
#define  CTL_AUTO_RELEASE       0x0800
213
#define  CTL_POWERDOWN          0x2000
214
 
215
/* Bank 2 registers. */
216
#define MMU_CMD         0
217
#define  MC_ALLOC       0x20    /* or with number of 256 byte packets */
218
#define  MC_RESET       0x40
219
#define  MC_RELEASE     0x80    /* remove and release the current rx packet */
220
#define  MC_FREEPKT     0xA0    /* Release packet in PNR register */
221
#define  MC_ENQUEUE     0xC0    /* Enqueue the packet for transmit */
222
#define PNR_ARR         2
223
#define FIFO_PORTS      4
224
#define  FP_RXEMPTY     0x8000
225
#define POINTER         6
226
#define  PTR_AUTO_INC   0x0040
227
#define  PTR_READ       0x2000
228
#define  PTR_AUTOINC    0x4000
229
#define  PTR_RCV        0x8000
230
#define DATA_1          8
231
#define INTERRUPT       12
232
#define  IM_RCV_INT             0x1
233
#define  IM_TX_INT              0x2
234
#define  IM_TX_EMPTY_INT        0x4
235
#define  IM_ALLOC_INT           0x8
236
#define  IM_RX_OVRN_INT         0x10
237
#define  IM_EPH_INT             0x20
238
 
239
#define RCR             4
240
enum RxCfg { RxAllMulti = 0x0004, RxPromisc = 0x0002,
241
             RxEnable = 0x0100, RxStripCRC = 0x0200};
242
#define  RCR_SOFTRESET  0x8000  /* resets the chip */
243
#define  RCR_STRIP_CRC  0x200   /* strips CRC */
244
#define  RCR_ENABLE     0x100   /* IFF this is set, we can receive packets */
245
#define  RCR_ALMUL      0x4     /* receive all multicast packets */
246
#define  RCR_PROMISC    0x2     /* enable promiscuous mode */
247
 
248
/* the normal settings for the RCR register : */
249
#define  RCR_NORMAL     (RCR_STRIP_CRC | RCR_ENABLE)
250
#define  RCR_CLEAR      0x0             /* set it to a base state */
251
#define COUNTER         6
252
 
253
/* BANK 3 -- not the same values as in smc9194! */
254
#define MULTICAST0      0
255
#define MULTICAST2      2
256
#define MULTICAST4      4
257
#define MULTICAST6      6
258
#define MGMT            8
259
#define REVISION        0x0a
260
 
261
/* Transmit status bits. */
262
#define TS_SUCCESS 0x0001
263
#define TS_16COL   0x0010
264
#define TS_LATCOL  0x0200
265
#define TS_LOSTCAR 0x0400
266
 
267
/* Receive status bits. */
268
#define RS_ALGNERR      0x8000
269
#define RS_BADCRC       0x2000
270
#define RS_ODDFRAME     0x1000
271
#define RS_TOOLONG      0x0800
272
#define RS_TOOSHORT     0x0400
273
#define RS_MULTICAST    0x0001
274
#define RS_ERRORS       (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
275
 
276
#define set_bits(v, p) outw(inw(p)|(v), (p))
277
#define mask_bits(v, p) outw(inw(p)&(v), (p))
278
 
279
/*====================================================================*/
280
 
281
static void smc91c92_detach(struct pcmcia_device *p_dev);
282
static int smc91c92_config(struct pcmcia_device *link);
283
static void smc91c92_release(struct pcmcia_device *link);
284
 
285
static int smc_open(struct net_device *dev);
286
static int smc_close(struct net_device *dev);
287
static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
288
static void smc_tx_timeout(struct net_device *dev);
289
static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev);
290
static irqreturn_t smc_interrupt(int irq, void *dev_id);
291
static void smc_rx(struct net_device *dev);
292
static struct net_device_stats *smc_get_stats(struct net_device *dev);
293
static void set_rx_mode(struct net_device *dev);
294
static int s9k_config(struct net_device *dev, struct ifmap *map);
295
static void smc_set_xcvr(struct net_device *dev, int if_port);
296
static void smc_reset(struct net_device *dev);
297
static void media_check(u_long arg);
298
static void mdio_sync(kio_addr_t addr);
299
static int mdio_read(struct net_device *dev, int phy_id, int loc);
300
static void mdio_write(struct net_device *dev, int phy_id, int loc, int value);
301
static int smc_link_ok(struct net_device *dev);
302
static const struct ethtool_ops ethtool_ops;
303
 
304
/*======================================================================
305
 
306
  smc91c92_attach() creates an "instance" of the driver, allocating
307
  local data structures for one device.  The device is registered
308
  with Card Services.
309
 
310
======================================================================*/
311
 
312
static int smc91c92_probe(struct pcmcia_device *link)
313
{
314
    struct smc_private *smc;
315
    struct net_device *dev;
316
 
317
    DEBUG(0, "smc91c92_attach()\n");
318
 
319
    /* Create new ethernet device */
320
    dev = alloc_etherdev(sizeof(struct smc_private));
321
    if (!dev)
322
        return -ENOMEM;
323
    smc = netdev_priv(dev);
324
    smc->p_dev = link;
325
    link->priv = dev;
326
 
327
    spin_lock_init(&smc->lock);
328
    link->io.NumPorts1 = 16;
329
    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
330
    link->io.IOAddrLines = 4;
331
    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
332
    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
333
    link->irq.Handler = &smc_interrupt;
334
    link->irq.Instance = dev;
335
    link->conf.Attributes = CONF_ENABLE_IRQ;
336
    link->conf.IntType = INT_MEMORY_AND_IO;
337
 
338
    /* The SMC91c92-specific entries in the device structure. */
339
    dev->hard_start_xmit = &smc_start_xmit;
340
    dev->get_stats = &smc_get_stats;
341
    dev->set_config = &s9k_config;
342
    dev->set_multicast_list = &set_rx_mode;
343
    dev->open = &smc_open;
344
    dev->stop = &smc_close;
345
    dev->do_ioctl = &smc_ioctl;
346
    SET_ETHTOOL_OPS(dev, &ethtool_ops);
347
#ifdef HAVE_TX_TIMEOUT
348
    dev->tx_timeout = smc_tx_timeout;
349
    dev->watchdog_timeo = TX_TIMEOUT;
350
#endif
351
 
352
    smc->mii_if.dev = dev;
353
    smc->mii_if.mdio_read = mdio_read;
354
    smc->mii_if.mdio_write = mdio_write;
355
    smc->mii_if.phy_id_mask = 0x1f;
356
    smc->mii_if.reg_num_mask = 0x1f;
357
 
358
    return smc91c92_config(link);
359
} /* smc91c92_attach */
360
 
361
/*======================================================================
362
 
363
    This deletes a driver "instance".  The device is de-registered
364
    with Card Services.  If it has been released, all local data
365
    structures are freed.  Otherwise, the structures will be freed
366
    when the device is released.
367
 
368
======================================================================*/
369
 
370
static void smc91c92_detach(struct pcmcia_device *link)
371
{
372
    struct net_device *dev = link->priv;
373
 
374
    DEBUG(0, "smc91c92_detach(0x%p)\n", link);
375
 
376
    if (link->dev_node)
377
        unregister_netdev(dev);
378
 
379
    smc91c92_release(link);
380
 
381
    free_netdev(dev);
382
} /* smc91c92_detach */
383
 
384
/*====================================================================*/
385
 
386
static int cvt_ascii_address(struct net_device *dev, char *s)
387
{
388
    int i, j, da, c;
389
 
390
    if (strlen(s) != 12)
391
        return -1;
392
    for (i = 0; i < 6; i++) {
393
        da = 0;
394
        for (j = 0; j < 2; j++) {
395
            c = *s++;
396
            da <<= 4;
397
            da += ((c >= '0') && (c <= '9')) ?
398
                (c - '0') : ((c & 0x0f) + 9);
399
        }
400
        dev->dev_addr[i] = da;
401
    }
402
    return 0;
403
}
404
 
405
/*====================================================================*/
406
 
407
static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
408
                cisparse_t *parse)
409
{
410
        int i;
411
 
412
        if ((i = pcmcia_get_first_tuple(handle, tuple)) != CS_SUCCESS ||
413
                        (i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
414
                return i;
415
        return pcmcia_parse_tuple(handle, tuple, parse);
416
}
417
 
418
static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
419
                cisparse_t *parse)
420
{
421
        int i;
422
 
423
        if ((i = pcmcia_get_next_tuple(handle, tuple)) != CS_SUCCESS ||
424
                        (i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
425
                return i;
426
        return pcmcia_parse_tuple(handle, tuple, parse);
427
}
428
 
429
/*======================================================================
430
 
431
    Configuration stuff for Megahertz cards
432
 
433
    mhz_3288_power() is used to power up a 3288's ethernet chip.
434
    mhz_mfc_config() handles socket setup for multifunction (1144
435
    and 3288) cards.  mhz_setup() gets a card's hardware ethernet
436
    address.
437
 
438
======================================================================*/
439
 
440
static int mhz_3288_power(struct pcmcia_device *link)
441
{
442
    struct net_device *dev = link->priv;
443
    struct smc_private *smc = netdev_priv(dev);
444
    u_char tmp;
445
 
446
    /* Read the ISR twice... */
447
    readb(smc->base+MEGAHERTZ_ISR);
448
    udelay(5);
449
    readb(smc->base+MEGAHERTZ_ISR);
450
 
451
    /* Pause 200ms... */
452
    mdelay(200);
453
 
454
    /* Now read and write the COR... */
455
    tmp = readb(smc->base + link->conf.ConfigBase + CISREG_COR);
456
    udelay(5);
457
    writeb(tmp, smc->base + link->conf.ConfigBase + CISREG_COR);
458
 
459
    return 0;
460
}
461
 
462
static int mhz_mfc_config(struct pcmcia_device *link)
463
{
464
    struct net_device *dev = link->priv;
465
    struct smc_private *smc = netdev_priv(dev);
466
    struct smc_cfg_mem *cfg_mem;
467
    tuple_t *tuple;
468
    cisparse_t *parse;
469
    cistpl_cftable_entry_t *cf;
470
    u_char *buf;
471
    win_req_t req;
472
    memreq_t mem;
473
    int i, k;
474
 
475
    cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
476
    if (!cfg_mem)
477
        return CS_OUT_OF_RESOURCE;
478
 
479
    tuple = &cfg_mem->tuple;
480
    parse = &cfg_mem->parse;
481
    cf = &parse->cftable_entry;
482
    buf = cfg_mem->buf;
483
 
484
    link->conf.Attributes |= CONF_ENABLE_SPKR;
485
    link->conf.Status = CCSR_AUDIO_ENA;
486
    link->irq.Attributes =
487
        IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
488
    link->io.IOAddrLines = 16;
489
    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
490
    link->io.NumPorts2 = 8;
491
 
492
    tuple->Attributes = tuple->TupleOffset = 0;
493
    tuple->TupleData = (cisdata_t *)buf;
494
    tuple->TupleDataMax = 255;
495
    tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
496
 
497
    i = first_tuple(link, tuple, parse);
498
    /* The Megahertz combo cards have modem-like CIS entries, so
499
       we have to explicitly try a bunch of port combinations. */
500
    while (i == CS_SUCCESS) {
501
        link->conf.ConfigIndex = cf->index;
502
        link->io.BasePort2 = cf->io.win[0].base;
503
        for (k = 0; k < 0x400; k += 0x10) {
504
            if (k & 0x80) continue;
505
            link->io.BasePort1 = k ^ 0x300;
506
            i = pcmcia_request_io(link, &link->io);
507
            if (i == CS_SUCCESS) break;
508
        }
509
        if (i == CS_SUCCESS) break;
510
        i = next_tuple(link, tuple, parse);
511
    }
512
    if (i != CS_SUCCESS)
513
        goto free_cfg_mem;
514
    dev->base_addr = link->io.BasePort1;
515
 
516
    /* Allocate a memory window, for accessing the ISR */
517
    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
518
    req.Base = req.Size = 0;
519
    req.AccessSpeed = 0;
520
    i = pcmcia_request_window(&link, &req, &link->win);
521
    if (i != CS_SUCCESS)
522
        goto free_cfg_mem;
523
    smc->base = ioremap(req.Base, req.Size);
524
    mem.CardOffset = mem.Page = 0;
525
    if (smc->manfid == MANFID_MOTOROLA)
526
        mem.CardOffset = link->conf.ConfigBase;
527
    i = pcmcia_map_mem_page(link->win, &mem);
528
 
529
    if ((i == CS_SUCCESS)
530
        && (smc->manfid == MANFID_MEGAHERTZ)
531
        && (smc->cardid == PRODID_MEGAHERTZ_EM3288))
532
        mhz_3288_power(link);
533
 
534
free_cfg_mem:
535
    kfree(cfg_mem);
536
    return i;
537
}
538
 
539
static int mhz_setup(struct pcmcia_device *link)
540
{
541
    struct net_device *dev = link->priv;
542
    struct smc_cfg_mem *cfg_mem;
543
    tuple_t *tuple;
544
    cisparse_t *parse;
545
    u_char *buf, *station_addr;
546
    int rc;
547
 
548
    cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
549
    if (!cfg_mem)
550
        return -1;
551
 
552
    tuple = &cfg_mem->tuple;
553
    parse = &cfg_mem->parse;
554
    buf = cfg_mem->buf;
555
 
556
    tuple->Attributes = tuple->TupleOffset = 0;
557
    tuple->TupleData = (cisdata_t *)buf;
558
    tuple->TupleDataMax = 255;
559
 
560
    /* Read the station address from the CIS.  It is stored as the last
561
       (fourth) string in the Version 1 Version/ID tuple. */
562
    if (link->prod_id[3]) {
563
        station_addr = link->prod_id[3];
564
        if (cvt_ascii_address(dev, station_addr) == 0) {
565
                rc = 0;
566
                goto free_cfg_mem;
567
        }
568
    }
569
 
570
    /* Another possibility: for the EM3288, in a special tuple */
571
    tuple->DesiredTuple = 0x81;
572
    if (pcmcia_get_first_tuple(link, tuple) != CS_SUCCESS) {
573
        rc = -1;
574
        goto free_cfg_mem;
575
    }
576
    if (pcmcia_get_tuple_data(link, tuple) != CS_SUCCESS) {
577
        rc = -1;
578
        goto free_cfg_mem;
579
    }
580
    buf[12] = '\0';
581
    if (cvt_ascii_address(dev, buf) == 0) {
582
        rc = 0;
583
        goto free_cfg_mem;
584
   }
585
    rc = -1;
586
free_cfg_mem:
587
   kfree(cfg_mem);
588
   return rc;
589
}
590
 
591
/*======================================================================
592
 
593
    Configuration stuff for the Motorola Mariner
594
 
595
    mot_config() writes directly to the Mariner configuration
596
    registers because the CIS is just bogus.
597
 
598
======================================================================*/
599
 
600
static void mot_config(struct pcmcia_device *link)
601
{
602
    struct net_device *dev = link->priv;
603
    struct smc_private *smc = netdev_priv(dev);
604
    kio_addr_t ioaddr = dev->base_addr;
605
    kio_addr_t iouart = link->io.BasePort2;
606
 
607
    /* Set UART base address and force map with COR bit 1 */
608
    writeb(iouart & 0xff,        smc->base + MOT_UART + CISREG_IOBASE_0);
609
    writeb((iouart >> 8) & 0xff, smc->base + MOT_UART + CISREG_IOBASE_1);
610
    writeb(MOT_NORMAL,           smc->base + MOT_UART + CISREG_COR);
611
 
612
    /* Set SMC base address and force map with COR bit 1 */
613
    writeb(ioaddr & 0xff,        smc->base + MOT_LAN + CISREG_IOBASE_0);
614
    writeb((ioaddr >> 8) & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_1);
615
    writeb(MOT_NORMAL,           smc->base + MOT_LAN + CISREG_COR);
616
 
617
    /* Wait for things to settle down */
618
    mdelay(100);
619
}
620
 
621
static int mot_setup(struct pcmcia_device *link)
622
{
623
    struct net_device *dev = link->priv;
624
    kio_addr_t ioaddr = dev->base_addr;
625
    int i, wait, loop;
626
    u_int addr;
627
 
628
    /* Read Ethernet address from Serial EEPROM */
629
 
630
    for (i = 0; i < 3; i++) {
631
        SMC_SELECT_BANK(2);
632
        outw(MOT_EEPROM + i, ioaddr + POINTER);
633
        SMC_SELECT_BANK(1);
634
        outw((CTL_RELOAD | CTL_EE_SELECT), ioaddr + CONTROL);
635
 
636
        for (loop = wait = 0; loop < 200; loop++) {
637
            udelay(10);
638
            wait = ((CTL_RELOAD | CTL_STORE) & inw(ioaddr + CONTROL));
639
            if (wait == 0) break;
640
        }
641
 
642
        if (wait)
643
            return -1;
644
 
645
        addr = inw(ioaddr + GENERAL);
646
        dev->dev_addr[2*i]   = addr & 0xff;
647
        dev->dev_addr[2*i+1] = (addr >> 8) & 0xff;
648
    }
649
 
650
    return 0;
651
}
652
 
653
/*====================================================================*/
654
 
655
static int smc_config(struct pcmcia_device *link)
656
{
657
    struct net_device *dev = link->priv;
658
    struct smc_cfg_mem *cfg_mem;
659
    tuple_t *tuple;
660
    cisparse_t *parse;
661
    cistpl_cftable_entry_t *cf;
662
    u_char *buf;
663
    int i;
664
 
665
    cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
666
    if (!cfg_mem)
667
        return CS_OUT_OF_RESOURCE;
668
 
669
    tuple = &cfg_mem->tuple;
670
    parse = &cfg_mem->parse;
671
    cf = &parse->cftable_entry;
672
    buf = cfg_mem->buf;
673
 
674
    tuple->Attributes = tuple->TupleOffset = 0;
675
    tuple->TupleData = (cisdata_t *)buf;
676
    tuple->TupleDataMax = 255;
677
    tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
678
 
679
    link->io.NumPorts1 = 16;
680
    i = first_tuple(link, tuple, parse);
681
    while (i != CS_NO_MORE_ITEMS) {
682
        if (i == CS_SUCCESS) {
683
            link->conf.ConfigIndex = cf->index;
684
            link->io.BasePort1 = cf->io.win[0].base;
685
            link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
686
            i = pcmcia_request_io(link, &link->io);
687
            if (i == CS_SUCCESS) break;
688
        }
689
        i = next_tuple(link, tuple, parse);
690
    }
691
    if (i == CS_SUCCESS)
692
        dev->base_addr = link->io.BasePort1;
693
 
694
    kfree(cfg_mem);
695
    return i;
696
}
697
 
698
static int smc_setup(struct pcmcia_device *link)
699
{
700
    struct net_device *dev = link->priv;
701
    struct smc_cfg_mem *cfg_mem;
702
    tuple_t *tuple;
703
    cisparse_t *parse;
704
    cistpl_lan_node_id_t *node_id;
705
    u_char *buf, *station_addr;
706
    int i, rc;
707
 
708
    cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
709
    if (!cfg_mem)
710
        return CS_OUT_OF_RESOURCE;
711
 
712
    tuple = &cfg_mem->tuple;
713
    parse = &cfg_mem->parse;
714
    buf = cfg_mem->buf;
715
 
716
    tuple->Attributes = tuple->TupleOffset = 0;
717
    tuple->TupleData = (cisdata_t *)buf;
718
    tuple->TupleDataMax = 255;
719
 
720
    /* Check for a LAN function extension tuple */
721
    tuple->DesiredTuple = CISTPL_FUNCE;
722
    i = first_tuple(link, tuple, parse);
723
    while (i == CS_SUCCESS) {
724
        if (parse->funce.type == CISTPL_FUNCE_LAN_NODE_ID)
725
            break;
726
        i = next_tuple(link, tuple, parse);
727
    }
728
    if (i == CS_SUCCESS) {
729
        node_id = (cistpl_lan_node_id_t *)parse->funce.data;
730
        if (node_id->nb == 6) {
731
            for (i = 0; i < 6; i++)
732
                dev->dev_addr[i] = node_id->id[i];
733
            rc = 0;
734
            goto free_cfg_mem;
735
        }
736
    }
737
    /* Try the third string in the Version 1 Version/ID tuple. */
738
    if (link->prod_id[2]) {
739
        station_addr = link->prod_id[2];
740
        if (cvt_ascii_address(dev, station_addr) == 0) {
741
                rc = 0;
742
                goto free_cfg_mem;
743
        }
744
    }
745
 
746
    rc = -1;
747
free_cfg_mem:
748
    kfree(cfg_mem);
749
    return rc;
750
}
751
 
752
/*====================================================================*/
753
 
754
static int osi_config(struct pcmcia_device *link)
755
{
756
    struct net_device *dev = link->priv;
757
    static const kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
758
    int i, j;
759
 
760
    link->conf.Attributes |= CONF_ENABLE_SPKR;
761
    link->conf.Status = CCSR_AUDIO_ENA;
762
    link->irq.Attributes =
763
        IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
764
    link->io.NumPorts1 = 64;
765
    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
766
    link->io.NumPorts2 = 8;
767
    link->io.IOAddrLines = 16;
768
 
769
    /* Enable Hard Decode, LAN, Modem */
770
    link->conf.ConfigIndex = 0x23;
771
 
772
    for (i = j = 0; j < 4; j++) {
773
        link->io.BasePort2 = com[j];
774
        i = pcmcia_request_io(link, &link->io);
775
        if (i == CS_SUCCESS) break;
776
    }
777
    if (i != CS_SUCCESS) {
778
        /* Fallback: turn off hard decode */
779
        link->conf.ConfigIndex = 0x03;
780
        link->io.NumPorts2 = 0;
781
        i = pcmcia_request_io(link, &link->io);
782
    }
783
    dev->base_addr = link->io.BasePort1 + 0x10;
784
    return i;
785
}
786
 
787
static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid)
788
{
789
    struct net_device *dev = link->priv;
790
    struct smc_cfg_mem *cfg_mem;
791
    tuple_t *tuple;
792
    u_char *buf;
793
    int i, rc;
794
 
795
    cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
796
    if (!cfg_mem)
797
        return -1;
798
 
799
    tuple = &cfg_mem->tuple;
800
    buf = cfg_mem->buf;
801
 
802
    tuple->Attributes = TUPLE_RETURN_COMMON;
803
    tuple->TupleData = (cisdata_t *)buf;
804
    tuple->TupleDataMax = 255;
805
    tuple->TupleOffset = 0;
806
 
807
    /* Read the station address from tuple 0x90, subtuple 0x04 */
808
    tuple->DesiredTuple = 0x90;
809
    i = pcmcia_get_first_tuple(link, tuple);
810
    while (i == CS_SUCCESS) {
811
        i = pcmcia_get_tuple_data(link, tuple);
812
        if ((i != CS_SUCCESS) || (buf[0] == 0x04))
813
            break;
814
        i = pcmcia_get_next_tuple(link, tuple);
815
    }
816
    if (i != CS_SUCCESS) {
817
        rc = -1;
818
        goto free_cfg_mem;
819
    }
820
    for (i = 0; i < 6; i++)
821
        dev->dev_addr[i] = buf[i+2];
822
 
823
    if (((manfid == MANFID_OSITECH) &&
824
         (cardid == PRODID_OSITECH_SEVEN)) ||
825
        ((manfid == MANFID_PSION) &&
826
         (cardid == PRODID_PSION_NET100))) {
827
        /* Download the Seven of Diamonds firmware */
828
        for (i = 0; i < sizeof(__Xilinx7OD); i++) {
829
            outb(__Xilinx7OD[i], link->io.BasePort1+2);
830
            udelay(50);
831
        }
832
    } else if (manfid == MANFID_OSITECH) {
833
        /* Make sure both functions are powered up */
834
        set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
835
        /* Now, turn on the interrupt for both card functions */
836
        set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
837
        DEBUG(2, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
838
              inw(link->io.BasePort1 + OSITECH_AUI_PWR),
839
              inw(link->io.BasePort1 + OSITECH_RESET_ISR));
840
    }
841
    rc = 0;
842
free_cfg_mem:
843
   kfree(cfg_mem);
844
   return rc;
845
}
846
 
847
static int smc91c92_suspend(struct pcmcia_device *link)
848
{
849
        struct net_device *dev = link->priv;
850
 
851
        if (link->open)
852
                netif_device_detach(dev);
853
 
854
        return 0;
855
}
856
 
857
static int smc91c92_resume(struct pcmcia_device *link)
858
{
859
        struct net_device *dev = link->priv;
860
        struct smc_private *smc = netdev_priv(dev);
861
        int i;
862
 
863
        if ((smc->manfid == MANFID_MEGAHERTZ) &&
864
            (smc->cardid == PRODID_MEGAHERTZ_EM3288))
865
                mhz_3288_power(link);
866
        if (smc->manfid == MANFID_MOTOROLA)
867
                mot_config(link);
868
        if ((smc->manfid == MANFID_OSITECH) &&
869
            (smc->cardid != PRODID_OSITECH_SEVEN)) {
870
                /* Power up the card and enable interrupts */
871
                set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
872
                set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
873
        }
874
        if (((smc->manfid == MANFID_OSITECH) &&
875
             (smc->cardid == PRODID_OSITECH_SEVEN)) ||
876
            ((smc->manfid == MANFID_PSION) &&
877
             (smc->cardid == PRODID_PSION_NET100))) {
878
                /* Download the Seven of Diamonds firmware */
879
                for (i = 0; i < sizeof(__Xilinx7OD); i++) {
880
                        outb(__Xilinx7OD[i], link->io.BasePort1+2);
881
                        udelay(50);
882
                }
883
        }
884
        if (link->open) {
885
                smc_reset(dev);
886
                netif_device_attach(dev);
887
        }
888
 
889
        return 0;
890
}
891
 
892
 
893
/*======================================================================
894
 
895
    This verifies that the chip is some SMC91cXX variant, and returns
896
    the revision code if successful.  Otherwise, it returns -ENODEV.
897
 
898
======================================================================*/
899
 
900
static int check_sig(struct pcmcia_device *link)
901
{
902
    struct net_device *dev = link->priv;
903
    kio_addr_t ioaddr = dev->base_addr;
904
    int width;
905
    u_short s;
906
 
907
    SMC_SELECT_BANK(1);
908
    if (inw(ioaddr + BANK_SELECT) >> 8 != 0x33) {
909
        /* Try powering up the chip */
910
        outw(0, ioaddr + CONTROL);
911
        mdelay(55);
912
    }
913
 
914
    /* Try setting bus width */
915
    width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
916
    s = inb(ioaddr + CONFIG);
917
    if (width)
918
        s |= CFG_16BIT;
919
    else
920
        s &= ~CFG_16BIT;
921
    outb(s, ioaddr + CONFIG);
922
 
923
    /* Check Base Address Register to make sure bus width is OK */
924
    s = inw(ioaddr + BASE_ADDR);
925
    if ((inw(ioaddr + BANK_SELECT) >> 8 == 0x33) &&
926
        ((s >> 8) != (s & 0xff))) {
927
        SMC_SELECT_BANK(3);
928
        s = inw(ioaddr + REVISION);
929
        return (s & 0xff);
930
    }
931
 
932
    if (width) {
933
            modconf_t mod = {
934
                    .Attributes = CONF_IO_CHANGE_WIDTH,
935
            };
936
            printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
937
 
938
            smc91c92_suspend(link);
939
            pcmcia_modify_configuration(link, &mod);
940
            smc91c92_resume(link);
941
            return check_sig(link);
942
    }
943
    return -ENODEV;
944
}
945
 
946
/*======================================================================
947
 
948
    smc91c92_config() is scheduled to run after a CARD_INSERTION event
949
    is received, to configure the PCMCIA socket, and to make the
950
    ethernet device available to the system.
951
 
952
======================================================================*/
953
 
954
#define CS_EXIT_TEST(ret, svc, label) \
955
if (ret != CS_SUCCESS) { cs_error(link, svc, ret); goto label; }
956
 
957
static int smc91c92_config(struct pcmcia_device *link)
958
{
959
    struct net_device *dev = link->priv;
960
    struct smc_private *smc = netdev_priv(dev);
961
    char *name;
962
    int i, j, rev;
963
    kio_addr_t ioaddr;
964
    u_long mir;
965
    DECLARE_MAC_BUF(mac);
966
 
967
    DEBUG(0, "smc91c92_config(0x%p)\n", link);
968
 
969
    smc->manfid = link->manf_id;
970
    smc->cardid = link->card_id;
971
 
972
    if ((smc->manfid == MANFID_OSITECH) &&
973
        (smc->cardid != PRODID_OSITECH_SEVEN)) {
974
        i = osi_config(link);
975
    } else if ((smc->manfid == MANFID_MOTOROLA) ||
976
               ((smc->manfid == MANFID_MEGAHERTZ) &&
977
                ((smc->cardid == PRODID_MEGAHERTZ_VARIOUS) ||
978
                 (smc->cardid == PRODID_MEGAHERTZ_EM3288)))) {
979
        i = mhz_mfc_config(link);
980
    } else {
981
        i = smc_config(link);
982
    }
983
    CS_EXIT_TEST(i, RequestIO, config_failed);
984
 
985
    i = pcmcia_request_irq(link, &link->irq);
986
    CS_EXIT_TEST(i, RequestIRQ, config_failed);
987
    i = pcmcia_request_configuration(link, &link->conf);
988
    CS_EXIT_TEST(i, RequestConfiguration, config_failed);
989
 
990
    if (smc->manfid == MANFID_MOTOROLA)
991
        mot_config(link);
992
 
993
    dev->irq = link->irq.AssignedIRQ;
994
 
995
    if ((if_port >= 0) && (if_port <= 2))
996
        dev->if_port = if_port;
997
    else
998
        printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n");
999
 
1000
    switch (smc->manfid) {
1001
    case MANFID_OSITECH:
1002
    case MANFID_PSION:
1003
        i = osi_setup(link, smc->manfid, smc->cardid); break;
1004
    case MANFID_SMC:
1005
    case MANFID_NEW_MEDIA:
1006
        i = smc_setup(link); break;
1007
    case 0x128: /* For broken Megahertz cards */
1008
    case MANFID_MEGAHERTZ:
1009
        i = mhz_setup(link); break;
1010
    case MANFID_MOTOROLA:
1011
    default: /* get the hw address from EEPROM */
1012
        i = mot_setup(link); break;
1013
    }
1014
 
1015
    if (i != 0) {
1016
        printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
1017
        goto config_undo;
1018
    }
1019
 
1020
    smc->duplex = 0;
1021
    smc->rx_ovrn = 0;
1022
 
1023
    rev = check_sig(link);
1024
    name = "???";
1025
    if (rev > 0)
1026
        switch (rev >> 4) {
1027
        case 3: name = "92"; break;
1028
        case 4: name = ((rev & 15) >= 6) ? "96" : "94"; break;
1029
        case 5: name = "95"; break;
1030
        case 7: name = "100"; break;
1031
        case 8: name = "100-FD"; break;
1032
        case 9: name = "110"; break;
1033
        }
1034
 
1035
    ioaddr = dev->base_addr;
1036
    if (rev > 0) {
1037
        u_long mcr;
1038
        SMC_SELECT_BANK(0);
1039
        mir = inw(ioaddr + MEMINFO) & 0xff;
1040
        if (mir == 0xff) mir++;
1041
        /* Get scale factor for memory size */
1042
        mcr = ((rev >> 4) > 3) ? inw(ioaddr + MEMCFG) : 0x0200;
1043
        mir *= 128 * (1<<((mcr >> 9) & 7));
1044
        SMC_SELECT_BANK(1);
1045
        smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT;
1046
        smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC;
1047
        if (smc->manfid == MANFID_OSITECH)
1048
            smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0;
1049
        if ((rev >> 4) >= 7)
1050
            smc->cfg |= CFG_MII_SELECT;
1051
    } else
1052
        mir = 0;
1053
 
1054
    if (smc->cfg & CFG_MII_SELECT) {
1055
        SMC_SELECT_BANK(3);
1056
 
1057
        for (i = 0; i < 32; i++) {
1058
            j = mdio_read(dev, i, 1);
1059
            if ((j != 0) && (j != 0xffff)) break;
1060
        }
1061
        smc->mii_if.phy_id = (i < 32) ? i : -1;
1062
 
1063
        SMC_SELECT_BANK(0);
1064
    }
1065
 
1066
    link->dev_node = &smc->node;
1067
    SET_NETDEV_DEV(dev, &handle_to_dev(link));
1068
 
1069
    if (register_netdev(dev) != 0) {
1070
        printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n");
1071
        link->dev_node = NULL;
1072
        goto config_undo;
1073
    }
1074
 
1075
    strcpy(smc->node.dev_name, dev->name);
1076
 
1077
    printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, "
1078
           "hw_addr %s\n",
1079
           dev->name, name, (rev & 0x0f), dev->base_addr, dev->irq,
1080
           print_mac(mac, dev->dev_addr));
1081
 
1082
    if (rev > 0) {
1083
        if (mir & 0x3ff)
1084
            printk(KERN_INFO "  %lu byte", mir);
1085
        else
1086
            printk(KERN_INFO "  %lu kb", mir>>10);
1087
        printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ?
1088
               "MII" : if_names[dev->if_port]);
1089
    }
1090
 
1091
    if (smc->cfg & CFG_MII_SELECT) {
1092
        if (smc->mii_if.phy_id != -1) {
1093
            DEBUG(0, "  MII transceiver at index %d, status %x.\n",
1094
                  smc->mii_if.phy_id, j);
1095
        } else {
1096
            printk(KERN_NOTICE "  No MII transceivers found!\n");
1097
        }
1098
    }
1099
    return 0;
1100
 
1101
config_undo:
1102
    unregister_netdev(dev);
1103
config_failed:                  /* CS_EXIT_TEST() calls jump to here... */
1104
    smc91c92_release(link);
1105
    return -ENODEV;
1106
} /* smc91c92_config */
1107
 
1108
/*======================================================================
1109
 
1110
    After a card is removed, smc91c92_release() will unregister the net
1111
    device, and release the PCMCIA configuration.  If the device is
1112
    still open, this will be postponed until it is closed.
1113
 
1114
======================================================================*/
1115
 
1116
static void smc91c92_release(struct pcmcia_device *link)
1117
{
1118
        DEBUG(0, "smc91c92_release(0x%p)\n", link);
1119
        if (link->win) {
1120
                struct net_device *dev = link->priv;
1121
                struct smc_private *smc = netdev_priv(dev);
1122
                iounmap(smc->base);
1123
        }
1124
        pcmcia_disable_device(link);
1125
}
1126
 
1127
/*======================================================================
1128
 
1129
    MII interface support for SMC91cXX based cards
1130
======================================================================*/
1131
 
1132
#define MDIO_SHIFT_CLK          0x04
1133
#define MDIO_DATA_OUT           0x01
1134
#define MDIO_DIR_WRITE          0x08
1135
#define MDIO_DATA_WRITE0        (MDIO_DIR_WRITE)
1136
#define MDIO_DATA_WRITE1        (MDIO_DIR_WRITE | MDIO_DATA_OUT)
1137
#define MDIO_DATA_READ          0x02
1138
 
1139
static void mdio_sync(kio_addr_t addr)
1140
{
1141
    int bits;
1142
    for (bits = 0; bits < 32; bits++) {
1143
        outb(MDIO_DATA_WRITE1, addr);
1144
        outb(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
1145
    }
1146
}
1147
 
1148
static int mdio_read(struct net_device *dev, int phy_id, int loc)
1149
{
1150
    kio_addr_t addr = dev->base_addr + MGMT;
1151
    u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
1152
    int i, retval = 0;
1153
 
1154
    mdio_sync(addr);
1155
    for (i = 13; i >= 0; i--) {
1156
        int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
1157
        outb(dat, addr);
1158
        outb(dat | MDIO_SHIFT_CLK, addr);
1159
    }
1160
    for (i = 19; i > 0; i--) {
1161
        outb(0, addr);
1162
        retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
1163
        outb(MDIO_SHIFT_CLK, addr);
1164
    }
1165
    return (retval>>1) & 0xffff;
1166
}
1167
 
1168
static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
1169
{
1170
    kio_addr_t addr = dev->base_addr + MGMT;
1171
    u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
1172
    int i;
1173
 
1174
    mdio_sync(addr);
1175
    for (i = 31; i >= 0; i--) {
1176
        int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
1177
        outb(dat, addr);
1178
        outb(dat | MDIO_SHIFT_CLK, addr);
1179
    }
1180
    for (i = 1; i >= 0; i--) {
1181
        outb(0, addr);
1182
        outb(MDIO_SHIFT_CLK, addr);
1183
    }
1184
}
1185
 
1186
/*======================================================================
1187
 
1188
    The driver core code, most of which should be common with a
1189
    non-PCMCIA implementation.
1190
 
1191
======================================================================*/
1192
 
1193
#ifdef PCMCIA_DEBUG
1194
static void smc_dump(struct net_device *dev)
1195
{
1196
    kio_addr_t ioaddr = dev->base_addr;
1197
    u_short i, w, save;
1198
    save = inw(ioaddr + BANK_SELECT);
1199
    for (w = 0; w < 4; w++) {
1200
        SMC_SELECT_BANK(w);
1201
        printk(KERN_DEBUG "bank %d: ", w);
1202
        for (i = 0; i < 14; i += 2)
1203
            printk(" %04x", inw(ioaddr + i));
1204
        printk("\n");
1205
    }
1206
    outw(save, ioaddr + BANK_SELECT);
1207
}
1208
#endif
1209
 
1210
static int smc_open(struct net_device *dev)
1211
{
1212
    struct smc_private *smc = netdev_priv(dev);
1213
    struct pcmcia_device *link = smc->p_dev;
1214
 
1215
#ifdef PCMCIA_DEBUG
1216
    DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n",
1217
          dev->name, dev, inw(dev->base_addr + BANK_SELECT));
1218
    if (pc_debug > 1) smc_dump(dev);
1219
#endif
1220
 
1221
    /* Check that the PCMCIA card is still here. */
1222
    if (!pcmcia_dev_present(link))
1223
        return -ENODEV;
1224
    /* Physical device present signature. */
1225
    if (check_sig(link) < 0) {
1226
        printk("smc91c92_cs: Yikes!  Bad chip signature!\n");
1227
        return -ENODEV;
1228
    }
1229
    link->open++;
1230
 
1231
    netif_start_queue(dev);
1232
    smc->saved_skb = NULL;
1233
    smc->packets_waiting = 0;
1234
 
1235
    smc_reset(dev);
1236
    init_timer(&smc->media);
1237
    smc->media.function = &media_check;
1238
    smc->media.data = (u_long) dev;
1239
    smc->media.expires = jiffies + HZ;
1240
    add_timer(&smc->media);
1241
 
1242
    return 0;
1243
} /* smc_open */
1244
 
1245
/*====================================================================*/
1246
 
1247
static int smc_close(struct net_device *dev)
1248
{
1249
    struct smc_private *smc = netdev_priv(dev);
1250
    struct pcmcia_device *link = smc->p_dev;
1251
    kio_addr_t ioaddr = dev->base_addr;
1252
 
1253
    DEBUG(0, "%s: smc_close(), status %4.4x.\n",
1254
          dev->name, inw(ioaddr + BANK_SELECT));
1255
 
1256
    netif_stop_queue(dev);
1257
 
1258
    /* Shut off all interrupts, and turn off the Tx and Rx sections.
1259
       Don't bother to check for chip present. */
1260
    SMC_SELECT_BANK(2); /* Nominally paranoia, but do no assume... */
1261
    outw(0, ioaddr + INTERRUPT);
1262
    SMC_SELECT_BANK(0);
1263
    mask_bits(0xff00, ioaddr + RCR);
1264
    mask_bits(0xff00, ioaddr + TCR);
1265
 
1266
    /* Put the chip into power-down mode. */
1267
    SMC_SELECT_BANK(1);
1268
    outw(CTL_POWERDOWN, ioaddr + CONTROL );
1269
 
1270
    link->open--;
1271
    del_timer_sync(&smc->media);
1272
 
1273
    return 0;
1274
} /* smc_close */
1275
 
1276
/*======================================================================
1277
 
1278
   Transfer a packet to the hardware and trigger the packet send.
1279
   This may be called at either from either the Tx queue code
1280
   or the interrupt handler.
1281
 
1282
======================================================================*/
1283
 
1284
static void smc_hardware_send_packet(struct net_device * dev)
1285
{
1286
    struct smc_private *smc = netdev_priv(dev);
1287
    struct sk_buff *skb = smc->saved_skb;
1288
    kio_addr_t ioaddr = dev->base_addr;
1289
    u_char packet_no;
1290
 
1291
    if (!skb) {
1292
        printk(KERN_ERR "%s: In XMIT with no packet to send.\n", dev->name);
1293
        return;
1294
    }
1295
 
1296
    /* There should be a packet slot waiting. */
1297
    packet_no = inw(ioaddr + PNR_ARR) >> 8;
1298
    if (packet_no & 0x80) {
1299
        /* If not, there is a hardware problem!  Likely an ejected card. */
1300
        printk(KERN_WARNING "%s: 91c92 hardware Tx buffer allocation"
1301
               " failed, status %#2.2x.\n", dev->name, packet_no);
1302
        dev_kfree_skb_irq(skb);
1303
        smc->saved_skb = NULL;
1304
        netif_start_queue(dev);
1305
        return;
1306
    }
1307
 
1308
    smc->stats.tx_bytes += skb->len;
1309
    /* The card should use the just-allocated buffer. */
1310
    outw(packet_no, ioaddr + PNR_ARR);
1311
    /* point to the beginning of the packet */
1312
    outw(PTR_AUTOINC , ioaddr + POINTER);
1313
 
1314
    /* Send the packet length (+6 for status, length and ctl byte)
1315
       and the status word (set to zeros). */
1316
    {
1317
        u_char *buf = skb->data;
1318
        u_int length = skb->len; /* The chip will pad to ethernet min. */
1319
 
1320
        DEBUG(2, "%s: Trying to xmit packet of length %d.\n",
1321
              dev->name, length);
1322
 
1323
        /* send the packet length: +6 for status word, length, and ctl */
1324
        outw(0, ioaddr + DATA_1);
1325
        outw(length + 6, ioaddr + DATA_1);
1326
        outsw(ioaddr + DATA_1, buf, length >> 1);
1327
 
1328
        /* The odd last byte, if there is one, goes in the control word. */
1329
        outw((length & 1) ? 0x2000 | buf[length-1] : 0, ioaddr + DATA_1);
1330
    }
1331
 
1332
    /* Enable the Tx interrupts, both Tx (TxErr) and TxEmpty. */
1333
    outw(((IM_TX_INT|IM_TX_EMPTY_INT)<<8) |
1334
         (inw(ioaddr + INTERRUPT) & 0xff00),
1335
         ioaddr + INTERRUPT);
1336
 
1337
    /* The chip does the rest of the work. */
1338
    outw(MC_ENQUEUE , ioaddr + MMU_CMD);
1339
 
1340
    smc->saved_skb = NULL;
1341
    dev_kfree_skb_irq(skb);
1342
    dev->trans_start = jiffies;
1343
    netif_start_queue(dev);
1344
    return;
1345
}
1346
 
1347
/*====================================================================*/
1348
 
1349
static void smc_tx_timeout(struct net_device *dev)
1350
{
1351
    struct smc_private *smc = netdev_priv(dev);
1352
    kio_addr_t ioaddr = dev->base_addr;
1353
 
1354
    printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "
1355
           "Tx_status %2.2x status %4.4x.\n",
1356
           dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));
1357
    smc->stats.tx_errors++;
1358
    smc_reset(dev);
1359
    dev->trans_start = jiffies;
1360
    smc->saved_skb = NULL;
1361
    netif_wake_queue(dev);
1362
}
1363
 
1364
static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev)
1365
{
1366
    struct smc_private *smc = netdev_priv(dev);
1367
    kio_addr_t ioaddr = dev->base_addr;
1368
    u_short num_pages;
1369
    short time_out, ir;
1370
    unsigned long flags;
1371
 
1372
    netif_stop_queue(dev);
1373
 
1374
    DEBUG(2, "%s: smc_start_xmit(length = %d) called,"
1375
          " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));
1376
 
1377
    if (smc->saved_skb) {
1378
        /* THIS SHOULD NEVER HAPPEN. */
1379
        smc->stats.tx_aborted_errors++;
1380
        printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",
1381
               dev->name);
1382
        return 1;
1383
    }
1384
    smc->saved_skb = skb;
1385
 
1386
    num_pages = skb->len >> 8;
1387
 
1388
    if (num_pages > 7) {
1389
        printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);
1390
        dev_kfree_skb (skb);
1391
        smc->saved_skb = NULL;
1392
        smc->stats.tx_dropped++;
1393
        return 0;                /* Do not re-queue this packet. */
1394
    }
1395
    /* A packet is now waiting. */
1396
    smc->packets_waiting++;
1397
 
1398
    spin_lock_irqsave(&smc->lock, flags);
1399
    SMC_SELECT_BANK(2); /* Paranoia, we should always be in window 2 */
1400
 
1401
    /* need MC_RESET to keep the memory consistent. errata? */
1402
    if (smc->rx_ovrn) {
1403
        outw(MC_RESET, ioaddr + MMU_CMD);
1404
        smc->rx_ovrn = 0;
1405
    }
1406
 
1407
    /* Allocate the memory; send the packet now if we win. */
1408
    outw(MC_ALLOC | num_pages, ioaddr + MMU_CMD);
1409
    for (time_out = MEMORY_WAIT_TIME; time_out >= 0; time_out--) {
1410
        ir = inw(ioaddr+INTERRUPT);
1411
        if (ir & IM_ALLOC_INT) {
1412
            /* Acknowledge the interrupt, send the packet. */
1413
            outw((ir&0xff00) | IM_ALLOC_INT, ioaddr + INTERRUPT);
1414
            smc_hardware_send_packet(dev);      /* Send the packet now.. */
1415
            spin_unlock_irqrestore(&smc->lock, flags);
1416
            return 0;
1417
        }
1418
    }
1419
 
1420
    /* Otherwise defer until the Tx-space-allocated interrupt. */
1421
    DEBUG(2, "%s: memory allocation deferred.\n", dev->name);
1422
    outw((IM_ALLOC_INT << 8) | (ir & 0xff00), ioaddr + INTERRUPT);
1423
    spin_unlock_irqrestore(&smc->lock, flags);
1424
 
1425
    return 0;
1426
}
1427
 
1428
/*======================================================================
1429
 
1430
    Handle a Tx anomolous event.  Entered while in Window 2.
1431
 
1432
======================================================================*/
1433
 
1434
static void smc_tx_err(struct net_device * dev)
1435
{
1436
    struct smc_private *smc = netdev_priv(dev);
1437
    kio_addr_t ioaddr = dev->base_addr;
1438
    int saved_packet = inw(ioaddr + PNR_ARR) & 0xff;
1439
    int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f;
1440
    int tx_status;
1441
 
1442
    /* select this as the packet to read from */
1443
    outw(packet_no, ioaddr + PNR_ARR);
1444
 
1445
    /* read the first word from this packet */
1446
    outw(PTR_AUTOINC | PTR_READ | 0, ioaddr + POINTER);
1447
 
1448
    tx_status = inw(ioaddr + DATA_1);
1449
 
1450
    smc->stats.tx_errors++;
1451
    if (tx_status & TS_LOSTCAR) smc->stats.tx_carrier_errors++;
1452
    if (tx_status & TS_LATCOL)  smc->stats.tx_window_errors++;
1453
    if (tx_status & TS_16COL) {
1454
        smc->stats.tx_aborted_errors++;
1455
        smc->tx_err++;
1456
    }
1457
 
1458
    if (tx_status & TS_SUCCESS) {
1459
        printk(KERN_NOTICE "%s: Successful packet caused error "
1460
               "interrupt?\n", dev->name);
1461
    }
1462
    /* re-enable transmit */
1463
    SMC_SELECT_BANK(0);
1464
    outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
1465
    SMC_SELECT_BANK(2);
1466
 
1467
    outw(MC_FREEPKT, ioaddr + MMU_CMD);         /* Free the packet memory. */
1468
 
1469
    /* one less packet waiting for me */
1470
    smc->packets_waiting--;
1471
 
1472
    outw(saved_packet, ioaddr + PNR_ARR);
1473
    return;
1474
}
1475
 
1476
/*====================================================================*/
1477
 
1478
static void smc_eph_irq(struct net_device *dev)
1479
{
1480
    struct smc_private *smc = netdev_priv(dev);
1481
    kio_addr_t ioaddr = dev->base_addr;
1482
    u_short card_stats, ephs;
1483
 
1484
    SMC_SELECT_BANK(0);
1485
    ephs = inw(ioaddr + EPH);
1486
    DEBUG(2, "%s: Ethernet protocol handler interrupt, status"
1487
          " %4.4x.\n", dev->name, ephs);
1488
    /* Could be a counter roll-over warning: update stats. */
1489
    card_stats = inw(ioaddr + COUNTER);
1490
    /* single collisions */
1491
    smc->stats.collisions += card_stats & 0xF;
1492
    card_stats >>= 4;
1493
    /* multiple collisions */
1494
    smc->stats.collisions += card_stats & 0xF;
1495
#if 0           /* These are for when linux supports these statistics */
1496
    card_stats >>= 4;                   /* deferred */
1497
    card_stats >>= 4;                   /* excess deferred */
1498
#endif
1499
    /* If we had a transmit error we must re-enable the transmitter. */
1500
    outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
1501
 
1502
    /* Clear a link error interrupt. */
1503
    SMC_SELECT_BANK(1);
1504
    outw(CTL_AUTO_RELEASE | 0x0000, ioaddr + CONTROL);
1505
    outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
1506
         ioaddr + CONTROL);
1507
    SMC_SELECT_BANK(2);
1508
}
1509
 
1510
/*====================================================================*/
1511
 
1512
static irqreturn_t smc_interrupt(int irq, void *dev_id)
1513
{
1514
    struct net_device *dev = dev_id;
1515
    struct smc_private *smc = netdev_priv(dev);
1516
    kio_addr_t ioaddr;
1517
    u_short saved_bank, saved_pointer, mask, status;
1518
    unsigned int handled = 1;
1519
    char bogus_cnt = INTR_WORK;         /* Work we are willing to do. */
1520
 
1521
    if (!netif_device_present(dev))
1522
        return IRQ_NONE;
1523
 
1524
    ioaddr = dev->base_addr;
1525
 
1526
    DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,
1527
          irq, ioaddr);
1528
 
1529
    spin_lock(&smc->lock);
1530
    smc->watchdog = 0;
1531
    saved_bank = inw(ioaddr + BANK_SELECT);
1532
    if ((saved_bank & 0xff00) != 0x3300) {
1533
        /* The device does not exist -- the card could be off-line, or
1534
           maybe it has been ejected. */
1535
        DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"
1536
              "/ejected device.\n", dev->name, irq);
1537
        handled = 0;
1538
        goto irq_done;
1539
    }
1540
 
1541
    SMC_SELECT_BANK(2);
1542
    saved_pointer = inw(ioaddr + POINTER);
1543
    mask = inw(ioaddr + INTERRUPT) >> 8;
1544
    /* clear all interrupts */
1545
    outw(0, ioaddr + INTERRUPT);
1546
 
1547
    do { /* read the status flag, and mask it */
1548
        status = inw(ioaddr + INTERRUPT) & 0xff;
1549
        DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,
1550
              status, mask);
1551
        if ((status & mask) == 0) {
1552
            if (bogus_cnt == INTR_WORK)
1553
                handled = 0;
1554
            break;
1555
        }
1556
        if (status & IM_RCV_INT) {
1557
            /* Got a packet(s). */
1558
            smc_rx(dev);
1559
        }
1560
        if (status & IM_TX_INT) {
1561
            smc_tx_err(dev);
1562
            outw(IM_TX_INT, ioaddr + INTERRUPT);
1563
        }
1564
        status &= mask;
1565
        if (status & IM_TX_EMPTY_INT) {
1566
            outw(IM_TX_EMPTY_INT, ioaddr + INTERRUPT);
1567
            mask &= ~IM_TX_EMPTY_INT;
1568
            smc->stats.tx_packets += smc->packets_waiting;
1569
            smc->packets_waiting = 0;
1570
        }
1571
        if (status & IM_ALLOC_INT) {
1572
            /* Clear this interrupt so it doesn't happen again */
1573
            mask &= ~IM_ALLOC_INT;
1574
 
1575
            smc_hardware_send_packet(dev);
1576
 
1577
            /* enable xmit interrupts based on this */
1578
            mask |= (IM_TX_EMPTY_INT | IM_TX_INT);
1579
 
1580
            /* and let the card send more packets to me */
1581
            netif_wake_queue(dev);
1582
        }
1583
        if (status & IM_RX_OVRN_INT) {
1584
            smc->stats.rx_errors++;
1585
            smc->stats.rx_fifo_errors++;
1586
            if (smc->duplex)
1587
                smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */
1588
            outw(IM_RX_OVRN_INT, ioaddr + INTERRUPT);
1589
        }
1590
        if (status & IM_EPH_INT)
1591
            smc_eph_irq(dev);
1592
    } while (--bogus_cnt);
1593
 
1594
    DEBUG(3, "  Restoring saved registers mask %2.2x bank %4.4x"
1595
          " pointer %4.4x.\n", mask, saved_bank, saved_pointer);
1596
 
1597
    /* restore state register */
1598
    outw((mask<<8), ioaddr + INTERRUPT);
1599
    outw(saved_pointer, ioaddr + POINTER);
1600
    SMC_SELECT_BANK(saved_bank);
1601
 
1602
    DEBUG(3, "%s: Exiting interrupt IRQ%d.\n", dev->name, irq);
1603
 
1604
irq_done:
1605
 
1606
    if ((smc->manfid == MANFID_OSITECH) &&
1607
        (smc->cardid != PRODID_OSITECH_SEVEN)) {
1608
        /* Retrigger interrupt if needed */
1609
        mask_bits(0x00ff, ioaddr-0x10+OSITECH_RESET_ISR);
1610
        set_bits(0x0300, ioaddr-0x10+OSITECH_RESET_ISR);
1611
    }
1612
    if (smc->manfid == MANFID_MOTOROLA) {
1613
        u_char cor;
1614
        cor = readb(smc->base + MOT_UART + CISREG_COR);
1615
        writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR);
1616
        writeb(cor, smc->base + MOT_UART + CISREG_COR);
1617
        cor = readb(smc->base + MOT_LAN + CISREG_COR);
1618
        writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR);
1619
        writeb(cor, smc->base + MOT_LAN + CISREG_COR);
1620
    }
1621
#ifdef DOES_NOT_WORK
1622
    if (smc->base != NULL) { /* Megahertz MFC's */
1623
        readb(smc->base+MEGAHERTZ_ISR);
1624
        readb(smc->base+MEGAHERTZ_ISR);
1625
    }
1626
#endif
1627
    spin_unlock(&smc->lock);
1628
    return IRQ_RETVAL(handled);
1629
}
1630
 
1631
/*====================================================================*/
1632
 
1633
static void smc_rx(struct net_device *dev)
1634
{
1635
    struct smc_private *smc = netdev_priv(dev);
1636
    kio_addr_t ioaddr = dev->base_addr;
1637
    int rx_status;
1638
    int packet_length;  /* Caution: not frame length, rather words
1639
                           to transfer from the chip. */
1640
 
1641
    /* Assertion: we are in Window 2. */
1642
 
1643
    if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {
1644
        printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",
1645
               dev->name);
1646
        return;
1647
    }
1648
 
1649
    /*  Reset the read pointer, and read the status and packet length. */
1650
    outw(PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER);
1651
    rx_status = inw(ioaddr + DATA_1);
1652
    packet_length = inw(ioaddr + DATA_1) & 0x07ff;
1653
 
1654
    DEBUG(2, "%s: Receive status %4.4x length %d.\n",
1655
          dev->name, rx_status, packet_length);
1656
 
1657
    if (!(rx_status & RS_ERRORS)) {
1658
        /* do stuff to make a new packet */
1659
        struct sk_buff *skb;
1660
 
1661
        /* Note: packet_length adds 5 or 6 extra bytes here! */
1662
        skb = dev_alloc_skb(packet_length+2);
1663
 
1664
        if (skb == NULL) {
1665
            DEBUG(1, "%s: Low memory, packet dropped.\n", dev->name);
1666
            smc->stats.rx_dropped++;
1667
            outw(MC_RELEASE, ioaddr + MMU_CMD);
1668
            return;
1669
        }
1670
 
1671
        packet_length -= (rx_status & RS_ODDFRAME ? 5 : 6);
1672
        skb_reserve(skb, 2);
1673
        insw(ioaddr+DATA_1, skb_put(skb, packet_length),
1674
             (packet_length+1)>>1);
1675
        skb->protocol = eth_type_trans(skb, dev);
1676
 
1677
        netif_rx(skb);
1678
        dev->last_rx = jiffies;
1679
        smc->stats.rx_packets++;
1680
        smc->stats.rx_bytes += packet_length;
1681
        if (rx_status & RS_MULTICAST)
1682
            smc->stats.multicast++;
1683
    } else {
1684
        /* error ... */
1685
        smc->stats.rx_errors++;
1686
 
1687
        if (rx_status & RS_ALGNERR)  smc->stats.rx_frame_errors++;
1688
        if (rx_status & (RS_TOOSHORT | RS_TOOLONG))
1689
            smc->stats.rx_length_errors++;
1690
        if (rx_status & RS_BADCRC)      smc->stats.rx_crc_errors++;
1691
    }
1692
    /* Let the MMU free the memory of this packet. */
1693
    outw(MC_RELEASE, ioaddr + MMU_CMD);
1694
 
1695
    return;
1696
}
1697
 
1698
/*====================================================================*/
1699
 
1700
static struct net_device_stats *smc_get_stats(struct net_device *dev)
1701
{
1702
    struct smc_private *smc = netdev_priv(dev);
1703
    /* Nothing to update - the 91c92 is a pretty primative chip. */
1704
    return &smc->stats;
1705
}
1706
 
1707
/*======================================================================
1708
 
1709
    Calculate values for the hardware multicast filter hash table.
1710
 
1711
======================================================================*/
1712
 
1713
static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
1714
                               u_char *multicast_table)
1715
{
1716
    struct dev_mc_list  *mc_addr;
1717
 
1718
    for (mc_addr = addrs;  mc_addr && count-- > 0;  mc_addr = mc_addr->next) {
1719
        u_int position = ether_crc(6, mc_addr->dmi_addr);
1720
#ifndef final_version           /* Verify multicast address. */
1721
        if ((mc_addr->dmi_addr[0] & 1) == 0)
1722
            continue;
1723
#endif
1724
        multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
1725
    }
1726
}
1727
 
1728
/*======================================================================
1729
 
1730
    Set the receive mode.
1731
 
1732
    This routine is used by both the protocol level to notify us of
1733
    promiscuous/multicast mode changes, and by the open/reset code to
1734
    initialize the Rx registers.  We always set the multicast list and
1735
    leave the receiver running.
1736
 
1737
======================================================================*/
1738
 
1739
static void set_rx_mode(struct net_device *dev)
1740
{
1741
    kio_addr_t ioaddr = dev->base_addr;
1742
    struct smc_private *smc = netdev_priv(dev);
1743
    u_int multicast_table[ 2 ] = { 0, };
1744
    unsigned long flags;
1745
    u_short rx_cfg_setting;
1746
 
1747
    if (dev->flags & IFF_PROMISC) {
1748
        rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti;
1749
    } else if (dev->flags & IFF_ALLMULTI)
1750
        rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;
1751
    else {
1752
        if (dev->mc_count)  {
1753
            fill_multicast_tbl(dev->mc_count, dev->mc_list,
1754
                               (u_char *)multicast_table);
1755
        }
1756
        rx_cfg_setting = RxStripCRC | RxEnable;
1757
    }
1758
 
1759
    /* Load MC table and Rx setting into the chip without interrupts. */
1760
    spin_lock_irqsave(&smc->lock, flags);
1761
    SMC_SELECT_BANK(3);
1762
    outl(multicast_table[0], ioaddr + MULTICAST0);
1763
    outl(multicast_table[1], ioaddr + MULTICAST4);
1764
    SMC_SELECT_BANK(0);
1765
    outw(rx_cfg_setting, ioaddr + RCR);
1766
    SMC_SELECT_BANK(2);
1767
    spin_unlock_irqrestore(&smc->lock, flags);
1768
 
1769
    return;
1770
}
1771
 
1772
/*======================================================================
1773
 
1774
    Senses when a card's config changes. Here, it's coax or TP.
1775
 
1776
======================================================================*/
1777
 
1778
static int s9k_config(struct net_device *dev, struct ifmap *map)
1779
{
1780
    struct smc_private *smc = netdev_priv(dev);
1781
    if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
1782
        if (smc->cfg & CFG_MII_SELECT)
1783
            return -EOPNOTSUPP;
1784
        else if (map->port > 2)
1785
            return -EINVAL;
1786
        dev->if_port = map->port;
1787
        printk(KERN_INFO "%s: switched to %s port\n",
1788
               dev->name, if_names[dev->if_port]);
1789
        smc_reset(dev);
1790
    }
1791
    return 0;
1792
}
1793
 
1794
/*======================================================================
1795
 
1796
    Reset the chip, reloading every register that might be corrupted.
1797
 
1798
======================================================================*/
1799
 
1800
/*
1801
  Set transceiver type, perhaps to something other than what the user
1802
  specified in dev->if_port.
1803
*/
1804
static void smc_set_xcvr(struct net_device *dev, int if_port)
1805
{
1806
    struct smc_private *smc = netdev_priv(dev);
1807
    kio_addr_t ioaddr = dev->base_addr;
1808
    u_short saved_bank;
1809
 
1810
    saved_bank = inw(ioaddr + BANK_SELECT);
1811
    SMC_SELECT_BANK(1);
1812
    if (if_port == 2) {
1813
        outw(smc->cfg | CFG_AUI_SELECT, ioaddr + CONFIG);
1814
        if ((smc->manfid == MANFID_OSITECH) &&
1815
            (smc->cardid != PRODID_OSITECH_SEVEN))
1816
            set_bits(OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
1817
        smc->media_status = ((dev->if_port == 0) ? 0x0001 : 0x0002);
1818
    } else {
1819
        outw(smc->cfg, ioaddr + CONFIG);
1820
        if ((smc->manfid == MANFID_OSITECH) &&
1821
            (smc->cardid != PRODID_OSITECH_SEVEN))
1822
            mask_bits(~OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
1823
        smc->media_status = ((dev->if_port == 0) ? 0x0012 : 0x4001);
1824
    }
1825
    SMC_SELECT_BANK(saved_bank);
1826
}
1827
 
1828
static void smc_reset(struct net_device *dev)
1829
{
1830
    kio_addr_t ioaddr = dev->base_addr;
1831
    struct smc_private *smc = netdev_priv(dev);
1832
    int i;
1833
 
1834
    DEBUG(0, "%s: smc91c92 reset called.\n", dev->name);
1835
 
1836
    /* The first interaction must be a write to bring the chip out
1837
       of sleep mode. */
1838
    SMC_SELECT_BANK(0);
1839
    /* Reset the chip. */
1840
    outw(RCR_SOFTRESET, ioaddr + RCR);
1841
    udelay(10);
1842
 
1843
    /* Clear the transmit and receive configuration registers. */
1844
    outw(RCR_CLEAR, ioaddr + RCR);
1845
    outw(TCR_CLEAR, ioaddr + TCR);
1846
 
1847
    /* Set the Window 1 control, configuration and station addr registers.
1848
       No point in writing the I/O base register ;-> */
1849
    SMC_SELECT_BANK(1);
1850
    /* Automatically release successfully transmitted packets,
1851
       Accept link errors, counter and Tx error interrupts. */
1852
    outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
1853
         ioaddr + CONTROL);
1854
    smc_set_xcvr(dev, dev->if_port);
1855
    if ((smc->manfid == MANFID_OSITECH) &&
1856
        (smc->cardid != PRODID_OSITECH_SEVEN))
1857
        outw((dev->if_port == 2 ? OSI_AUI_PWR : 0) |
1858
             (inw(ioaddr-0x10+OSITECH_AUI_PWR) & 0xff00),
1859
             ioaddr - 0x10 + OSITECH_AUI_PWR);
1860
 
1861
    /* Fill in the physical address.  The databook is wrong about the order! */
1862
    for (i = 0; i < 6; i += 2)
1863
        outw((dev->dev_addr[i+1]<<8)+dev->dev_addr[i],
1864
             ioaddr + ADDR0 + i);
1865
 
1866
    /* Reset the MMU */
1867
    SMC_SELECT_BANK(2);
1868
    outw(MC_RESET, ioaddr + MMU_CMD);
1869
    outw(0, ioaddr + INTERRUPT);
1870
 
1871
    /* Re-enable the chip. */
1872
    SMC_SELECT_BANK(0);
1873
    outw(((smc->cfg & CFG_MII_SELECT) ? 0 : TCR_MONCSN) |
1874
         TCR_ENABLE | TCR_PAD_EN | smc->duplex, ioaddr + TCR);
1875
    set_rx_mode(dev);
1876
 
1877
    if (smc->cfg & CFG_MII_SELECT) {
1878
        SMC_SELECT_BANK(3);
1879
 
1880
        /* Reset MII */
1881
        mdio_write(dev, smc->mii_if.phy_id, 0, 0x8000);
1882
 
1883
        /* Advertise 100F, 100H, 10F, 10H */
1884
        mdio_write(dev, smc->mii_if.phy_id, 4, 0x01e1);
1885
 
1886
        /* Restart MII autonegotiation */
1887
        mdio_write(dev, smc->mii_if.phy_id, 0, 0x0000);
1888
        mdio_write(dev, smc->mii_if.phy_id, 0, 0x1200);
1889
    }
1890
 
1891
    /* Enable interrupts. */
1892
    SMC_SELECT_BANK(2);
1893
    outw((IM_EPH_INT | IM_RX_OVRN_INT | IM_RCV_INT) << 8,
1894
         ioaddr + INTERRUPT);
1895
}
1896
 
1897
/*======================================================================
1898
 
1899
    Media selection timer routine
1900
 
1901
======================================================================*/
1902
 
1903
static void media_check(u_long arg)
1904
{
1905
    struct net_device *dev = (struct net_device *) arg;
1906
    struct smc_private *smc = netdev_priv(dev);
1907
    kio_addr_t ioaddr = dev->base_addr;
1908
    u_short i, media, saved_bank;
1909
    u_short link;
1910
    unsigned long flags;
1911
 
1912
    spin_lock_irqsave(&smc->lock, flags);
1913
 
1914
    saved_bank = inw(ioaddr + BANK_SELECT);
1915
 
1916
    if (!netif_device_present(dev))
1917
        goto reschedule;
1918
 
1919
    SMC_SELECT_BANK(2);
1920
 
1921
    /* need MC_RESET to keep the memory consistent. errata? */
1922
    if (smc->rx_ovrn) {
1923
        outw(MC_RESET, ioaddr + MMU_CMD);
1924
        smc->rx_ovrn = 0;
1925
    }
1926
    i = inw(ioaddr + INTERRUPT);
1927
    SMC_SELECT_BANK(0);
1928
    media = inw(ioaddr + EPH) & EPH_LINK_OK;
1929
    SMC_SELECT_BANK(1);
1930
    media |= (inw(ioaddr + CONFIG) & CFG_AUI_SELECT) ? 2 : 1;
1931
 
1932
    /* Check for pending interrupt with watchdog flag set: with
1933
       this, we can limp along even if the interrupt is blocked */
1934
    if (smc->watchdog++ && ((i>>8) & i)) {
1935
        if (!smc->fast_poll)
1936
            printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
1937
        smc_interrupt(dev->irq, dev);
1938
        smc->fast_poll = HZ;
1939
    }
1940
    if (smc->fast_poll) {
1941
        smc->fast_poll--;
1942
        smc->media.expires = jiffies + HZ/100;
1943
        add_timer(&smc->media);
1944
        SMC_SELECT_BANK(saved_bank);
1945
        spin_unlock_irqrestore(&smc->lock, flags);
1946
        return;
1947
    }
1948
 
1949
    if (smc->cfg & CFG_MII_SELECT) {
1950
        if (smc->mii_if.phy_id < 0)
1951
            goto reschedule;
1952
 
1953
        SMC_SELECT_BANK(3);
1954
        link = mdio_read(dev, smc->mii_if.phy_id, 1);
1955
        if (!link || (link == 0xffff)) {
1956
            printk(KERN_INFO "%s: MII is missing!\n", dev->name);
1957
            smc->mii_if.phy_id = -1;
1958
            goto reschedule;
1959
        }
1960
 
1961
        link &= 0x0004;
1962
        if (link != smc->link_status) {
1963
            u_short p = mdio_read(dev, smc->mii_if.phy_id, 5);
1964
            printk(KERN_INFO "%s: %s link beat\n", dev->name,
1965
                (link) ? "found" : "lost");
1966
            smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40))
1967
                           ? TCR_FDUPLX : 0);
1968
            if (link) {
1969
                printk(KERN_INFO "%s: autonegotiation complete: "
1970
                       "%sbaseT-%cD selected\n", dev->name,
1971
                       ((p & 0x0180) ? "100" : "10"),
1972
                       (smc->duplex ? 'F' : 'H'));
1973
            }
1974
            SMC_SELECT_BANK(0);
1975
            outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR);
1976
            smc->link_status = link;
1977
        }
1978
        goto reschedule;
1979
    }
1980
 
1981
    /* Ignore collisions unless we've had no rx's recently */
1982
    if (time_after(jiffies, dev->last_rx + HZ)) {
1983
        if (smc->tx_err || (smc->media_status & EPH_16COL))
1984
            media |= EPH_16COL;
1985
    }
1986
    smc->tx_err = 0;
1987
 
1988
    if (media != smc->media_status) {
1989
        if ((media & smc->media_status & 1) &&
1990
            ((smc->media_status ^ media) & EPH_LINK_OK))
1991
            printk(KERN_INFO "%s: %s link beat\n", dev->name,
1992
                   (smc->media_status & EPH_LINK_OK ? "lost" : "found"));
1993
        else if ((media & smc->media_status & 2) &&
1994
                 ((smc->media_status ^ media) & EPH_16COL))
1995
            printk(KERN_INFO "%s: coax cable %s\n", dev->name,
1996
                   (media & EPH_16COL ? "problem" : "ok"));
1997
        if (dev->if_port == 0) {
1998
            if (media & 1) {
1999
                if (media & EPH_LINK_OK)
2000
                    printk(KERN_INFO "%s: flipped to 10baseT\n",
2001
                           dev->name);
2002
                else
2003
                    smc_set_xcvr(dev, 2);
2004
            } else {
2005
                if (media & EPH_16COL)
2006
                    smc_set_xcvr(dev, 1);
2007
                else
2008
                    printk(KERN_INFO "%s: flipped to 10base2\n",
2009
                           dev->name);
2010
            }
2011
        }
2012
        smc->media_status = media;
2013
    }
2014
 
2015
reschedule:
2016
    smc->media.expires = jiffies + HZ;
2017
    add_timer(&smc->media);
2018
    SMC_SELECT_BANK(saved_bank);
2019
    spin_unlock_irqrestore(&smc->lock, flags);
2020
}
2021
 
2022
static int smc_link_ok(struct net_device *dev)
2023
{
2024
    kio_addr_t ioaddr = dev->base_addr;
2025
    struct smc_private *smc = netdev_priv(dev);
2026
 
2027
    if (smc->cfg & CFG_MII_SELECT) {
2028
        return mii_link_ok(&smc->mii_if);
2029
    } else {
2030
        SMC_SELECT_BANK(0);
2031
        return inw(ioaddr + EPH) & EPH_LINK_OK;
2032
    }
2033
}
2034
 
2035
static int smc_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
2036
{
2037
    u16 tmp;
2038
    kio_addr_t ioaddr = dev->base_addr;
2039
 
2040
    ecmd->supported = (SUPPORTED_TP | SUPPORTED_AUI |
2041
        SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full);
2042
 
2043
    SMC_SELECT_BANK(1);
2044
    tmp = inw(ioaddr + CONFIG);
2045
    ecmd->port = (tmp & CFG_AUI_SELECT) ? PORT_AUI : PORT_TP;
2046
    ecmd->transceiver = XCVR_INTERNAL;
2047
    ecmd->speed = SPEED_10;
2048
    ecmd->phy_address = ioaddr + MGMT;
2049
 
2050
    SMC_SELECT_BANK(0);
2051
    tmp = inw(ioaddr + TCR);
2052
    ecmd->duplex = (tmp & TCR_FDUPLX) ? DUPLEX_FULL : DUPLEX_HALF;
2053
 
2054
    return 0;
2055
}
2056
 
2057
static int smc_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
2058
{
2059
    u16 tmp;
2060
    kio_addr_t ioaddr = dev->base_addr;
2061
 
2062
    if (ecmd->speed != SPEED_10)
2063
        return -EINVAL;
2064
    if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
2065
        return -EINVAL;
2066
    if (ecmd->port != PORT_TP && ecmd->port != PORT_AUI)
2067
        return -EINVAL;
2068
    if (ecmd->transceiver != XCVR_INTERNAL)
2069
        return -EINVAL;
2070
 
2071
    if (ecmd->port == PORT_AUI)
2072
        smc_set_xcvr(dev, 1);
2073
    else
2074
        smc_set_xcvr(dev, 0);
2075
 
2076
    SMC_SELECT_BANK(0);
2077
    tmp = inw(ioaddr + TCR);
2078
    if (ecmd->duplex == DUPLEX_FULL)
2079
        tmp |= TCR_FDUPLX;
2080
    else
2081
        tmp &= ~TCR_FDUPLX;
2082
    outw(tmp, ioaddr + TCR);
2083
 
2084
    return 0;
2085
}
2086
 
2087
static int check_if_running(struct net_device *dev)
2088
{
2089
        if (!netif_running(dev))
2090
                return -EINVAL;
2091
        return 0;
2092
}
2093
 
2094
static void smc_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
2095
{
2096
        strcpy(info->driver, DRV_NAME);
2097
        strcpy(info->version, DRV_VERSION);
2098
}
2099
 
2100
static int smc_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2101
{
2102
        struct smc_private *smc = netdev_priv(dev);
2103
        kio_addr_t ioaddr = dev->base_addr;
2104
        u16 saved_bank = inw(ioaddr + BANK_SELECT);
2105
        int ret;
2106
 
2107
        spin_lock_irq(&smc->lock);
2108
        SMC_SELECT_BANK(3);
2109
        if (smc->cfg & CFG_MII_SELECT)
2110
                ret = mii_ethtool_gset(&smc->mii_if, ecmd);
2111
        else
2112
                ret = smc_netdev_get_ecmd(dev, ecmd);
2113
        SMC_SELECT_BANK(saved_bank);
2114
        spin_unlock_irq(&smc->lock);
2115
        return ret;
2116
}
2117
 
2118
static int smc_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2119
{
2120
        struct smc_private *smc = netdev_priv(dev);
2121
        kio_addr_t ioaddr = dev->base_addr;
2122
        u16 saved_bank = inw(ioaddr + BANK_SELECT);
2123
        int ret;
2124
 
2125
        spin_lock_irq(&smc->lock);
2126
        SMC_SELECT_BANK(3);
2127
        if (smc->cfg & CFG_MII_SELECT)
2128
                ret = mii_ethtool_sset(&smc->mii_if, ecmd);
2129
        else
2130
                ret = smc_netdev_set_ecmd(dev, ecmd);
2131
        SMC_SELECT_BANK(saved_bank);
2132
        spin_unlock_irq(&smc->lock);
2133
        return ret;
2134
}
2135
 
2136
static u32 smc_get_link(struct net_device *dev)
2137
{
2138
        struct smc_private *smc = netdev_priv(dev);
2139
        kio_addr_t ioaddr = dev->base_addr;
2140
        u16 saved_bank = inw(ioaddr + BANK_SELECT);
2141
        u32 ret;
2142
 
2143
        spin_lock_irq(&smc->lock);
2144
        SMC_SELECT_BANK(3);
2145
        ret = smc_link_ok(dev);
2146
        SMC_SELECT_BANK(saved_bank);
2147
        spin_unlock_irq(&smc->lock);
2148
        return ret;
2149
}
2150
 
2151
#ifdef PCMCIA_DEBUG
2152
static u32 smc_get_msglevel(struct net_device *dev)
2153
{
2154
        return pc_debug;
2155
}
2156
 
2157
static void smc_set_msglevel(struct net_device *dev, u32 val)
2158
{
2159
        pc_debug = val;
2160
}
2161
#endif
2162
 
2163
static int smc_nway_reset(struct net_device *dev)
2164
{
2165
        struct smc_private *smc = netdev_priv(dev);
2166
        if (smc->cfg & CFG_MII_SELECT) {
2167
                kio_addr_t ioaddr = dev->base_addr;
2168
                u16 saved_bank = inw(ioaddr + BANK_SELECT);
2169
                int res;
2170
 
2171
                SMC_SELECT_BANK(3);
2172
                res = mii_nway_restart(&smc->mii_if);
2173
                SMC_SELECT_BANK(saved_bank);
2174
 
2175
                return res;
2176
        } else
2177
                return -EOPNOTSUPP;
2178
}
2179
 
2180
static const struct ethtool_ops ethtool_ops = {
2181
        .begin = check_if_running,
2182
        .get_drvinfo = smc_get_drvinfo,
2183
        .get_settings = smc_get_settings,
2184
        .set_settings = smc_set_settings,
2185
        .get_link = smc_get_link,
2186
#ifdef PCMCIA_DEBUG
2187
        .get_msglevel = smc_get_msglevel,
2188
        .set_msglevel = smc_set_msglevel,
2189
#endif
2190
        .nway_reset = smc_nway_reset,
2191
};
2192
 
2193
static int smc_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
2194
{
2195
        struct smc_private *smc = netdev_priv(dev);
2196
        struct mii_ioctl_data *mii = if_mii(rq);
2197
        int rc = 0;
2198
        u16 saved_bank;
2199
        kio_addr_t ioaddr = dev->base_addr;
2200
 
2201
        if (!netif_running(dev))
2202
                return -EINVAL;
2203
 
2204
        spin_lock_irq(&smc->lock);
2205
        saved_bank = inw(ioaddr + BANK_SELECT);
2206
        SMC_SELECT_BANK(3);
2207
        rc = generic_mii_ioctl(&smc->mii_if, mii, cmd, NULL);
2208
        SMC_SELECT_BANK(saved_bank);
2209
        spin_unlock_irq(&smc->lock);
2210
        return rc;
2211
}
2212
 
2213
static struct pcmcia_device_id smc91c92_ids[] = {
2214
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0109, 0x0501),
2215
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0140, 0x000a),
2216
        PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
2217
        PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
2218
        PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
2219
        PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
2220
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
2221
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
2222
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
2223
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
2224
        PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
2225
        PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
2226
        PCMCIA_DEVICE_PROD_ID123("BASICS by New Media Corporation", "Ethernet", "SMC91C94", 0x23c78a9d, 0x00b2e941, 0xcef397fb),
2227
        PCMCIA_DEVICE_PROD_ID12("ARGOSY", "Fast Ethernet PCCard", 0x78f308dc, 0xdcea68bc),
2228
        PCMCIA_DEVICE_PROD_ID12("dit Co., Ltd.", "PC Card-10/100BTX", 0xe59365c8, 0x6a2161d1),
2229
        PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L100C", 0x6a26d1cf, 0xc16ce9c5),
2230
        PCMCIA_DEVICE_PROD_ID12("Farallon", "Farallon Enet", 0x58d93fc4, 0x244734e9),
2231
        PCMCIA_DEVICE_PROD_ID12("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
2232
        PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
2233
        PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Four of Diamonds Ethernet", 0xc2f80cd, 0xb3466314),
2234
        PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Seven of Diamonds Ethernet", 0xc2f80cd, 0x194b650a),
2235
        PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
2236
        PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
2237
        PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),
2238
        /* These conflict with other cards! */
2239
        /* PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0100), */
2240
        /* PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), */
2241
        PCMCIA_DEVICE_NULL,
2242
};
2243
MODULE_DEVICE_TABLE(pcmcia, smc91c92_ids);
2244
 
2245
static struct pcmcia_driver smc91c92_cs_driver = {
2246
        .owner          = THIS_MODULE,
2247
        .drv            = {
2248
                .name   = "smc91c92_cs",
2249
        },
2250
        .probe          = smc91c92_probe,
2251
        .remove         = smc91c92_detach,
2252
        .id_table       = smc91c92_ids,
2253
        .suspend        = smc91c92_suspend,
2254
        .resume         = smc91c92_resume,
2255
};
2256
 
2257
static int __init init_smc91c92_cs(void)
2258
{
2259
        return pcmcia_register_driver(&smc91c92_cs_driver);
2260
}
2261
 
2262
static void __exit exit_smc91c92_cs(void)
2263
{
2264
        pcmcia_unregister_driver(&smc91c92_cs_driver);
2265
}
2266
 
2267
module_init(init_smc91c92_cs);
2268
module_exit(exit_smc91c92_cs);

powered by: WebSVN 2.1.0

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