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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*======================================================================
2
    fmvj18x_cs.c 2.8 2002/03/23
3
 
4
    A fmvj18x (and its compatibles) PCMCIA client driver
5
 
6
    Contributed by Shingo Fujimoto, shingo@flab.fujitsu.co.jp
7
 
8
    TDK LAK-CD021 and CONTEC C-NET(PC)C support added by
9
    Nobuhiro Katayama, kata-n@po.iijnet.or.jp
10
 
11
    The PCMCIA client code is based on code written by David Hinds.
12
    Network code is based on the "FMV-18x driver" by Yutaka TAMIYA
13
    but is actually largely Donald Becker's AT1700 driver, which
14
    carries the following attribution:
15
 
16
    Written 1993-94 by Donald Becker.
17
 
18
    Copyright 1993 United States Government as represented by the
19
    Director, National Security Agency.
20
 
21
    This software may be used and distributed according to the terms
22
    of the GNU General Public License, incorporated herein by reference.
23
 
24
    The author may be reached as becker@scyld.com, or C/O
25
    Scyld Computing Corporation
26
    410 Severn Ave., Suite 210
27
    Annapolis MD 21403
28
 
29
======================================================================*/
30
 
31
#define DRV_NAME        "fmvj18x_cs"
32
#define DRV_VERSION     "2.9"
33
 
34
#include <linux/module.h>
35
#include <linux/kernel.h>
36
#include <linux/init.h>
37
#include <linux/ptrace.h>
38
#include <linux/slab.h>
39
#include <linux/string.h>
40
#include <linux/timer.h>
41
#include <linux/interrupt.h>
42
#include <linux/in.h>
43
#include <linux/delay.h>
44
#include <linux/ethtool.h>
45
#include <linux/netdevice.h>
46
#include <linux/etherdevice.h>
47
#include <linux/skbuff.h>
48
#include <linux/if_arp.h>
49
#include <linux/ioport.h>
50
#include <linux/crc32.h>
51
 
52
#include <pcmcia/cs_types.h>
53
#include <pcmcia/cs.h>
54
#include <pcmcia/cistpl.h>
55
#include <pcmcia/ciscode.h>
56
#include <pcmcia/ds.h>
57
 
58
#include <asm/uaccess.h>
59
#include <asm/io.h>
60
#include <asm/system.h>
61
 
62
/*====================================================================*/
63
 
64
/* Module parameters */
65
 
66
MODULE_DESCRIPTION("fmvj18x and compatible PCMCIA ethernet driver");
67
MODULE_LICENSE("GPL");
68
 
69
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
70
 
71
/* SRAM configuration */
72
/* 0:4KB*2 TX buffer   else:8KB*2 TX buffer */
73
INT_MODULE_PARM(sram_config, 0);
74
 
75
#ifdef PCMCIA_DEBUG
76
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
77
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
78
static char *version = DRV_NAME ".c " DRV_VERSION " 2002/03/23";
79
#else
80
#define DEBUG(n, args...)
81
#endif
82
 
83
/*====================================================================*/
84
/*
85
    PCMCIA event handlers
86
 */
87
static int fmvj18x_config(struct pcmcia_device *link);
88
static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id);
89
static int fmvj18x_setup_mfc(struct pcmcia_device *link);
90
static void fmvj18x_release(struct pcmcia_device *link);
91
static void fmvj18x_detach(struct pcmcia_device *p_dev);
92
 
93
/*
94
    LAN controller(MBH86960A) specific routines
95
 */
96
static int fjn_config(struct net_device *dev, struct ifmap *map);
97
static int fjn_open(struct net_device *dev);
98
static int fjn_close(struct net_device *dev);
99
static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev);
100
static irqreturn_t fjn_interrupt(int irq, void *dev_id);
101
static void fjn_rx(struct net_device *dev);
102
static void fjn_reset(struct net_device *dev);
103
static struct net_device_stats *fjn_get_stats(struct net_device *dev);
104
static void set_rx_mode(struct net_device *dev);
105
static void fjn_tx_timeout(struct net_device *dev);
106
static const struct ethtool_ops netdev_ethtool_ops;
107
 
108
/*
109
    card type
110
 */
111
typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN,
112
               XXX10304, NEC, KME
113
} cardtype_t;
114
 
115
/*
116
    driver specific data structure
117
*/
118
typedef struct local_info_t {
119
        struct pcmcia_device    *p_dev;
120
    dev_node_t node;
121
    struct net_device_stats stats;
122
    long open_time;
123
    uint tx_started:1;
124
    uint tx_queue;
125
    u_short tx_queue_len;
126
    cardtype_t cardtype;
127
    u_short sent;
128
} local_info_t;
129
 
130
#define MC_FILTERBREAK 64
131
 
132
/*====================================================================*/
133
/*
134
    ioport offset from the base address
135
 */
136
#define TX_STATUS               0 /* transmit status register */
137
#define RX_STATUS               1 /* receive status register */
138
#define TX_INTR                 2 /* transmit interrupt mask register */
139
#define RX_INTR                 3 /* receive interrupt mask register */
140
#define TX_MODE                 4 /* transmit mode register */
141
#define RX_MODE                 5 /* receive mode register */
142
#define CONFIG_0                6 /* configuration register 0 */
143
#define CONFIG_1                7 /* configuration register 1 */
144
 
145
#define NODE_ID                 8 /* node ID register            (bank 0) */
146
#define MAR_ADR                 8 /* multicast address registers (bank 1) */
147
 
148
#define DATAPORT                8 /* buffer mem port registers   (bank 2) */
149
#define TX_START               10 /* transmit start register */
150
#define COL_CTRL               11 /* 16 collision control register */
151
#define BMPR12                 12 /* reserved */
152
#define BMPR13                 13 /* reserved */
153
#define RX_SKIP                14 /* skip received packet register */
154
 
155
#define LAN_CTRL               16 /* LAN card control register */
156
 
157
#define MAC_ID               0x1a /* hardware address */
158
#define UNGERMANN_MAC_ID     0x18 /* UNGERMANN-BASS hardware address */
159
 
160
/*
161
    control bits
162
 */
