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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [net/] [ne.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* ne.c: A general non-shared-memory NS8390 ethernet driver for linux. */
2
/*
3
    Written 1992-94 by Donald Becker.
4
 
5
    Copyright 1993 United States Government as represented by the
6
    Director, National Security Agency.
7
 
8
    This software may be used and distributed according to the terms
9
    of the GNU General Public License, incorporated herein by reference.
10
 
11
    The author may be reached as becker@scyld.com, or C/O
12
    Scyld Computing Corporation, 410 Severn Ave., Suite 210, Annapolis MD 21403
13
 
14
    This driver should work with many programmed-I/O 8390-based ethernet
15
    boards.  Currently it supports the NE1000, NE2000, many clones,
16
    and some Cabletron products.
17
 
18
    Changelog:
19
 
20
    Paul Gortmaker      : use ENISR_RDC to monitor Tx PIO uploads, made
21
                          sanity checks and bad clone support optional.
22
    Paul Gortmaker      : new reset code, reset card after probe at boot.
23
    Paul Gortmaker      : multiple card support for module users.
24
    Paul Gortmaker      : Support for PCI ne2k clones, similar to lance.c
25
    Paul Gortmaker      : Allow users with bad cards to avoid full probe.
26
    Paul Gortmaker      : PCI probe changes, more PCI cards supported.
27
    rjohnson@analogic.com : Changed init order so an interrupt will only
28
    occur after memory is allocated for dev->priv. Deallocated memory
29
    last in cleanup_modue()
30
    Richard Guenther    : Added support for ISAPnP cards
31
    Paul Gortmaker      : Discontinued PCI support - use ne2k-pci.c instead.
32
 
33
*/
34
 
35
/* Routines for the NatSemi-based designs (NE[12]000). */
36
 
37
static const char version1[] =
38
"ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)\n";
39
static const char version2[] =
40
"Last modified Nov 1, 2000 by Paul Gortmaker\n";
41
 
42
 
43
#include <linux/module.h>
44
#include <linux/kernel.h>
45
#include <linux/sched.h>
46
#include <linux/errno.h>
47
#include <linux/isapnp.h>
48
#include <linux/init.h>
49
#include <linux/delay.h>
50
#include <asm/system.h>
51
#include <asm/io.h>
52
 
53
#include <linux/netdevice.h>
54
#include <linux/etherdevice.h>
55
#include "8390.h"
56
 
57
/* Some defines that people can play with if so inclined. */
58
 
59
/* Do we support clones that don't adhere to 14,15 of the SAprom ? */
60
#define SUPPORT_NE_BAD_CLONES
61
 
62
/* Do we perform extra sanity checks on stuff ? */
63
/* #define NE_SANITY_CHECK */
64
 
65
/* Do we implement the read before write bugfix ? */
66
/* #define NE_RW_BUGFIX */
67
 
68
/* Do we have a non std. amount of memory? (in units of 256 byte pages) */
69
/* #define PACKETBUF_MEMSIZE    0x40 */
70
 
71
/* A zero-terminated list of I/O addresses to be probed at boot. */
72
#ifndef MODULE
73
static unsigned int netcard_portlist[] __initdata = {
74
        0x300, 0x280, 0x320, 0x340, 0x360, 0x380, 0
75
};
76
#endif
77
 
78
static struct isapnp_device_id isapnp_clone_list[] __initdata = {
79
        {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
80
                ISAPNP_VENDOR('E','D','I'), ISAPNP_FUNCTION(0x0216),
81
                (long) "NN NE2000" },
82
        {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
83
                ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0x80d6),
84
                (long) "Generic PNP" },
85
        { }     /* terminate list */
86
};
87
 
88
MODULE_DEVICE_TABLE(isapnp, isapnp_clone_list);
89
 
