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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*======================================================================
2
 
3
    A PCMCIA ethernet driver for Asix AX88190-based cards
4
 
5
    The Asix AX88190 is a NS8390-derived chipset with a few nasty
6
    idiosyncracies that make it very inconvenient to support with a
7
    standard 8390 driver.  This driver is based on pcnet_cs, with the
8
    tweaked 8390 code grafted on the end.  Much of what I did was to
9
    clean up and update a similar driver supplied by Asix, which was
10
    adapted by William Lee, william@asix.com.tw.
11
 
12
    Copyright (C) 2001 David A. Hinds -- dahinds@users.sourceforge.net
13
 
14
    axnet_cs.c 1.28 2002/06/29 06:27:37
15
 
16
    The network driver code is based on Donald Becker's NE2000 code:
17
 
18
    Written 1992,1993 by Donald Becker.
19
    Copyright 1993 United States Government as represented by the
20
    Director, National Security Agency.  This software may be used and
21
    distributed according to the terms of the GNU General Public License,
22
    incorporated herein by reference.
23
    Donald Becker may be reached at becker@scyld.com
24
 
25
======================================================================*/
26
 
27
#include <linux/kernel.h>
28
#include <linux/module.h>
29
#include <linux/init.h>
30
#include <linux/ptrace.h>
31
#include <linux/slab.h>
32
#include <linux/string.h>
33
#include <linux/timer.h>
34
#include <linux/delay.h>
35
#include <linux/spinlock.h>
36
#include <linux/ethtool.h>
37
#include <linux/netdevice.h>
38
#include <linux/crc32.h>
39
#include "../8390.h"
40
 
41
#include <pcmcia/cs_types.h>
42
#include <pcmcia/cs.h>
43
#include <pcmcia/cistpl.h>
44
#include <pcmcia/ciscode.h>
45
#include <pcmcia/ds.h>
46
#include <pcmcia/cisreg.h>
47
 
48
#include <asm/io.h>
49
#include <asm/system.h>
50
#include <asm/byteorder.h>
51
#include <asm/uaccess.h>
52
 
53
#define AXNET_CMD       0x00
54
#define AXNET_DATAPORT  0x10    /* NatSemi-defined port window offset. */
55
#define AXNET_RESET     0x1f    /* Issue a read to reset, a write to clear. */
56
#define AXNET_MII_EEP   0x14    /* Offset of MII access port */
57
#define AXNET_TEST      0x15    /* Offset of TEST Register port */
58
#define AXNET_GPIO      0x17    /* Offset of General Purpose Register Port */
59
 
60
#define AXNET_START_PG  0x40    /* First page of TX buffer */
61
#define AXNET_STOP_PG   0x80    /* Last page +1 of RX ring */
62
 
63
#define AXNET_RDC_TIMEOUT 0x02  /* Max wait in jiffies for Tx RDC */
64
 
65
#define IS_AX88190      0x0001
66
#define IS_AX88790      0x0002
67
 
68
/*====================================================================*/
69
 
70
/* Module parameters */
71
 
72
MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
73
MODULE_DESCRIPTION("Asix AX88190 PCMCIA ethernet driver");
74
MODULE_LICENSE("GPL");
75
 
76
#ifdef PCMCIA_DEBUG
77
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
78
 
79
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
80
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
81
static char *version =
82
"axnet_cs.c 1.28 2002/06/29 06:27:37 (David Hinds)";
83
#else
84
#define DEBUG(n, args...)
85
#endif
86
 
87
/*====================================================================*/
88
 
89
static int axnet_config(struct pcmcia_device *link);
90
static void axnet_release(struct pcmcia_device *link);
91
static int axnet_open(struct net_device *dev);
92
static int axnet_close(struct net_device *dev);
93
static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
94
static const struct ethtool_ops netdev_ethtool_ops;
95
static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
96
static void ei_watchdog(u_long arg);
97
static void axnet_reset_8390(struct net_device *dev);
98
 
99
static int mdio_read(kio_addr_t addr, int phy_id, int loc);
100
static void mdio_write(kio_addr_t addr, int phy_id, int loc, int value);
101
 
102
static void get_8390_hdr(struct net_device *,
103
                         struct e8390_pkt_hdr *, int);
104
static void block_input(struct net_device *dev, int count,
105
                        struct sk_buff *skb, int ring_offset);
106
static void block_output(struct net_device *dev, int count,
107
                         const u_char *buf, const int start_page);
108
 
109
static void axnet_detach(struct pcmcia_device *p_dev);
110
 
111
static void axdev_setup(struct net_device *dev);
112
static void AX88190_init(struct net_device *dev, int startp);
113
static int ax_open(struct net_device *dev);
114
static int ax_close(struct net_device *dev);
115
static irqreturn_t ax_interrupt(int irq, void *dev_id);
116
 
117
/*====================================================================*/
118
 
119
typedef struct axnet_dev_t {
120
        struct pcmcia_device    *p_dev;
121
    dev_node_t          node;
122
    caddr_t             base;
123
    struct timer_list   watchdog;
124
    int                 stale, fast_poll;
125
    u_short             link_status;
126
    u_char              duplex_flag;
127
    int                 phy_id;
128
    int                 flags;
129
} axnet_dev_t;
130
 
131
static inline axnet_dev_t *PRIV(struct net_device *dev)
132
{
133
        void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device);
134
        return p;
135
}
136
 
137
/*======================================================================
138
 
139
    axnet_attach() creates an "instance" of the driver, allocating
140
    local data structures for one device.  The device is registered
141
    with Card Services.
142
 
143
======================================================================*/
144
 
145
static int axnet_probe(struct pcmcia_device *link)
146
{
147
    axnet_dev_t *info;
148
    struct net_device *dev;
149
 
150
    DEBUG(0, "axnet_attach()\n");
151
 
152
    dev = alloc_netdev(sizeof(struct ei_device) + sizeof(axnet_dev_t),
153
                        "eth%d", axdev_setup);
154
 
155
    if (!dev)
156
        return -ENOMEM;
157
 
158
    info = PRIV(dev);
159
    info->p_dev = link;
160
    link->priv = dev;
161
    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
162
    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
163
    link->conf.Attributes = CONF_ENABLE_IRQ;
164
    link->conf.IntType = INT_MEMORY_AND_IO;
165
 
166
    dev->open = &axnet_open;
167
    dev->stop = &axnet_close;
168
    dev->do_ioctl = &axnet_ioctl;
169
    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
170
 
171
    return axnet_config(link);
172
} /* axnet_attach */
173
 
174
/*======================================================================
175
 
176
    This deletes a driver "instance".  The device is de-registered
177
    with Card Services.  If it has been released, all local data
178
    structures are freed.  Otherwise, the structures will be freed
179
    when the device is released.
180
 
181
======================================================================*/
182
 
183
static void axnet_detach(struct pcmcia_device *link)
184
{
185
    struct net_device *dev = link->priv;
186
 
187
    DEBUG(0, "axnet_detach(0x%p)\n", link);
188
 
189
    if (link->dev_node)
190
        unregister_netdev(dev);
191
 
192
    axnet_release(link);
193
 
194
    free_netdev(dev);
195
} /* axnet_detach */
196
 
197
/*======================================================================
198
 
199
    This probes for a card's hardware address by reading the PROM.
200
 
201
======================================================================*/
202
 