163
#define ENA_TMT_OK           0x80
164
#define ENA_TMT_REC          0x20
165
#define ENA_COL              0x04
166
#define ENA_16_COL           0x02
167
#define ENA_TBUS_ERR         0x01
168
 
169
#define ENA_PKT_RDY          0x80
170
#define ENA_BUS_ERR          0x40
171
#define ENA_LEN_ERR          0x08
172
#define ENA_ALG_ERR          0x04
173
#define ENA_CRC_ERR          0x02
174
#define ENA_OVR_FLO          0x01
175
 
176
/* flags */
177
#define F_TMT_RDY            0x80 /* can accept new packet */
178
#define F_NET_BSY            0x40 /* carrier is detected */
179
#define F_TMT_OK             0x20 /* send packet successfully */
180
#define F_SRT_PKT            0x10 /* short packet error */
181
#define F_COL_ERR            0x04 /* collision error */
182
#define F_16_COL             0x02 /* 16 collision error */
183
#define F_TBUS_ERR           0x01 /* bus read error */
184
 
185
#define F_PKT_RDY            0x80 /* packet(s) in buffer */
186
#define F_BUS_ERR            0x40 /* bus read error */
187
#define F_LEN_ERR            0x08 /* short packet */
188
#define F_ALG_ERR            0x04 /* frame error */
189
#define F_CRC_ERR            0x02 /* CRC error */
190
#define F_OVR_FLO            0x01 /* overflow error */
191
 
192
#define F_BUF_EMP            0x40 /* receive buffer is empty */
193
 
194
#define F_SKP_PKT            0x05 /* drop packet in buffer */
195
 
196
/* default bitmaps */
197
#define D_TX_INTR  ( ENA_TMT_OK )
198
#define D_RX_INTR  ( ENA_PKT_RDY | ENA_LEN_ERR \
199
                   | ENA_ALG_ERR | ENA_CRC_ERR | ENA_OVR_FLO )
200
#define TX_STAT_M  ( F_TMT_RDY )
201
#define RX_STAT_M  ( F_PKT_RDY | F_LEN_ERR \
202
                   | F_ALG_ERR | F_CRC_ERR | F_OVR_FLO )
203
 
204
/* commands */
205
#define D_TX_MODE            0x06 /* no tests, detect carrier */
206
#define ID_MATCHED           0x02 /* (RX_MODE) */
207
#define RECV_ALL             0x03 /* (RX_MODE) */
208
#define CONFIG0_DFL          0x5a /* 16bit bus, 4K x 2 Tx queues */
209
#define CONFIG0_DFL_1        0x5e /* 16bit bus, 8K x 2 Tx queues */
210
#define CONFIG0_RST          0xda /* Data Link Controller off (CONFIG_0) */
211
#define CONFIG0_RST_1        0xde /* Data Link Controller off (CONFIG_0) */
212
#define BANK_0               0xa0 /* bank 0 (CONFIG_1) */
213
#define BANK_1               0xa4 /* bank 1 (CONFIG_1) */
214
#define BANK_2               0xa8 /* bank 2 (CONFIG_1) */
215
#define CHIP_OFF             0x80 /* contrl chip power off (CONFIG_1) */
216
#define DO_TX                0x80 /* do transmit packet */
217
#define SEND_PKT             0x81 /* send a packet */
218
#define AUTO_MODE            0x07 /* Auto skip packet on 16 col detected */
219
#define MANU_MODE            0x03 /* Stop and skip packet on 16 col */
220
#define TDK_AUTO_MODE        0x47 /* Auto skip packet on 16 col detected */
221
#define TDK_MANU_MODE        0x43 /* Stop and skip packet on 16 col */
222
#define INTR_OFF             0x0d /* LAN controller ignores interrupts */
223
#define INTR_ON              0x1d /* LAN controller will catch interrupts */
224
 
225
#define TX_TIMEOUT              ((400*HZ)/1000)
226
 
227
#define BANK_0U              0x20 /* bank 0 (CONFIG_1) */
228
#define BANK_1U              0x24 /* bank 1 (CONFIG_1) */
229
#define BANK_2U              0x28 /* bank 2 (CONFIG_1) */
230
 
231
static int fmvj18x_probe(struct pcmcia_device *link)
232
{
233
    local_info_t *lp;
234
    struct net_device *dev;
235
 
236
    DEBUG(0, "fmvj18x_attach()\n");
237
 
238
    /* Make up a FMVJ18x specific data structure */
239
    dev = alloc_etherdev(sizeof(local_info_t));
240
    if (!dev)
241
        return -ENOMEM;
242
    lp = netdev_priv(dev);
243
    link->priv = dev;
244
    lp->p_dev = link;
245
 
246
    /* The io structure describes IO port mapping */
247
    link->io.NumPorts1 = 32;
248
    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
249
    link->io.IOAddrLines = 5;
250
 
251
    /* Interrupt setup */
252
    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
253
    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
254
    link->irq.Handler = &fjn_interrupt;
255
    link->irq.Instance = dev;
256
 
257
    /* General socket configuration */
258
    link->conf.Attributes = CONF_ENABLE_IRQ;
259
    link->conf.IntType = INT_MEMORY_AND_IO;
260
 
261
    /* The FMVJ18x specific entries in the device structure. */
262
    dev->hard_start_xmit = &fjn_start_xmit;
263
    dev->set_config = &fjn_config;
264
    dev->get_stats = &fjn_get_stats;
265
    dev->set_multicast_list = &set_rx_mode;
266
    dev->open = &fjn_open;
267
    dev->stop = &fjn_close;
268
#ifdef HAVE_TX_TIMEOUT
269
    dev->tx_timeout = fjn_tx_timeout;
270
    dev->watchdog_timeo = TX_TIMEOUT;
271
#endif
272
    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
273
 
274
    return fmvj18x_config(link);
275
} /* fmvj18x_attach */
276
 
277
/*====================================================================*/
278
 