90
#ifdef SUPPORT_NE_BAD_CLONES
91
/* A list of bad clones that we none-the-less recognize. */
92
static struct { const char *name8, *name16; unsigned char SAprefix[4];}
93
bad_clone_list[] __initdata = {
94
    {"DE100", "DE200", {0x00, 0xDE, 0x01,}},
95
    {"DE120", "DE220", {0x00, 0x80, 0xc8,}},
96
    {"DFI1000", "DFI2000", {'D', 'F', 'I',}}, /* Original, eh?  */
97
    {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}},
98
    {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}}, /* Ancient real NE1000. */
99
    {"NN1000", "NN2000",  {0x08, 0x03, 0x08}}, /* Outlaw no-name clone. */
100
    {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}},  /* Outlaw 4-Dimension cards. */
101
    {"Con-Intl_8", "Con-Intl_16", {0x00, 0x00, 0x24}}, /* Connect Int'nl */
102
    {"ET-100","ET-200", {0x00, 0x45, 0x54}}, /* YANG and YA clone */
103
    {"COMPEX","COMPEX16",{0x00,0x80,0x48}}, /* Broken ISA Compex cards */
104
    {"E-LAN100", "E-LAN200", {0x00, 0x00, 0x5d}}, /* Broken ne1000 clones */
105
    {"PCM-4823", "PCM-4823", {0x00, 0xc0, 0x6c}}, /* Broken Advantech MoBo */
106
    {"REALTEK", "RTL8019", {0x00, 0x00, 0xe8}}, /* no-name with Realtek chip */
107
    {"LCS-8834", "LCS-8836", {0x04, 0x04, 0x37}}, /* ShinyNet (SET) */
108
    {0,}
109
};
110
#endif
111
 
112
/* ---- No user-serviceable parts below ---- */
113
 
114
#define NE_BASE  (dev->base_addr)
115
#define NE_CMD          0x00
116
#define NE_DATAPORT     0x10    /* NatSemi-defined port window offset. */
117
#define NE_RESET        0x1f    /* Issue a read to reset, a write to clear. */
118
#define NE_IO_EXTENT    0x20
119
 
120
#define NE1SM_START_PG  0x20    /* First page of TX buffer */
121
#define NE1SM_STOP_PG   0x40    /* Last page +1 of RX ring */
122
#define NESM_START_PG   0x40    /* First page of TX buffer */
123
#define NESM_STOP_PG    0x80    /* Last page +1 of RX ring */
124
 
125
int ne_probe(struct net_device *dev);
126
static int ne_probe1(struct net_device *dev, int ioaddr);
127
static int ne_probe_isapnp(struct net_device *dev);
128
 
129
static int ne_open(struct net_device *dev);
130
static int ne_close(struct net_device *dev);
131
 
132
static void ne_reset_8390(struct net_device *dev);
133
static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
134
                          int ring_page);
135
static void ne_block_input(struct net_device *dev, int count,
136
                          struct sk_buff *skb, int ring_offset);
137
static void ne_block_output(struct net_device *dev, const int count,
138
                const unsigned char *buf, const int start_page);
139
 
140
 
141
/*  Probe for various non-shared-memory ethercards.
142
 
143
   NEx000-clone boards have a Station Address PROM (SAPROM) in the packet
144
   buffer memory space.  NE2000 clones have 0x57,0x57 in bytes 0x0e,0x0f of
145
   the SAPROM, while other supposed NE2000 clones must be detected by their
146
   SA prefix.
147
 
148
   Reading the SAPROM from a word-wide card with the 8390 set in byte-wide
149
   mode results in doubled values, which can be detected and compensated for.
150
 
151
   The probe is also responsible for initializing the card and filling
152
   in the 'dev' and 'ei_status' structures.
153
 
154
   We use the minimum memory size for some ethercard product lines, iff we can't
155
   distinguish models.  You can increase the packet buffer size by setting
156
   PACKETBUF_MEMSIZE.  Reported Cabletron packet buffer locations are:
157
        E1010   starts at 0x100 and ends at 0x2000.
158
        E1010-x starts at 0x100 and ends at 0x8000. ("-x" means "more memory")
159
        E2010    starts at 0x100 and ends at 0x4000.
160
        E2010-x starts at 0x100 and ends at 0xffff.  */
