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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* 3c574.c: A PCMCIA ethernet driver for the 3com 3c574 "RoadRunner".
2
 
3
        Written 1993-1998 by
4
        Donald Becker, becker@scyld.com, (driver core) and
5
        David Hinds, dahinds@users.sourceforge.net (from his PC card code).
6
        Locking fixes (C) Copyright 2003 Red Hat Inc
7
 
8
        This software may be used and distributed according to the terms of
9
        the GNU General Public License, incorporated herein by reference.
10
 
11
        This driver derives from Donald Becker's 3c509 core, which has the
12
        following copyright:
13
        Copyright 1993 United States Government as represented by the
14
        Director, National Security Agency.
15
 
16
 
17
*/
18
 
19
/*
20
                                Theory of Operation
21
 
22
I. Board Compatibility
23
 
24
This device driver is designed for the 3Com 3c574 PC card Fast Ethernet
25
Adapter.
26
 
27
II. Board-specific settings
28
 
29
None -- PC cards are autoconfigured.
30
 
31
III. Driver operation
32
 
33
The 3c574 uses a Boomerang-style interface, without the bus-master capability.
34
See the Boomerang driver and documentation for most details.
35
 
36
IV. Notes and chip documentation.
37
 
38
Two added registers are used to enhance PIO performance, RunnerRdCtrl and
39
RunnerWrCtrl.  These are 11 bit down-counters that are preloaded with the
40
count of word (16 bits) reads or writes the driver is about to do to the Rx
41
or Tx FIFO.  The chip is then able to hide the internal-PCI-bus to PC-card
42
translation latency by buffering the I/O operations with an 8 word FIFO.
43
Note: No other chip accesses are permitted when this buffer is used.
44
 
45
A second enhancement is that both attribute and common memory space
46
0x0800-0x0fff can translated to the PIO FIFO.  Thus memory operations (faster
47
with *some* PCcard bridges) may be used instead of I/O operations.
48
This is enabled by setting the 0x10 bit in the PCMCIA LAN COR.
49
 
50
Some slow PC card bridges work better if they never see a WAIT signal.
51
This is configured by setting the 0x20 bit in the PCMCIA LAN COR.
52
Only do this after testing that it is reliable and improves performance.
53
 
54
The upper five bits of RunnerRdCtrl are used to window into PCcard
55
configuration space registers.  Window 0 is the regular Boomerang/Odie
56
register set, 1-5 are various PC card control registers, and 16-31 are
57
the (reversed!) CIS table.
58
 
59
A final note: writing the InternalConfig register in window 3 with an
60
invalid ramWidth is Very Bad.
61
 
62
V. References
63
 
64
http://www.scyld.com/expert/NWay.html
65
http://www.national.com/pf/DP/DP83840.html
66
 
67
Thanks to Terry Murphy of 3Com for providing development information for
68
earlier 3Com products.
69
 
70
*/
71
 
72
#include <linux/module.h>
73
#include <linux/kernel.h>
74
#include <linux/init.h>
75
#include <linux/slab.h>
76
#include <linux/string.h>
77
#include <linux/timer.h>
78
#include <linux/interrupt.h>
79
#include <linux/in.h>
80
#include <linux/delay.h>
81
#include <linux/netdevice.h>
82
#include <linux/etherdevice.h>
83
#include <linux/skbuff.h>
84
#include <linux/if_arp.h>
85
#include <linux/ioport.h>
86
#include <linux/ethtool.h>
87
#include <linux/bitops.h>
88
 
89
#include <pcmcia/cs_types.h>
90
#include <pcmcia/cs.h>
91
#include <pcmcia/cistpl.h>
92
#include <pcmcia/cisreg.h>
93
#include <pcmcia/ciscode.h>
94
#include <pcmcia/ds.h>
95
#include <pcmcia/mem_op.h>
96
 
97
#include <asm/uaccess.h>
98
#include <asm/io.h>
99
#include <asm/system.h>
100
 
101
/*====================================================================*/
102
 
103
/* Module parameters */
104
 
105
MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
106
MODULE_DESCRIPTION("3Com 3c574 series PCMCIA ethernet driver");
107
MODULE_LICENSE("GPL");
108
 
109
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
110
 
111
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
112
INT_MODULE_PARM(max_interrupt_work, 32);
113
 
114
/* Force full duplex modes? */
115
INT_MODULE_PARM(full_duplex, 0);
116
 
117
/* Autodetect link polarity reversal? */
118
INT_MODULE_PARM(auto_polarity, 1);
119
 
120
#ifdef PCMCIA_DEBUG
121
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
122
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
123
static char *version =
124
"3c574_cs.c 1.65ac1 2003/04/07 Donald Becker/David Hinds, becker@scyld.com.\n";
125
#else
126
#define DEBUG(n, args...)
127
#endif
128
 
129
/*====================================================================*/
130
 
131
/* Time in jiffies before concluding the transmitter is hung. */
132
#define TX_TIMEOUT  ((800*HZ)/1000)
133
 
134
/* To minimize the size of the driver source and make the driver more
135
   readable not all constants are symbolically defined.
136
   You'll need the manual if you want to understand driver details anyway. */
137
/* Offsets from base I/O address. */
138
#define EL3_DATA        0x00
139
#define EL3_CMD         0x0e
140
#define EL3_STATUS      0x0e
141
 
142
#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
143
 
144
/* The top five bits written to EL3_CMD are a command, the lower
145
   11 bits are the parameter, if applicable. */
146
enum el3_cmds {
147
        TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
148
        RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
149
        TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
150
        FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
151
        SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
152
        SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
153
        StatsDisable = 22<<11, StopCoax = 23<<11,
154
};
155
 
156
enum elxl_status {
157
        IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
158
        TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
159
        IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000 };
160
 
161
/* The SetRxFilter command accepts the following classes: */
162
enum RxFilter {
163
        RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
164
};
165
 