279
static void fmvj18x_detach(struct pcmcia_device *link)
280
{
281
    struct net_device *dev = link->priv;
282
 
283
    DEBUG(0, "fmvj18x_detach(0x%p)\n", link);
284
 
285
    if (link->dev_node)
286
        unregister_netdev(dev);
287
 
288
    fmvj18x_release(link);
289
 
290
    free_netdev(dev);
291
} /* fmvj18x_detach */
292
 
293
/*====================================================================*/
294
 
295
#define CS_CHECK(fn, ret) \
296
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
297
 
298
static int mfc_try_io_port(struct pcmcia_device *link)
299
{
300
    int i, ret;
301
    static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
302
 
303
    for (i = 0; i < 5; i++) {
304
        link->io.BasePort2 = serial_base[i];
305
        link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
306
        if (link->io.BasePort2 == 0) {
307
            link->io.NumPorts2 = 0;
308
            printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
309
        }
310
        ret = pcmcia_request_io(link, &link->io);
311
        if (ret == CS_SUCCESS) return ret;
312
    }
313
    return ret;
314
}
315
 
316
static int ungermann_try_io_port(struct pcmcia_device *link)
317
{
318
    int ret;
319
    kio_addr_t ioaddr;
320
    /*
321
        Ungermann-Bass Access/CARD accepts 0x300,0x320,0x340,0x360
322
        0x380,0x3c0 only for ioport.
323
    */
324
    for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
325
        link->io.BasePort1 = ioaddr;
326
        ret = pcmcia_request_io(link, &link->io);
327
        if (ret == CS_SUCCESS) {
328
            /* calculate ConfigIndex value */
329
            link->conf.ConfigIndex =
330
                ((link->io.BasePort1 & 0x0f0) >> 3) | 0x22;
331
            return ret;
332
        }
333
    }
334
    return ret; /* RequestIO failed */
335
}
336
 
337
static int fmvj18x_config(struct pcmcia_device *link)
338
{
339
    struct net_device *dev = link->priv;
340
    local_info_t *lp = netdev_priv(dev);
341
    tuple_t tuple;
342
    cisparse_t parse;
343
    u_short buf[32];
344
    int i, last_fn = 0, last_ret = 0, ret;
345
    kio_addr_t ioaddr;
346
    cardtype_t cardtype;
347
    char *card_name = "unknown";
348
    u_char *node_id;
349
    DECLARE_MAC_BUF(mac);
350
 
351
    DEBUG(0, "fmvj18x_config(0x%p)\n", link);
352
 
353
    tuple.TupleData = (u_char *)buf;
354
    tuple.TupleDataMax = 64;
355
    tuple.TupleOffset = 0;
356
    tuple.DesiredTuple = CISTPL_FUNCE;
357
    tuple.TupleOffset = 0;
358
    if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {
359
        /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */
360
        tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
361
        CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
362
        CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
363
        CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));
364
        link->conf.ConfigIndex = parse.cftable_entry.index;
365
        switch (link->manf_id) {
366
        case MANFID_TDK:
367
            cardtype = TDK;
368
            if (link->card_id == PRODID_TDK_GN3410
369
                        || link->card_id == PRODID_TDK_NP9610
370
                        || link->card_id == PRODID_TDK_MN3200) {
371
                /* MultiFunction Card */
372
                link->conf.ConfigBase = 0x800;
373
                link->conf.ConfigIndex = 0x47;
374
                link->io.NumPorts2 = 8;
375
            }
376
            break;
377
        case MANFID_NEC:
378
            cardtype = NEC; /* MultiFunction Card */
379
            link->conf.ConfigBase = 0x800;
380
            link->conf.ConfigIndex = 0x47;
381
            link->io.NumPorts2 = 8;
382
            break;
383
        case MANFID_KME:
384
            cardtype = KME; /* MultiFunction Card */
385
            link->conf.ConfigBase = 0x800;
386
            link->conf.ConfigIndex = 0x47;
387
            link->io.NumPorts2 = 8;
388
            break;
389
        case MANFID_CONTEC:
390
            cardtype = CONTEC;
391
            break;
392
        case MANFID_FUJITSU:
393
            if (link->card_id == PRODID_FUJITSU_MBH10302)
394
                /* RATOC REX-5588/9822/4886's PRODID are 0004(=MBH10302),
395
                   but these are MBH10304 based card. */
396
                cardtype = MBH10304;
397
            else if (link->card_id == PRODID_FUJITSU_MBH10304)
398
                cardtype = MBH10304;
399
            else
400
                cardtype = LA501;
401
            break;
402
        default:
403
            cardtype = MBH10304;
404
        }
405
    } else {
406
        /* old type card */
407
        switch (link->manf_id) {
408
        case MANFID_FUJITSU:
409
            if (link->card_id == PRODID_FUJITSU_MBH10304) {
410
                cardtype = XXX10304;    /* MBH10304 with buggy CIS */
411
                link->conf.ConfigIndex = 0x20;
412
            } else {
413
                cardtype = MBH10302;    /* NextCom NC5310, etc. */
414
                link->conf.ConfigIndex = 1;
415
            }
416
            break;
417
        case MANFID_UNGERMANN:
418
            cardtype = UNGERMANN;
419
            break;
420
        default:
421
            cardtype = MBH10302;
422
            link->conf.ConfigIndex = 1;
423
        }
424
    }
425
 
426
    if (link->io.NumPorts2 != 0) {
427
        link->irq.Attributes =
428
                IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
429
        ret = mfc_try_io_port(link);
430
        if (ret != CS_SUCCESS) goto cs_failed;
431
    } else if (cardtype == UNGERMANN) {
432
        ret = ungermann_try_io_port(link);
433
        if (ret != CS_SUCCESS) goto cs_failed;
434
    } else {
435
        CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));
436
    }
437
    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
438
    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
439
    dev->irq = link->irq.AssignedIRQ;
440
    dev->base_addr = link->io.BasePort1;
441
 
442
    if (link->io.BasePort2 != 0)
443
        fmvj18x_setup_mfc(link);
444
 
445
    ioaddr = dev->base_addr;
446
 
447
    /* Reset controller */
448
    if (sram_config == 0)
449
        outb(CONFIG0_RST, ioaddr + CONFIG_0);
450
    else
451
        outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
