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

Subversion Repositories test_project

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* ne2k-pci.c: A NE2000 clone on PCI bus driver for Linux. */
2
/*
3
        A Linux device driver for PCI NE2000 clones.
4
 
5
        Authors and other copyright holders:
6
        1992-2000 by Donald Becker, NE2000 core and various modifications.
7
        1995-1998 by Paul Gortmaker, core modifications and PCI support.
8
        Copyright 1993 assigned to the United States Government as represented
9
        by the Director, National Security Agency.
10
 
11
        This software may be used and distributed according to the terms of
12
        the GNU General Public License (GPL), incorporated herein by reference.
13
        Drivers based on or derived from this code fall under the GPL and must
14
        retain the authorship, copyright and license notice.  This file is not
15
        a complete program and may only be used when the entire operating
16
        system is licensed under the GPL.
17
 
18
        The author may be reached as becker@scyld.com, or C/O
19
        Scyld Computing Corporation
20
        410 Severn Ave., Suite 210
21
        Annapolis MD 21403
22
 
23
        Issues remaining:
24
        People are making PCI ne2000 clones! Oh the horror, the horror...
25
        Limited full-duplex support.
26
*/
27
 
28
#define DRV_NAME        "ne2k-pci"
29
#define DRV_VERSION     "1.03"
30
#define DRV_RELDATE     "9/22/2003"
31
 
32
 
33
/* The user-configurable values.
34
   These may be modified when a driver module is loaded.*/
35
 
36
static int debug = 1;                   /* 1 normal messages, 0 quiet .. 7 verbose. */
37
 
38
#define MAX_UNITS 8                             /* More are supported, limit only on options */
39
/* Used to pass the full-duplex flag, etc. */
40
static int full_duplex[MAX_UNITS];
41
static int options[MAX_UNITS];
42
 
43
/* Force a non std. amount of memory.  Units are 256 byte pages. */
44
/* #define PACKETBUF_MEMSIZE    0x40 */
45
 
46
 
47
#include <linux/module.h>
48
#include <linux/kernel.h>
49
#include <linux/errno.h>
50
#include <linux/pci.h>
51
#include <linux/init.h>
52
#include <linux/interrupt.h>
53
#include <linux/ethtool.h>
54
#include <linux/netdevice.h>
55
#include <linux/etherdevice.h>
56
 
57
#include <asm/system.h>
58
#include <asm/io.h>
59
#include <asm/irq.h>
60
#include <asm/uaccess.h>
61
 
62
#include "8390.h"
63
 
64
/* These identify the driver base version and may not be removed. */
65
static char version[] __devinitdata =
66
KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " D. Becker/P. Gortmaker\n";
67
 
68
#if defined(__powerpc__)
69
#define inl_le(addr)  le32_to_cpu(inl(addr))
70
#define inw_le(addr)  le16_to_cpu(inw(addr))
71
#endif
72
 
73
#define PFX DRV_NAME ": "
74
 
75
MODULE_AUTHOR("Donald Becker / Paul Gortmaker");
76
MODULE_DESCRIPTION("PCI NE2000 clone driver");
77
MODULE_LICENSE("GPL");
78
 
79
module_param(debug, int, 0);
80
module_param_array(options, int, NULL, 0);
81
module_param_array(full_duplex, int, NULL, 0);
82
MODULE_PARM_DESC(debug, "debug level (1-2)");
83
MODULE_PARM_DESC(options, "Bit 5: full duplex");
84
MODULE_PARM_DESC(full_duplex, "full duplex setting(s) (1)");
85
 
86
/* Some defines that people can play with if so inclined. */
87
 
88
/* Use 32 bit data-movement operations instead of 16 bit. */
89
#define USE_LONGIO
90
 
91
/* Do we implement the read before write bugfix ? */
92
/* #define NE_RW_BUGFIX */
93
 
94
/* Flags.  We rename an existing ei_status field to store flags! */
95
/* Thus only the low 8 bits are usable for non-init-time flags. */
96
#define ne2k_flags reg0
97
enum {
98
        ONLY_16BIT_IO=8, ONLY_32BIT_IO=4,       /* Chip can do only 16/32-bit xfers. */
99
        FORCE_FDX=0x20,                                         /* User override. */
100
        REALTEK_FDX=0x40, HOLTEK_FDX=0x80,
101
        STOP_PG_0x60=0x100,
102
};
103
 