161
 
162
int __init ne_probe(struct net_device *dev)
163
{
164
        unsigned int base_addr = dev->base_addr;
165
 
166
        SET_MODULE_OWNER(dev);
167
 
168
        /* First check any supplied i/o locations. User knows best. <cough> */
169
        if (base_addr > 0x1ff)  /* Check a single specified location. */
170
                return ne_probe1(dev, base_addr);
171
        else if (base_addr != 0) /* Don't probe at all. */
172
                return -ENXIO;
173
 
174
        /* Then look for any installed ISAPnP clones */
175
        if (isapnp_present() && (ne_probe_isapnp(dev) == 0))
176
                return 0;
177
 
178
#ifndef MODULE
179
        /* Last resort. The semi-risky ISA auto-probe. */
180
        for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
181
                int ioaddr = netcard_portlist[base_addr];
182
                if (ne_probe1(dev, ioaddr) == 0)
183
                        return 0;
184
        }
185
#endif
186
 
187
        return -ENODEV;
188
}
189
 
190
static int __init ne_probe_isapnp(struct net_device *dev)
191
{
192
        int i;
193
 
194
        for (i = 0; isapnp_clone_list[i].vendor != 0; i++) {
195
                struct pci_dev *idev = NULL;
196
 
197
                while ((idev = isapnp_find_dev(NULL,
198
                                               isapnp_clone_list[i].vendor,
199
                                               isapnp_clone_list[i].function,
200
                                               idev))) {
201
                        /* Avoid already found cards from previous calls */
202
                        if (idev->prepare(idev))
203
                                continue;
204
                        if (idev->activate(idev))
205
                                continue;
206
                        /* if no irq, search for next */
207
                        if (idev->irq_resource[0].start == 0)
208
                                continue;
209
                        /* found it */
210
                        dev->base_addr = idev->resource[0].start;
211
                        dev->irq = idev->irq_resource[0].start;
212
                        printk(KERN_INFO "ne.c: ISAPnP reports %s at i/o %#lx, irq %d.\n",
213
                                (char *) isapnp_clone_list[i].driver_data,
214
 
215
                                dev->base_addr, dev->irq);
216
                        if (ne_probe1(dev, dev->base_addr) != 0) {       /* Shouldn't happen. */
217
                                printk(KERN_ERR "ne.c: Probe of ISAPnP card at %#lx failed.\n", dev->base_addr);
218
                                return -ENXIO;
219
                        }
220
                        ei_status.priv = (unsigned long)idev;
221
                        break;
222
                }
223
                if (!idev)
224
                        continue;
225
                return 0;
226
        }
227
 
228
        return -ENODEV;
229
}
230
 