452
 
453
    /* Power On chip and select bank 0 */
454
    if (cardtype == MBH10302)
455
        outb(BANK_0, ioaddr + CONFIG_1);
456
    else
457
        outb(BANK_0U, ioaddr + CONFIG_1);
458
 
459
    /* Set hardware address */
460
    switch (cardtype) {
461
    case MBH10304:
462
    case TDK:
463
    case LA501:
464
    case CONTEC:
465
    case NEC:
466
    case KME:
467
        tuple.DesiredTuple = CISTPL_FUNCE;
468
        tuple.TupleOffset = 0;
469
        CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
470
        tuple.TupleOffset = 0;
471
        CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
472
        if (cardtype == MBH10304) {
473
            /* MBH10304's CIS_FUNCE is corrupted */
474
            node_id = &(tuple.TupleData[5]);
475
            card_name = "FMV-J182";
476
        } else {
477
            while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) {
478
                CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
479
                CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
480
            }
481
            node_id = &(tuple.TupleData[2]);
482
            if( cardtype == TDK ) {
483
                card_name = "TDK LAK-CD021";
484
            } else if( cardtype == LA501 ) {
485
                card_name = "LA501";
486
            } else if( cardtype == NEC ) {
487
                card_name = "PK-UG-J001";
488
            } else if( cardtype == KME ) {
489
                card_name = "Panasonic";
490
            } else {
491
                card_name = "C-NET(PC)C";
492
            }
493
        }
494
        /* Read MACID from CIS */
495
        for (i = 0; i < 6; i++)
496
            dev->dev_addr[i] = node_id[i];
497
        break;
498
    case UNGERMANN:
499
        /* Read MACID from register */
500
        for (i = 0; i < 6; i++)
501
            dev->dev_addr[i] = inb(ioaddr + UNGERMANN_MAC_ID + i);
502
        card_name = "Access/CARD";
503
        break;
504
    case XXX10304:
505
        /* Read MACID from Buggy CIS */
506
        if (fmvj18x_get_hwinfo(link, tuple.TupleData) == -1) {
507
            printk(KERN_NOTICE "fmvj18x_cs: unable to read hardware net address.\n");
508
            goto failed;
509
        }
510
        for (i = 0 ; i < 6; i++) {
511
            dev->dev_addr[i] = tuple.TupleData[i];
512
        }
513
        card_name = "FMV-J182";
514
        break;
515
    case MBH10302:
516
    default:
517
        /* Read MACID from register */
518
        for (i = 0; i < 6; i++)
519
            dev->dev_addr[i] = inb(ioaddr + MAC_ID + i);
520
        card_name = "FMV-J181";
521
        break;
522
    }
523
 
524
    lp->cardtype = cardtype;
525
    link->dev_node = &lp->node;
526
    SET_NETDEV_DEV(dev, &handle_to_dev(link));
527
 
528
    if (register_netdev(dev) != 0) {
529
        printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n");
530
        link->dev_node = NULL;
531
        goto failed;
532
    }
533
 
534
    strcpy(lp->node.dev_name, dev->name);
535
 
536
    /* print current configuration */
537
    printk(KERN_INFO "%s: %s, sram %s, port %#3lx, irq %d, "
538
           "hw_addr %s\n",
539
           dev->name, card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2",
540
           dev->base_addr, dev->irq, print_mac(mac, dev->dev_addr));
541
 
542
    return 0;
543
 
544
cs_failed:
545
    /* All Card Services errors end up here */
546
    cs_error(link, last_fn, last_ret);
547
failed:
548
    fmvj18x_release(link);
549
    return -ENODEV;
550
} /* fmvj18x_config */
551
/*====================================================================*/
552
 
553
static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
554
{
555
    win_req_t req;
556
    memreq_t mem;
557
    u_char __iomem *base;
558
    int i, j;
559
 
560
    /* Allocate a small memory window */
561
    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
562
    req.Base = 0; req.Size = 0;
563
    req.AccessSpeed = 0;
564
    i = pcmcia_request_window(&link, &req, &link->win);
565
    if (i != CS_SUCCESS) {
566
        cs_error(link, RequestWindow, i);
567
        return -1;
568
    }
569
 
570
    base = ioremap(req.Base, req.Size);
571
    mem.Page = 0;
572
    mem.CardOffset = 0;
573
    pcmcia_map_mem_page(link->win, &mem);
574
 
575
    /*
576
     *  MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
577
     *  22 0d xx xx xx 04 06 yy yy yy yy yy yy ff
578
     *  'xx' is garbage.
579
     *  'yy' is MAC address.
580
    */
581
    for (i = 0; i < 0x200; i++) {
582
        if (readb(base+i*2) == 0x22) {
583
            if (readb(base+(i-1)*2) == 0xff
584
             && readb(base+(i+5)*2) == 0x04
585
             && readb(base+(i+6)*2) == 0x06
586
             && readb(base+(i+13)*2) == 0xff)
587
                break;
588
        }
589
    }
590
 
591
    if (i != 0x200) {
592
        for (j = 0 ; j < 6; j++,i++) {
593
            node_id[j] = readb(base+(i+7)*2);
594
        }
595
    }
596
 
597
    iounmap(base);
598
    j = pcmcia_release_window(link->win);
599
    if (j != CS_SUCCESS)
600
        cs_error(link, ReleaseWindow, j);
601
    return (i != 0x200) ? 0 : -1;
602
 
603
} /* fmvj18x_get_hwinfo */
604
/*====================================================================*/
605
 
