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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [net/] [ne2k-pci.c] - Blame information for rev 1777

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1626 jcastillo
/* ne2k-pci.c: A NE2000 clone on PCI bus driver for Linux. */
2
/*
3
        A Linux device driver for PCI NE2000 clones.
4
 
5
        Authorship and other copyrights:
6
        1992-1998 by Donald Becker, NE2000 core and various modifications.
7
        1995-1998 by Paul Gortmaker, core modifications and PCI support.
8
 
9
        Copyright 1993 assigned to the United States Government as represented
10
        by the Director, National Security Agency.
11
 
12
        This software may be used and distributed according to the terms
13
        of the GNU Public License, incorporated herein by reference.
14
 
15
        The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
16
        Center of Excellence in Space Data and Information Sciences
17
        Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
18
 
19
        People are making PCI ne2000 clones! Oh the horror, the horror...
20
 
21
        Issues remaining:
22
        No full-duplex support.
23
*/
24
 
25
/* Our copyright info must remain in the binary. */
26
static const char *version =
27
"ne2k-pci.c:v0.99L 2/7/98 D. Becker/P. Gortmaker http://cesdis.gsfc.nasa.gov/linux/drivers/ne2k-pci.html\n";
28
 
29
#ifdef MODVERSIONS
30
#include <linux/modversions.h>
31
#endif
32
#include <linux/module.h>
33
#include <linux/kernel.h>
34
#include <linux/sched.h>
35
#include <linux/errno.h>
36
#include <linux/pci.h>
37
#include <linux/bios32.h>
38
#include <asm/system.h>
39
#include <asm/io.h>
40
#include <asm/irq.h>
41
 
42
#include <linux/netdevice.h>
43
#include <linux/etherdevice.h>
44
#include "8390.h"
45
 
46
/* Set statically or when loading the driver module. */
47
static int debug = 1;
48
 
49
/* Some defines that people can play with if so inclined. */
50
 
51
/* Do #define LOAD_8390_BY_KERNELD to automatically load 8390 support. */
52
#ifdef LOAD_8390_BY_KERNELD
53
#include <linux/kerneld.h>
54
#endif
55
/* Use 32 bit data-movement operations instead of 16 bit. */
56
#define USE_LONGIO
57
 
58
/* Do we implement the read before write bugfix ? */
59
/* #define NE_RW_BUGFIX */
60
 
61
/* Do we have a non std. amount of memory? (in units of 256 byte pages) */
62
/* #define PACKETBUF_MEMSIZE    0x40 */
63
 
64
static struct {
65
        unsigned short vendor, dev_id;
66
        char *name;
67
}
68
pci_clone_list[] = {
69
        {0x10ec, 0x8029, "RealTek RTL-8029"},
70
        {0x1050, 0x0940, "Winbond 89C940"},
71
        {0x11f6, 0x1401, "Compex RL2000"},
72
        {0x8e2e, 0x3000, "KTI ET32P2"},
73
        {0x4a14, 0x5000, "NetVin NV5000SC"},
74
        {0x1106, 0x0926, "Via 82C926"},
75
        {0,}
76
};
77
 
78
/* ---- No user-serviceable parts below ---- */
79
 
80
#define NE_BASE  (dev->base_addr)
81
#define NE_CMD          0x00
82
#define NE_DATAPORT     0x10    /* NatSemi-defined port window offset. */
83
#define NE_RESET        0x1f    /* Issue a read to reset, a write to clear. */
84
#define NE_IO_EXTENT    0x20
85
 
86
#define NESM_START_PG   0x40    /* First page of TX buffer */
87
#define NESM_STOP_PG    0x80    /* Last page +1 of RX ring */
88
 
89
int ne2k_pci_probe(struct device *dev);
90
static struct device *ne2k_pci_probe1(struct device *dev, int ioaddr, int irq);
91
 
92
static int ne_open(struct device *dev);
93
static int ne_close(struct device *dev);
94
 
95
static void ne_reset_8390(struct device *dev);
96
static void ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr,
97
                          int ring_page);
98
static void ne_block_input(struct device *dev, int count,
99
                          struct sk_buff *skb, int ring_offset);
100
static void ne_block_output(struct device *dev, const int count,
101
                const unsigned char *buf, const int start_page);
102
 
103
 
104
 