231
static int __init ne_probe1(struct net_device *dev, int ioaddr)
232
{
233
        int i;
234
        unsigned char SA_prom[32];
235
        int wordlength = 2;
236
        const char *name = NULL;
237
        int start_page, stop_page;
238
        int neX000, ctron, copam, bad_card;
239
        int reg0, ret;
240
        static unsigned version_printed;
241
 
242
        if (!request_region(ioaddr, NE_IO_EXTENT, dev->name))
243
                return -EBUSY;
244
 
245
        reg0 = inb_p(ioaddr);
246
        if (reg0 == 0xFF) {
247
                ret = -ENODEV;
248
                goto err_out;
249
        }
250
 
251
        /* Do a preliminary verification that we have a 8390. */
252
        {
253
                int regd;
254
                outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
255
                regd = inb_p(ioaddr + 0x0d);
256
                outb_p(0xff, ioaddr + 0x0d);
257
                outb_p(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
258
                inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
259
                if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
260
                        outb_p(reg0, ioaddr);
261
                        outb_p(regd, ioaddr + 0x0d);    /* Restore the old values. */
262
                        ret = -ENODEV;
263
                        goto err_out;
264
                }
265
        }
266
 
267
        if (ei_debug  &&  version_printed++ == 0)
268
                printk(KERN_INFO "%s" KERN_INFO "%s", version1, version2);
269
 
270
        printk(KERN_INFO "NE*000 ethercard probe at %#3x:", ioaddr);
271
 
272
        /* A user with a poor card that fails to ack the reset, or that
273
           does not have a valid 0x57,0x57 signature can still use this
274
           without having to recompile. Specifying an i/o address along
275
           with an otherwise unused dev->mem_end value of "0xBAD" will
276
           cause the driver to skip these parts of the probe. */
277
 
278
        bad_card = ((dev->base_addr != 0) && (dev->mem_end == 0xbad));
279
 
280
        /* Reset card. Who knows what dain-bramaged state it was left in. */
281
 
282
        {
283
                unsigned long reset_start_time = jiffies;
284
 
285
                /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
286
                outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
287
 
288
                while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
289
                if (jiffies - reset_start_time > 2*HZ/100) {
290
                        if (bad_card) {
291
                                printk(" (warning: no reset ack)");
292
                                break;
293
                        } else {
294
                                printk(" not found (no reset ack).\n");
295
                                ret = -ENODEV;
296
                                goto err_out;
297
                        }
298
                }
299
 
300
                outb_p(0xff, ioaddr + EN0_ISR);         /* Ack all intr. */
301
        }
302
 
303
        /* Read the 16 bytes of station address PROM.
304
           We must first initialize registers, similar to NS8390_init(eifdev, 0).
305
           We can't reliably read the SAPROM address without this.
306
           (I learned the hard way!). */
307
        {
308
                struct {unsigned char value, offset; } program_seq[] =
309
                {
310
                        {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
311
                        {0x48,  EN0_DCFG},      /* Set byte-wide (0x48) access. */
312
                        {0x00,  EN0_RCNTLO},    /* Clear the count regs. */
313
                        {0x00,  EN0_RCNTHI},
314
                        {0x00,  EN0_IMR},       /* Mask completion irq. */
315
                        {0xFF,  EN0_ISR},
316
                        {E8390_RXOFF, EN0_RXCR},        /* 0x20  Set to monitor */
317
                        {E8390_TXOFF, EN0_TXCR},        /* 0x02  and loopback mode. */
318
                        {32,    EN0_RCNTLO},
319
                        {0x00,  EN0_RCNTHI},
320
                        {0x00,  EN0_RSARLO},    /* DMA starting at 0x0000. */
321
                        {0x00,  EN0_RSARHI},
322
                        {E8390_RREAD+E8390_START, E8390_CMD},
323
                };
324
 
325
                for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
326
                        outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
327
 
328
        }
329
        for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
330
                SA_prom[i] = inb(ioaddr + NE_DATAPORT);
331
                SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
332
                if (SA_prom[i] != SA_prom[i+1])
333
                        wordlength = 1;
334
        }
335
 
336
        if (wordlength == 2)
337
        {
338
                for (i = 0; i < 16; i++)
339
                        SA_prom[i] = SA_prom[i+i];
340
                /* We must set the 8390 for word mode. */
341
                outb_p(0x49, ioaddr + EN0_DCFG);
342
                start_page = NESM_START_PG;
343
                stop_page = NESM_STOP_PG;
344
        } else {
345
                start_page = NE1SM_START_PG;
346
                stop_page = NE1SM_STOP_PG;
347
        }
348
 
349
        neX000 = (SA_prom[14] == 0x57  &&  SA_prom[15] == 0x57);
350
        ctron =  (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
351
        copam =  (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);
352
 
353
        /* Set up the rest of the parameters. */
354
        if (neX000 || bad_card || copam) {
355
                name = (wordlength == 2) ? "NE2000" : "NE1000";
356
        }
357
        else if (ctron)
358
        {
359
                name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";
360
                start_page = 0x01;
361
                stop_page = (wordlength == 2) ? 0x40 : 0x20;
362
        }
363
        else
364
        {
365
#ifdef SUPPORT_NE_BAD_CLONES
366
                /* Ack!  Well, there might be a *bad* NE*000 clone there.
367
                   Check for total bogus addresses. */
368
                for (i = 0; bad_clone_list[i].name8; i++)
369
                {
370
                        if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
371
                                SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
372
                                SA_prom[2] == bad_clone_list[i].SAprefix[2])
373
                        {
374
                                if (wordlength == 2)
375
                                {
376
                                        name = bad_clone_list[i].name16;
377
                                } else {
378
                                        name = bad_clone_list[i].name8;
379
                                }
380
                                break;
381
                        }
382
                }
383
                if (bad_clone_list[i].name8 == NULL)
384
                {
385
                        printk(" not found (invalid signature %2.2x %2.2x).\n",
386
                                SA_prom[14], SA_prom[15]);
387
                        ret = -ENXIO;
388
                        goto err_out;
389
                }
390
#else
391
                printk(" not found.\n");
392
                ret = -ENXIO;
393
                goto err_out;
394
#endif
395
        }
396
 
397
        if (dev->irq < 2)
398
        {
399
                unsigned long cookie = probe_irq_on();
400
                outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */
401
                outb_p(0x00, ioaddr + EN0_RCNTLO);
402
                outb_p(0x00, ioaddr + EN0_RCNTHI);
403
                outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */
404
                mdelay(10);             /* wait 10ms for interrupt to propagate */
405
                outb_p(0x00, ioaddr + EN0_IMR);                 /* Mask it again. */
406
                dev->irq = probe_irq_off(cookie);
407
                if (ei_debug > 2)
408
                        printk(" autoirq is %d\n", dev->irq);
409
        } else if (dev->irq == 2)
410
                /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
411
                   or don't know which one to set. */
412
                dev->irq = 9;
413
 
414
        if (! dev->irq) {
415
                printk(" failed to detect IRQ line.\n");
416
                ret = -EAGAIN;
417
                goto err_out;
418
        }
419
 
420
        /* Allocate dev->priv and fill in 8390 specific dev fields. */
421
        if (ethdev_init(dev))
422
        {
423
                printk (" unable to get memory for dev->priv.\n");
424
                ret = -ENOMEM;
425
                goto err_out;
426
        }
427
 
428
        /* Snarf the interrupt now.  There's no point in waiting since we cannot
429
           share and the board will usually be enabled. */
430
        ret = request_irq(dev->irq, ei_interrupt, 0, name, dev);
431
        if (ret) {
432
                printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);
433
                goto err_out_kfree;
434
        }