606
static int fmvj18x_setup_mfc(struct pcmcia_device *link)
607
{
608
    win_req_t req;
609
    memreq_t mem;
610
    u_char __iomem *base;
611
    int i, j;
612
    struct net_device *dev = link->priv;
613
    kio_addr_t ioaddr;
614
 
615
    /* Allocate a small memory window */
616
    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
617
    req.Base = 0; req.Size = 0;
618
    req.AccessSpeed = 0;
619
    i = pcmcia_request_window(&link, &req, &link->win);
620
    if (i != CS_SUCCESS) {
621
        cs_error(link, RequestWindow, i);
622
        return -1;
623
    }
624
 
625
    base = ioremap(req.Base, req.Size);
626
    mem.Page = 0;
627
    mem.CardOffset = 0;
628
    pcmcia_map_mem_page(link->win, &mem);
629
 
630
    ioaddr = dev->base_addr;
631
    writeb(0x47, base+0x800);   /* Config Option Register of LAN */
632
    writeb(0x0, base+0x802);    /* Config and Status Register */
633
 
634
    writeb(ioaddr & 0xff, base+0x80a);          /* I/O Base(Low) of LAN */
635
    writeb((ioaddr >> 8) & 0xff, base+0x80c);   /* I/O Base(High) of LAN */
636
 
637
    writeb(0x45, base+0x820);   /* Config Option Register of Modem */
638
    writeb(0x8, base+0x822);    /* Config and Status Register */
639
 
640
    iounmap(base);
641
    j = pcmcia_release_window(link->win);
642
    if (j != CS_SUCCESS)
643
        cs_error(link, ReleaseWindow, j);
644
    return 0;
645
 
646
}
647
/*====================================================================*/
648
 
649
static void fmvj18x_release(struct pcmcia_device *link)
650
{
651
        DEBUG(0, "fmvj18x_release(0x%p)\n", link);
652
        pcmcia_disable_device(link);
653
}
654
 
655
static int fmvj18x_suspend(struct pcmcia_device *link)
656
{
657
        struct net_device *dev = link->priv;
658
 
659
        if (link->open)
660
                netif_device_detach(dev);
661
 
662
        return 0;
663
}
664
 
665
static int fmvj18x_resume(struct pcmcia_device *link)
666
{
667
        struct net_device *dev = link->priv;
668
 
669
        if (link->open) {
670
                fjn_reset(dev);
671
                netif_device_attach(dev);
672
        }
673
 
674
        return 0;
675
}
676
 
677
/*====================================================================*/
678
 
679
static struct pcmcia_device_id fmvj18x_ids[] = {
680
        PCMCIA_DEVICE_MANF_CARD(0x0004, 0x0004),
681
        PCMCIA_DEVICE_PROD_ID12("EAGLE Technology", "NE200 ETHERNET LAN MBH10302 04", 0x528c88c4, 0x74f91e59),
682
        PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922),
683
        PCMCIA_DEVICE_PROD_ID12("Eiger labs,Inc.", "EPX-10BT PC Card Ethernet 10BT", 0xf47e6c66, 0x877f9922),
684
        PCMCIA_DEVICE_PROD_ID12("FUJITSU", "LAN Card(FMV-J182)", 0x6ee5a3d8, 0x5baf31db),
685
        PCMCIA_DEVICE_PROD_ID12("FUJITSU", "MBH10308", 0x6ee5a3d8, 0x3f04875e),
686
        PCMCIA_DEVICE_PROD_ID12("FUJITSU TOWA", "LA501", 0xb8451188, 0x12939ba2),
687
        PCMCIA_DEVICE_PROD_ID12("HITACHI", "HT-4840-11", 0xf4f43949, 0x773910f4),
688
        PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310B Ver1.0       ", 0x8cef4d3a, 0x075fc7b6),
689
        PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310 Ver1.0        ", 0x8cef4d3a, 0xbccf43e6),
690
        PCMCIA_DEVICE_PROD_ID12("RATOC System Inc.", "10BASE_T CARD R280", 0x85c10e17, 0xd9413666),
691
        PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CD02x", 0x1eae9475, 0x8fa0ee70),
692
        PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CF010", 0x1eae9475, 0x7683bc9a),
693
        PCMCIA_DEVICE_PROD_ID1("CONTEC Co.,Ltd.", 0x58d8fee2),
694
        PCMCIA_DEVICE_PROD_ID1("PCMCIA LAN MBH10304  ES", 0x2599f454),
695
        PCMCIA_DEVICE_PROD_ID1("PCMCIA MBH10302", 0x8f4005da),
696
        PCMCIA_DEVICE_PROD_ID1("UBKK,V2.0", 0x90888080),
697
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
698
        PCMCIA_PFC_DEVICE_PROD_ID12(0, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
699
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0d0a),
700
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
701
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05),
702
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
703
        PCMCIA_DEVICE_NULL,
704
};
705
MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids);
706
 
707
static struct pcmcia_driver fmvj18x_cs_driver = {
708
        .owner          = THIS_MODULE,
709
        .drv            = {
710
                .name   = "fmvj18x_cs",
711
        },
712
        .probe          = fmvj18x_probe,
713
        .remove         = fmvj18x_detach,
714
        .id_table       = fmvj18x_ids,
715
        .suspend        = fmvj18x_suspend,
716
        .resume         = fmvj18x_resume,
717
};
718
 
719
static int __init init_fmvj18x_cs(void)
720
{
721
        return pcmcia_register_driver(&fmvj18x_cs_driver);
722
}
723
 
724
static void __exit exit_fmvj18x_cs(void)
725
{
726
        pcmcia_unregister_driver(&fmvj18x_cs_driver);
727
}
728
 
729
module_init(init_fmvj18x_cs);
730
module_exit(exit_fmvj18x_cs);
731
 
732
/*====================================================================*/
733
 