203
static int get_prom(struct pcmcia_device *link)
204
{
205
    struct net_device *dev = link->priv;
206
    kio_addr_t ioaddr = dev->base_addr;
207
    int i, j;
208
 
209
    /* This is based on drivers/net/ne.c */
210
    struct {
211
        u_char value, offset;
212
    } program_seq[] = {
213
        {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
214
        {0x01,  EN0_DCFG},      /* Set word-wide access. */
215
        {0x00,  EN0_RCNTLO},    /* Clear the count regs. */
216
        {0x00,  EN0_RCNTHI},
217
        {0x00,  EN0_IMR},       /* Mask completion irq. */
218
        {0xFF,  EN0_ISR},
219
        {E8390_RXOFF|0x40, EN0_RXCR},   /* 0x60  Set to monitor */
220
        {E8390_TXOFF, EN0_TXCR},        /* 0x02  and loopback mode. */
221
        {0x10,  EN0_RCNTLO},
222
        {0x00,  EN0_RCNTHI},
223
        {0x00,  EN0_RSARLO},    /* DMA starting at 0x0400. */
224
        {0x04,  EN0_RSARHI},
225
        {E8390_RREAD+E8390_START, E8390_CMD},
226
    };
227
 
228
    /* Not much of a test, but the alternatives are messy */
229
    if (link->conf.ConfigBase != 0x03c0)
230
        return 0;
231
 
232
    axnet_reset_8390(dev);
233
    mdelay(10);
234
 
235
    for (i = 0; i < ARRAY_SIZE(program_seq); i++)
236
        outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
237
 
238
    for (i = 0; i < 6; i += 2) {
239
        j = inw(ioaddr + AXNET_DATAPORT);
240
        dev->dev_addr[i] = j & 0xff;
241
        dev->dev_addr[i+1] = j >> 8;
242
    }
243
    return 1;
244
} /* get_prom */
245
 
246
/*======================================================================
247
 
248
    axnet_config() is scheduled to run after a CARD_INSERTION event
249
    is received, to configure the PCMCIA socket, and to make the
250
    ethernet device available to the system.
251
 
252
======================================================================*/
253
 
254
#define CS_CHECK(fn, ret) \
255
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
256
 
257
static int try_io_port(struct pcmcia_device *link)
258
{
259
    int j, ret;
260
    if (link->io.NumPorts1 == 32) {
261
        link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
262
        if (link->io.NumPorts2 > 0) {
263
            /* for master/slave multifunction cards */
264
            link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
265
            link->irq.Attributes =
266
                IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
267
        }
268
    } else {
269
        /* This should be two 16-port windows */
270
        link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
271
        link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
272
    }
273
    if (link->io.BasePort1 == 0) {
274
        link->io.IOAddrLines = 16;
275
        for (j = 0; j < 0x400; j += 0x20) {
276
            link->io.BasePort1 = j ^ 0x300;
277
            link->io.BasePort2 = (j ^ 0x300) + 0x10;
278
            ret = pcmcia_request_io(link, &link->io);
279
            if (ret == CS_SUCCESS) return ret;
280
        }
281
        return ret;
282
    } else {
283
        return pcmcia_request_io(link, &link->io);
284
    }
285
}
286
 
287
static int axnet_config(struct pcmcia_device *link)
288
{
289
    struct net_device *dev = link->priv;
290
    axnet_dev_t *info = PRIV(dev);
291
    tuple_t tuple;
292
    cisparse_t parse;
293
    int i, j, last_ret, last_fn;
294
    u_short buf[64];
295
    DECLARE_MAC_BUF(mac);
296
 
297
    DEBUG(0, "axnet_config(0x%p)\n", link);
298
 
299
    tuple.Attributes = 0;
300
    tuple.TupleData = (cisdata_t *)buf;
301
    tuple.TupleDataMax = sizeof(buf);
302
    tuple.TupleOffset = 0;
303
 
304
    /* don't trust the CIS on this; Linksys got it wrong */
305
    link->conf.Present = 0x63;
306
 
307
    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
308
    tuple.Attributes = 0;
309
    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
310
    while (last_ret == CS_SUCCESS) {
311
        cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
312
        cistpl_io_t *io = &(parse.cftable_entry.io);
313
 
314
        if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
315
                pcmcia_parse_tuple(link, &tuple, &parse) != 0 ||
316
                cfg->index == 0 || cfg->io.nwin == 0)
317
            goto next_entry;
318
 
319
        link->conf.ConfigIndex = 0x05;
320
        /* For multifunction cards, by convention, we configure the
321
           network function with window 0, and serial with window 1 */
322
        if (io->nwin > 1) {
323
            i = (io->win[1].len > io->win[0].len);
324
            link->io.BasePort2 = io->win[1-i].base;
325
            link->io.NumPorts2 = io->win[1-i].len;
326
        } else {
327
            i = link->io.NumPorts2 = 0;
328
        }
329
        link->io.BasePort1 = io->win[i].base;
330
        link->io.NumPorts1 = io->win[i].len;
331
        link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
332
        if (link->io.NumPorts1 + link->io.NumPorts2 >= 32) {
333
            last_ret = try_io_port(link);
334
            if (last_ret == CS_SUCCESS) break;
335
        }
336
    next_entry:
337
        last_ret = pcmcia_get_next_tuple(link, &tuple);
338
    }
339
    if (last_ret != CS_SUCCESS) {
340
        cs_error(link, RequestIO, last_ret);
341
        goto failed;
342
    }
343
 
344
    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
345
 
346
    if (link->io.NumPorts2 == 8) {
347
        link->conf.Attributes |= CONF_ENABLE_SPKR;
348
        link->conf.Status = CCSR_AUDIO_ENA;
349
    }
350
 
351
    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
352
    dev->irq = link->irq.AssignedIRQ;
353
    dev->base_addr = link->io.BasePort1;
354
 
355
    if (!get_prom(link)) {
356
        printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
357
        printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n");
358
        goto failed;
359
    }
360
 
361
    ei_status.name = "AX88190";
362
    ei_status.word16 = 1;
363
    ei_status.tx_start_page = AXNET_START_PG;
364
    ei_status.rx_start_page = AXNET_START_PG + TX_PAGES;
365
    ei_status.stop_page = AXNET_STOP_PG;
366
    ei_status.reset_8390 = &axnet_reset_8390;
367
    ei_status.get_8390_hdr = &get_8390_hdr;
368
    ei_status.block_input = &block_input;
369
    ei_status.block_output = &block_output;
370
 
371
    if (inb(dev->base_addr + AXNET_TEST) != 0)
372
        info->flags |= IS_AX88790;
373
    else
374
        info->flags |= IS_AX88190;
375
 
376
    if (info->flags & IS_AX88790)
377
        outb(0x10, dev->base_addr + AXNET_GPIO);  /* select Internal PHY */
378
 
379
    for (i = 0; i < 32; i++) {
380
        j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
381
        if ((j != 0) && (j != 0xffff)) break;
382
    }
383
 
384
    /* Maybe PHY is in power down mode. (PPD_SET = 1)
385
       Bit 2 of CCSR is active low. */
386
    if (i == 32) {
387
        conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
388
        pcmcia_access_configuration_register(link, &reg);
389
        for (i = 0; i < 32; i++) {
390
            j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
391
            if ((j != 0) && (j != 0xffff)) break;
392
        }
393
    }
394
 
395
    info->phy_id = (i < 32) ? i : -1;
396
    link->dev_node = &info->node;
397
    SET_NETDEV_DEV(dev, &handle_to_dev(link));
398
 
399
    if (register_netdev(dev) != 0) {
400
        printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
401
        link->dev_node = NULL;
402
        goto failed;
403
    }
404
 
405
    strcpy(info->node.dev_name, dev->name);
406
 
407
    printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, "
408
           "hw_addr %s\n",
409
           dev->name, ((info->flags & IS_AX88790) ? 7 : 1),
410
           dev->base_addr, dev->irq,
411
           print_mac(mac, dev->dev_addr));
412
    if (info->phy_id != -1) {
413
        DEBUG(0, "  MII transceiver at index %d, status %x.\n", info->phy_id, j);
414
    } else {
415
        printk(KERN_NOTICE "  No MII transceivers found!\n");
416
    }
417
    return 0;
418
 
419
cs_failed:
420
    cs_error(link, last_fn, last_ret);
421
failed:
422
    axnet_release(link);
423
    return -ENODEV;
424
} /* axnet_config */
425
 
426
/*======================================================================
427
 
428
    After a card is removed, axnet_release() will unregister the net
429
    device, and release the PCMCIA configuration.  If the device is
430
    still open, this will be postponed until it is closed.
431
 
432
======================================================================*/
433
 
434
static void axnet_release(struct pcmcia_device *link)
435
{
436
        pcmcia_disable_device(link);
437
}
438
 
439
static int axnet_suspend(struct pcmcia_device *link)
440
{
441
        struct net_device *dev = link->priv;
442
 
443
        if (link->open)
444
                netif_device_detach(dev);
445
 
446
        return 0;
447
}
448
 
449
static int axnet_resume(struct pcmcia_device *link)
450
{
451
        struct net_device *dev = link->priv;
452
 
453
        if (link->open) {
454
                axnet_reset_8390(dev);
455
                AX88190_init(dev, 1);
456
                netif_device_attach(dev);
457
        }
458
 
459
        return 0;
460
}
461
 
462
 
463
/*======================================================================
464
 
465
    MII interface support
466
 
467
======================================================================*/
468
 
469
#define MDIO_SHIFT_CLK          0x01
470
#define MDIO_DATA_WRITE0        0x00
471
#define MDIO_DATA_WRITE1        0x08
472
#define MDIO_DATA_READ          0x04
473
#define MDIO_MASK               0x0f
474
#define MDIO_ENB_IN             0x02
475
 