104
enum ne2k_pci_chipsets {
105
        CH_RealTek_RTL_8029 = 0,
106
        CH_Winbond_89C940,
107
        CH_Compex_RL2000,
108
        CH_KTI_ET32P2,
109
        CH_NetVin_NV5000SC,
110
        CH_Via_86C926,
111
        CH_SureCom_NE34,
112
        CH_Winbond_W89C940F,
113
        CH_Holtek_HT80232,
114
        CH_Holtek_HT80229,
115
        CH_Winbond_89C940_8c4a,
116
};
117
 
118
 
119
static struct {
120
        char *name;
121
        int flags;
122
} pci_clone_list[] __devinitdata = {
123
        {"RealTek RTL-8029", REALTEK_FDX},
124
        {"Winbond 89C940", 0},
125
        {"Compex RL2000", 0},
126
        {"KTI ET32P2", 0},
127
        {"NetVin NV5000SC", 0},
128
        {"Via 86C926", ONLY_16BIT_IO},
129
        {"SureCom NE34", 0},
130
        {"Winbond W89C940F", 0},
131
        {"Holtek HT80232", ONLY_16BIT_IO | HOLTEK_FDX},
132
        {"Holtek HT80229", ONLY_32BIT_IO | HOLTEK_FDX | STOP_PG_0x60 },
133
        {"Winbond W89C940(misprogrammed)", 0},
134
        {NULL,}
135
};
136
 
137
 
138
static struct pci_device_id ne2k_pci_tbl[] = {
139
        { 0x10ec, 0x8029, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_RealTek_RTL_8029 },
140
        { 0x1050, 0x0940, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_89C940 },
141
        { 0x11f6, 0x1401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Compex_RL2000 },
142
        { 0x8e2e, 0x3000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_KTI_ET32P2 },
143
        { 0x4a14, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_NetVin_NV5000SC },
144
        { 0x1106, 0x0926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Via_86C926 },
145
        { 0x10bd, 0x0e34, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_SureCom_NE34 },
146
        { 0x1050, 0x5a5a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_W89C940F },
147
        { 0x12c3, 0x0058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Holtek_HT80232 },
148
        { 0x12c3, 0x5598, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Holtek_HT80229 },
149
        { 0x8c4a, 0x1980, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_89C940_8c4a },
150
        { 0, }
151
};
152
MODULE_DEVICE_TABLE(pci, ne2k_pci_tbl);
153
 
154
 
155
/* ---- No user-serviceable parts below ---- */
156
 
157
#define NE_BASE  (dev->base_addr)
158
#define NE_CMD          0x00
159
#define NE_DATAPORT     0x10    /* NatSemi-defined port window offset. */
160
#define NE_RESET        0x1f    /* Issue a read to reset, a write to clear. */
161
#define NE_IO_EXTENT    0x20
162
 
163
#define NESM_START_PG   0x40    /* First page of TX buffer */
164
#define NESM_STOP_PG    0x80    /* Last page +1 of RX ring */
165
 
166
 
167
static int ne2k_pci_open(struct net_device *dev);
168
static int ne2k_pci_close(struct net_device *dev);
169
 
170
static void ne2k_pci_reset_8390(struct net_device *dev);
171
static void ne2k_pci_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
172
                          int ring_page);
173
static void ne2k_pci_block_input(struct net_device *dev, int count,
174
                          struct sk_buff *skb, int ring_offset);
175
static void ne2k_pci_block_output(struct net_device *dev, const int count,
176
                const unsigned char *buf, const int start_page);
177
static const struct ethtool_ops ne2k_pci_ethtool_ops;
178
 
179
 
180
 
181
/* There is no room in the standard 8390 structure for extra info we need,
182
   so we build a meta/outer-wrapper structure.. */
183
struct ne2k_pci_card {
184
        struct net_device *dev;
185
        struct pci_dev *pci_dev;
186
};
187
 
188
 
189
 