734
static irqreturn_t fjn_interrupt(int irq, void *dev_id)
735
{
736
    struct net_device *dev = dev_id;
737
    local_info_t *lp = netdev_priv(dev);
738
    kio_addr_t ioaddr;
739
    unsigned short tx_stat, rx_stat;
740
 
741
    if (lp == NULL) {
742
        printk(KERN_NOTICE "fjn_interrupt(): irq %d for "
743
               "unknown device.\n", irq);
744
        return IRQ_NONE;
745
    }
746
    ioaddr = dev->base_addr;
747
 
748
    /* avoid multiple interrupts */
749
    outw(0x0000, ioaddr + TX_INTR);
750
 
751
    /* wait for a while */
752
    udelay(1);
753
 
754
    /* get status */
755
    tx_stat = inb(ioaddr + TX_STATUS);
756
    rx_stat = inb(ioaddr + RX_STATUS);
757
 
758
    /* clear status */
759
    outb(tx_stat, ioaddr + TX_STATUS);
760
    outb(rx_stat, ioaddr + RX_STATUS);
761
 
762
    DEBUG(4, "%s: interrupt, rx_status %02x.\n", dev->name, rx_stat);
763
    DEBUG(4, "               tx_status %02x.\n", tx_stat);
764
 
765
    if (rx_stat || (inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
766
        /* there is packet(s) in rx buffer */
767
        fjn_rx(dev);
768
    }
769
    if (tx_stat & F_TMT_RDY) {
770
        lp->stats.tx_packets += lp->sent ;
771
        lp->sent = 0 ;
772
        if (lp->tx_queue) {
773
            outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
774
            lp->sent = lp->tx_queue ;
775
            lp->tx_queue = 0;
776
            lp->tx_queue_len = 0;
777
            dev->trans_start = jiffies;
778
        } else {
779
            lp->tx_started = 0;
780
        }
781
        netif_wake_queue(dev);
782
    }
783
    DEBUG(4, "%s: exiting interrupt,\n", dev->name);
784
    DEBUG(4, "    tx_status %02x, rx_status %02x.\n", tx_stat, rx_stat);
785
 
786
    outb(D_TX_INTR, ioaddr + TX_INTR);
787
    outb(D_RX_INTR, ioaddr + RX_INTR);
788
    return IRQ_HANDLED;
789
 
790
} /* fjn_interrupt */
791
 
792
/*====================================================================*/
793
 
794
static void fjn_tx_timeout(struct net_device *dev)
795
{
796
    struct local_info_t *lp = netdev_priv(dev);
797
    kio_addr_t ioaddr = dev->base_addr;
798
 
799
    printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n",
800
           dev->name, htons(inw(ioaddr + TX_STATUS)),
801
           inb(ioaddr + TX_STATUS) & F_TMT_RDY
802
           ? "IRQ conflict" : "network cable problem");
803
    printk(KERN_NOTICE "%s: timeout registers: %04x %04x %04x "
804
           "%04x %04x %04x %04x %04x.\n",
805
           dev->name, htons(inw(ioaddr + 0)),
806
           htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
807
           htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
808
           htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
809
           htons(inw(ioaddr +14)));
810
    lp->stats.tx_errors++;
811
    /* ToDo: We should try to restart the adaptor... */
812
    local_irq_disable();
813
    fjn_reset(dev);
814
 
815
    lp->tx_started = 0;
816
    lp->tx_queue = 0;
817
    lp->tx_queue_len = 0;
818
    lp->sent = 0;
819
    lp->open_time = jiffies;
820
    local_irq_enable();
821
    netif_wake_queue(dev);
822
}
823
 
824
static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev)
825
{
826
    struct local_info_t *lp = netdev_priv(dev);
827
    kio_addr_t ioaddr = dev->base_addr;
828
    short length = skb->len;
829
 
830
    if (length < ETH_ZLEN)
831
    {
832
        if (skb_padto(skb, ETH_ZLEN))
833
                return 0;
834
        length = ETH_ZLEN;
835
    }
836
 
837
    netif_stop_queue(dev);
838
 
839
    {
840
        unsigned char *buf = skb->data;
841
 
842
        if (length > ETH_FRAME_LEN) {
843
            printk(KERN_NOTICE "%s: Attempting to send a large packet"
844
                   " (%d bytes).\n", dev->name, length);
845
            return 1;
846
        }
847
 
848
        DEBUG(4, "%s: Transmitting a packet of length %lu.\n",
849
              dev->name, (unsigned long)skb->len);
850
        lp->stats.tx_bytes += skb->len;
851
 
852
        /* Disable both interrupts. */
853
        outw(0x0000, ioaddr + TX_INTR);
854
 
855
        /* wait for a while */
856
        udelay(1);
857
 
858
        outw(length, ioaddr + DATAPORT);
859
        outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
860
 
861
        lp->tx_queue++;
862
        lp->tx_queue_len += ((length+3) & ~1);
863
 
864
        if (lp->tx_started == 0) {
865
            /* If the Tx is idle, always trigger a transmit. */
866
            outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
867
            lp->sent = lp->tx_queue ;
868
            lp->tx_queue = 0;
869
            lp->tx_queue_len = 0;
870
            dev->trans_start = jiffies;
871
            lp->tx_started = 1;
872
            netif_start_queue(dev);
873
        } else {
874
            if( sram_config == 0 ) {
875
                if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) )
876
                    /* Yes, there is room for one more packet. */
877
                    netif_start_queue(dev);
878
            } else {
879
                if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) &&
880
                                                lp->tx_queue < 127 )
881
                    /* Yes, there is room for one more packet. */
882
                    netif_start_queue(dev);
883
            }
884
        }
885
 
886
        /* Re-enable interrupts */
887
        outb(D_TX_INTR, ioaddr + TX_INTR);
888
        outb(D_RX_INTR, ioaddr + RX_INTR);
889
    }
890
    dev_kfree_skb (skb);
891
 
892
    return 0;
893
} /* fjn_start_xmit */
894
 
895
/*====================================================================*/
896
 