435
 
436
        dev->base_addr = ioaddr;
437
 
438
        for(i = 0; i < ETHER_ADDR_LEN; i++) {
439
                printk(" %2.2x", SA_prom[i]);
440
                dev->dev_addr[i] = SA_prom[i];
441
        }
442
 
443
        printk("\n%s: %s found at %#x, using IRQ %d.\n",
444
                dev->name, name, ioaddr, dev->irq);
445
 
446
        ei_status.name = name;
447
        ei_status.tx_start_page = start_page;
448
        ei_status.stop_page = stop_page;
449
        ei_status.word16 = (wordlength == 2);
450
 
451
        ei_status.rx_start_page = start_page + TX_PAGES;
452
#ifdef PACKETBUF_MEMSIZE
453
         /* Allow the packet buffer size to be overridden by know-it-alls. */
454
        ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
455
#endif
456
 
457
        ei_status.reset_8390 = &ne_reset_8390;
458
        ei_status.block_input = &ne_block_input;
459
        ei_status.block_output = &ne_block_output;
460
        ei_status.get_8390_hdr = &ne_get_8390_hdr;
461
        ei_status.priv = 0;
462
        dev->open = &ne_open;
463
        dev->stop = &ne_close;
464
        NS8390_init(dev, 0);
465
        return 0;
466
 
467
err_out_kfree:
468
        kfree(dev->priv);
469
        dev->priv = NULL;
470
err_out:
471
        release_region(ioaddr, NE_IO_EXTENT);
472
        return ret;
473
}
474
 