105
/* No room in the standard 8390 structure for extra info we need. */
106
struct ne2k_pci_card {
107
        struct ne2k_pci_card *next;
108
        struct device *dev;
109
        unsigned char pci_bus, pci_device_fn;
110
};
111
/* A list of all installed devices, for removing the driver module. */
112
static struct ne2k_pci_card *ne2k_card_list = NULL;
113
 
114
#ifdef LOAD_8390_BY_KERNELD
115
static int (*Lethdev_init)(struct device *dev);
116
static void (*LNS8390_init)(struct device *dev, int startp);
117
static int (*Lei_open)(struct device *dev);
118
static int (*Lei_close)(struct device *dev);
119
static void (*Lei_interrupt)(int irq, void *dev_id, struct pt_regs *regs);
120
#else
121
#define Lethdev_init ethdev_init
122
#define LNS8390_init NS8390_init
123
#define Lei_open ei_open
124
#define Lei_close ei_close
125
#define Lei_interrupt ei_interrupt
126
#endif
127
 
128
#ifdef MODULE
129
 
130
int
131
init_module(void)
132
{
133
        /* We must emit version information. */
134
        if (debug)
135
                printk(KERN_INFO "%s", version);
136
 
137
        return ne2k_pci_probe(0);
138
}
139
 
140
void
141
cleanup_module(void)
142
{
143
        struct device *dev;
144
        struct ne2k_pci_card *this_card;
145
 
146
        /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
147
        while (ne2k_card_list) {
148
                dev = ne2k_card_list->dev;
149
                unregister_netdev(dev);
150
                release_region(dev->base_addr, NE_IO_EXTENT);
151
                kfree(dev);
152
                this_card = ne2k_card_list;
153
                ne2k_card_list = ne2k_card_list->next;
154
                kfree(this_card);
155
        }
156
 
157
#ifdef LOAD_8390_BY_KERNELD
158
        release_module("8390", 0);
159
#endif
160
}
161
 
162
#endif  /* MODULE */
163
 
164
/*
165
  NEx000-clone boards have a Station Address (SA) PROM (SAPROM) in the packet
166
  buffer memory space.  By-the-spec NE2000 clones have 0x57,0x57 in bytes
167
  0x0e,0x0f of the SAPROM, while other supposed NE2000 clones must be
168
  detected by their SA prefix.
169
 
170
  Reading the SAPROM from a word-wide card with the 8390 set in byte-wide
171
  mode results in doubled values, which can be detected and compensated for.
172
 
173
  The probe is also responsible for initializing the card and filling
174
  in the 'dev' and 'ei_status' structures.
175
*/
176
 
177
#ifdef HAVE_DEVLIST
178
struct netdev_entry netcard_drv =
179
{"ne2k_pci", ne2k_pci_probe1, NE_IO_EXTENT, 0};
180
#endif
181
 
182
int ne2k_pci_probe(struct device *dev)
183
{
184
        static int pci_index = 0;        /* Static, for multiple calls. */
185
        int cards_found = 0;
186
        int i;
187
 
188
        if ( ! pcibios_present())
189
                return -ENODEV;
190
 
191
        for (;pci_index < 0xff; pci_index++) {
192
                unsigned char pci_bus, pci_device_fn;
193
                u8 pci_irq_line;
194
                u16 pci_command, new_command, vendor, device;
195
                u32 pci_ioaddr;
196
 
197
                if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pci_index,
198
                                                                &pci_bus, &pci_device_fn)
199
                        != PCIBIOS_SUCCESSFUL)
200
                        break;
201
                pcibios_read_config_word(pci_bus, pci_device_fn,
202
                                                                 PCI_VENDOR_ID, &vendor);
203
                pcibios_read_config_word(pci_bus, pci_device_fn,
204
                                                                 PCI_DEVICE_ID, &device);
205
 
206
                /* Note: some vendor IDs (RealTek) have non-NE2k cards as well. */
207
                for (i = 0; pci_clone_list[i].vendor != 0; i++)
208
                        if (pci_clone_list[i].vendor == vendor
209
                                && pci_clone_list[i].dev_id == device)
210
                                break;
211
                if (pci_clone_list[i].vendor == 0)
212
                        continue;
213
 
214
#ifndef MODULE
215
                {
216
                        static unsigned version_printed = 0;
217
                        if (version_printed++ == 0)
218
                                printk(KERN_INFO "%s", version);
219
                }
220
#endif
221
 