897
static void fjn_reset(struct net_device *dev)
898
{
899
    struct local_info_t *lp = netdev_priv(dev);
900
    kio_addr_t ioaddr = dev->base_addr;
901
    int i;
902
 
903
    DEBUG(4, "fjn_reset(%s) called.\n",dev->name);
904
 
905
    /* Reset controller */
906
    if( sram_config == 0 )
907
        outb(CONFIG0_RST, ioaddr + CONFIG_0);
908
    else
909
        outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
910
 
911
    /* Power On chip and select bank 0 */
912
    if (lp->cardtype == MBH10302)
913
        outb(BANK_0, ioaddr + CONFIG_1);
914
    else
915
        outb(BANK_0U, ioaddr + CONFIG_1);
916
 
917
    /* Set Tx modes */
918
    outb(D_TX_MODE, ioaddr + TX_MODE);
919
    /* set Rx modes */
920
    outb(ID_MATCHED, ioaddr + RX_MODE);
921
 
922
    /* Set hardware address */
923
    for (i = 0; i < 6; i++)
924
        outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
925
 
926
    /* (re)initialize the multicast table */
927
    set_rx_mode(dev);
928
 
929
    /* Switch to bank 2 (runtime mode) */
930
    if (lp->cardtype == MBH10302)
931
        outb(BANK_2, ioaddr + CONFIG_1);
932
    else
933
        outb(BANK_2U, ioaddr + CONFIG_1);
934
 
935
    /* set 16col ctrl bits */
936
    if( lp->cardtype == TDK || lp->cardtype == CONTEC)
937
        outb(TDK_AUTO_MODE, ioaddr + COL_CTRL);
938
    else
939
        outb(AUTO_MODE, ioaddr + COL_CTRL);
940
 
941
    /* clear Reserved Regs */
942
    outb(0x00, ioaddr + BMPR12);
943
    outb(0x00, ioaddr + BMPR13);
944
 
945
    /* reset Skip packet reg. */
946
    outb(0x01, ioaddr + RX_SKIP);
947
 
948
    /* Enable Tx and Rx */
949
    if( sram_config == 0 )
950
        outb(CONFIG0_DFL, ioaddr + CONFIG_0);
951
    else
952
        outb(CONFIG0_DFL_1, ioaddr + CONFIG_0);
953
 
954
    /* Init receive pointer ? */
955
    inw(ioaddr + DATAPORT);
956
    inw(ioaddr + DATAPORT);
957
 
958
    /* Clear all status */
959
    outb(0xff, ioaddr + TX_STATUS);
960
    outb(0xff, ioaddr + RX_STATUS);
961
 
962
    if (lp->cardtype == MBH10302)
963
        outb(INTR_OFF, ioaddr + LAN_CTRL);
964
 
965
    /* Turn on Rx interrupts */
966
    outb(D_TX_INTR, ioaddr + TX_INTR);
967
    outb(D_RX_INTR, ioaddr + RX_INTR);
968
 
969
    /* Turn on interrupts from LAN card controller */
970
    if (lp->cardtype == MBH10302)
971
        outb(INTR_ON, ioaddr + LAN_CTRL);
972
} /* fjn_reset */
973
 
974
/*====================================================================*/
975
 
976
static void fjn_rx(struct net_device *dev)
977
{
978
    struct local_info_t *lp = netdev_priv(dev);
979
    kio_addr_t ioaddr = dev->base_addr;
980
    int boguscount = 10;        /* 5 -> 10: by agy 19940922 */
981
 
982
    DEBUG(4, "%s: in rx_packet(), rx_status %02x.\n",
983
          dev->name, inb(ioaddr + RX_STATUS));
984
 
985
    while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
986
        u_short status = inw(ioaddr + DATAPORT);
987
 
988
        DEBUG(4, "%s: Rxing packet mode %02x status %04x.\n",
989
              dev->name, inb(ioaddr + RX_MODE), status);
990
#ifndef final_version
991
        if (status == 0) {
992
            outb(F_SKP_PKT, ioaddr + RX_SKIP);
993
            break;
994
        }
995
#endif
996
        if ((status & 0xF0) != 0x20) {  /* There was an error. */
997
            lp->stats.rx_errors++;
998
            if (status & F_LEN_ERR) lp->stats.rx_length_errors++;
999
            if (status & F_ALG_ERR) lp->stats.rx_frame_errors++;
1000
            if (status & F_CRC_ERR) lp->stats.rx_crc_errors++;
1001
            if (status & F_OVR_FLO) lp->stats.rx_over_errors++;
1002
        } else {
1003
            u_short pkt_len = inw(ioaddr + DATAPORT);
1004
            /* Malloc up new buffer. */
1005
            struct sk_buff *skb;
1006
 
1007
            if (pkt_len > 1550) {
1008
                printk(KERN_NOTICE "%s: The FMV-18x claimed a very "
1009
                       "large packet, size %d.\n", dev->name, pkt_len);
1010
                outb(F_SKP_PKT, ioaddr + RX_SKIP);
1011
                lp->stats.rx_errors++;
1012
                break;
1013
            }
1014
            skb = dev_alloc_skb(pkt_len+2);
1015
            if (skb == NULL) {
1016
                printk(KERN_NOTICE "%s: Memory squeeze, dropping "
1017
                       "packet (len %d).\n", dev->name, pkt_len);
1018
                outb(F_SKP_PKT, ioaddr + RX_SKIP);
1019
                lp->stats.rx_dropped++;
1020
                break;
1021
            }
1022
 
1023
            skb_reserve(skb, 2);
1024
            insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1025
                 (pkt_len + 1) >> 1);
1026
            skb->protocol = eth_type_trans(skb, dev);
1027
 
1028
#ifdef PCMCIA_DEBUG
1029
            if (pc_debug > 5) {
1030
                int i;
1031
                printk(KERN_DEBUG "%s: Rxed packet of length %d: ",
1032
                       dev->name, pkt_len);
1033
                for (i = 0; i < 14; i++)
1034
                    printk(" %02x", skb->data[i]);
1035
                printk(".\n");
1036
            }
1037
#endif
1038
 
1039
            netif_rx(skb);
1040
            dev->last_rx = jiffies;
1041
            lp->stats.rx_packets++;
1042
            lp->stats.rx_bytes += pkt_len;
1043
        }
1044
        if (--boguscount <= 0)
1045
            break;
1046
    }
1047
 
1048
    /* If any worth-while packets have been received, dev_rint()
1049
           has done a netif_wake_queue() for us and will work on them
1050
           when we get to the bottom-half routine. */
1051
/*
1052
    if (lp->cardtype != TDK) {
1053
        int i;
1054
        for (i = 0; i < 20; i++) {
1055
            if ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == F_BUF_EMP)
1056
                break;
1057
            (void)inw(ioaddr + DATAPORT);  /+ dummy status read +/
1058
            outb(F_SKP_PKT, ioaddr + RX_SKIP);
1059
        }
1060
 
1061
        if (i > 0)
1062
            DEBUG(5, "%s: Exint Rx packet with mode %02x after "
1063
                  "%d ticks.\n", dev->name, inb(ioaddr + RX_MODE), i);
1064
    }
1065
*/
1066
 