475
static int ne_open(struct net_device *dev)
476
{
477
        ei_open(dev);
478
        return 0;
479
}
480
 
481
static int ne_close(struct net_device *dev)
482
{
483
        if (ei_debug > 1)
484
                printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
485
        ei_close(dev);
486
        return 0;
487
}
488
 
489
/* Hard reset the card.  This used to pause for the same period that a
490
   8390 reset command required, but that shouldn't be necessary. */
491
 
492
static void ne_reset_8390(struct net_device *dev)
493
{
494
        unsigned long reset_start_time = jiffies;
495
 
496
        if (ei_debug > 1)
497
                printk(KERN_DEBUG "resetting the 8390 t=%ld...", jiffies);
498
 
499
        /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
500
        outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
501
 
502
        ei_status.txing = 0;
503
        ei_status.dmaing = 0;
504
 
505
        /* This check _should_not_ be necessary, omit eventually. */
506
        while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
507
                if (jiffies - reset_start_time > 2*HZ/100) {
508
                        printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);
509
                        break;
510
                }
511
        outb_p(ENISR_RESET, NE_BASE + EN0_ISR); /* Ack intr. */
512
}
513
 
514
/* Grab the 8390 specific header. Similar to the block_input routine, but
515
   we don't need to be concerned with ring wrap as the header will be at
516
   the start of a page, so we optimize accordingly. */
517
 
518
static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
519
{
520
        int nic_base = dev->base_addr;
521
 
522
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
523
 
524
        if (ei_status.dmaing)
525
        {
526
                printk(KERN_EMERG "%s: DMAing conflict in ne_get_8390_hdr "
527
                        "[DMAstat:%d][irqlock:%d].\n",
528
                        dev->name, ei_status.dmaing, ei_status.irqlock);
529
                return;
530
        }
531
 
532
        ei_status.dmaing |= 0x01;
533
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
534
        outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
535
        outb_p(0, nic_base + EN0_RCNTHI);
536
        outb_p(0, nic_base + EN0_RSARLO);                /* On page boundary */
537
        outb_p(ring_page, nic_base + EN0_RSARHI);
538
        outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
539
 
540
        if (ei_status.word16)
541
                insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
542
        else
543
                insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
544
 
545
        outb_p(ENISR_RDC, nic_base + EN0_ISR);  /* Ack intr. */
546
        ei_status.dmaing &= ~0x01;
547
 
548
        le16_to_cpus(&hdr->count);
549
}
550
 
551
/* Block input and output, similar to the Crynwr packet driver.  If you
552
   are porting to a new ethercard, look at the packet driver source for hints.
553
   The NEx000 doesn't share the on-board packet memory -- you have to put
554
   the packet out through the "remote DMA" dataport using outb. */
555
 
556
static void ne_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
557
{
558
#ifdef NE_SANITY_CHECK
559
        int xfer_count = count;
560
#endif
561
        int nic_base = dev->base_addr;
562
        char *buf = skb->data;
563
 
564
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
565
        if (ei_status.dmaing)
566
        {
567
                printk(KERN_EMERG "%s: DMAing conflict in ne_block_input "
568
                        "[DMAstat:%d][irqlock:%d].\n",
569
                        dev->name, ei_status.dmaing, ei_status.irqlock);
570
                return;
571
        }
572
        ei_status.dmaing |= 0x01;
573
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
574
        outb_p(count & 0xff, nic_base + EN0_RCNTLO);
575
        outb_p(count >> 8, nic_base + EN0_RCNTHI);
576
        outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
577
        outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
578
        outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
579
        if (ei_status.word16)
580
        {
581
                insw(NE_BASE + NE_DATAPORT,buf,count>>1);
582
                if (count & 0x01)
583
                {
584
                        buf[count-1] = inb(NE_BASE + NE_DATAPORT);
585
#ifdef NE_SANITY_CHECK
586
                        xfer_count++;
587
#endif
588
                }
589
        } else {
590
                insb(NE_BASE + NE_DATAPORT, buf, count);
591
        }
592
 
593
#ifdef NE_SANITY_CHECK
594
        /* This was for the ALPHA version only, but enough people have
595
           been encountering problems so it is still here.  If you see
596
           this message you either 1) have a slightly incompatible clone
597
           or 2) have noise/speed problems with your bus. */
598
 
599
        if (ei_debug > 1)
600
        {
601
                /* DMA termination address check... */
602
                int addr, tries = 20;
603
                do {
604
                        /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
605
                           -- it's broken for Rx on some cards! */
606
                        int high = inb_p(nic_base + EN0_RSARHI);
607
                        int low = inb_p(nic_base + EN0_RSARLO);
608
                        addr = (high << 8) + low;
609
                        if (((ring_offset + xfer_count) & 0xff) == low)
610
                                break;
611
                } while (--tries > 0);
612
                if (tries <= 0)
613
                        printk(KERN_WARNING "%s: RX transfer address mismatch,"
614
                                "%#4.4x (expected) vs. %#4.4x (actual).\n",
615
                                dev->name, ring_offset + xfer_count, addr);
616
        }
617
#endif
618
        outb_p(ENISR_RDC, nic_base + EN0_ISR);  /* Ack intr. */
619
        ei_status.dmaing &= ~0x01;
620
}
621
 