222
                pcibios_read_config_dword(pci_bus, pci_device_fn,
223
                                                                  PCI_BASE_ADDRESS_0, &pci_ioaddr);
224
                pcibios_read_config_byte(pci_bus, pci_device_fn,
225
                                                                 PCI_INTERRUPT_LINE, &pci_irq_line);
226
                pcibios_read_config_word(pci_bus, pci_device_fn,
227
                                                                 PCI_COMMAND, &pci_command);
228
 
229
                /* Remove I/O space marker in bit 0. */
230
                pci_ioaddr &= PCI_BASE_ADDRESS_IO_MASK;
231
 
232
                /* Avoid already found cards from previous calls */
233
                if (check_region(pci_ioaddr, NE_IO_EXTENT))
234
                        continue;
235
 
236
                /* Activate the card: fix for brain-damaged Win98 BIOSes. */
237
                new_command = pci_command | PCI_COMMAND_IO;
238
                if (pci_command != new_command) {
239
                        printk(KERN_INFO "  The PCI BIOS has not enabled this"
240
                                   " NE2k clone!  Updating PCI command %4.4x->%4.4x.\n",
241
                                   pci_command, new_command);
242
                        pcibios_write_config_word(pci_bus, pci_device_fn,
243
                                                                          PCI_COMMAND, new_command);
244
                }
245
 
246
                if (pci_irq_line <= 0 || pci_irq_line >= NR_IRQS)
247
                        printk(KERN_WARNING " WARNING: The PCI BIOS assigned this PCI NE2k"
248
                                   " card to IRQ %d, which is unlikely to work!.\n"
249
                                   KERN_WARNING " You should use the PCI BIOS setup to assign"
250
                                   " a valid IRQ line.\n", pci_irq_line);
251
 
252
                printk("ne2k-pci.c: PCI NE2000 clone '%s' at I/O %#x, IRQ %d.\n",
253
                           pci_clone_list[i].name, pci_ioaddr, pci_irq_line);
254
                dev = ne2k_pci_probe1(dev, pci_ioaddr, pci_irq_line);
255
                if (dev == 0) {
256
                        /* Should not happen. */
257
                        printk(KERN_ERR "ne2k-pci: Probe of PCI card at %#x failed.\n",
258
                                   pci_ioaddr);
259
                        continue;
260
                } else {
261
                        struct ne2k_pci_card *ne2k_card =
262
                                kmalloc(sizeof(struct ne2k_pci_card), GFP_KERNEL);
263
                        ne2k_card->next = ne2k_card_list;
264
                        ne2k_card_list = ne2k_card;
265
                        ne2k_card->dev = dev;
266
                        ne2k_card->pci_bus = pci_bus;
267
                        ne2k_card->pci_device_fn = pci_device_fn;
268
                }
269
                dev = 0;
270
 
271
                cards_found++;
272
        }
273
 
274
        return cards_found ? 0 : -ENODEV;
275
}
276
 