476
static void mdio_sync(kio_addr_t addr)
477
{
478
    int bits;
479
    for (bits = 0; bits < 32; bits++) {
480
        outb_p(MDIO_DATA_WRITE1, addr);
481
        outb_p(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
482
    }
483
}
484
 
485
static int mdio_read(kio_addr_t addr, int phy_id, int loc)
486
{
487
    u_int cmd = (0xf6<<10)|(phy_id<<5)|loc;
488
    int i, retval = 0;
489
 
490
    mdio_sync(addr);
491
    for (i = 14; i >= 0; i--) {
492
        int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
493
        outb_p(dat, addr);
494
        outb_p(dat | MDIO_SHIFT_CLK, addr);
495
    }
496
    for (i = 19; i > 0; i--) {
497
        outb_p(MDIO_ENB_IN, addr);
498
        retval = (retval << 1) | ((inb_p(addr) & MDIO_DATA_READ) != 0);
499
        outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
500
    }
501
    return (retval>>1) & 0xffff;
502
}
503
 
504
static void mdio_write(kio_addr_t addr, int phy_id, int loc, int value)
505
{
506
    u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
507
    int i;
508
 
509
    mdio_sync(addr);
510
    for (i = 31; i >= 0; i--) {
511
        int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
512
        outb_p(dat, addr);
513
        outb_p(dat | MDIO_SHIFT_CLK, addr);
514
    }
515
    for (i = 1; i >= 0; i--) {
516
        outb_p(MDIO_ENB_IN, addr);
517
        outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
518
    }
519
}
520
 
521
/*====================================================================*/
522
 
523
static int axnet_open(struct net_device *dev)
524
{
525
    int ret;
526
    axnet_dev_t *info = PRIV(dev);
527
    struct pcmcia_device *link = info->p_dev;
528
 
529
    DEBUG(2, "axnet_open('%s')\n", dev->name);
530
 
531
    if (!pcmcia_dev_present(link))
532
        return -ENODEV;
533
 
534
    ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
535
    if (ret)
536
            return ret;
537
 
538
    link->open++;
539
 
540
    info->link_status = 0x00;
541
    init_timer(&info->watchdog);
542
    info->watchdog.function = &ei_watchdog;
543
    info->watchdog.data = (u_long)dev;
544
    info->watchdog.expires = jiffies + HZ;
545
    add_timer(&info->watchdog);
546
 
547
    return ax_open(dev);
548
} /* axnet_open */
549
 
550
/*====================================================================*/
551
 
552
static int axnet_close(struct net_device *dev)
553
{
554
    axnet_dev_t *info = PRIV(dev);
555
    struct pcmcia_device *link = info->p_dev;
556
 
557
    DEBUG(2, "axnet_close('%s')\n", dev->name);
558
 
559
    ax_close(dev);
560
    free_irq(dev->irq, dev);
561
 
562
    link->open--;
563
    netif_stop_queue(dev);
564
    del_timer_sync(&info->watchdog);
565
 
566
    return 0;
567
} /* axnet_close */
568
 
569
/*======================================================================
570
 
571
    Hard reset the card.  This used to pause for the same period that
572
    a 8390 reset command required, but that shouldn't be necessary.
573
 
574
======================================================================*/
575
 
576
static void axnet_reset_8390(struct net_device *dev)
577
{
578
    kio_addr_t nic_base = dev->base_addr;
579
    int i;
580
 
581
    ei_status.txing = ei_status.dmaing = 0;
582
 
583
    outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD);
584
 
585
    outb(inb(nic_base + AXNET_RESET), nic_base + AXNET_RESET);
586
 
587
    for (i = 0; i < 100; i++) {
588
        if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0)
589
            break;
590
        udelay(100);
591
    }
592
    outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
593
 
594
    if (i == 100)
595
        printk(KERN_ERR "%s: axnet_reset_8390() did not complete.\n",
596
               dev->name);
597
 
598
} /* axnet_reset_8390 */
599
 
600
/*====================================================================*/
601
 
602
static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
603
{
604
    struct net_device *dev = dev_id;
605
    PRIV(dev)->stale = 0;
606
    return ax_interrupt(irq, dev_id);
607
}
608
 
609
static void ei_watchdog(u_long arg)
610
{
611
    struct net_device *dev = (struct net_device *)(arg);
612
    axnet_dev_t *info = PRIV(dev);
613
    kio_addr_t nic_base = dev->base_addr;
614
    kio_addr_t mii_addr = nic_base + AXNET_MII_EEP;
615
    u_short link;
616
 
617
    if (!netif_device_present(dev)) goto reschedule;
618
 
619
    /* Check for pending interrupt with expired latency timer: with
620
       this, we can limp along even if the interrupt is blocked */
621
    if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
622
        if (!info->fast_poll)
623
            printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
624
        ei_irq_wrapper(dev->irq, dev);
625
        info->fast_poll = HZ;
626
    }
627
    if (info->fast_poll) {
628
        info->fast_poll--;
629
        info->watchdog.expires = jiffies + 1;
630
        add_timer(&info->watchdog);
631
        return;
632
    }
633
 
634
    if (info->phy_id < 0)
635
        goto reschedule;
636
    link = mdio_read(mii_addr, info->phy_id, 1);
637
    if (!link || (link == 0xffff)) {
638
        printk(KERN_INFO "%s: MII is missing!\n", dev->name);
639
        info->phy_id = -1;
640
        goto reschedule;
641
    }
642
 
643
    link &= 0x0004;
644
    if (link != info->link_status) {
645
        u_short p = mdio_read(mii_addr, info->phy_id, 5);
646
        printk(KERN_INFO "%s: %s link beat\n", dev->name,
647
               (link) ? "found" : "lost");
648
        if (link) {
649
            info->duplex_flag = (p & 0x0140) ? 0x80 : 0x00;
650
            if (p)
651
                printk(KERN_INFO "%s: autonegotiation complete: "
652
                       "%sbaseT-%cD selected\n", dev->name,
653
                       ((p & 0x0180) ? "100" : "10"),
654
                       ((p & 0x0140) ? 'F' : 'H'));
655
            else
656
                printk(KERN_INFO "%s: link partner did not autonegotiate\n",
657
                       dev->name);
658
            AX88190_init(dev, 1);
659
        }
660
        info->link_status = link;
661
    }
662
 
663
reschedule:
664
    info->watchdog.expires = jiffies + HZ;
665
    add_timer(&info->watchdog);
666
}
667
 
668
static void netdev_get_drvinfo(struct net_device *dev,
669
                               struct ethtool_drvinfo *info)
670
{
671
        strcpy(info->driver, "axnet_cs");
672
}
673
 
674
static const struct ethtool_ops netdev_ethtool_ops = {
675
        .get_drvinfo            = netdev_get_drvinfo,
676
};
677
 
678
/*====================================================================*/
679
 
680
static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
681
{
682
    axnet_dev_t *info = PRIV(dev);
683
    u16 *data = (u16 *)&rq->ifr_ifru;
684
    kio_addr_t mii_addr = dev->base_addr + AXNET_MII_EEP;
685
    switch (cmd) {
686
    case SIOCGMIIPHY:
687
        data[0] = info->phy_id;
688
    case SIOCGMIIREG:           /* Read MII PHY register. */
689
        data[3] = mdio_read(mii_addr, data[0], data[1] & 0x1f);
690
        return 0;
691
    case SIOCSMIIREG:           /* Write MII PHY register. */
692
        if (!capable(CAP_NET_ADMIN))
693
            return -EPERM;
694
        mdio_write(mii_addr, data[0], data[1] & 0x1f, data[2]);
695
        return 0;
696
    }
697
    return -EOPNOTSUPP;
698
}
699
 
700
/*====================================================================*/
701
 
702
static void get_8390_hdr(struct net_device *dev,
703
                         struct e8390_pkt_hdr *hdr,
704
                         int ring_page)
705
{
706
    kio_addr_t nic_base = dev->base_addr;
707
 
708
    outb_p(0, nic_base + EN0_RSARLO);            /* On page boundary */
709
    outb_p(ring_page, nic_base + EN0_RSARHI);
710
    outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
711
 
712
    insw(nic_base + AXNET_DATAPORT, hdr,
713
            sizeof(struct e8390_pkt_hdr)>>1);
714
    /* Fix for big endian systems */
715
    hdr->count = le16_to_cpu(hdr->count);
716
 
717
}
718
 
719
/*====================================================================*/
720
 
721
static void block_input(struct net_device *dev, int count,
722
                        struct sk_buff *skb, int ring_offset)