622
static void ne_block_output(struct net_device *dev, int count,
623
                const unsigned char *buf, const int start_page)
624
{
625
        int nic_base = NE_BASE;
626
        unsigned long dma_start;
627
#ifdef NE_SANITY_CHECK
628
        int retries = 0;
629
#endif
630
 
631
        /* Round the count up for word writes.  Do we need to do this?
632
           What effect will an odd byte count have on the 8390?
633
           I should check someday. */
634
 
635
        if (ei_status.word16 && (count & 0x01))
636
                count++;
637
 
638
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
639
        if (ei_status.dmaing)
640
        {
641
                printk(KERN_EMERG "%s: DMAing conflict in ne_block_output."
642
                        "[DMAstat:%d][irqlock:%d]\n",
643
                        dev->name, ei_status.dmaing, ei_status.irqlock);
644
                return;
645
        }
646
        ei_status.dmaing |= 0x01;
647
        /* We should already be in page 0, but to be safe... */
648
        outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
649
 
650
#ifdef NE_SANITY_CHECK
651
retry:
652
#endif
653
 
654
#ifdef NE8390_RW_BUGFIX
655
        /* Handle the read-before-write bug the same way as the
656
           Crynwr packet driver -- the NatSemi method doesn't work.
657
           Actually this doesn't always work either, but if you have
658
           problems with your NEx000 this is better than nothing! */
659
 
660
        outb_p(0x42, nic_base + EN0_RCNTLO);
661
        outb_p(0x00,   nic_base + EN0_RCNTHI);
662
        outb_p(0x42, nic_base + EN0_RSARLO);
663
        outb_p(0x00, nic_base + EN0_RSARHI);
664
        outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
665
        /* Make certain that the dummy read has occurred. */
666
        udelay(6);
667
#endif
668
 
669
        outb_p(ENISR_RDC, nic_base + EN0_ISR);
670
 
671
        /* Now the normal output. */
672
        outb_p(count & 0xff, nic_base + EN0_RCNTLO);
673
        outb_p(count >> 8,   nic_base + EN0_RCNTHI);
674
        outb_p(0x00, nic_base + EN0_RSARLO);
675
        outb_p(start_page, nic_base + EN0_RSARHI);
676
 
677
        outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
678
        if (ei_status.word16) {
679
                outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
680
        } else {
681
                outsb(NE_BASE + NE_DATAPORT, buf, count);
682
        }
683
 
684
        dma_start = jiffies;
685
 
686
#ifdef NE_SANITY_CHECK
687
        /* This was for the ALPHA version only, but enough people have
688
           been encountering problems so it is still here. */
689
 
690
        if (ei_debug > 1)
691
        {
692
                /* DMA termination address check... */
693
                int addr, tries = 20;
694
                do {
695
                        int high = inb_p(nic_base + EN0_RSARHI);
696
                        int low = inb_p(nic_base + EN0_RSARLO);
697
                        addr = (high << 8) + low;
698
                        if ((start_page << 8) + count == addr)
699
                                break;
700
                } while (--tries > 0);
701
 
702
                if (tries <= 0)
703
                {
704
                        printk(KERN_WARNING "%s: Tx packet transfer address mismatch,"
705
                                "%#4.4x (expected) vs. %#4.4x (actual).\n",
706
                                dev->name, (start_page << 8) + count, addr);
707
                        if (retries++ == 0)
708
                                goto retry;
709
                }
710
        }
711
#endif
712
 
713
        while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
714
                if (jiffies - dma_start > 2*HZ/100) {           /* 20ms */
715
                        printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
716
                        ne_reset_8390(dev);
717
                        NS8390_init(dev,1);
718
                        break;
719
                }
720
 
721
        outb_p(ENISR_RDC, nic_base + EN0_ISR);  /* Ack intr. */
722
        ei_status.dmaing &= ~0x01;
723
        return;
724
}
725
 