166
enum Window0 {
167
        Wn0EepromCmd = 10, Wn0EepromData = 12, /* EEPROM command/address, data. */
168
        IntrStatus=0x0E,                /* Valid in all windows. */
169
};
170
/* These assumes the larger EEPROM. */
171
enum Win0_EEPROM_cmds {
172
        EEPROM_Read = 0x200, EEPROM_WRITE = 0x100, EEPROM_ERASE = 0x300,
173
        EEPROM_EWENB = 0x30,            /* Enable erasing/writing for 10 msec. */
174
        EEPROM_EWDIS = 0x00,            /* Disable EWENB before 10 msec timeout. */
175
};
176
 
177
/* Register window 1 offsets, the window used in normal operation.
178
   On the "Odie" this window is always mapped at offsets 0x10-0x1f.
179
   Except for TxFree, which is overlapped by RunnerWrCtrl. */
180
enum Window1 {
181
        TX_FIFO = 0x10,  RX_FIFO = 0x10,  RxErrors = 0x14,
182
        RxStatus = 0x18,  Timer=0x1A, TxStatus = 0x1B,
183
        TxFree = 0x0C, /* Remaining free bytes in Tx buffer. */
184
        RunnerRdCtrl = 0x16, RunnerWrCtrl = 0x1c,
185
};
186
 
187
enum Window3 {                  /* Window 3: MAC/config bits. */
188
        Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
189
};
190
enum wn3_config {
191
        Ram_size = 7,
192
        Ram_width = 8,
193
        Ram_speed = 0x30,
194
        Rom_size = 0xc0,
195
        Ram_split_shift = 16,
196
        Ram_split = 3 << Ram_split_shift,
197
        Xcvr_shift = 20,
198
        Xcvr = 7 << Xcvr_shift,
199
        Autoselect = 0x1000000,
200
};
201
 
202
enum Window4 {          /* Window 4: Xcvr/media bits. */
203
        Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,
204
};
205
 
206
#define MEDIA_TP        0x00C0  /* Enable link beat and jabber for 10baseT. */
207
 
208
struct el3_private {
209
        struct pcmcia_device    *p_dev;
210
        dev_node_t node;
211
        struct net_device_stats stats;
212
        u16 advertising, partner;               /* NWay media advertisement */
213
        unsigned char phys;                     /* MII device address */
214
        unsigned int autoselect:1, default_media:3;     /* Read from the EEPROM/Wn3_Config. */
215
        /* for transceiver monitoring */
216
        struct timer_list media;
217
        unsigned short media_status;
218
        unsigned short fast_poll;
219
        unsigned long last_irq;
220
        spinlock_t window_lock;                 /* Guards the Window selection */
221
};
222
 
223
/* Set iff a MII transceiver on any interface requires mdio preamble.
224
   This only set with the original DP83840 on older 3c905 boards, so the extra
225
   code size of a per-interface flag is not worthwhile. */
226
static char mii_preamble_required = 0;
227
 
228
/* Index of functions. */
229
 
230
static int tc574_config(struct pcmcia_device *link);
231
static void tc574_release(struct pcmcia_device *link);
232
 
233
static void mdio_sync(kio_addr_t ioaddr, int bits);
234
static int mdio_read(kio_addr_t ioaddr, int phy_id, int location);
235
static void mdio_write(kio_addr_t ioaddr, int phy_id, int location, int value);
236
static unsigned short read_eeprom(kio_addr_t ioaddr, int index);
237
static void tc574_wait_for_completion(struct net_device *dev, int cmd);
238
 
239
static void tc574_reset(struct net_device *dev);
240
static void media_check(unsigned long arg);
241
static int el3_open(struct net_device *dev);
242
static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
243
static irqreturn_t el3_interrupt(int irq, void *dev_id);
244
static void update_stats(struct net_device *dev);
245
static struct net_device_stats *el3_get_stats(struct net_device *dev);
246
static int el3_rx(struct net_device *dev, int worklimit);
247
static int el3_close(struct net_device *dev);
248
static void el3_tx_timeout(struct net_device *dev);
249
static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
250
static const struct ethtool_ops netdev_ethtool_ops;
251
static void set_rx_mode(struct net_device *dev);
252
 
253
static void tc574_detach(struct pcmcia_device *p_dev);
254
 
255
/*
256
        tc574_attach() creates an "instance" of the driver, allocating
257
        local data structures for one device.  The device is registered
258
        with Card Services.
259
*/
260
 
261
static int tc574_probe(struct pcmcia_device *link)
262
{
263
        struct el3_private *lp;
264
        struct net_device *dev;
265
 
266
        DEBUG(0, "3c574_attach()\n");
267
 
268
        /* Create the PC card device object. */
269
        dev = alloc_etherdev(sizeof(struct el3_private));
270
        if (!dev)
271
                return -ENOMEM;
272
        lp = netdev_priv(dev);
273
        link->priv = dev;
274
        lp->p_dev = link;
275
 
276
        spin_lock_init(&lp->window_lock);
277
        link->io.NumPorts1 = 32;
278
        link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
279
        link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
280
        link->irq.IRQInfo1 = IRQ_LEVEL_ID;
281
        link->irq.Handler = &el3_interrupt;
282
        link->irq.Instance = dev;
283
        link->conf.Attributes = CONF_ENABLE_IRQ;
284
        link->conf.IntType = INT_MEMORY_AND_IO;
285
        link->conf.ConfigIndex = 1;
286
 
287
        /* The EL3-specific entries in the device structure. */
288
        dev->hard_start_xmit = &el3_start_xmit;
289
        dev->get_stats = &el3_get_stats;
290
        dev->do_ioctl = &el3_ioctl;
291
        SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
292
        dev->set_multicast_list = &set_rx_mode;
293
        dev->open = &el3_open;
294
        dev->stop = &el3_close;
295
#ifdef HAVE_TX_TIMEOUT
296
        dev->tx_timeout = el3_tx_timeout;
297
        dev->watchdog_timeo = TX_TIMEOUT;
298
#endif
299
 
300
        return tc574_config(link);
301
} /* tc574_attach */
302
 
303
/*
304
 
305
        This deletes a driver "instance".  The device is de-registered
306
        with Card Services.  If it has been released, all local data
307
        structures are freed.  Otherwise, the structures will be freed
308
        when the device is released.
309
 
310
*/
311
 