723
{
724
    kio_addr_t nic_base = dev->base_addr;
725
    int xfer_count = count;
726
    char *buf = skb->data;
727
 
728
#ifdef PCMCIA_DEBUG
729
    if ((ei_debug > 4) && (count != 4))
730
        printk(KERN_DEBUG "%s: [bi=%d]\n", dev->name, count+4);
731
#endif
732
    outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
733
    outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
734
    outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
735
 
736
    insw(nic_base + AXNET_DATAPORT,buf,count>>1);
737
    if (count & 0x01)
738
        buf[count-1] = inb(nic_base + AXNET_DATAPORT), xfer_count++;
739
 
740
}
741
 
742
/*====================================================================*/
743
 
744
static void block_output(struct net_device *dev, int count,
745
                         const u_char *buf, const int start_page)
746
{
747
    kio_addr_t nic_base = dev->base_addr;
748
 
749
#ifdef PCMCIA_DEBUG
750
    if (ei_debug > 4)
751
        printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
752
#endif
753
 
754
    /* Round the count up for word writes.  Do we need to do this?
755
       What effect will an odd byte count have on the 8390?
756
       I should check someday. */
757
    if (count & 0x01)
758
        count++;
759
 
760
    outb_p(0x00, nic_base + EN0_RSARLO);
761
    outb_p(start_page, nic_base + EN0_RSARHI);
762
    outb_p(E8390_RWRITE+E8390_START, nic_base + AXNET_CMD);
763
    outsw(nic_base + AXNET_DATAPORT, buf, count>>1);
764
}
765
 
766
static struct pcmcia_device_id axnet_ids[] = {
767
        PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081),
768
        PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301),
769
        PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0301),
770
        PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0303),
771
        PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309),
772
        PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106),
773
        PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab),
774
        PCMCIA_DEVICE_MANF_CARD(0x021b, 0x0202),
775
        PCMCIA_DEVICE_MANF_CARD(0xffff, 0x1090),
776
        PCMCIA_DEVICE_PROD_ID12("AmbiCom,Inc.", "Fast Ethernet PC Card(AMB8110)", 0x49b020a7, 0x119cc9fc),
777
        PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef),
778
        PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef),
779
        PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1),
780
        PCMCIA_DEVICE_PROD_ID12("CHEETAH ETHERCARD", "EN2228", 0x00fa7bc8, 0x00e990cc),
781
        PCMCIA_DEVICE_PROD_ID12("CNet", "CNF301", 0xbc477dde, 0x78c5f40b),
782
        PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEther PCC-TXD", 0x5261440f, 0x436768c5),
783
        PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEtherII PCC-TXD", 0x5261440f, 0x730df72e),
784
        PCMCIA_DEVICE_PROD_ID12("Dynalink", "L100C16", 0x55632fd5, 0x66bc2a90),
785
        PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V3)", 0x0733cc81, 0x232019a8),
786
        PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC3-TX", 0x481e0094, 0xf91af609),
787
        PCMCIA_DEVICE_PROD_ID12("PCMCIA", "100BASE", 0x281f1c5d, 0x7c2add04),
788
        PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEtherCard", 0x281f1c5d, 0x7ef26116),
789
        PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FEP501", 0x281f1c5d, 0x2e272058),
790
        PCMCIA_DEVICE_PROD_ID14("Network Everywhere", "AX88190", 0x820a67b6,  0xab9be5ef),
791
        PCMCIA_DEVICE_NULL,
792
};
793
MODULE_DEVICE_TABLE(pcmcia, axnet_ids);
794
 
795
static struct pcmcia_driver axnet_cs_driver = {
796
        .owner          = THIS_MODULE,
797
        .drv            = {
798
                .name   = "axnet_cs",
799
        },
800
        .probe          = axnet_probe,
801
        .remove         = axnet_detach,
802
        .id_table       = axnet_ids,
803
        .suspend        = axnet_suspend,
804
        .resume         = axnet_resume,
805
};
806
 
807
static int __init init_axnet_cs(void)
808
{
809
        return pcmcia_register_driver(&axnet_cs_driver);
810
}
811
 
812
static void __exit exit_axnet_cs(void)
813
{
814
        pcmcia_unregister_driver(&axnet_cs_driver);
815
}
816
 
817
module_init(init_axnet_cs);
818
module_exit(exit_axnet_cs);
819
 
820
/*====================================================================*/
821
 
822
/* 8390.c: A general NS8390 ethernet driver core for linux. */
823
/*
824
        Written 1992-94 by Donald Becker.
825
 
826
        Copyright 1993 United States Government as represented by the
827
        Director, National Security Agency.
828
 
829
        This software may be used and distributed according to the terms
830
        of the GNU General Public License, incorporated herein by reference.
831
 
832
        The author may be reached as becker@scyld.com, or C/O
833
        Scyld Computing Corporation
834
        410 Severn Ave., Suite 210
835
        Annapolis MD 21403
836
 
837
  This is the chip-specific code for many 8390-based ethernet adaptors.
838
  This is not a complete driver, it must be combined with board-specific
839
  code such as ne.c, wd.c, 3c503.c, etc.
840
 
841
  Seeing how at least eight drivers use this code, (not counting the
842
  PCMCIA ones either) it is easy to break some card by what seems like
843
  a simple innocent change. Please contact me or Donald if you think
844
  you have found something that needs changing. -- PG
845
 
846
  Changelog:
847
 
848
  Paul Gortmaker        : remove set_bit lock, other cleanups.
849
  Paul Gortmaker        : add ei_get_8390_hdr() so we can pass skb's to
850
                          ei_block_input() for eth_io_copy_and_sum().
851
  Paul Gortmaker        : exchange static int ei_pingpong for a #define,
852
                          also add better Tx error handling.
853
  Paul Gortmaker        : rewrite Rx overrun handling as per NS specs.
854
  Alexey Kuznetsov      : use the 8390's six bit hash multicast filter.
855
  Paul Gortmaker        : tweak ANK's above multicast changes a bit.
856
  Paul Gortmaker        : update packet statistics for v2.1.x
857
  Alan Cox              : support arbitary stupid port mappings on the
858
                          68K Macintosh. Support >16bit I/O spaces
859
  Paul Gortmaker        : add kmod support for auto-loading of the 8390
860
                          module by all drivers that require it.
861
  Alan Cox              : Spinlocking work, added 'BUG_83C690'
862
  Paul Gortmaker        : Separate out Tx timeout code from Tx path.
863
 
864
  Sources:
865
  The National Semiconductor LAN Databook, and the 3Com 3c503 databook.
866
 
867
  */
868
 
869
static const char *version_8390 =
870
    "8390.c:v1.10cvs 9/23/94 Donald Becker (becker@scyld.com)\n";
871
 
872
#include <linux/bitops.h>
873
#include <asm/irq.h>
874
#include <linux/fcntl.h>
875
#include <linux/in.h>
876
#include <linux/interrupt.h>
877
 
878
#include <linux/etherdevice.h>
879
 
880
#define BUG_83C690
881
 
882
/* These are the operational function interfaces to board-specific
883
   routines.
884
        void reset_8390(struct net_device *dev)
885
                Resets the board associated with DEV, including a hardware reset of
886
                the 8390.  This is only called when there is a transmit timeout, and
887
                it is always followed by 8390_init().
888
        void block_output(struct net_device *dev, int count, const unsigned char *buf,
889
                                          int start_page)
890
                Write the COUNT bytes of BUF to the packet buffer at START_PAGE.  The
891
                "page" value uses the 8390's 256-byte pages.
892
        void get_8390_hdr(struct net_device *dev, struct e8390_hdr *hdr, int ring_page)
893
                Read the 4 byte, page aligned 8390 header. *If* there is a
894
                subsequent read, it will be of the rest of the packet.
895
        void block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
896
                Read COUNT bytes from the packet buffer into the skb data area. Start
897
                reading from RING_OFFSET, the address as the 8390 sees it.  This will always
898
                follow the read of the 8390 header.
899
*/
900
#define ei_reset_8390 (ei_local->reset_8390)
901
#define ei_block_output (ei_local->block_output)
902
#define ei_block_input (ei_local->block_input)
903
#define ei_get_8390_hdr (ei_local->get_8390_hdr)
904
 
905
/* use 0 for production, 1 for verification, >2 for debug */
906
#ifndef ei_debug
907
int ei_debug = 1;
908
#endif
909
 
910
/* Index to functions. */
911
static void ei_tx_intr(struct net_device *dev);
912
static void ei_tx_err(struct net_device *dev);
913
static void ei_tx_timeout(struct net_device *dev);
914
static void ei_receive(struct net_device *dev);
915
static void ei_rx_overrun(struct net_device *dev);
916
 
917
/* Routines generic to NS8390-based boards. */
918
static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
919
                                                                int start_page);
920
static void set_multicast_list(struct net_device *dev);
921
static void do_set_multicast_list(struct net_device *dev);
922
 