726
 
727
#ifdef MODULE
728
#define MAX_NE_CARDS    4       /* Max number of NE cards per module */
729
static struct net_device dev_ne[MAX_NE_CARDS];
730
static int io[MAX_NE_CARDS];
731
static int irq[MAX_NE_CARDS];
732
static int bad[MAX_NE_CARDS];   /* 0xbad = bad sig or no reset ack */
733
 
734
MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
735
MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
736
MODULE_PARM(bad, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
737
MODULE_PARM_DESC(io, "I/O base address(es),required");
738
MODULE_PARM_DESC(irq, "IRQ number(s)");
739
MODULE_PARM_DESC(bad, "Accept card(s) with bad signatures");
740
MODULE_DESCRIPTION("NE1000/NE2000 ISA/PnP Ethernet driver");
741
MODULE_LICENSE("GPL");
742
 
743
/* This is set up so that no ISA autoprobe takes place. We can't guarantee
744
that the ne2k probe is the last 8390 based probe to take place (as it
745
is at boot) and so the probe will get confused by any other 8390 cards.
746
ISA device autoprobes on a running machine are not recommended anyway. */
747
 
748
int init_module(void)
749
{
750
        int this_dev, found = 0;
751
 
752
        for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
753
                struct net_device *dev = &dev_ne[this_dev];
754
                dev->irq = irq[this_dev];
755
                dev->mem_end = bad[this_dev];
756
                dev->base_addr = io[this_dev];
757
                dev->init = ne_probe;
758
                if (register_netdev(dev) == 0) {
759
                        found++;
760
                        continue;
761
                }
762
                if (found != 0) {        /* Got at least one. */
763
                        return 0;
764
                }
765
                if (io[this_dev] != 0)
766
                        printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]);
767
                else
768
                        printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
769
                return -ENXIO;
770
        }
771
        return 0;
772
}
773
 
774
void cleanup_module(void)
775
{
776
        int this_dev;
777
 
778
        for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
779
                struct net_device *dev = &dev_ne[this_dev];
780
                if (dev->priv != NULL) {
781
                        void *priv = dev->priv;
782
                        struct pci_dev *idev = (struct pci_dev *)ei_status.priv;
783
                        if (idev)
784
                                idev->deactivate(idev);
785
                        free_irq(dev->irq, dev);
786
                        release_region(dev->base_addr, NE_IO_EXTENT);
787
                        unregister_netdev(dev);
788
                        kfree(priv);
789
                }
790
        }
791
}
792
#endif /* MODULE */
793
 
794
 
795
/*
796
 * Local variables:
797
 *  compile-command: "gcc -DKERNEL -Wall -O6 -fomit-frame-pointer -I/usr/src/linux/net/tcp -c ne.c"
798
 *  version-control: t
799
 *  kept-new-versions: 5
800
 * End:
801
 */

powered by: WebSVN 2.1.0

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