1067
    return;
1068
} /* fjn_rx */
1069
 
1070
/*====================================================================*/
1071
 
1072
static void netdev_get_drvinfo(struct net_device *dev,
1073
                               struct ethtool_drvinfo *info)
1074
{
1075
        strcpy(info->driver, DRV_NAME);
1076
        strcpy(info->version, DRV_VERSION);
1077
        sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1078
}
1079
 
1080
#ifdef PCMCIA_DEBUG
1081
static u32 netdev_get_msglevel(struct net_device *dev)
1082
{
1083
        return pc_debug;
1084
}
1085
 
1086
static void netdev_set_msglevel(struct net_device *dev, u32 level)
1087
{
1088
        pc_debug = level;
1089
}
1090
#endif /* PCMCIA_DEBUG */
1091
 
1092
static const struct ethtool_ops netdev_ethtool_ops = {
1093
        .get_drvinfo            = netdev_get_drvinfo,
1094
#ifdef PCMCIA_DEBUG
1095
        .get_msglevel           = netdev_get_msglevel,
1096
        .set_msglevel           = netdev_set_msglevel,
1097
#endif /* PCMCIA_DEBUG */
1098
};
1099
 
1100
static int fjn_config(struct net_device *dev, struct ifmap *map){
1101
    return 0;
1102
}
1103
 
1104
static int fjn_open(struct net_device *dev)
1105
{
1106
    struct local_info_t *lp = netdev_priv(dev);
1107
    struct pcmcia_device *link = lp->p_dev;
1108
 
1109
    DEBUG(4, "fjn_open('%s').\n", dev->name);
1110
 
1111
    if (!pcmcia_dev_present(link))
1112
        return -ENODEV;
1113
 
1114
    link->open++;
1115
 
1116
    fjn_reset(dev);
1117
 
1118
    lp->tx_started = 0;
1119
    lp->tx_queue = 0;
1120
    lp->tx_queue_len = 0;
1121
    lp->open_time = jiffies;
1122
    netif_start_queue(dev);
1123
 
1124
    return 0;
1125
} /* fjn_open */
1126
 
1127
/*====================================================================*/
1128
 
1129
static int fjn_close(struct net_device *dev)
1130
{
1131
    struct local_info_t *lp = netdev_priv(dev);
1132
    struct pcmcia_device *link = lp->p_dev;
1133
    kio_addr_t ioaddr = dev->base_addr;
1134
 
1135
    DEBUG(4, "fjn_close('%s').\n", dev->name);
1136
 
1137
    lp->open_time = 0;
1138
    netif_stop_queue(dev);
1139
 
1140
    /* Set configuration register 0 to disable Tx and Rx. */
1141
    if( sram_config == 0 )
1142
        outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1143
    else
1144
        outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1145
 
1146
    /* Update the statistics -- ToDo. */
1147
 
1148
    /* Power-down the chip.  Green, green, green! */
1149
    outb(CHIP_OFF ,ioaddr + CONFIG_1);
1150
 
1151
    /* Set the ethernet adaptor disable IRQ */
1152
    if (lp->cardtype == MBH10302)
1153
        outb(INTR_OFF, ioaddr + LAN_CTRL);
1154
 
1155
    link->open--;
1156
 
1157
    return 0;
1158
} /* fjn_close */
1159
 
1160
/*====================================================================*/
1161
 
1162
static struct net_device_stats *fjn_get_stats(struct net_device *dev)
1163
{
1164
    local_info_t *lp = netdev_priv(dev);
1165
    return &lp->stats;
1166
} /* fjn_get_stats */
1167
 
1168
/*====================================================================*/
1169
 
1170
/*
1171
  Set the multicast/promiscuous mode for this adaptor.
1172
*/
1173
 
1174
static void set_rx_mode(struct net_device *dev)
1175
{
1176
    kio_addr_t ioaddr = dev->base_addr;
1177
    u_char mc_filter[8];                 /* Multicast hash filter */
1178
    u_long flags;
1179
    int i;
1180
 
1181
    int saved_bank;
1182
    int saved_config_0 = inb(ioaddr + CONFIG_0);
1183
 
1184
    local_irq_save(flags);
1185
 
1186
    /* Disable Tx and Rx */
1187
    if (sram_config == 0)
1188
        outb(CONFIG0_RST, ioaddr + CONFIG_0);
1189
    else
1190
        outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1191
 
1192
    if (dev->flags & IFF_PROMISC) {
1193
        memset(mc_filter, 0xff, sizeof(mc_filter));
1194
        outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
1195
    } else if (dev->mc_count > MC_FILTERBREAK
1196
               ||  (dev->flags & IFF_ALLMULTI)) {
1197
        /* Too many to filter perfectly -- accept all multicasts. */
1198
        memset(mc_filter, 0xff, sizeof(mc_filter));
1199
        outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1200
    } else if (dev->mc_count == 0) {
1201
        memset(mc_filter, 0x00, sizeof(mc_filter));
1202
        outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
1203
    } else {
1204
        struct dev_mc_list *mclist;
1205
        int i;
1206
 
1207
        memset(mc_filter, 0, sizeof(mc_filter));
1208
        for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1209
             i++, mclist = mclist->next) {
1210
            unsigned int bit =
1211
                ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1212
            mc_filter[bit >> 3] |= (1 << (bit & 7));
1213
        }
1214
        outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1215
    }
1216
 
1217
    /* Switch to bank 1 and set the multicast table. */
1218
    saved_bank = inb(ioaddr + CONFIG_1);
1219
    outb(0xe4, ioaddr + CONFIG_1);
1220
 
1221
    for (i = 0; i < 8; i++)
1222
        outb(mc_filter[i], ioaddr + MAR_ADR + i);
1223
    outb(saved_bank, ioaddr + CONFIG_1);
1224
 
1225
    outb(saved_config_0, ioaddr + CONFIG_0);
1226
 
1227
    local_irq_restore(flags);
1228
}

powered by: WebSVN 2.1.0

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