923
/*
924
 *      SMP and the 8390 setup.
925
 *
926
 *      The 8390 isnt exactly designed to be multithreaded on RX/TX. There is
927
 *      a page register that controls bank and packet buffer access. We guard
928
 *      this with ei_local->page_lock. Nobody should assume or set the page other
929
 *      than zero when the lock is not held. Lock holders must restore page 0
930
 *      before unlocking. Even pure readers must take the lock to protect in
931
 *      page 0.
932
 *
933
 *      To make life difficult the chip can also be very slow. We therefore can't
934
 *      just use spinlocks. For the longer lockups we disable the irq the device
935
 *      sits on and hold the lock. We must hold the lock because there is a dual
936
 *      processor case other than interrupts (get stats/set multicast list in
937
 *      parallel with each other and transmit).
938
 *
939
 *      Note: in theory we can just disable the irq on the card _but_ there is
940
 *      a latency on SMP irq delivery. So we can easily go "disable irq" "sync irqs"
941
 *      enter lock, take the queued irq. So we waddle instead of flying.
942
 *
943
 *      Finally by special arrangement for the purpose of being generally
944
 *      annoying the transmit function is called bh atomic. That places
945
 *      restrictions on the user context callers as disable_irq won't save
946
 *      them.
947
 */
948
 
949
/**
950
 * ax_open - Open/initialize the board.
951
 * @dev: network device to initialize
952
 *
953
 * This routine goes all-out, setting everything
954
 * up anew at each open, even though many of these registers should only
955
 * need to be set once at boot.
956
 */
957
static int ax_open(struct net_device *dev)
958
{
959
        unsigned long flags;
960
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
961
 
962
#ifdef HAVE_TX_TIMEOUT
963
        /* The card I/O part of the driver (e.g. 3c503) can hook a Tx timeout
964
            wrapper that does e.g. media check & then calls ei_tx_timeout. */
965
        if (dev->tx_timeout == NULL)
966
                 dev->tx_timeout = ei_tx_timeout;
967
        if (dev->watchdog_timeo <= 0)
968
                 dev->watchdog_timeo = TX_TIMEOUT;
969
#endif
970
 
971
        /*
972
         *      Grab the page lock so we own the register set, then call
973
         *      the init function.
974
         */
975
 
976
        spin_lock_irqsave(&ei_local->page_lock, flags);
977
        AX88190_init(dev, 1);
978
        /* Set the flag before we drop the lock, That way the IRQ arrives
979
           after its set and we get no silly warnings */
980
        netif_start_queue(dev);
981
        spin_unlock_irqrestore(&ei_local->page_lock, flags);
982
        ei_local->irqlock = 0;
983
        return 0;
984
}
985
 
986
#define dev_lock(dev) (((struct ei_device *)netdev_priv(dev))->page_lock)
987
 
988
/**
989
 * ax_close - shut down network device
990
 * @dev: network device to close
991
 *
992
 * Opposite of ax_open(). Only used when "ifconfig <devname> down" is done.
993
 */
994
int ax_close(struct net_device *dev)
995
{
996
        unsigned long flags;
997
 
998
        /*
999
         *      Hold the page lock during close
1000
         */
1001
 
1002
        spin_lock_irqsave(&dev_lock(dev), flags);
1003
        AX88190_init(dev, 0);
1004
        spin_unlock_irqrestore(&dev_lock(dev), flags);
1005
        netif_stop_queue(dev);
1006
        return 0;
1007
}
1008
 
1009
/**
1010
 * ei_tx_timeout - handle transmit time out condition
1011
 * @dev: network device which has apparently fallen asleep
1012
 *
1013
 * Called by kernel when device never acknowledges a transmit has
1014
 * completed (or failed) - i.e. never posted a Tx related interrupt.
1015
 */
1016
 
1017
void ei_tx_timeout(struct net_device *dev)
1018
{
1019
        long e8390_base = dev->base_addr;
1020
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1021
        int txsr, isr, tickssofar = jiffies - dev->trans_start;
1022
        unsigned long flags;
1023
 
1024
        ei_local->stat.tx_errors++;
1025
 
1026
        spin_lock_irqsave(&ei_local->page_lock, flags);
1027
        txsr = inb(e8390_base+EN0_TSR);
1028
        isr = inb(e8390_base+EN0_ISR);
1029
        spin_unlock_irqrestore(&ei_local->page_lock, flags);
1030
 
1031
        printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
1032
                dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
1033
                (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
1034
 
1035
        if (!isr && !ei_local->stat.tx_packets)
1036
        {
1037
                /* The 8390 probably hasn't gotten on the cable yet. */
1038
                ei_local->interface_num ^= 1;   /* Try a different xcvr.  */
1039
        }
1040
 
1041
        /* Ugly but a reset can be slow, yet must be protected */
1042
 
1043
        disable_irq_nosync(dev->irq);
1044
        spin_lock(&ei_local->page_lock);
1045
 
1046
        /* Try to restart the card.  Perhaps the user has fixed something. */
1047
        ei_reset_8390(dev);
1048
        AX88190_init(dev, 1);
1049
 
1050
        spin_unlock(&ei_local->page_lock);
1051
        enable_irq(dev->irq);
1052
        netif_wake_queue(dev);
1053
}
1054
 
1055
/**
1056
 * ei_start_xmit - begin packet transmission
1057
 * @skb: packet to be sent
1058
 * @dev: network device to which packet is sent
1059
 *
1060
 * Sends a packet to an 8390 network device.
1061
 */
1062
 
1063
static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
1064
{
1065
        long e8390_base = dev->base_addr;
1066
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1067
        int length, send_length, output_page;
1068
        unsigned long flags;
1069
        u8 packet[ETH_ZLEN];
1070
 
1071
        netif_stop_queue(dev);
1072
 
1073
        length = skb->len;
1074
 
1075
        /* Mask interrupts from the ethercard.
1076
           SMP: We have to grab the lock here otherwise the IRQ handler
1077
           on another CPU can flip window and race the IRQ mask set. We end
1078
           up trashing the mcast filter not disabling irqs if we don't lock */
1079
 
1080
        spin_lock_irqsave(&ei_local->page_lock, flags);
1081
        outb_p(0x00, e8390_base + EN0_IMR);
1082
        spin_unlock_irqrestore(&ei_local->page_lock, flags);
1083
 
1084
        /*
1085
         *      Slow phase with lock held.
1086
         */
1087
 
1088
        disable_irq_nosync(dev->irq);
1089
 
1090
        spin_lock(&ei_local->page_lock);
1091
 
1092
        ei_local->irqlock = 1;
1093
 
1094
        send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
1095
 
1096
        /*
1097
         * We have two Tx slots available for use. Find the first free
1098
         * slot, and then perform some sanity checks. With two Tx bufs,
1099
         * you get very close to transmitting back-to-back packets. With
1100
         * only one Tx buf, the transmitter sits idle while you reload the
1101
         * card, leaving a substantial gap between each transmitted packet.
1102
         */
1103
 
1104
        if (ei_local->tx1 == 0)
1105
        {
1106
                output_page = ei_local->tx_start_page;
1107
                ei_local->tx1 = send_length;
1108
                if (ei_debug  &&  ei_local->tx2 > 0)
1109
                        printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
1110
                                dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
1111
        }
1112
        else if (ei_local->tx2 == 0)
1113
        {
1114
                output_page = ei_local->tx_start_page + TX_PAGES/2;
1115
                ei_local->tx2 = send_length;
1116
                if (ei_debug  &&  ei_local->tx1 > 0)
1117
                        printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
1118
                                dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
1119
        }
1120
        else
1121
        {       /* We should never get here. */
1122
                if (ei_debug)
1123
                        printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
1124
                                dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
1125
                ei_local->irqlock = 0;
1126
                netif_stop_queue(dev);
1127
                outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1128
                spin_unlock(&ei_local->page_lock);
1129
                enable_irq(dev->irq);
1130
                ei_local->stat.tx_errors++;
1131
                return 1;
1132
        }
1133
 
1134
        /*
1135
         * Okay, now upload the packet and trigger a send if the transmitter
1136
         * isn't already sending. If it is busy, the interrupt handler will
1137
         * trigger the send later, upon receiving a Tx done interrupt.
1138
         */
1139
 
1140
        if (length == skb->len)
1141
                ei_block_output(dev, length, skb->data, output_page);
1142
        else {
1143
                memset(packet, 0, ETH_ZLEN);
1144
                skb_copy_from_linear_data(skb, packet, skb->len);
1145
                ei_block_output(dev, length, packet, output_page);
1146
        }
1147
 
1148
        if (! ei_local->txing)
1149
        {
1150
                ei_local->txing = 1;
1151
                NS8390_trigger_send(dev, send_length, output_page);
1152
                dev->trans_start = jiffies;
1153
                if (output_page == ei_local->tx_start_page)
1154
                {
1155
                        ei_local->tx1 = -1;
1156
                        ei_local->lasttx = -1;
1157
                }
1158
                else
1159
                {
1160
                        ei_local->tx2 = -1;
1161
                        ei_local->lasttx = -2;
1162
                }
1163
        }
1164
        else ei_local->txqueue++;
1165
 
1166
        if (ei_local->tx1  &&  ei_local->tx2)
1167
                netif_stop_queue(dev);
1168
        else
1169
                netif_start_queue(dev);
1170
 
1171
        /* Turn 8390 interrupts back on. */
1172
        ei_local->irqlock = 0;
1173
        outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1174
 
1175
        spin_unlock(&ei_local->page_lock);
1176
        enable_irq(dev->irq);
1177
 
1178
        dev_kfree_skb (skb);
1179
        ei_local->stat.tx_bytes += send_length;
1180
 
1181
        return 0;
1182
}
1183
 
1184
/**
1185
 * ax_interrupt - handle the interrupts from an 8390
1186
 * @irq: interrupt number
1187
 * @dev_id: a pointer to the net_device
1188
 * @regs: unused
1189
 *
1190
 * Handle the ether interface interrupts. We pull packets from
1191
 * the 8390 via the card specific functions and fire them at the networking
1192
 * stack. We also handle transmit completions and wake the transmit path if
1193
 * necessary. We also update the counters and do other housekeeping as
1194
 * needed.
1195
 */
1196
 
1197
static irqreturn_t ax_interrupt(int irq, void *dev_id)
1198
{
1199
        struct net_device *dev = dev_id;
1200
        long e8390_base;
1201
        int interrupts, nr_serviced = 0, i;
1202
        struct ei_device *ei_local;
1203
        int handled = 0;
1204
 
1205
        e8390_base = dev->base_addr;
1206
        ei_local = netdev_priv(dev);
1207
 
1208
        /*
1209
         *      Protect the irq test too.
1210
         */
1211
 
1212
        spin_lock(&ei_local->page_lock);
1213
 
1214
        if (ei_local->irqlock)
1215
        {
1216
#if 1 /* This might just be an interrupt for a PCI device sharing this line */
1217
                /* The "irqlock" check is only for testing. */
1218
                printk(ei_local->irqlock
1219
                           ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
1220
                           : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
1221
                           dev->name, inb_p(e8390_base + EN0_ISR),
1222
                           inb_p(e8390_base + EN0_IMR));
1223
#endif
1224
                spin_unlock(&ei_local->page_lock);
1225
                return IRQ_NONE;
1226
        }
1227
 
1228
        if (ei_debug > 3)
1229
                printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
1230
                           inb_p(e8390_base + EN0_ISR));
1231
 
1232
        outb_p(0x00, e8390_base + EN0_ISR);
1233
        ei_local->irqlock = 1;
1234
 
1235
        /* !!Assumption!! -- we stay in page 0.  Don't break this. */
1236
        while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
1237
                   && ++nr_serviced < MAX_SERVICE)