312
static void tc574_detach(struct pcmcia_device *link)
313
{
314
        struct net_device *dev = link->priv;
315
 
316
        DEBUG(0, "3c574_detach(0x%p)\n", link);
317
 
318
        if (link->dev_node)
319
                unregister_netdev(dev);
320
 
321
        tc574_release(link);
322
 
323
        free_netdev(dev);
324
} /* tc574_detach */
325
 
326
/*
327
        tc574_config() is scheduled to run after a CARD_INSERTION event
328
        is received, to configure the PCMCIA socket, and to make the
329
        ethernet device available to the system.
330
*/
331
 
332
#define CS_CHECK(fn, ret) \
333
  do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
334
 
335
static const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
336
 
337
static int tc574_config(struct pcmcia_device *link)
338
{
339
        struct net_device *dev = link->priv;
340
        struct el3_private *lp = netdev_priv(dev);
341
        tuple_t tuple;
342
        __le16 buf[32];
343
        int last_fn, last_ret, i, j;
344
        kio_addr_t ioaddr;
345
        __be16 *phys_addr;
346
        char *cardname;
347
        __u32 config;
348
        DECLARE_MAC_BUF(mac);
349
 
350
        phys_addr = (__be16 *)dev->dev_addr;
351
 
352
        DEBUG(0, "3c574_config(0x%p)\n", link);
353
 
354
        link->io.IOAddrLines = 16;
355
        for (i = j = 0; j < 0x400; j += 0x20) {
356
                link->io.BasePort1 = j ^ 0x300;
357
                i = pcmcia_request_io(link, &link->io);
358
                if (i == CS_SUCCESS) break;
359
        }
360
        if (i != CS_SUCCESS) {
361
                cs_error(link, RequestIO, i);
362
                goto failed;
363
        }
364
        CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
365
        CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
366
 
367
        dev->irq = link->irq.AssignedIRQ;
368
        dev->base_addr = link->io.BasePort1;
369
 
370
        ioaddr = dev->base_addr;
371
 
372
        /* The 3c574 normally uses an EEPROM for configuration info, including
373
           the hardware address.  The future products may include a modem chip
374
           and put the address in the CIS. */
375
        tuple.Attributes = 0;
376
        tuple.TupleData = (cisdata_t *)buf;
377
        tuple.TupleDataMax = 64;
378
        tuple.TupleOffset = 0;
379
        tuple.DesiredTuple = 0x88;
380
        if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {
381
                pcmcia_get_tuple_data(link, &tuple);
382
                for (i = 0; i < 3; i++)
383
                        phys_addr[i] = htons(le16_to_cpu(buf[i]));
384
        } else {
385
                EL3WINDOW(0);
386
                for (i = 0; i < 3; i++)
387
                        phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
388
                if (phys_addr[0] == htons(0x6060)) {
389
                        printk(KERN_NOTICE "3c574_cs: IO port conflict at 0x%03lx"
390
                                   "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
391
                        goto failed;
392
                }
393
        }
394
        if (link->prod_id[1])
395
                cardname = link->prod_id[1];
396
        else
397
                cardname = "3Com 3c574";
398
 
399
        {
400
                u_char mcr;
401
                outw(2<<11, ioaddr + RunnerRdCtrl);
402
                mcr = inb(ioaddr + 2);
403
                outw(0<<11, ioaddr + RunnerRdCtrl);
404
                printk(KERN_INFO "  ASIC rev %d,", mcr>>3);
405
                EL3WINDOW(3);
406
                config = inl(ioaddr + Wn3_Config);
407
                lp->default_media = (config & Xcvr) >> Xcvr_shift;
408
                lp->autoselect = config & Autoselect ? 1 : 0;
409
        }
410
 
411
        init_timer(&lp->media);
412
 
413
        {
414
                int phy;
415
 
416
                /* Roadrunner only: Turn on the MII transceiver */
417
                outw(0x8040, ioaddr + Wn3_Options);
418
                mdelay(1);
419
                outw(0xc040, ioaddr + Wn3_Options);
420
                tc574_wait_for_completion(dev, TxReset);
421
                tc574_wait_for_completion(dev, RxReset);
422
                mdelay(1);
423
                outw(0x8040, ioaddr + Wn3_Options);
424
 
425
                EL3WINDOW(4);
426
                for (phy = 1; phy <= 32; phy++) {
427
                        int mii_status;
428
                        mdio_sync(ioaddr, 32);
429
                        mii_status = mdio_read(ioaddr, phy & 0x1f, 1);
430
                        if (mii_status != 0xffff) {
431
                                lp->phys = phy & 0x1f;
432
                                DEBUG(0, "  MII transceiver at index %d, status %x.\n",
433
                                          phy, mii_status);
434
                                if ((mii_status & 0x0040) == 0)
435
                                        mii_preamble_required = 1;
436
                                break;
437
                        }
438
                }
439
                if (phy > 32) {
440
                        printk(KERN_NOTICE "  No MII transceivers found!\n");
441
                        goto failed;
442
                }
443
                i = mdio_read(ioaddr, lp->phys, 16) | 0x40;
444
                mdio_write(ioaddr, lp->phys, 16, i);
445
                lp->advertising = mdio_read(ioaddr, lp->phys, 4);
446
                if (full_duplex) {
447
                        /* Only advertise the FD media types. */
448
                        lp->advertising &= ~0x02a0;
449
                        mdio_write(ioaddr, lp->phys, 4, lp->advertising);
450
                }
451
        }
452
 
453
        link->dev_node = &lp->node;
454
        SET_NETDEV_DEV(dev, &handle_to_dev(link));
455
 
456
        if (register_netdev(dev) != 0) {
457
                printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n");
458
                link->dev_node = NULL;
459
                goto failed;
460
        }
461
 
462
        strcpy(lp->node.dev_name, dev->name);
463
 
464
        printk(KERN_INFO "%s: %s at io %#3lx, irq %d, "
465
               "hw_addr %s.\n",
466
               dev->name, cardname, dev->base_addr, dev->irq,
467
               print_mac(mac, dev->dev_addr));
468
        printk(" %dK FIFO split %s Rx:Tx, %sMII interface.\n",
469
                   8 << config & Ram_size,
470
                   ram_split[(config & Ram_split) >> Ram_split_shift],
471
                   config & Autoselect ? "autoselect " : "");
472
 
473
        return 0;
474
 
475
cs_failed:
476
        cs_error(link, last_fn, last_ret);
477
failed:
478
        tc574_release(link);
479
        return -ENODEV;
480
 
481
} /* tc574_config */
482
 
483
/*
484
        After a card is removed, tc574_release() will unregister the net
485
        device, and release the PCMCIA configuration.  If the device is
486
        still open, this will be postponed until it is closed.
487
*/
488
 
489
static void tc574_release(struct pcmcia_device *link)
490
{
491
        pcmcia_disable_device(link);
492
}
493
 
494
static int tc574_suspend(struct pcmcia_device *link)
495
{
496
        struct net_device *dev = link->priv;
497
 
498
        if (link->open)
499
                netif_device_detach(dev);
500
 
501
        return 0;
502
}
503
 
504
static int tc574_resume(struct pcmcia_device *link)
505
{
506
        struct net_device *dev = link->priv;
507
 
508
        if (link->open) {
509
                tc574_reset(dev);
510
                netif_device_attach(dev);
511
        }
512
 
513
        return 0;
514
}
515
 
516
static void dump_status(struct net_device *dev)
517
{
518
        kio_addr_t ioaddr = dev->base_addr;
519
        EL3WINDOW(1);
520
        printk(KERN_INFO "  irq status %04x, rx status %04x, tx status "
521
                   "%02x, tx free %04x\n", inw(ioaddr+EL3_STATUS),
522
                   inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
523
                   inw(ioaddr+TxFree));
524
        EL3WINDOW(4);
525
        printk(KERN_INFO "  diagnostics: fifo %04x net %04x ethernet %04x"
526
                   " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
527
                   inw(ioaddr+0x08), inw(ioaddr+0x0a));
528
        EL3WINDOW(1);
529
}
530
 
531
/*
532
  Use this for commands that may take time to finish
533
*/
534
static void tc574_wait_for_completion(struct net_device *dev, int cmd)
535
{
536
        int i = 1500;
537
        outw(cmd, dev->base_addr + EL3_CMD);
538
        while (--i > 0)
539
                if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
540
        if (i == 0)
541
                printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n", dev->name, cmd);
542
}
543
 
544
/* Read a word from the EEPROM using the regular EEPROM access register.
545
   Assume that we are in register window zero.
546
 */
547
static unsigned short read_eeprom(kio_addr_t ioaddr, int index)
548
{
549
        int timer;
550
        outw(EEPROM_Read + index, ioaddr + Wn0EepromCmd);
551
        /* Pause for at least 162 usec for the read to take place. */
552
        for (timer = 1620; timer >= 0; timer--) {
553
                if ((inw(ioaddr + Wn0EepromCmd) & 0x8000) == 0)
554
                        break;
555
        }
556
        return inw(ioaddr + Wn0EepromData);
557
}
558
 
559
/* MII transceiver control section.
560
   Read and write the MII registers using software-generated serial
561
   MDIO protocol.  See the MII specifications or DP83840A data sheet
562
   for details.
563
   The maxium data clock rate is 2.5 Mhz.  The timing is easily met by the
564
   slow PC card interface. */
565
 
566
#define MDIO_SHIFT_CLK  0x01
567
#define MDIO_DIR_WRITE  0x04
568
#define MDIO_DATA_WRITE0 (0x00 | MDIO_DIR_WRITE)
569
#define MDIO_DATA_WRITE1 (0x02 | MDIO_DIR_WRITE)
570
#define MDIO_DATA_READ  0x02
571
#define MDIO_ENB_IN             0x00
572
 
573
/* Generate the preamble required for initial synchronization and
574
   a few older transceivers. */
575
static void mdio_sync(kio_addr_t ioaddr, int bits)
576
{
577
        kio_addr_t mdio_addr = ioaddr + Wn4_PhysicalMgmt;
578
 
579
        /* Establish sync by sending at least 32 logic ones. */
580
        while (-- bits >= 0) {
581
                outw(MDIO_DATA_WRITE1, mdio_addr);
582
                outw(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
583
        }
584
}
585
 
586
static int mdio_read(kio_addr_t ioaddr, int phy_id, int location)
587
{
588
        int i;
589
        int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
590
        unsigned int retval = 0;
591
        kio_addr_t mdio_addr = ioaddr + Wn4_PhysicalMgmt;
592
 
593
        if (mii_preamble_required)
594
                mdio_sync(ioaddr, 32);
595
 
596
        /* Shift the read command bits out. */
597
        for (i = 14; i >= 0; i--) {
598
                int dataval = (read_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
599
                outw(dataval, mdio_addr);
600
                outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
601
        }
602
        /* Read the two transition, 16 data, and wire-idle bits. */
603
        for (i = 19; i > 0; i--) {
604
                outw(MDIO_ENB_IN, mdio_addr);
605
                retval = (retval << 1) | ((inw(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
606
                outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
607
        }
608
        return (retval>>1) & 0xffff;
609
}
610
 
611
static void mdio_write(kio_addr_t ioaddr, int phy_id, int location, int value)
612
{
613
        int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value;
614
        kio_addr_t mdio_addr = ioaddr + Wn4_PhysicalMgmt;
615
        int i;
616
 
617
        if (mii_preamble_required)
618
                mdio_sync(ioaddr, 32);
619
 
620
        /* Shift the command bits out. */
621
        for (i = 31; i >= 0; i--) {
622
                int dataval = (write_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
623
                outw(dataval, mdio_addr);
624
                outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
625
        }
626
        /* Leave the interface idle. */
627
        for (i = 1; i >= 0; i--) {
628
                outw(MDIO_ENB_IN, mdio_addr);
629
                outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
630
        }
631
 
632
        return;
633
}
634
 
635
/* Reset and restore all of the 3c574 registers. */
636
static void tc574_reset(struct net_device *dev)
637
{
638
        struct el3_private *lp = netdev_priv(dev);
639
        int i;
640
        kio_addr_t ioaddr = dev->base_addr;
641
        unsigned long flags;
642
 
643
        tc574_wait_for_completion(dev, TotalReset|0x10);
644
 
645
        spin_lock_irqsave(&lp->window_lock, flags);
646
        /* Clear any transactions in progress. */
647
        outw(0, ioaddr + RunnerWrCtrl);
648
        outw(0, ioaddr + RunnerRdCtrl);
649
 
650
        /* Set the station address and mask. */
651
        EL3WINDOW(2);
652
        for (i = 0; i < 6; i++)
653
                outb(dev->dev_addr[i], ioaddr + i);
654
        for (; i < 12; i+=2)
655
                outw(0, ioaddr + i);
656
 
657
        /* Reset config options */
658
        EL3WINDOW(3);
659
        outb((dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
660
        outl((lp->autoselect ? 0x01000000 : 0) | 0x0062001b,
661
                 ioaddr + Wn3_Config);
662
        /* Roadrunner only: Turn on the MII transceiver. */
663
        outw(0x8040, ioaddr + Wn3_Options);
664
        mdelay(1);
665
        outw(0xc040, ioaddr + Wn3_Options);
666
        EL3WINDOW(1);
667
        spin_unlock_irqrestore(&lp->window_lock, flags);
668
 
669
        tc574_wait_for_completion(dev, TxReset);
670
        tc574_wait_for_completion(dev, RxReset);
671
        mdelay(1);
672
        spin_lock_irqsave(&lp->window_lock, flags);
673
        EL3WINDOW(3);
674
        outw(0x8040, ioaddr + Wn3_Options);
675
 
676
        /* Switch to the stats window, and clear all stats by reading. */
677
        outw(StatsDisable, ioaddr + EL3_CMD);
678
        EL3WINDOW(6);
679
        for (i = 0; i < 10; i++)
680
                inb(ioaddr + i);
681
        inw(ioaddr + 10);
682
        inw(ioaddr + 12);
683
        EL3WINDOW(4);
684
        inb(ioaddr + 12);
685
        inb(ioaddr + 13);
686
 
687
        /* .. enable any extra statistics bits.. */
688
        outw(0x0040, ioaddr + Wn4_NetDiag);
689
 
690
        EL3WINDOW(1);
691
        spin_unlock_irqrestore(&lp->window_lock, flags);
692
 
693
        /* .. re-sync MII and re-fill what NWay is advertising. */
694
        mdio_sync(ioaddr, 32);
695
        mdio_write(ioaddr, lp->phys, 4, lp->advertising);
696
        if (!auto_polarity) {
697
                /* works for TDK 78Q2120 series MII's */
698
                int i = mdio_read(ioaddr, lp->phys, 16) | 0x20;
699
                mdio_write(ioaddr, lp->phys, 16, i);
700
        }
701
 
702
        spin_lock_irqsave(&lp->window_lock, flags);
703
        /* Switch to register set 1 for normal use, just for TxFree. */
704
        set_rx_mode(dev);
705
        spin_unlock_irqrestore(&lp->window_lock, flags);
706
        outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
707
        outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
708
        outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
709
        /* Allow status bits to be seen. */
710
        outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
711
        /* Ack all pending events, and set active indicator mask. */
712
        outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
713
                 ioaddr + EL3_CMD);
714
        outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
715
                 | AdapterFailure | RxEarly, ioaddr + EL3_CMD);
716
}
717
 
718
static int el3_open(struct net_device *dev)
719
{
720
        struct el3_private *lp = netdev_priv(dev);
721
        struct pcmcia_device *link = lp->p_dev;
722
 
723
        if (!pcmcia_dev_present(link))
724
                return -ENODEV;
725
 
726
        link->open++;
727
        netif_start_queue(dev);
728
 
729
        tc574_reset(dev);
730
        lp->media.function = &media_check;
731
        lp->media.data = (unsigned long) dev;
732
        lp->media.expires = jiffies + HZ;
733
        add_timer(&lp->media);
734
 
735
        DEBUG(2, "%s: opened, status %4.4x.\n",
736
                  dev->name, inw(dev->base_addr + EL3_STATUS));
737
 
738
        return 0;
739
}
740
 
741
static void el3_tx_timeout(struct net_device *dev)
742
{
743
        struct el3_private *lp = netdev_priv(dev);
744
        kio_addr_t ioaddr = dev->base_addr;
745
 
746
        printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name);
747
        dump_status(dev);
748
        lp->stats.tx_errors++;
749
        dev->trans_start = jiffies;
750
        /* Issue TX_RESET and TX_START commands. */
751
        tc574_wait_for_completion(dev, TxReset);
752
        outw(TxEnable, ioaddr + EL3_CMD);
753
        netif_wake_queue(dev);
754
}
755
 
756
static void pop_tx_status(struct net_device *dev)
757
{
758
        struct el3_private *lp = netdev_priv(dev);
759
        kio_addr_t ioaddr = dev->base_addr;
760
        int i;
761
 
762
        /* Clear the Tx status stack. */
763
        for (i = 32; i > 0; i--) {
764
                u_char tx_status = inb(ioaddr + TxStatus);
765
                if (!(tx_status & 0x84))
766
                        break;
767
                /* reset transmitter on jabber error or underrun */
768
                if (tx_status & 0x30)
769
                        tc574_wait_for_completion(dev, TxReset);
770
                if (tx_status & 0x38) {
771
                        DEBUG(1, "%s: transmit error: status 0x%02x\n",
772
                                  dev->name, tx_status);
773
                        outw(TxEnable, ioaddr + EL3_CMD);
774
                        lp->stats.tx_aborted_errors++;
775
                }
776
                outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
777
        }
778
}
779
 
780
static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
781
{
782
        kio_addr_t ioaddr = dev->base_addr;
783
        struct el3_private *lp = netdev_priv(dev);
784
        unsigned long flags;
785
 
786
        DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
787
                  "status %4.4x.\n", dev->name, (long)skb->len,
788
                  inw(ioaddr + EL3_STATUS));
789
 
790
        spin_lock_irqsave(&lp->window_lock, flags);
791
        outw(skb->len, ioaddr + TX_FIFO);
792
        outw(0, ioaddr + TX_FIFO);
793
        outsl(ioaddr + TX_FIFO, skb->data, (skb->len+3)>>2);
794
 
795
        dev->trans_start = jiffies;
796
 
797
        /* TxFree appears only in Window 1, not offset 0x1c. */
798
        if (inw(ioaddr + TxFree) <= 1536) {
799
                netif_stop_queue(dev);
800
                /* Interrupt us when the FIFO has room for max-sized packet.
801
                   The threshold is in units of dwords. */
802
                outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
803
        }
804
 
805
        pop_tx_status(dev);
806
        spin_unlock_irqrestore(&lp->window_lock, flags);
807
        dev_kfree_skb(skb);
808
        return 0;
809
}
810
 
811
/* The EL3 interrupt handler. */
812
static irqreturn_t el3_interrupt(int irq, void *dev_id)
813
{
814
        struct net_device *dev = (struct net_device *) dev_id;
815
        struct el3_private *lp = netdev_priv(dev);
816
        kio_addr_t ioaddr;
817
        unsigned status;
818
        int work_budget = max_interrupt_work;
819
        int handled = 0;
820
 
821
        if (!netif_device_present(dev))
822
                return IRQ_NONE;
823
        ioaddr = dev->base_addr;
824
 
825
        DEBUG(3, "%s: interrupt, status %4.4x.\n",
826
                  dev->name, inw(ioaddr + EL3_STATUS));
827
 
828
        spin_lock(&lp->window_lock);
829
 
830
        while ((status = inw(ioaddr + EL3_STATUS)) &
831
                   (IntLatch | RxComplete | RxEarly | StatsFull)) {
832
                if (!netif_device_present(dev) ||
833
                        ((status & 0xe000) != 0x2000)) {
834
                        DEBUG(1, "%s: Interrupt from dead card\n", dev->name);
835
                        break;
836
                }
837
 
838
                handled = 1;
839
 
840
                if (status & RxComplete)
841
                        work_budget = el3_rx(dev, work_budget);
842
 
843
                if (status & TxAvailable) {
844
                        DEBUG(3, "  TX room bit was handled.\n");
845
                        /* There's room in the FIFO for a full-sized packet. */
846
                        outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
847
                        netif_wake_queue(dev);
848
                }
849
 
850
                if (status & TxComplete)
851
                        pop_tx_status(dev);
852
 
853
                if (status & (AdapterFailure | RxEarly | StatsFull)) {
854
                        /* Handle all uncommon interrupts. */
855
                        if (status & StatsFull)
856
                                update_stats(dev);
857
                        if (status & RxEarly) {
858
                                work_budget = el3_rx(dev, work_budget);
859
                                outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
860
                        }
861
                        if (status & AdapterFailure) {
862
                                u16 fifo_diag;
863
                                EL3WINDOW(4);
864
                                fifo_diag = inw(ioaddr + Wn4_FIFODiag);
865
                                EL3WINDOW(1);
866
                                printk(KERN_NOTICE "%s: adapter failure, FIFO diagnostic"
867
                                           " register %04x.\n", dev->name, fifo_diag);
868
                                if (fifo_diag & 0x0400) {
869
                                        /* Tx overrun */
870
                                        tc574_wait_for_completion(dev, TxReset);
871
                                        outw(TxEnable, ioaddr + EL3_CMD);
872
                                }
873
                                if (fifo_diag & 0x2000) {
874
                                        /* Rx underrun */
875
                                        tc574_wait_for_completion(dev, RxReset);
876
                                        set_rx_mode(dev);
877
                                        outw(RxEnable, ioaddr + EL3_CMD);
878
                                }
879
                                outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
880
                        }
881
                }
882
 
883
                if (--work_budget < 0) {
884
                        DEBUG(0, "%s: Too much work in interrupt, "
885
                                  "status %4.4x.\n", dev->name, status);
886
                        /* Clear all interrupts */
887
                        outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
888
                        break;
889
                }
890
                /* Acknowledge the IRQ. */
891
                outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
892
        }
893
 
894
        DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
895
                  dev->name, inw(ioaddr + EL3_STATUS));
896
 
897
        spin_unlock(&lp->window_lock);
898
        return IRQ_RETVAL(handled);
899
}
900
 
901
/*
902
    This timer serves two purposes: to check for missed interrupts
903
        (and as a last resort, poll the NIC for events), and to monitor
904
        the MII, reporting changes in cable status.
905
*/
906
static void media_check(unsigned long arg)
907
{
908
        struct net_device *dev = (struct net_device *) arg;
909
        struct el3_private *lp = netdev_priv(dev);
910
        kio_addr_t ioaddr = dev->base_addr;
911
        unsigned long flags;
912
        unsigned short /* cable, */ media, partner;
913
 
914
        if (!netif_device_present(dev))
915
                goto reschedule;
916
 
917
        /* Check for pending interrupt with expired latency timer: with
918
           this, we can limp along even if the interrupt is blocked */
919
        if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + Timer) == 0xff)) {
920
                if (!lp->fast_poll)
921
                        printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
922
                el3_interrupt(dev->irq, dev);
923
                lp->fast_poll = HZ;
924
        }
925
        if (lp->fast_poll) {
926
                lp->fast_poll--;
927
                lp->media.expires = jiffies + 2*HZ/100;
928
                add_timer(&lp->media);
929
                return;
930
        }
931
 
932
        spin_lock_irqsave(&lp->window_lock, flags);
933
        EL3WINDOW(4);
934
        media = mdio_read(ioaddr, lp->phys, 1);
935
        partner = mdio_read(ioaddr, lp->phys, 5);
936
        EL3WINDOW(1);
937
 
938
        if (media != lp->media_status) {
939
                if ((media ^ lp->media_status) & 0x0004)
940
                        printk(KERN_INFO "%s: %s link beat\n", dev->name,
941
                                   (lp->media_status & 0x0004) ? "lost" : "found");
942
                if ((media ^ lp->media_status) & 0x0020) {
943
                        lp->partner = 0;
944
                        if (lp->media_status & 0x0020) {
945
                                printk(KERN_INFO "%s: autonegotiation restarted\n",
946
                                           dev->name);
947
                        } else if (partner) {
948
                                partner &= lp->advertising;
949
                                lp->partner = partner;
950
                                printk(KERN_INFO "%s: autonegotiation complete: "
951
                                           "%sbaseT-%cD selected\n", dev->name,
952
                                           ((partner & 0x0180) ? "100" : "10"),
953
                                           ((partner & 0x0140) ? 'F' : 'H'));
954
                        } else {
955
                                printk(KERN_INFO "%s: link partner did not autonegotiate\n",
956
                                           dev->name);
957
                        }
958
 
959
                        EL3WINDOW(3);
960
                        outb((partner & 0x0140 ? 0x20 : 0) |
961
                                 (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
962
                        EL3WINDOW(1);
963
 
964
                }
965
                if (media & 0x0010)
966
                        printk(KERN_INFO "%s: remote fault detected\n",
967
                                   dev->name);
968
                if (media & 0x0002)
969
                        printk(KERN_INFO "%s: jabber detected\n", dev->name);
970
                lp->media_status = media;
971
        }
972
        spin_unlock_irqrestore(&lp->window_lock, flags);
973
 
974
reschedule:
975
        lp->media.expires = jiffies + HZ;
976
        add_timer(&lp->media);
977
}
978
 
979
static struct net_device_stats *el3_get_stats(struct net_device *dev)
980
{
981
        struct el3_private *lp = netdev_priv(dev);
982
 
983
        if (netif_device_present(dev)) {
984
                unsigned long flags;
985
                spin_lock_irqsave(&lp->window_lock, flags);
986
                update_stats(dev);
987
                spin_unlock_irqrestore(&lp->window_lock, flags);
988
        }
989
        return &lp->stats;
990
}
991
 
992
/*  Update statistics.
993
        Suprisingly this need not be run single-threaded, but it effectively is.
994
        The counters clear when read, so the adds must merely be atomic.
995
 */
996
static void update_stats(struct net_device *dev)
997
{
998
        struct el3_private *lp = netdev_priv(dev);
999
        kio_addr_t ioaddr = dev->base_addr;
1000
        u8 rx, tx, up;
1001
 
1002
        DEBUG(2, "%s: updating the statistics.\n", dev->name);
1003
 
1004
        if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
1005
                return;
1006
 
1007
        /* Unlike the 3c509 we need not turn off stats updates while reading. */
1008
        /* Switch to the stats window, and read everything. */
1009
        EL3WINDOW(6);
1010
        lp->stats.tx_carrier_errors             += inb(ioaddr + 0);
1011
        lp->stats.tx_heartbeat_errors           += inb(ioaddr + 1);
1012
        /* Multiple collisions. */              inb(ioaddr + 2);
1013
        lp->stats.collisions                    += inb(ioaddr + 3);
1014
        lp->stats.tx_window_errors              += inb(ioaddr + 4);
1015
        lp->stats.rx_fifo_errors                += inb(ioaddr + 5);
1016
        lp->stats.tx_packets                    += inb(ioaddr + 6);
1017
        up                                       = inb(ioaddr + 9);
1018
        lp->stats.tx_packets                    += (up&0x30) << 4;
1019
        /* Rx packets   */                         inb(ioaddr + 7);
1020
        /* Tx deferrals */                         inb(ioaddr + 8);
1021
        rx                                       = inw(ioaddr + 10);
1022
        tx                                       = inw(ioaddr + 12);
1023
 
1024
        EL3WINDOW(4);
1025
        /* BadSSD */                               inb(ioaddr + 12);
1026
        up                                       = inb(ioaddr + 13);
1027
 
1028
        lp->stats.tx_bytes                      += tx + ((up & 0xf0) << 12);
1029
 
1030
        EL3WINDOW(1);
1031
}
1032
 
1033
static int el3_rx(struct net_device *dev, int worklimit)
1034
{
1035
        struct el3_private *lp = netdev_priv(dev);
1036
        kio_addr_t ioaddr = dev->base_addr;
1037
        short rx_status;
1038
 
1039
        DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
1040
                  dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
1041
        while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
1042
                   (--worklimit >= 0)) {
1043
                if (rx_status & 0x4000) { /* Error, update stats. */
1044
                        short error = rx_status & 0x3800;
1045
                        lp->stats.rx_errors++;
1046
                        switch (error) {
1047
                        case 0x0000:    lp->stats.rx_over_errors++; break;
1048
                        case 0x0800:    lp->stats.rx_length_errors++; break;
1049
                        case 0x1000:    lp->stats.rx_frame_errors++; break;
1050
                        case 0x1800:    lp->stats.rx_length_errors++; break;
1051
                        case 0x2000:    lp->stats.rx_frame_errors++; break;
1052
                        case 0x2800:    lp->stats.rx_crc_errors++; break;
1053
                        }
1054
                } else {
1055
                        short pkt_len = rx_status & 0x7ff;
1056
                        struct sk_buff *skb;
1057
 
1058
                        skb = dev_alloc_skb(pkt_len+5);
1059
 
1060
                        DEBUG(3, "  Receiving packet size %d status %4.4x.\n",
1061
                                  pkt_len, rx_status);
1062
                        if (skb != NULL) {
1063
                                skb_reserve(skb, 2);
1064
                                insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
1065
                                                ((pkt_len+3)>>2));
1066
                                skb->protocol = eth_type_trans(skb, dev);
1067
                                netif_rx(skb);
1068
                                dev->last_rx = jiffies;
1069
                                lp->stats.rx_packets++;
1070
                                lp->stats.rx_bytes += pkt_len;
1071
                        } else {
1072
                                DEBUG(1, "%s: couldn't allocate a sk_buff of"
1073
                                          " size %d.\n", dev->name, pkt_len);
1074
                                lp->stats.rx_dropped++;
1075
                        }
1076
                }
1077
                tc574_wait_for_completion(dev, RxDiscard);
1078
        }
1079
 
1080
        return worklimit;
1081
}
1082
 
1083
static void netdev_get_drvinfo(struct net_device *dev,
1084
                               struct ethtool_drvinfo *info)
1085
{
1086
        strcpy(info->driver, "3c574_cs");
1087
}
1088
 
1089
static const struct ethtool_ops netdev_ethtool_ops = {
1090
        .get_drvinfo            = netdev_get_drvinfo,
1091
};
1092
 
1093
/* Provide ioctl() calls to examine the MII xcvr state. */
1094
static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1095
{
1096
        struct el3_private *lp = netdev_priv(dev);
1097
        kio_addr_t ioaddr = dev->base_addr;
1098
        u16 *data = (u16 *)&rq->ifr_ifru;
1099
        int phy = lp->phys & 0x1f;
1100
 
1101
        DEBUG(2, "%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
1102
                  dev->name, rq->ifr_ifrn.ifrn_name, cmd,
1103
                  data[0], data[1], data[2], data[3]);
1104
 
1105
        switch(cmd) {
1106
        case SIOCGMIIPHY:               /* Get the address of the PHY in use. */
1107
                data[0] = phy;
1108
        case SIOCGMIIREG:               /* Read the specified MII register. */
1109
                {
1110
                        int saved_window;
1111
                        unsigned long flags;
1112
 
1113
                        spin_lock_irqsave(&lp->window_lock, flags);
1114
                        saved_window = inw(ioaddr + EL3_CMD) >> 13;
1115
                        EL3WINDOW(4);
1116
                        data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f);
1117
                        EL3WINDOW(saved_window);
1118
                        spin_unlock_irqrestore(&lp->window_lock, flags);
1119
                        return 0;
1120
                }
1121
        case SIOCSMIIREG:               /* Write the specified MII register */
1122
                {
1123
                        int saved_window;
1124
                       unsigned long flags;
1125
 
1126
                        if (!capable(CAP_NET_ADMIN))
1127
                                return -EPERM;
1128
                        spin_lock_irqsave(&lp->window_lock, flags);
1129
                        saved_window = inw(ioaddr + EL3_CMD) >> 13;
1130
                        EL3WINDOW(4);
1131
                        mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]);
1132
                        EL3WINDOW(saved_window);
1133
                        spin_unlock_irqrestore(&lp->window_lock, flags);
1134
                        return 0;
1135
                }