277
static struct device *ne2k_pci_probe1(struct device *dev, int ioaddr, int irq)
278
{
279
        int i;
280
        unsigned char SA_prom[32];
281
        const char *name = NULL;
282
        int start_page, stop_page;
283
        int reg0 = inb(ioaddr);
284
 
285
        if (reg0 == 0xFF)
286
                return 0;
287
 
288
        /* Do a preliminary verification that we have a 8390. */
289
        {
290
                int regd;
291
                outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
292
                regd = inb(ioaddr + 0x0d);
293
                outb(0xff, ioaddr + 0x0d);
294
                outb(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
295
                inb(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
296
                if (inb(ioaddr + EN0_COUNTER0) != 0) {
297
                        outb(reg0, ioaddr);
298
                        outb(regd, ioaddr + 0x0d);      /* Restore the old values. */
299
                        return 0;
300
                }
301
        }
302
 
303
        dev = init_etherdev(dev, 0);
304
 
305
        /* Reset card. Who knows what dain-bramaged state it was left in. */
306
        {
307
                unsigned long reset_start_time = jiffies;
308
 
309
                outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
310
 
311
                /* This looks like a horrible timing loop, but it should never take
312
                   more than a few cycles.
313
                */
314
                while ((inb(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
315
                        /* Limit wait: '2' avoids jiffy roll-over. */
316
                        if (jiffies - reset_start_time > 2) {
317
                                printk("ne2k-pci: Card failure (no reset ack).\n");
318
                                return 0;
319
                        }
320
 
321
                outb(0xff, ioaddr + EN0_ISR);           /* Ack all intr. */
322
        }
323
 
324
#if defined(LOAD_8390_BY_KERNELD)
325
        /* We are now certain the 8390 module is required. */
326
        if (request_module("8390")) {
327
                printk("ne2k-pci: Failed to load the 8390 core module.\n");
328
                return 0;
329
        }
330
        if ((Lethdev_init = (void*)get_module_symbol(0, "ethdev_init")) == 0 ||
331
                (LNS8390_init = (void*)get_module_symbol(0, "NS8390_init")) == 0 ||
332
                (Lei_open = (void*)get_module_symbol(0, "ei_open")) == 0 ||
333
                (Lei_close = (void*)get_module_symbol(0, "ei_close")) == 0 ||
334
                (Lei_interrupt = (void*)get_module_symbol(0, "ei_interrupt")) == 0 ) {
335
                printk("ne2k-pci: Failed to resolve an 8390 symbol.\n");
336
                release_module("8390", 0);
337
                return 0;
338
        }
339
#endif
340
 
341
        /* Read the 16 bytes of station address PROM.
342
           We must first initialize registers, similar to NS8390_init(eifdev, 0).
343
           We can't reliably read the SAPROM address without this.
344
           (I learned the hard way!). */
345
        {
346
                struct {unsigned char value, offset; } program_seq[] = {
347
                        {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
348
                        {0x49,  EN0_DCFG},      /* Set word-wide access. */
349
                        {0x00,  EN0_RCNTLO},    /* Clear the count regs. */
350
                        {0x00,  EN0_RCNTHI},
351
                        {0x00,  EN0_IMR},       /* Mask completion irq. */
352
                        {0xFF,  EN0_ISR},
353
                        {E8390_RXOFF, EN0_RXCR},        /* 0x20  Set to monitor */
354
                        {E8390_TXOFF, EN0_TXCR},        /* 0x02  and loopback mode. */
355
                        {32,    EN0_RCNTLO},
356
                        {0x00,  EN0_RCNTHI},
357
                        {0x00,  EN0_RSARLO},    /* DMA starting at 0x0000. */
358
                        {0x00,  EN0_RSARHI},
359
                        {E8390_RREAD+E8390_START, E8390_CMD},
360
                };
361
                for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
362
                        outb(program_seq[i].value, ioaddr + program_seq[i].offset);
363
 
364
        }
365
 
366
#ifdef notdef
367
        /* Some broken PCI cards don't respect the byte-wide
368
           request in program_seq above, and hence don't have doubled up values.
369
        */
370
        for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
371
                SA_prom[i] = inb(ioaddr + NE_DATAPORT);
372
                SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
373
                if (SA_prom[i] != SA_prom[i+1])
374
                        sa_prom_doubled = 0;
375
        }
376
 
377
        if (sa_prom_doubled)
378
                for (i = 0; i < 16; i++)
379
                        SA_prom[i] = SA_prom[i+i];
380
#else
381
        for(i = 0; i < 32 /*sizeof(SA_prom)*/; i++)
382
                SA_prom[i] = inb(ioaddr + NE_DATAPORT);
383
 
384
#endif
385
 
386
        /* We always set the 8390 registers for word mode. */
387
        outb(0x49, ioaddr + EN0_DCFG);
388
        start_page = NESM_START_PG;
389
        stop_page = NESM_STOP_PG;
390
 
391
        /* Set up the rest of the parameters. */
392
        name = "PCI NE2000";
393
 
394
        dev->irq = irq;
395
        dev->base_addr = ioaddr;
396
 
397
        /* Allocate dev->priv and fill in 8390 specific dev fields. */
398
        if (Lethdev_init(dev)) {
399
                printk ("%s: unable to get memory for dev->priv.\n", dev->name);
400
                return 0;
401
        }
402
 
403
        request_region(ioaddr, NE_IO_EXTENT, dev->name);
404
 
405
        printk("%s: %s found at %#x, IRQ %d, ",
406
                   dev->name, name, ioaddr, dev->irq);
407
        for(i = 0; i < 6; i++) {
408
                printk("%2.2X%s", SA_prom[i], i == 5 ? ".\n": ":");
409
                dev->dev_addr[i] = SA_prom[i];
410
        }
411
 
412
        ei_status.name = name;
413
        ei_status.tx_start_page = start_page;
414
        ei_status.stop_page = stop_page;
415
        ei_status.word16 = 1;
416
 
417
        ei_status.rx_start_page = start_page + TX_PAGES;
418
#ifdef PACKETBUF_MEMSIZE
419
        /* Allow the packet buffer size to be overridden by know-it-alls. */
420
        ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
421
#endif
422
 
423
        ei_status.reset_8390 = &ne_reset_8390;
424
        ei_status.block_input = &ne_block_input;
425
        ei_status.block_output = &ne_block_output;
426
        ei_status.get_8390_hdr = &ne_get_8390_hdr;
427
        dev->open = &ne_open;
428
        dev->stop = &ne_close;
429
        LNS8390_init(dev, 0);
430
        return dev;
431
}
432
 
433
static int
434
ne_open(struct device *dev)
435
{
436
        if (request_irq(dev->irq, Lei_interrupt, SA_SHIRQ, dev->name, dev))
437
                return -EAGAIN;
438
        Lei_open(dev);
439
        MOD_INC_USE_COUNT;
440
        return 0;
441
}
442
 
443
static int
444
ne_close(struct device *dev)
445
{
446
        Lei_close(dev);
447
        free_irq(dev->irq, dev);
448
        MOD_DEC_USE_COUNT;
449
        return 0;
450
}
451
 
452
/* Hard reset the card.  This used to pause for the same period that a
453
   8390 reset command required, but that shouldn't be necessary. */
454
static void
455
ne_reset_8390(struct device *dev)
456
{
457
        unsigned long reset_start_time = jiffies;
458
 
459
        if (debug > 1) printk("%s: Resetting the 8390 t=%ld...",
460
                                                  dev->name, jiffies);
461
 
462
        outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
463
 
464
        ei_status.txing = 0;
465
        ei_status.dmaing = 0;
466
 
467
        /* This check _should_not_ be necessary, omit eventually. */
468
        while ((inb(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
469
                if (jiffies - reset_start_time > 2) {
470
                        printk("%s: ne_reset_8390() did not complete.\n", dev->name);
471
                        break;
472
                }
473
        outb(ENISR_RESET, NE_BASE + EN0_ISR);   /* Ack intr. */
474
}
475
 
476
/* Grab the 8390 specific header. Similar to the block_input routine, but
477
   we don't need to be concerned with ring wrap as the header will be at
478
   the start of a page, so we optimize accordingly. */
479
 
480
static void
481
ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
482
{
483
 
484
        int nic_base = dev->base_addr;
485
 
486
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
487
        if (ei_status.dmaing) {
488
                printk("%s: DMAing conflict in ne_get_8390_hdr "
489
                           "[DMAstat:%d][irqlock:%d][intr:%d].\n",
490
                           dev->name, ei_status.dmaing, ei_status.irqlock,
491
                           dev->interrupt);
492
                return;
493
        }
494
 
495
        ei_status.dmaing |= 0x01;
496
        outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
497
        outb(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
498
        outb(0, nic_base + EN0_RCNTHI);
499
        outb(0, nic_base + EN0_RSARLO);          /* On page boundary */
500
        outb(ring_page, nic_base + EN0_RSARHI);
501
        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
502
 
503
#if defined(USE_LONGIO)
504
        *(u32*)hdr = inl(NE_BASE + NE_DATAPORT);
505
#else
506
        insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
507
#endif
508
 
509
        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
510
        ei_status.dmaing &= ~0x01;
511
}
512
 
513
/* Block input and output, similar to the Crynwr packet driver.  If you
514
   are porting to a new ethercard, look at the packet driver source for hints.
515
   The NEx000 doesn't share the on-board packet memory -- you have to put
516
   the packet out through the "remote DMA" dataport using outb. */
517
 
518
static void
519
ne_block_input(struct device *dev, int count, struct sk_buff *skb, int ring_offset)
520
{
521
        int nic_base = dev->base_addr;
522
        char *buf = skb->data;
523
 
524
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
525
        if (ei_status.dmaing) {
526
                printk("%s: DMAing conflict in ne_block_input "
527
                           "[DMAstat:%d][irqlock:%d][intr:%d].\n",
528
                           dev->name, ei_status.dmaing, ei_status.irqlock,
529
                           dev->interrupt);
530
                return;
531
        }
532
        ei_status.dmaing |= 0x01;
533
        outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
534
        outb(count & 0xff, nic_base + EN0_RCNTLO);
535
        outb(count >> 8, nic_base + EN0_RCNTHI);
536
        outb(ring_offset & 0xff, nic_base + EN0_RSARLO);
537
        outb(ring_offset >> 8, nic_base + EN0_RSARHI);
538
        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
539
 
540
#if defined(USE_LONGIO)
541
        insl(NE_BASE + NE_DATAPORT, buf, count>>2);
542
        if (count & 3) {
543
                buf += count & ~3;
544
                if (count & 2)
545
                        *((u16*)buf)++ = inw(NE_BASE + NE_DATAPORT);
546
                if (count & 1)
547
                        *buf = inb(NE_BASE + NE_DATAPORT);
548
        }
549
#else
550
        insw(NE_BASE + NE_DATAPORT,buf,count>>1);
551
        if (count & 0x01) {
552
                buf[count-1] = inb(NE_BASE + NE_DATAPORT);
553
        }
554
#endif
555
 
556
        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
557
        ei_status.dmaing &= ~0x01;
558
}
559
 
560
static void
561
ne_block_output(struct device *dev, int count,
562
                const unsigned char *buf, const int start_page)
563
{
564
        int nic_base = NE_BASE;
565
        unsigned long dma_start;
566
 
567
        /* On little-endian it's always safe to round the count up for
568
           word writes. */
569
        if (count & 0x01)
570
                count++;
571
 
572
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
573
        if (ei_status.dmaing) {
574
                printk("%s: DMAing conflict in ne_block_output."
575
                           "[DMAstat:%d][irqlock:%d][intr:%d]\n",
576
                           dev->name, ei_status.dmaing, ei_status.irqlock,
577
                           dev->interrupt);
578
                return;
579
        }
580
        ei_status.dmaing |= 0x01;
581
        /* We should already be in page 0, but to be safe... */
582
        outb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
583
 
584
#ifdef NE8390_RW_BUGFIX
585
        /* Handle the read-before-write bug the same way as the
586
           Crynwr packet driver -- the NatSemi method doesn't work.
587
           Actually this doesn't always work either, but if you have
588
           problems with your NEx000 this is better than nothing! */
589
        outb(0x42, nic_base + EN0_RCNTLO);
590
        outb(0x00, nic_base + EN0_RCNTHI);
591
        outb(0x42, nic_base + EN0_RSARLO);
592
        outb(0x00, nic_base + EN0_RSARHI);
593
        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
594
#endif
595
        outb(ENISR_RDC, nic_base + EN0_ISR);
596
 
597
   /* Now the normal output. */
598
        outb(count & 0xff, nic_base + EN0_RCNTLO);
599
        outb(count >> 8,   nic_base + EN0_RCNTHI);
600
        outb(0x00, nic_base + EN0_RSARLO);
601
        outb(start_page, nic_base + EN0_RSARHI);
602
        outb(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
603
#if defined(USE_LONGIO)
604
        outsl(NE_BASE + NE_DATAPORT, buf, count>>2);
605
        if (count & 3) {
606
                buf += count & ~3;
607
                if (count & 2)
608
                        outw(*((u16*)buf)++, NE_BASE + NE_DATAPORT);
609
        }
610
#else
611
        outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
612
#endif
613
 
614
        dma_start = jiffies;
615
 
616
        while ((inb(nic_base + EN0_ISR) & ENISR_RDC) == 0)
617
                if (jiffies - dma_start > 2) {                  /* Avoid clock roll-over. */
618
                        printk("%s: timeout waiting for Tx RDC.\n", dev->name);
619
                        ne_reset_8390(dev);
620
                        LNS8390_init(dev,1);
621
                        break;
622
                }
623
 
624
        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
625
        ei_status.dmaing &= ~0x01;
626
        return;
627
}
628
 
629
 
630
/*
631
 * Local variables:
632
 *  compile-command: "gcc -DMODVERSIONS  -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/ -c ne2k-pci.c"
633
 *  alt-compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/ -c ne2k-pci.c"
634
 *  c-indent-level: 4
635
 *  c-basic-offset: 4
636
 *  tab-width: 4
637
 *  version-control: t
638
 *  kept-new-versions: 5
639
 * End:
640
 */

powered by: WebSVN 2.1.0

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