1238
        {
1239
                if (!netif_running(dev) || (interrupts == 0xff)) {
1240
                        if (ei_debug > 1)
1241
                                printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
1242
                        outb_p(interrupts, e8390_base + EN0_ISR);
1243
                        interrupts = 0;
1244
                        break;
1245
                }
1246
                handled = 1;
1247
 
1248
                /* AX88190 bug fix. */
1249
                outb_p(interrupts, e8390_base + EN0_ISR);
1250
                for (i = 0; i < 10; i++) {
1251
                        if (!(inb(e8390_base + EN0_ISR) & interrupts))
1252
                                break;
1253
                        outb_p(0, e8390_base + EN0_ISR);
1254
                        outb_p(interrupts, e8390_base + EN0_ISR);
1255
                }
1256
                if (interrupts & ENISR_OVER)
1257
                        ei_rx_overrun(dev);
1258
                else if (interrupts & (ENISR_RX+ENISR_RX_ERR))
1259
                {
1260
                        /* Got a good (?) packet. */
1261
                        ei_receive(dev);
1262
                }
1263
                /* Push the next to-transmit packet through. */
1264
                if (interrupts & ENISR_TX)
1265
                        ei_tx_intr(dev);
1266
                else if (interrupts & ENISR_TX_ERR)
1267
                        ei_tx_err(dev);
1268
 
1269
                if (interrupts & ENISR_COUNTERS)
1270
                {
1271
                        ei_local->stat.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0);
1272
                        ei_local->stat.rx_crc_errors   += inb_p(e8390_base + EN0_COUNTER1);
1273
                        ei_local->stat.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2);
1274
                }
1275
        }
1276
 
1277
        if (interrupts && ei_debug)
1278
        {
1279
                handled = 1;
1280
                if (nr_serviced >= MAX_SERVICE)
1281
                {
1282
                        /* 0xFF is valid for a card removal */
1283
                        if(interrupts!=0xFF)
1284
                                printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
1285
                                   dev->name, interrupts);
1286
                        outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
1287
                } else {
1288
                        printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
1289
                        outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
1290
                }
1291
        }
1292
 
1293
        /* Turn 8390 interrupts back on. */
1294
        ei_local->irqlock = 0;
1295
        outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1296
 
1297
        spin_unlock(&ei_local->page_lock);
1298
        return IRQ_RETVAL(handled);
1299
}
1300
 
1301
/**
1302
 * ei_tx_err - handle transmitter error
1303
 * @dev: network device which threw the exception
1304
 *
1305
 * A transmitter error has happened. Most likely excess collisions (which
1306
 * is a fairly normal condition). If the error is one where the Tx will
1307
 * have been aborted, we try and send another one right away, instead of
1308
 * letting the failed packet sit and collect dust in the Tx buffer. This
1309
 * is a much better solution as it avoids kernel based Tx timeouts, and
1310
 * an unnecessary card reset.
1311
 *
1312
 * Called with lock held.
1313
 */
1314
 
1315
static void ei_tx_err(struct net_device *dev)
1316
{
1317
        long e8390_base = dev->base_addr;
1318
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1319
        unsigned char txsr = inb_p(e8390_base+EN0_TSR);
1320
        unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
1321
 
1322
#ifdef VERBOSE_ERROR_DUMP
1323
        printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
1324
        if (txsr & ENTSR_ABT)
1325
                printk("excess-collisions ");
1326
        if (txsr & ENTSR_ND)
1327
                printk("non-deferral ");
1328
        if (txsr & ENTSR_CRS)
1329
                printk("lost-carrier ");
1330
        if (txsr & ENTSR_FU)
1331
                printk("FIFO-underrun ");
1332
        if (txsr & ENTSR_CDH)
1333
                printk("lost-heartbeat ");
1334
        printk("\n");
1335
#endif
1336
 
1337
        if (tx_was_aborted)
1338
                ei_tx_intr(dev);
1339
        else
1340
        {
1341
                ei_local->stat.tx_errors++;
1342
                if (txsr & ENTSR_CRS) ei_local->stat.tx_carrier_errors++;
1343
                if (txsr & ENTSR_CDH) ei_local->stat.tx_heartbeat_errors++;
1344
                if (txsr & ENTSR_OWC) ei_local->stat.tx_window_errors++;
1345
        }
1346
}
1347
 
1348
/**
1349
 * ei_tx_intr - transmit interrupt handler
1350
 * @dev: network device for which tx intr is handled
1351
 *
1352
 * We have finished a transmit: check for errors and then trigger the next
1353
 * packet to be sent. Called with lock held.
1354
 */
1355
 
1356
static void ei_tx_intr(struct net_device *dev)
1357
{
1358
        long e8390_base = dev->base_addr;
1359
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1360
        int status = inb(e8390_base + EN0_TSR);
1361
 
1362
        /*
1363
         * There are two Tx buffers, see which one finished, and trigger
1364
         * the send of another one if it exists.
1365
         */
1366
        ei_local->txqueue--;
1367
 
1368
        if (ei_local->tx1 < 0)
1369
        {
1370
                if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
1371
                        printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
1372
                                ei_local->name, ei_local->lasttx, ei_local->tx1);
1373
                ei_local->tx1 = 0;
1374
                if (ei_local->tx2 > 0)
1375
                {
1376
                        ei_local->txing = 1;
1377
                        NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
1378
                        dev->trans_start = jiffies;
1379
                        ei_local->tx2 = -1,
1380
                        ei_local->lasttx = 2;
1381
                }
1382
                else ei_local->lasttx = 20, ei_local->txing = 0;
1383
        }