190
/*
191
  NEx000-clone boards have a Station Address (SA) PROM (SAPROM) in the packet
192
  buffer memory space.  By-the-spec NE2000 clones have 0x57,0x57 in bytes
193
  0x0e,0x0f of the SAPROM, while other supposed NE2000 clones must be
194
  detected by their SA prefix.
195
 
196
  Reading the SAPROM from a word-wide card with the 8390 set in byte-wide
197
  mode results in doubled values, which can be detected and compensated for.
198
 
199
  The probe is also responsible for initializing the card and filling
200
  in the 'dev' and 'ei_status' structures.
201
*/
202
 
203
 
204
static int __devinit ne2k_pci_init_one (struct pci_dev *pdev,
205
                                     const struct pci_device_id *ent)
206
{
207
        struct net_device *dev;
208
        int i;
209
        unsigned char SA_prom[32];
210
        int start_page, stop_page;
211
        int irq, reg0, chip_idx = ent->driver_data;
212
        static unsigned int fnd_cnt;
213
        long ioaddr;
214
        int flags = pci_clone_list[chip_idx].flags;
215
        DECLARE_MAC_BUF(mac);
216
 
217
/* when built into the kernel, we only print version if device is found */
218
#ifndef MODULE
219
        static int printed_version;
220
        if (!printed_version++)
221
                printk(version);
222
#endif
223
 
224
        fnd_cnt++;
225
 
226
        i = pci_enable_device (pdev);
227
        if (i)
228
                return i;
229
 
230
        ioaddr = pci_resource_start (pdev, 0);
231
        irq = pdev->irq;
232
 
233
        if (!ioaddr || ((pci_resource_flags (pdev, 0) & IORESOURCE_IO) == 0)) {
234
                dev_err(&pdev->dev, "no I/O resource at PCI BAR #0\n");
235
                return -ENODEV;
236
        }
237
 
238
        if (request_region (ioaddr, NE_IO_EXTENT, DRV_NAME) == NULL) {
239
                dev_err(&pdev->dev, "I/O resource 0x%x @ 0x%lx busy\n",
240
                        NE_IO_EXTENT, ioaddr);
241
                return -EBUSY;
242
        }
243
 
244
        reg0 = inb(ioaddr);
245
        if (reg0 == 0xFF)
246
                goto err_out_free_res;
247
 
248
        /* Do a preliminary verification that we have a 8390. */
249
        {
250
                int regd;
251
                outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
252
                regd = inb(ioaddr + 0x0d);
253
                outb(0xff, ioaddr + 0x0d);
254
                outb(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
255
                inb(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
256
                if (inb(ioaddr + EN0_COUNTER0) != 0) {
257
                        outb(reg0, ioaddr);
258
                        outb(regd, ioaddr + 0x0d);      /* Restore the old values. */
259
                        goto err_out_free_res;
260
                }
261
        }
262
 
263
        /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */
264
        dev = alloc_ei_netdev();
265
        if (!dev) {
266
                dev_err(&pdev->dev, "cannot allocate ethernet device\n");
267
                goto err_out_free_res;
268
        }
269
        SET_NETDEV_DEV(dev, &pdev->dev);
270
 
271
        /* Reset card. Who knows what dain-bramaged state it was left in. */
272
        {
273
                unsigned long reset_start_time = jiffies;
274
 
275
                outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
276
 
277
                /* This looks like a horrible timing loop, but it should never take
278
                   more than a few cycles.
279
                */
280
                while ((inb(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
281
                        /* Limit wait: '2' avoids jiffy roll-over. */
282
                        if (jiffies - reset_start_time > 2) {
283
                                dev_err(&pdev->dev,
284
                                        "Card failure (no reset ack).\n");
285
                                goto err_out_free_netdev;
286
                        }
287
 
288
                outb(0xff, ioaddr + EN0_ISR);           /* Ack all intr. */
289
        }
290
 
291
        /* Read the 16 bytes of station address PROM.
292
           We must first initialize registers, similar to NS8390_init(eifdev, 0).
293
           We can't reliably read the SAPROM address without this.
294
           (I learned the hard way!). */
295
        {
296
                struct {unsigned char value, offset; } program_seq[] = {
297
                        {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
298
                        {0x49,  EN0_DCFG},      /* Set word-wide access. */
299
                        {0x00,  EN0_RCNTLO},    /* Clear the count regs. */
300
                        {0x00,  EN0_RCNTHI},
301
                        {0x00,  EN0_IMR},       /* Mask completion irq. */
302
                        {0xFF,  EN0_ISR},
303
                        {E8390_RXOFF, EN0_RXCR},        /* 0x20  Set to monitor */
304
                        {E8390_TXOFF, EN0_TXCR},        /* 0x02  and loopback mode. */
305
                        {32,    EN0_RCNTLO},
306
                        {0x00,  EN0_RCNTHI},
307
                        {0x00,  EN0_RSARLO},    /* DMA starting at 0x0000. */
308
                        {0x00,  EN0_RSARHI},
309
                        {E8390_RREAD+E8390_START, E8390_CMD},
310
                };
311
                for (i = 0; i < ARRAY_SIZE(program_seq); i++)
312
                        outb(program_seq[i].value, ioaddr + program_seq[i].offset);
313
 
314
        }
315
 
316
        /* Note: all PCI cards have at least 16 bit access, so we don't have
317
           to check for 8 bit cards.  Most cards permit 32 bit access. */
318
        if (flags & ONLY_32BIT_IO) {
319
                for (i = 0; i < 4 ; i++)
320
                        ((u32 *)SA_prom)[i] = le32_to_cpu(inl(ioaddr + NE_DATAPORT));
321
        } else
322
                for(i = 0; i < 32 /*sizeof(SA_prom)*/; i++)
323
                        SA_prom[i] = inb(ioaddr + NE_DATAPORT);
324
 
325
        /* We always set the 8390 registers for word mode. */
326
        outb(0x49, ioaddr + EN0_DCFG);
327
        start_page = NESM_START_PG;
328
 
329
        stop_page = flags & STOP_PG_0x60 ? 0x60 : NESM_STOP_PG;
330
 
331
        /* Set up the rest of the parameters. */
332
        dev->irq = irq;
333
        dev->base_addr = ioaddr;
334
        pci_set_drvdata(pdev, dev);
335
 
336
        ei_status.name = pci_clone_list[chip_idx].name;
337
        ei_status.tx_start_page = start_page;
338
        ei_status.stop_page = stop_page;
339
        ei_status.word16 = 1;
340
        ei_status.ne2k_flags = flags;
341
        if (fnd_cnt < MAX_UNITS) {
342
                if (full_duplex[fnd_cnt] > 0  ||  (options[fnd_cnt] & FORCE_FDX))
343
                        ei_status.ne2k_flags |= FORCE_FDX;
344
        }
345
 
346
        ei_status.rx_start_page = start_page + TX_PAGES;
347
#ifdef PACKETBUF_MEMSIZE
348
        /* Allow the packet buffer size to be overridden by know-it-alls. */
349
        ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
350
#endif
351
 
352
        ei_status.reset_8390 = &ne2k_pci_reset_8390;
353
        ei_status.block_input = &ne2k_pci_block_input;
354
        ei_status.block_output = &ne2k_pci_block_output;
355
        ei_status.get_8390_hdr = &ne2k_pci_get_8390_hdr;
356
        ei_status.priv = (unsigned long) pdev;
357
        dev->open = &ne2k_pci_open;
358
        dev->stop = &ne2k_pci_close;
359
        dev->ethtool_ops = &ne2k_pci_ethtool_ops;
360
#ifdef CONFIG_NET_POLL_CONTROLLER
361
        dev->poll_controller = ei_poll;
362
#endif
363
        NS8390_init(dev, 0);
364
 
365
        i = register_netdev(dev);
366
        if (i)
367
                goto err_out_free_netdev;
368
 
369
        for(i = 0; i < 6; i++)
370
                dev->dev_addr[i] = SA_prom[i];
371
        printk("%s: %s found at %#lx, IRQ %d, %s.\n",
372
               dev->name, pci_clone_list[chip_idx].name, ioaddr, dev->irq,
373
               print_mac(mac, dev->dev_addr));
374
 
375
        memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
376
 
377
        return 0;
378
 
379
err_out_free_netdev:
380
        free_netdev (dev);
381
err_out_free_res:
382
        release_region (ioaddr, NE_IO_EXTENT);
383
        pci_set_drvdata (pdev, NULL);
384
        return -ENODEV;
385
 
386
}
387
 
388
/*
389
 * Magic incantation sequence for full duplex on the supported cards.
390
 */
391
static inline int set_realtek_fdx(struct net_device *dev)
392
{
393
        long ioaddr = dev->base_addr;
394
 
395
        outb(0xC0 + E8390_NODMA, ioaddr + NE_CMD); /* Page 3 */
396
        outb(0xC0, ioaddr + 0x01); /* Enable writes to CONFIG3 */
397
        outb(0x40, ioaddr + 0x06); /* Enable full duplex */
398
        outb(0x00, ioaddr + 0x01); /* Disable writes to CONFIG3 */
399
        outb(E8390_PAGE0 + E8390_NODMA, ioaddr + NE_CMD); /* Page 0 */
400
        return 0;
401
}
402
 
403
static inline int set_holtek_fdx(struct net_device *dev)
404
{
405
        long ioaddr = dev->base_addr;
406
 
407
        outb(inb(ioaddr + 0x20) | 0x80, ioaddr + 0x20);
408
        return 0;
409
}
410
 
411
static int ne2k_pci_set_fdx(struct net_device *dev)
412
{
413
        if (ei_status.ne2k_flags & REALTEK_FDX)
414
                return set_realtek_fdx(dev);
415
        else if (ei_status.ne2k_flags & HOLTEK_FDX)
416
                return set_holtek_fdx(dev);
417
 
418
        return -EOPNOTSUPP;
419
}
420
 
421
static int ne2k_pci_open(struct net_device *dev)
422
{
423
        int ret = request_irq(dev->irq, ei_interrupt, IRQF_SHARED, dev->name, dev);
424
        if (ret)
425
                return ret;
426
 
427
        if (ei_status.ne2k_flags & FORCE_FDX)
428
                ne2k_pci_set_fdx(dev);
429
 
430
        ei_open(dev);
431
        return 0;
432
}
433
 
434
static int ne2k_pci_close(struct net_device *dev)
435
{
436
        ei_close(dev);
437
        free_irq(dev->irq, dev);
438
        return 0;
439
}
440
 
441
/* Hard reset the card.  This used to pause for the same period that a
442
   8390 reset command required, but that shouldn't be necessary. */
443
static void ne2k_pci_reset_8390(struct net_device *dev)
444
{
445
        unsigned long reset_start_time = jiffies;
446
 
447
        if (debug > 1) printk("%s: Resetting the 8390 t=%ld...",
448
                                                  dev->name, jiffies);
449
 
450
        outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
451
 
452
        ei_status.txing = 0;
453
        ei_status.dmaing = 0;
454
 
455
        /* This check _should_not_ be necessary, omit eventually. */
456
        while ((inb(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
457
                if (jiffies - reset_start_time > 2) {
458
                        printk("%s: ne2k_pci_reset_8390() did not complete.\n", dev->name);
459
                        break;
460
                }
461
        outb(ENISR_RESET, NE_BASE + EN0_ISR);   /* Ack intr. */
462
}
463
 
464
/* Grab the 8390 specific header. Similar to the block_input routine, but
465
   we don't need to be concerned with ring wrap as the header will be at
466
   the start of a page, so we optimize accordingly. */
467
 
468
static void ne2k_pci_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
469
{
470
 
471
        long nic_base = dev->base_addr;
472
 
473
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
474
        if (ei_status.dmaing) {
475
                printk("%s: DMAing conflict in ne2k_pci_get_8390_hdr "
476
                           "[DMAstat:%d][irqlock:%d].\n",
477
                           dev->name, ei_status.dmaing, ei_status.irqlock);
478
                return;
479
        }
480
 
481
        ei_status.dmaing |= 0x01;
482
        outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
483
        outb(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
484
        outb(0, nic_base + EN0_RCNTHI);
485
        outb(0, nic_base + EN0_RSARLO);          /* On page boundary */
486
        outb(ring_page, nic_base + EN0_RSARHI);
487
        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
488
 
489
        if (ei_status.ne2k_flags & ONLY_16BIT_IO) {
490
                insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
491
        } else {
492
                *(u32*)hdr = le32_to_cpu(inl(NE_BASE + NE_DATAPORT));
493
                le16_to_cpus(&hdr->count);
494
        }
495
 
496
        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
497
        ei_status.dmaing &= ~0x01;
498
}
499
 
500
/* Block input and output, similar to the Crynwr packet driver.  If you
501
   are porting to a new ethercard, look at the packet driver source for hints.
502
   The NEx000 doesn't share the on-board packet memory -- you have to put
503
   the packet out through the "remote DMA" dataport using outb. */
504
 
505
static void ne2k_pci_block_input(struct net_device *dev, int count,
506
                                 struct sk_buff *skb, int ring_offset)
507
{
508
        long nic_base = dev->base_addr;
509
        char *buf = skb->data;
510
 
511
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
512
        if (ei_status.dmaing) {
513
                printk("%s: DMAing conflict in ne2k_pci_block_input "
514
                           "[DMAstat:%d][irqlock:%d].\n",
515
                           dev->name, ei_status.dmaing, ei_status.irqlock);
516
                return;
517
        }
518
        ei_status.dmaing |= 0x01;
519
        if (ei_status.ne2k_flags & ONLY_32BIT_IO)
520
                count = (count + 3) & 0xFFFC;
521
        outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
522
        outb(count & 0xff, nic_base + EN0_RCNTLO);
523
        outb(count >> 8, nic_base + EN0_RCNTHI);
524
        outb(ring_offset & 0xff, nic_base + EN0_RSARLO);
525
        outb(ring_offset >> 8, nic_base + EN0_RSARHI);
526
        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
527
 
528
        if (ei_status.ne2k_flags & ONLY_16BIT_IO) {
529
                insw(NE_BASE + NE_DATAPORT,buf,count>>1);
530
                if (count & 0x01) {
531
                        buf[count-1] = inb(NE_BASE + NE_DATAPORT);
532
                }
533
        } else {
534
                insl(NE_BASE + NE_DATAPORT, buf, count>>2);
535
                if (count & 3) {
536
                        buf += count & ~3;
537
                        if (count & 2) {
538
                                u16 *b = (u16 *)buf;
539
 
540
                                *b++ = le16_to_cpu(inw(NE_BASE + NE_DATAPORT));
541
                                buf = (char *)b;
542
                        }
543
                        if (count & 1)
544
                                *buf = inb(NE_BASE + NE_DATAPORT);
545
                }
546
        }
547
 
548
        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
549
        ei_status.dmaing &= ~0x01;
550
}
551
 
552
static void ne2k_pci_block_output(struct net_device *dev, int count,
553
                                  const unsigned char *buf, const int start_page)
554
{
555
        long nic_base = NE_BASE;
556
        unsigned long dma_start;
557
 
558
        /* On little-endian it's always safe to round the count up for
559
           word writes. */
560
        if (ei_status.ne2k_flags & ONLY_32BIT_IO)
561
                count = (count + 3) & 0xFFFC;
562
        else
563
                if (count & 0x01)
564
                        count++;
565
 
566
        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
567
        if (ei_status.dmaing) {
568
                printk("%s: DMAing conflict in ne2k_pci_block_output."
569
                           "[DMAstat:%d][irqlock:%d]\n",
570
                           dev->name, ei_status.dmaing, ei_status.irqlock);
571
                return;
572
        }
573
        ei_status.dmaing |= 0x01;
574
        /* We should already be in page 0, but to be safe... */
575
        outb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
576
 
577
#ifdef NE8390_RW_BUGFIX
578
        /* Handle the read-before-write bug the same way as the
579
           Crynwr packet driver -- the NatSemi method doesn't work.
580
           Actually this doesn't always work either, but if you have
581
           problems with your NEx000 this is better than nothing! */
582
        outb(0x42, nic_base + EN0_RCNTLO);
583
        outb(0x00, nic_base + EN0_RCNTHI);
584
        outb(0x42, nic_base + EN0_RSARLO);
585
        outb(0x00, nic_base + EN0_RSARHI);
586
        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
587
#endif
588
        outb(ENISR_RDC, nic_base + EN0_ISR);
589
 
590
   /* Now the normal output. */
591
        outb(count & 0xff, nic_base + EN0_RCNTLO);
592
        outb(count >> 8,   nic_base + EN0_RCNTHI);
593
        outb(0x00, nic_base + EN0_RSARLO);
594
        outb(start_page, nic_base + EN0_RSARHI);
595
        outb(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
596
        if (ei_status.ne2k_flags & ONLY_16BIT_IO) {
597
                outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
598
        } else {
599
                outsl(NE_BASE + NE_DATAPORT, buf, count>>2);
600
                if (count & 3) {
601
                        buf += count & ~3;
602
                        if (count & 2) {
603
                                u16 *b = (u16 *)buf;
604
 
605
                                outw(cpu_to_le16(*b++), NE_BASE + NE_DATAPORT);
606
                                buf = (char *)b;
607
                        }
608
                }
609
        }
610
 
611
        dma_start = jiffies;
612
 
613
        while ((inb(nic_base + EN0_ISR) & ENISR_RDC) == 0)
614
                if (jiffies - dma_start > 2) {                  /* Avoid clock roll-over. */
615
                        printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
616
                        ne2k_pci_reset_8390(dev);
617
                        NS8390_init(dev,1);
618
                        break;
619
                }
620
 
621
        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
622
        ei_status.dmaing &= ~0x01;
623
        return;
624
}
625
 
626
static void ne2k_pci_get_drvinfo(struct net_device *dev,
627
                                 struct ethtool_drvinfo *info)
628
{
629
        struct ei_device *ei = dev->priv;
630
        struct pci_dev *pci_dev = (struct pci_dev *) ei->priv;
631
 
632
        strcpy(info->driver, DRV_NAME);
633
        strcpy(info->version, DRV_VERSION);
634
        strcpy(info->bus_info, pci_name(pci_dev));
635
}
636
 
637
static const struct ethtool_ops ne2k_pci_ethtool_ops = {
638
        .get_drvinfo            = ne2k_pci_get_drvinfo,
639
};
640
 
641
static void __devexit ne2k_pci_remove_one (struct pci_dev *pdev)
642
{
643
        struct net_device *dev = pci_get_drvdata(pdev);
644
 
645
        BUG_ON(!dev);
646
        unregister_netdev(dev);
647
        release_region(dev->base_addr, NE_IO_EXTENT);
648
        free_netdev(dev);
649
        pci_disable_device(pdev);
650
        pci_set_drvdata(pdev, NULL);
651
}
652
 
653
#ifdef CONFIG_PM
654
static int ne2k_pci_suspend (struct pci_dev *pdev, pm_message_t state)
655
{
656
        struct net_device *dev = pci_get_drvdata (pdev);
657
 
658
        netif_device_detach(dev);
659
        pci_save_state(pdev);
660
        pci_disable_device(pdev);
661
        pci_set_power_state(pdev, pci_choose_state(pdev, state));
662
 
663
        return 0;
664
}
665
 
666
static int ne2k_pci_resume (struct pci_dev *pdev)
667
{
668
        struct net_device *dev = pci_get_drvdata (pdev);
669
        int rc;
670
 
671
        pci_set_power_state(pdev, 0);
672
        pci_restore_state(pdev);
673
 
674
        rc = pci_enable_device(pdev);
675
        if (rc)
676
                return rc;
677
 
678
        NS8390_init(dev, 1);
679
        netif_device_attach(dev);
680
 
681
        return 0;
682
}
683
 
684
#endif /* CONFIG_PM */
685
 
686
 
687
static struct pci_driver ne2k_driver = {
688
        .name           = DRV_NAME,
689
        .probe          = ne2k_pci_init_one,
690
        .remove         = __devexit_p(ne2k_pci_remove_one),
691
        .id_table       = ne2k_pci_tbl,
692
#ifdef CONFIG_PM
693
        .suspend        = ne2k_pci_suspend,
694
        .resume         = ne2k_pci_resume,
695
#endif /* CONFIG_PM */
696
 
697
};
698
 
699
 
700
static int __init ne2k_pci_init(void)
701
{
702
/* when a module, this is printed whether or not devices are found in probe */
703
#ifdef MODULE
704
        printk(version);
705
#endif
706
        return pci_register_driver(&ne2k_driver);
707
}
708
 
709
 
710
static void __exit ne2k_pci_cleanup(void)
711
{
712
        pci_unregister_driver (&ne2k_driver);
713
}
714
 
715
module_init(ne2k_pci_init);
716
module_exit(ne2k_pci_cleanup);

powered by: WebSVN 2.1.0

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