1136
        default:
1137
                return -EOPNOTSUPP;
1138
        }
1139
}
1140
 
1141
/* The Odie chip has a 64 bin multicast filter, but the bit layout is not
1142
   documented.  Until it is we revert to receiving all multicast frames when
1143
   any multicast reception is desired.
1144
   Note: My other drivers emit a log message whenever promiscuous mode is
1145
   entered to help detect password sniffers.  This is less desirable on
1146
   typical PC card machines, so we omit the message.
1147
   */
1148
 
1149
static void set_rx_mode(struct net_device *dev)
1150
{
1151
        kio_addr_t ioaddr = dev->base_addr;
1152
 
1153
        if (dev->flags & IFF_PROMISC)
1154
                outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1155
                         ioaddr + EL3_CMD);
1156
        else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
1157
                outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
1158
        else
1159
                outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1160
}
1161
 
1162
static int el3_close(struct net_device *dev)
1163
{
1164
        kio_addr_t ioaddr = dev->base_addr;
1165
        struct el3_private *lp = netdev_priv(dev);
1166
        struct pcmcia_device *link = lp->p_dev;
1167
 
1168
        DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
1169
 
1170
        if (pcmcia_dev_present(link)) {
1171
                unsigned long flags;
1172
 
1173
                /* Turn off statistics ASAP.  We update lp->stats below. */
1174
                outw(StatsDisable, ioaddr + EL3_CMD);
1175
 
1176
                /* Disable the receiver and transmitter. */
1177
                outw(RxDisable, ioaddr + EL3_CMD);
1178
                outw(TxDisable, ioaddr + EL3_CMD);
1179
 
1180
                /* Note: Switching to window 0 may disable the IRQ. */
1181
                EL3WINDOW(0);
1182
                spin_lock_irqsave(&lp->window_lock, flags);
1183
                update_stats(dev);
1184
                spin_unlock_irqrestore(&lp->window_lock, flags);
1185
 
1186
                /* force interrupts off */
1187
                outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
1188
        }
1189
 
1190
        link->open--;
1191
        netif_stop_queue(dev);
1192
        del_timer_sync(&lp->media);
1193
 
1194
        return 0;
1195
}
1196
 
1197
static struct pcmcia_device_id tc574_ids[] = {
1198
        PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0574),
1199
        PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0556, "3CCFEM556.cis"),
1200
        PCMCIA_DEVICE_NULL,
1201
};
1202
MODULE_DEVICE_TABLE(pcmcia, tc574_ids);
1203
 
1204
static struct pcmcia_driver tc574_driver = {
1205
        .owner          = THIS_MODULE,
1206
        .drv            = {
1207
                .name   = "3c574_cs",
1208
        },
1209
        .probe          = tc574_probe,
1210
        .remove         = tc574_detach,
1211
        .id_table       = tc574_ids,
1212
        .suspend        = tc574_suspend,
1213
        .resume         = tc574_resume,
1214
};
1215
 
1216
static int __init init_tc574(void)
1217
{
1218
        return pcmcia_register_driver(&tc574_driver);
1219
}
1220
 
1221
static void __exit exit_tc574(void)
1222
{
1223
        pcmcia_unregister_driver(&tc574_driver);
1224
}
1225
 
1226
module_init(init_tc574);
1227
module_exit(exit_tc574);

powered by: WebSVN 2.1.0

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