1384
        else if (ei_local->tx2 < 0)
1385
        {
1386
                if (ei_local->lasttx != 2  &&  ei_local->lasttx != -2)
1387
                        printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
1388
                                ei_local->name, ei_local->lasttx, ei_local->tx2);
1389
                ei_local->tx2 = 0;
1390
                if (ei_local->tx1 > 0)
1391
                {
1392
                        ei_local->txing = 1;
1393
                        NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
1394
                        dev->trans_start = jiffies;
1395
                        ei_local->tx1 = -1;
1396
                        ei_local->lasttx = 1;
1397
                }
1398
                else
1399
                        ei_local->lasttx = 10, ei_local->txing = 0;
1400
        }
1401
//      else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n",
1402
//                      dev->name, ei_local->lasttx);
1403
 
1404
        /* Minimize Tx latency: update the statistics after we restart TXing. */
1405
        if (status & ENTSR_COL)
1406
                ei_local->stat.collisions++;
1407
        if (status & ENTSR_PTX)
1408
                ei_local->stat.tx_packets++;
1409
        else
1410
        {
1411
                ei_local->stat.tx_errors++;
1412
                if (status & ENTSR_ABT)
1413
                {
1414
                        ei_local->stat.tx_aborted_errors++;
1415
                        ei_local->stat.collisions += 16;
1416
                }
1417
                if (status & ENTSR_CRS)
1418
                        ei_local->stat.tx_carrier_errors++;
1419
                if (status & ENTSR_FU)
1420
                        ei_local->stat.tx_fifo_errors++;
1421
                if (status & ENTSR_CDH)
1422
                        ei_local->stat.tx_heartbeat_errors++;
1423
                if (status & ENTSR_OWC)
1424
                        ei_local->stat.tx_window_errors++;
1425
        }
1426
        netif_wake_queue(dev);
1427
}
1428
 
1429
/**
1430
 * ei_receive - receive some packets
1431
 * @dev: network device with which receive will be run
1432
 *
1433
 * We have a good packet(s), get it/them out of the buffers.
1434
 * Called with lock held.
1435
 */
1436
 
1437
static void ei_receive(struct net_device *dev)
1438
{
1439
        long e8390_base = dev->base_addr;
1440
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1441
        unsigned char rxing_page, this_frame, next_frame;
1442
        unsigned short current_offset;
1443
        int rx_pkt_count = 0;
1444
        struct e8390_pkt_hdr rx_frame;
1445
 
1446
        while (++rx_pkt_count < 10)
1447
        {
1448
                int pkt_len, pkt_stat;
1449
 
1450
                /* Get the rx page (incoming packet pointer). */
1451
                rxing_page = inb_p(e8390_base + EN1_CURPAG -1);
1452
 
1453
                /* Remove one frame from the ring.  Boundary is always a page behind. */
1454
                this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
1455
                if (this_frame >= ei_local->stop_page)
1456
                        this_frame = ei_local->rx_start_page;
1457
 
1458
                /* Someday we'll omit the previous, iff we never get this message.
1459
                   (There is at least one clone claimed to have a problem.)
1460
 
1461
                   Keep quiet if it looks like a card removal. One problem here
1462
                   is that some clones crash in roughly the same way.
1463
                 */
1464
                if (ei_debug > 0  &&  this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
1465
                        printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
1466
                                   dev->name, this_frame, ei_local->current_page);
1467
 
1468
                if (this_frame == rxing_page)   /* Read all the frames? */
1469
                        break;                          /* Done for now */
1470
 
1471
                current_offset = this_frame << 8;
1472
                ei_get_8390_hdr(dev, &rx_frame, this_frame);
1473
 
1474
                pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr);
1475
                pkt_stat = rx_frame.status;
1476
 
1477
                next_frame = this_frame + 1 + ((pkt_len+4)>>8);
1478
 
1479
                if (pkt_len < 60  ||  pkt_len > 1518)
1480
                {
1481
                        if (ei_debug)
1482
                                printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
1483
                                           dev->name, rx_frame.count, rx_frame.status,
1484
                                           rx_frame.next);
1485
                        ei_local->stat.rx_errors++;
1486
                        ei_local->stat.rx_length_errors++;
1487
                }
1488
                 else if ((pkt_stat & 0x0F) == ENRSR_RXOK)
1489
                {
1490
                        struct sk_buff *skb;
1491
 
1492
                        skb = dev_alloc_skb(pkt_len+2);
1493
                        if (skb == NULL)
1494
                        {
1495
                                if (ei_debug > 1)
1496
                                        printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
1497
                                                   dev->name, pkt_len);
1498
                                ei_local->stat.rx_dropped++;
1499
                                break;
1500
                        }
1501
                        else
1502
                        {
1503
                                skb_reserve(skb,2);     /* IP headers on 16 byte boundaries */
1504
                                skb_put(skb, pkt_len);  /* Make room */
1505
                                ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame));
1506
                                skb->protocol=eth_type_trans(skb,dev);
1507
                                netif_rx(skb);
1508
                                dev->last_rx = jiffies;
1509
                                ei_local->stat.rx_packets++;
1510
                                ei_local->stat.rx_bytes += pkt_len;
1511
                                if (pkt_stat & ENRSR_PHY)
1512
                                        ei_local->stat.multicast++;
1513
                        }
1514
                }
1515
                else
1516
                {
1517
                        if (ei_debug)
1518
                                printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
1519
                                           dev->name, rx_frame.status, rx_frame.next,
1520
                                           rx_frame.count);
1521
                        ei_local->stat.rx_errors++;
1522
                        /* NB: The NIC counts CRC, frame and missed errors. */
1523
                        if (pkt_stat & ENRSR_FO)
1524
                                ei_local->stat.rx_fifo_errors++;
1525
                }
1526
                next_frame = rx_frame.next;
1527
 
1528
                /* This _should_ never happen: it's here for avoiding bad clones. */
1529
                if (next_frame >= ei_local->stop_page) {
1530
                        printk("%s: next frame inconsistency, %#2x\n", dev->name,
1531
                                   next_frame);
1532
                        next_frame = ei_local->rx_start_page;
1533
                }
1534
                ei_local->current_page = next_frame;
1535
                outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
1536
        }
1537
 
1538
        return;
1539
}
1540
 
1541
/**
1542
 * ei_rx_overrun - handle receiver overrun
1543
 * @dev: network device which threw exception
1544
 *
1545
 * We have a receiver overrun: we have to kick the 8390 to get it started
1546
 * again. Problem is that you have to kick it exactly as NS prescribes in
1547
 * the updated datasheets, or "the NIC may act in an unpredictable manner."
1548
 * This includes causing "the NIC to defer indefinitely when it is stopped
1549
 * on a busy network."  Ugh.
1550
 * Called with lock held. Don't call this with the interrupts off or your
1551
 * computer will hate you - it takes 10ms or so.
1552
 */
1553
 
1554
static void ei_rx_overrun(struct net_device *dev)
1555
{
1556
        axnet_dev_t *info = PRIV(dev);
1557
        long e8390_base = dev->base_addr;
1558
        unsigned char was_txing, must_resend = 0;
1559
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1560
 
1561
        /*
1562
         * Record whether a Tx was in progress and then issue the
1563
         * stop command.
1564
         */
1565
        was_txing = inb_p(e8390_base+E8390_CMD) & E8390_TRANS;
1566
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1567
 
1568
        if (ei_debug > 1)
1569
                printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name);
1570
        ei_local->stat.rx_over_errors++;
1571
 
1572
        /*
1573
         * Wait a full Tx time (1.2ms) + some guard time, NS says 1.6ms total.
1574
         * Early datasheets said to poll the reset bit, but now they say that
1575
         * it "is not a reliable indicator and subsequently should be ignored."
1576
         * We wait at least 10ms.
1577
         */
1578
 
1579
        mdelay(10);
1580
 
1581
        /*
1582
         * Reset RBCR[01] back to zero as per magic incantation.
1583
         */
1584
        outb_p(0x00, e8390_base+EN0_RCNTLO);
1585
        outb_p(0x00, e8390_base+EN0_RCNTHI);
1586
 
1587
        /*
1588
         * See if any Tx was interrupted or not. According to NS, this
1589
         * step is vital, and skipping it will cause no end of havoc.
1590
         */
1591
 
1592
        if (was_txing)
1593
        {
1594
                unsigned char tx_completed = inb_p(e8390_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR);
1595
                if (!tx_completed)
1596
                        must_resend = 1;
1597
        }
1598
 
1599
        /*
1600
         * Have to enter loopback mode and then restart the NIC before
1601
         * you are allowed to slurp packets up off the ring.
1602
         */
1603
        outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1604
        outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
1605
 
1606
        /*
1607
         * Clear the Rx ring of all the debris, and ack the interrupt.
1608
         */
1609
        ei_receive(dev);
1610
 
1611
        /*
1612
         * Leave loopback mode, and resend any packet that got stopped.
1613
         */
1614
        outb_p(E8390_TXCONFIG | info->duplex_flag, e8390_base + EN0_TXCR);
1615
        if (must_resend)
1616
                outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, e8390_base + E8390_CMD);
1617
}
1618
 
1619
/*
1620
 *      Collect the stats. This is called unlocked and from several contexts.
1621
 */
1622
 
1623
static struct net_device_stats *get_stats(struct net_device *dev)
1624
{
1625
        long ioaddr = dev->base_addr;
1626
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1627
        unsigned long flags;
1628
 
1629
        /* If the card is stopped, just return the present stats. */
1630
        if (!netif_running(dev))
1631
                return &ei_local->stat;
1632
 
1633
        spin_lock_irqsave(&ei_local->page_lock,flags);
1634
        /* Read the counter registers, assuming we are in page 0. */
1635
        ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
1636
        ei_local->stat.rx_crc_errors   += inb_p(ioaddr + EN0_COUNTER1);
1637
        ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
1638
        spin_unlock_irqrestore(&ei_local->page_lock, flags);
1639
 
1640
        return &ei_local->stat;
1641
}
1642
 
1643
/*
1644
 * Form the 64 bit 8390 multicast table from the linked list of addresses
1645
 * associated with this dev structure.
1646
 */
1647
 
1648
static inline void make_mc_bits(u8 *bits, struct net_device *dev)
1649
{
1650
        struct dev_mc_list *dmi;
1651
        u32 crc;
1652
 
1653
        for (dmi=dev->mc_list; dmi; dmi=dmi->next) {
1654
 
1655
                crc = ether_crc(ETH_ALEN, dmi->dmi_addr);
1656
                /*
1657
                 * The 8390 uses the 6 most significant bits of the
1658
                 * CRC to index the multicast table.
1659
                 */
1660
                bits[crc>>29] |= (1<<((crc>>26)&7));
1661
        }
1662
}
1663
 
1664
/**
1665
 * do_set_multicast_list - set/clear multicast filter
1666
 * @dev: net device for which multicast filter is adjusted
1667
 *
1668
 *      Set or clear the multicast filter for this adaptor.
1669
 *      Must be called with lock held.
1670
 */
1671
 
1672
static void do_set_multicast_list(struct net_device *dev)
1673
{
1674
        long e8390_base = dev->base_addr;
1675
        int i;
1676
        struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
1677
 
1678
        if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) {
1679
                memset(ei_local->mcfilter, 0, 8);
1680
                if (dev->mc_list)
1681
                        make_mc_bits(ei_local->mcfilter, dev);
1682
        } else {
1683
                /* set to accept-all */
1684
                memset(ei_local->mcfilter, 0xFF, 8);
1685
        }
1686
 
1687
        outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
1688
        for(i = 0; i < 8; i++)
1689
        {
1690
                outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i));
1691
        }
1692
        outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
1693
 
1694
        if(dev->flags&IFF_PROMISC)
1695
                outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR);
1696
        else if(dev->flags&IFF_ALLMULTI || dev->mc_list)
1697
                outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR);
1698
        else
1699
                outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
1700
 
1701
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1702
}
1703
 
1704
/*
1705
 *      Called without lock held. This is invoked from user context and may
1706
 *      be parallel to just about everything else. Its also fairly quick and
1707
 *      not called too often. Must protect against both bh and irq users
1708
 */
1709
 
1710
static void set_multicast_list(struct net_device *dev)
1711
{
1712
        unsigned long flags;
1713
 
1714
        spin_lock_irqsave(&dev_lock(dev), flags);
1715
        do_set_multicast_list(dev);
1716
        spin_unlock_irqrestore(&dev_lock(dev), flags);
1717
}
1718
 
1719
/**
1720
 * axdev_setup - init rest of 8390 device struct
1721
 * @dev: network device structure to init
1722
 *
1723
 * Initialize the rest of the 8390 device structure.  Do NOT __init
1724
 * this, as it is used by 8390 based modular drivers too.
1725
 */
1726
 
1727
static void axdev_setup(struct net_device *dev)
1728
{
1729
        struct ei_device *ei_local;
1730
        if (ei_debug > 1)
1731
                printk(version_8390);
1732
 
1733
        ei_local = (struct ei_device *)netdev_priv(dev);
1734
        spin_lock_init(&ei_local->page_lock);
1735
 
1736
        dev->hard_start_xmit = &ei_start_xmit;
1737
        dev->get_stats  = get_stats;
1738
        dev->set_multicast_list = &set_multicast_list;
1739
 
1740
        ether_setup(dev);
1741
}
1742
 
1743
/* This page of functions should be 8390 generic */
1744
/* Follow National Semi's recommendations for initializing the "NIC". */
1745
 
1746
/**
1747
 * AX88190_init - initialize 8390 hardware
1748
 * @dev: network device to initialize
1749
 * @startp: boolean.  non-zero value to initiate chip processing
1750
 *
1751
 *      Must be called with lock held.
1752
 */
1753
 
1754
static void AX88190_init(struct net_device *dev, int startp)
1755
{
1756
        axnet_dev_t *info = PRIV(dev);
1757
        long e8390_base = dev->base_addr;
1758
        struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1759
        int i;
1760
        int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
1761
 
1762
        if(sizeof(struct e8390_pkt_hdr)!=4)
1763
                panic("8390.c: header struct mispacked\n");
1764
        /* Follow National Semi's recommendations for initing the DP83902. */
1765
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD); /* 0x21 */
1766
        outb_p(endcfg, e8390_base + EN0_DCFG);  /* 0x48 or 0x49 */
1767
        /* Clear the remote byte count registers. */
1768
        outb_p(0x00,  e8390_base + EN0_RCNTLO);
1769
        outb_p(0x00,  e8390_base + EN0_RCNTHI);
1770
        /* Set to monitor and loopback mode -- this is vital!. */
1771
        outb_p(E8390_RXOFF|0x40, e8390_base + EN0_RXCR); /* 0x60 */
1772
        outb_p(E8390_TXOFF, e8390_base + EN0_TXCR); /* 0x02 */
1773
        /* Set the transmit page and receive ring. */
1774
        outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
1775
        ei_local->tx1 = ei_local->tx2 = 0;
1776
        outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
1777
        outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY);       /* 3c503 says 0x3f,NS0x26*/
1778
        ei_local->current_page = ei_local->rx_start_page;               /* assert boundary+1 */
1779
        outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
1780
        /* Clear the pending interrupts and mask. */
1781
        outb_p(0xFF, e8390_base + EN0_ISR);
1782
        outb_p(0x00,  e8390_base + EN0_IMR);
1783
 
1784
        /* Copy the station address into the DS8390 registers. */
1785
 
1786
        outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD); /* 0x61 */
1787
        for(i = 0; i < 6; i++)
1788
        {
1789
                outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
1790
                if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
1791
                        printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
1792
        }
1793
 
1794
        outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
1795
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1796
 
1797
        netif_start_queue(dev);
1798
        ei_local->tx1 = ei_local->tx2 = 0;
1799
        ei_local->txing = 0;
1800
 
1801
        if (startp)
1802
        {
1803
                outb_p(0xff,  e8390_base + EN0_ISR);
1804
                outb_p(ENISR_ALL,  e8390_base + EN0_IMR);
1805
                outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1806
                outb_p(E8390_TXCONFIG | info->duplex_flag,
1807
                       e8390_base + EN0_TXCR); /* xmit on. */
1808
                /* 3c503 TechMan says rxconfig only after the NIC is started. */
1809
                outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR); /* rx on, */
1810
                do_set_multicast_list(dev);     /* (re)load the mcast table */
1811
        }
1812
}
1813
 
1814
/* Trigger a transmit start, assuming the length is valid.
1815
   Always called with the page lock held */
1816
 
1817
static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1818
                                                                int start_page)
1819
{
1820
        long e8390_base = dev->base_addr;
1821
        struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev);
1822
 
1823
        if (inb_p(e8390_base) & E8390_TRANS)
1824
        {
1825
                printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
1826
                        dev->name);
1827
                return;
1828
        }
1829
        outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
1830
        outb_p(length >> 8, e8390_base + EN0_TCNTHI);
1831
        outb_p(start_page, e8390_base + EN0_TPSR);
1832
        outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base+E8390_CMD);
1833
}

powered by: WebSVN 2.1.0

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