linux-bk/drivers/net/ne2k-pci.c
<<
>>
Prefs
   1/* 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
  36static 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. */
  40static int full_duplex[MAX_UNITS];
  41static 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. */
  65static char version[] __devinitdata =
  66KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " D. Becker/P. Gortmaker\n"
  67KERN_INFO "  http://www.scyld.com/network/ne2k-pci.html\n";
  68
  69#if defined(__powerpc__)
  70#define inl_le(addr)  le32_to_cpu(inl(addr))
  71#define inw_le(addr)  le16_to_cpu(inw(addr))
  72#define insl insl_ns
  73#define outsl outsl_ns
  74#endif
  75
  76#define PFX DRV_NAME ": "
  77
  78MODULE_AUTHOR("Donald Becker / Paul Gortmaker");
  79MODULE_DESCRIPTION("PCI NE2000 clone driver");
  80MODULE_LICENSE("GPL");
  81
  82MODULE_PARM(debug, "i");
  83MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
  84MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
  85MODULE_PARM_DESC(debug, "debug level (1-2)");
  86MODULE_PARM_DESC(options, "Bit 5: full duplex");
  87MODULE_PARM_DESC(full_duplex, "full duplex setting(s) (1)");
  88
  89/* Some defines that people can play with if so inclined. */
  90
  91/* Use 32 bit data-movement operations instead of 16 bit. */
  92#define USE_LONGIO
  93
  94/* Do we implement the read before write bugfix ? */
  95/* #define NE_RW_BUGFIX */
  96
  97/* Flags.  We rename an existing ei_status field to store flags! */
  98/* Thus only the low 8 bits are usable for non-init-time flags. */
  99#define ne2k_flags reg0
 100enum {
 101        ONLY_16BIT_IO=8, ONLY_32BIT_IO=4,       /* Chip can do only 16/32-bit xfers. */
 102        FORCE_FDX=0x20,                                         /* User override. */
 103        REALTEK_FDX=0x40, HOLTEK_FDX=0x80,
 104        STOP_PG_0x60=0x100,
 105};
 106
 107enum ne2k_pci_chipsets {
 108        CH_RealTek_RTL_8029 = 0,
 109        CH_Winbond_89C940,
 110        CH_Compex_RL2000,
 111        CH_KTI_ET32P2,
 112        CH_NetVin_NV5000SC,
 113        CH_Via_86C926,
 114        CH_SureCom_NE34,
 115        CH_Winbond_W89C940F,
 116        CH_Holtek_HT80232,
 117        CH_Holtek_HT80229,
 118};
 119
 120
 121static struct {
 122        char *name;
 123        int flags;
 124} pci_clone_list[] __devinitdata = {
 125        {"RealTek RTL-8029", REALTEK_FDX},
 126        {"Winbond 89C940", 0},
 127        {"Compex RL2000", 0},
 128        {"KTI ET32P2", 0},
 129        {"NetVin NV5000SC", 0},
 130        {"Via 86C926", ONLY_16BIT_IO},
 131        {"SureCom NE34", 0},
 132        {"Winbond W89C940F", 0},
 133        {"Holtek HT80232", ONLY_16BIT_IO | HOLTEK_FDX},
 134        {"Holtek HT80229", ONLY_32BIT_IO | HOLTEK_FDX | STOP_PG_0x60 },
 135        {0,}
 136};
 137
 138
 139static struct pci_device_id ne2k_pci_tbl[] = {
 140        { 0x10ec, 0x8029, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_RealTek_RTL_8029 },
 141        { 0x1050, 0x0940, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_89C940 },
 142        { 0x11f6, 0x1401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Compex_RL2000 },
 143        { 0x8e2e, 0x3000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_KTI_ET32P2 },
 144        { 0x4a14, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_NetVin_NV5000SC },
 145        { 0x1106, 0x0926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Via_86C926 },
 146        { 0x10bd, 0x0e34, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_SureCom_NE34 },
 147        { 0x1050, 0x5a5a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_W89C940F },
 148        { 0x12c3, 0x0058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Holtek_HT80232 },
 149        { 0x12c3, 0x5598, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Holtek_HT80229 },
 150        { 0, }
 151};
 152MODULE_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
 167static int ne2k_pci_open(struct net_device *dev);
 168static int ne2k_pci_close(struct net_device *dev);
 169
 170static void ne2k_pci_reset_8390(struct net_device *dev);
 171static void ne2k_pci_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
 172                          int ring_page);
 173static void ne2k_pci_block_input(struct net_device *dev, int count,
 174                          struct sk_buff *skb, int ring_offset);
 175static void ne2k_pci_block_output(struct net_device *dev, const int count,
 176                const unsigned char *buf, const int start_page);
 177static 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.. */
 183struct 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
 204static 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
 216/* when built into the kernel, we only print version if device is found */
 217#ifndef MODULE
 218        static int printed_version;
 219        if (!printed_version++)
 220                printk(version);
 221#endif
 222
 223        fnd_cnt++;
 224
 225        i = pci_enable_device (pdev);
 226        if (i)
 227                return i;
 228
 229        ioaddr = pci_resource_start (pdev, 0);
 230        irq = pdev->irq;
 231
 232        if (!ioaddr || ((pci_resource_flags (pdev, 0) & IORESOURCE_IO) == 0)) {
 233                printk (KERN_ERR PFX "no I/O resource at PCI BAR #0\n");
 234                return -ENODEV;
 235        }
 236
 237        if (request_region (ioaddr, NE_IO_EXTENT, DRV_NAME) == NULL) {
 238                printk (KERN_ERR PFX "I/O resource 0x%x @ 0x%lx busy\n",
 239                        NE_IO_EXTENT, ioaddr);
 240                return -EBUSY;
 241        }
 242
 243        reg0 = inb(ioaddr);
 244        if (reg0 == 0xFF)
 245                goto err_out_free_res;
 246
 247        /* Do a preliminary verification that we have a 8390. */
 248        {
 249                int regd;
 250                outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
 251                regd = inb(ioaddr + 0x0d);
 252                outb(0xff, ioaddr + 0x0d);
 253                outb(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
 254                inb(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
 255                if (inb(ioaddr + EN0_COUNTER0) != 0) {
 256                        outb(reg0, ioaddr);
 257                        outb(regd, ioaddr + 0x0d);      /* Restore the old values. */
 258                        goto err_out_free_res;
 259                }
 260        }
 261
 262        /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */
 263        dev = alloc_ei_netdev();
 264        if (!dev) {
 265                printk (KERN_ERR PFX "cannot allocate ethernet device\n");
 266                goto err_out_free_res;
 267        }
 268        SET_MODULE_OWNER(dev);
 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                                printk(KERN_ERR PFX "Card failure (no reset ack).\n");
 284                                goto err_out_free_netdev;
 285                        }
 286
 287                outb(0xff, ioaddr + EN0_ISR);           /* Ack all intr. */
 288        }
 289
 290        /* Read the 16 bytes of station address PROM.
 291           We must first initialize registers, similar to NS8390_init(eifdev, 0).
 292           We can't reliably read the SAPROM address without this.
 293           (I learned the hard way!). */
 294        {
 295                struct {unsigned char value, offset; } program_seq[] = {
 296                        {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
 297                        {0x49,  EN0_DCFG},      /* Set word-wide access. */
 298                        {0x00,  EN0_RCNTLO},    /* Clear the count regs. */
 299                        {0x00,  EN0_RCNTHI},
 300                        {0x00,  EN0_IMR},       /* Mask completion irq. */
 301                        {0xFF,  EN0_ISR},
 302                        {E8390_RXOFF, EN0_RXCR},        /* 0x20  Set to monitor */
 303                        {E8390_TXOFF, EN0_TXCR},        /* 0x02  and loopback mode. */
 304                        {32,    EN0_RCNTLO},
 305                        {0x00,  EN0_RCNTHI},
 306                        {0x00,  EN0_RSARLO},    /* DMA starting at 0x0000. */
 307                        {0x00,  EN0_RSARHI},
 308                        {E8390_RREAD+E8390_START, E8390_CMD},
 309                };
 310                for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
 311                        outb(program_seq[i].value, ioaddr + program_seq[i].offset);
 312
 313        }
 314
 315        /* Note: all PCI cards have at least 16 bit access, so we don't have
 316           to check for 8 bit cards.  Most cards permit 32 bit access. */
 317        if (flags & ONLY_32BIT_IO) {
 318                for (i = 0; i < 4 ; i++)
 319                        ((u32 *)SA_prom)[i] = le32_to_cpu(inl(ioaddr + NE_DATAPORT));
 320        } else
 321                for(i = 0; i < 32 /*sizeof(SA_prom)*/; i++)
 322                        SA_prom[i] = inb(ioaddr + NE_DATAPORT);
 323
 324        /* We always set the 8390 registers for word mode. */
 325        outb(0x49, ioaddr + EN0_DCFG);
 326        start_page = NESM_START_PG;
 327
 328        stop_page = flags & STOP_PG_0x60 ? 0x60 : NESM_STOP_PG;
 329
 330        /* Set up the rest of the parameters. */
 331        dev->irq = irq;
 332        dev->base_addr = ioaddr;
 333        pci_set_drvdata(pdev, dev);
 334
 335        ei_status.name = pci_clone_list[chip_idx].name;
 336        ei_status.tx_start_page = start_page;
 337        ei_status.stop_page = stop_page;
 338        ei_status.word16 = 1;
 339        ei_status.ne2k_flags = flags;
 340        if (fnd_cnt < MAX_UNITS) {
 341                if (full_duplex[fnd_cnt] > 0  ||  (options[fnd_cnt] & FORCE_FDX))
 342                        ei_status.ne2k_flags |= FORCE_FDX;
 343        }
 344
 345        ei_status.rx_start_page = start_page + TX_PAGES;
 346#ifdef PACKETBUF_MEMSIZE
 347        /* Allow the packet buffer size to be overridden by know-it-alls. */
 348        ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
 349#endif
 350
 351        ei_status.reset_8390 = &ne2k_pci_reset_8390;
 352        ei_status.block_input = &ne2k_pci_block_input;
 353        ei_status.block_output = &ne2k_pci_block_output;
 354        ei_status.get_8390_hdr = &ne2k_pci_get_8390_hdr;
 355        ei_status.priv = (unsigned long) pdev;
 356        dev->open = &ne2k_pci_open;
 357        dev->stop = &ne2k_pci_close;
 358        dev->ethtool_ops = &ne2k_pci_ethtool_ops;
 359        NS8390_init(dev, 0);
 360
 361        i = register_netdev(dev);
 362        if (i)
 363                goto err_out_free_netdev;
 364
 365        printk("%s: %s found at %#lx, IRQ %d, ",
 366                   dev->name, pci_clone_list[chip_idx].name, ioaddr, dev->irq);
 367        for(i = 0; i < 6; i++) {
 368                printk("%2.2X%s", SA_prom[i], i == 5 ? ".\n": ":");
 369                dev->dev_addr[i] = SA_prom[i];
 370        }
 371
 372        return 0;
 373
 374err_out_free_netdev:
 375        free_netdev (dev);
 376err_out_free_res:
 377        release_region (ioaddr, NE_IO_EXTENT);
 378        pci_set_drvdata (pdev, NULL);
 379        return -ENODEV;
 380
 381}
 382
 383/* 
 384 * Magic incantation sequence for full duplex on the supported cards.
 385 */
 386static inline int set_realtek_fdx(struct net_device *dev)
 387{
 388        long ioaddr = dev->base_addr;
 389
 390        outb(0xC0 + E8390_NODMA, ioaddr + NE_CMD); /* Page 3 */
 391        outb(0xC0, ioaddr + 0x01); /* Enable writes to CONFIG3 */
 392        outb(0x40, ioaddr + 0x06); /* Enable full duplex */
 393        outb(0x00, ioaddr + 0x01); /* Disable writes to CONFIG3 */
 394        outb(E8390_PAGE0 + E8390_NODMA, ioaddr + NE_CMD); /* Page 0 */
 395        return 0;
 396}
 397
 398static inline int set_holtek_fdx(struct net_device *dev)
 399{
 400        long ioaddr = dev->base_addr;
 401
 402        outb(inb(ioaddr + 0x20) | 0x80, ioaddr + 0x20);
 403        return 0;
 404}
 405
 406static int ne2k_pci_set_fdx(struct net_device *dev)
 407{
 408        if (ei_status.ne2k_flags & REALTEK_FDX) 
 409                return set_realtek_fdx(dev);
 410        else if (ei_status.ne2k_flags & HOLTEK_FDX)
 411                return set_holtek_fdx(dev);
 412
 413        return -EOPNOTSUPP;
 414}
 415
 416static int ne2k_pci_open(struct net_device *dev)
 417{
 418        int ret = request_irq(dev->irq, ei_interrupt, SA_SHIRQ, dev->name, dev);
 419        if (ret)
 420                return ret;
 421
 422        if (ei_status.ne2k_flags & FORCE_FDX)
 423                ne2k_pci_set_fdx(dev);
 424
 425        ei_open(dev);
 426        return 0;
 427}
 428
 429static int ne2k_pci_close(struct net_device *dev)
 430{
 431        ei_close(dev);
 432        free_irq(dev->irq, dev);
 433        return 0;
 434}
 435
 436/* Hard reset the card.  This used to pause for the same period that a
 437   8390 reset command required, but that shouldn't be necessary. */
 438static void ne2k_pci_reset_8390(struct net_device *dev)
 439{
 440        unsigned long reset_start_time = jiffies;
 441
 442        if (debug > 1) printk("%s: Resetting the 8390 t=%ld...",
 443                                                  dev->name, jiffies);
 444
 445        outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
 446
 447        ei_status.txing = 0;
 448        ei_status.dmaing = 0;
 449
 450        /* This check _should_not_ be necessary, omit eventually. */
 451        while ((inb(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
 452                if (jiffies - reset_start_time > 2) {
 453                        printk("%s: ne2k_pci_reset_8390() did not complete.\n", dev->name);
 454                        break;
 455                }
 456        outb(ENISR_RESET, NE_BASE + EN0_ISR);   /* Ack intr. */
 457}
 458
 459/* Grab the 8390 specific header. Similar to the block_input routine, but
 460   we don't need to be concerned with ring wrap as the header will be at
 461   the start of a page, so we optimize accordingly. */
 462
 463static void ne2k_pci_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
 464{
 465
 466        long nic_base = dev->base_addr;
 467
 468        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
 469        if (ei_status.dmaing) {
 470                printk("%s: DMAing conflict in ne2k_pci_get_8390_hdr "
 471                           "[DMAstat:%d][irqlock:%d].\n",
 472                           dev->name, ei_status.dmaing, ei_status.irqlock);
 473                return;
 474        }
 475
 476        ei_status.dmaing |= 0x01;
 477        outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
 478        outb(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
 479        outb(0, nic_base + EN0_RCNTHI);
 480        outb(0, nic_base + EN0_RSARLO);         /* On page boundary */
 481        outb(ring_page, nic_base + EN0_RSARHI);
 482        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
 483
 484        if (ei_status.ne2k_flags & ONLY_16BIT_IO) {
 485                insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
 486        } else {
 487                *(u32*)hdr = le32_to_cpu(inl(NE_BASE + NE_DATAPORT));
 488                le16_to_cpus(&hdr->count);
 489        }
 490
 491        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
 492        ei_status.dmaing &= ~0x01;
 493}
 494
 495/* Block input and output, similar to the Crynwr packet driver.  If you
 496   are porting to a new ethercard, look at the packet driver source for hints.
 497   The NEx000 doesn't share the on-board packet memory -- you have to put
 498   the packet out through the "remote DMA" dataport using outb. */
 499
 500static void ne2k_pci_block_input(struct net_device *dev, int count,
 501                                 struct sk_buff *skb, int ring_offset)
 502{
 503        long nic_base = dev->base_addr;
 504        char *buf = skb->data;
 505
 506        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
 507        if (ei_status.dmaing) {
 508                printk("%s: DMAing conflict in ne2k_pci_block_input "
 509                           "[DMAstat:%d][irqlock:%d].\n",
 510                           dev->name, ei_status.dmaing, ei_status.irqlock);
 511                return;
 512        }
 513        ei_status.dmaing |= 0x01;
 514        if (ei_status.ne2k_flags & ONLY_32BIT_IO)
 515                count = (count + 3) & 0xFFFC;
 516        outb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
 517        outb(count & 0xff, nic_base + EN0_RCNTLO);
 518        outb(count >> 8, nic_base + EN0_RCNTHI);
 519        outb(ring_offset & 0xff, nic_base + EN0_RSARLO);
 520        outb(ring_offset >> 8, nic_base + EN0_RSARHI);
 521        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
 522
 523        if (ei_status.ne2k_flags & ONLY_16BIT_IO) {
 524                insw(NE_BASE + NE_DATAPORT,buf,count>>1);
 525                if (count & 0x01) {
 526                        buf[count-1] = inb(NE_BASE + NE_DATAPORT);
 527                }
 528        } else {
 529                insl(NE_BASE + NE_DATAPORT, buf, count>>2);
 530                if (count & 3) {
 531                        buf += count & ~3;
 532                        if (count & 2)
 533                                *((u16*)buf)++ = le16_to_cpu(inw(NE_BASE + NE_DATAPORT));
 534                        if (count & 1)
 535                                *buf = inb(NE_BASE + NE_DATAPORT);
 536                }
 537        }
 538
 539        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
 540        ei_status.dmaing &= ~0x01;
 541}
 542
 543static void ne2k_pci_block_output(struct net_device *dev, int count,
 544                                  const unsigned char *buf, const int start_page)
 545{
 546        long nic_base = NE_BASE;
 547        unsigned long dma_start;
 548
 549        /* On little-endian it's always safe to round the count up for
 550           word writes. */
 551        if (ei_status.ne2k_flags & ONLY_32BIT_IO)
 552                count = (count + 3) & 0xFFFC;
 553        else
 554                if (count & 0x01)
 555                        count++;
 556
 557        /* This *shouldn't* happen. If it does, it's the last thing you'll see */
 558        if (ei_status.dmaing) {
 559                printk("%s: DMAing conflict in ne2k_pci_block_output."
 560                           "[DMAstat:%d][irqlock:%d]\n",
 561                           dev->name, ei_status.dmaing, ei_status.irqlock);
 562                return;
 563        }
 564        ei_status.dmaing |= 0x01;
 565        /* We should already be in page 0, but to be safe... */
 566        outb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
 567
 568#ifdef NE8390_RW_BUGFIX
 569        /* Handle the read-before-write bug the same way as the
 570           Crynwr packet driver -- the NatSemi method doesn't work.
 571           Actually this doesn't always work either, but if you have
 572           problems with your NEx000 this is better than nothing! */
 573        outb(0x42, nic_base + EN0_RCNTLO);
 574        outb(0x00, nic_base + EN0_RCNTHI);
 575        outb(0x42, nic_base + EN0_RSARLO);
 576        outb(0x00, nic_base + EN0_RSARHI);
 577        outb(E8390_RREAD+E8390_START, nic_base + NE_CMD);
 578#endif
 579        outb(ENISR_RDC, nic_base + EN0_ISR);
 580
 581   /* Now the normal output. */
 582        outb(count & 0xff, nic_base + EN0_RCNTLO);
 583        outb(count >> 8,   nic_base + EN0_RCNTHI);
 584        outb(0x00, nic_base + EN0_RSARLO);
 585        outb(start_page, nic_base + EN0_RSARHI);
 586        outb(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
 587        if (ei_status.ne2k_flags & ONLY_16BIT_IO) {
 588                outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
 589        } else {
 590                outsl(NE_BASE + NE_DATAPORT, buf, count>>2);
 591                if (count & 3) {
 592                        buf += count & ~3;
 593                        if (count & 2)
 594                                outw(cpu_to_le16(*((u16*)buf)++), NE_BASE + NE_DATAPORT);
 595                }
 596        }
 597
 598        dma_start = jiffies;
 599
 600        while ((inb(nic_base + EN0_ISR) & ENISR_RDC) == 0)
 601                if (jiffies - dma_start > 2) {                  /* Avoid clock roll-over. */
 602                        printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
 603                        ne2k_pci_reset_8390(dev);
 604                        NS8390_init(dev,1);
 605                        break;
 606                }
 607
 608        outb(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
 609        ei_status.dmaing &= ~0x01;
 610        return;
 611}
 612
 613static void ne2k_pci_get_drvinfo(struct net_device *dev,
 614                                 struct ethtool_drvinfo *info)
 615{
 616        struct ei_device *ei = dev->priv;
 617        struct pci_dev *pci_dev = (struct pci_dev *) ei->priv;
 618
 619        strcpy(info->driver, DRV_NAME);
 620        strcpy(info->version, DRV_VERSION);
 621        strcpy(info->bus_info, pci_name(pci_dev));
 622}
 623
 624static struct ethtool_ops ne2k_pci_ethtool_ops = {
 625        .get_drvinfo            = ne2k_pci_get_drvinfo,
 626        .get_tx_csum            = ethtool_op_get_tx_csum,
 627        .get_sg                 = ethtool_op_get_sg,
 628};
 629
 630static void __devexit ne2k_pci_remove_one (struct pci_dev *pdev)
 631{
 632        struct net_device *dev = pci_get_drvdata(pdev);
 633
 634        if (!dev)
 635                BUG();
 636
 637        unregister_netdev(dev);
 638        release_region(dev->base_addr, NE_IO_EXTENT);
 639        free_netdev(dev);
 640        pci_disable_device(pdev);
 641        pci_set_drvdata(pdev, NULL);
 642}
 643
 644
 645static struct pci_driver ne2k_driver = {
 646        .name           = DRV_NAME,
 647        .probe          = ne2k_pci_init_one,
 648        .remove         = __devexit_p(ne2k_pci_remove_one),
 649        .id_table       = ne2k_pci_tbl,
 650};
 651
 652
 653static int __init ne2k_pci_init(void)
 654{
 655/* when a module, this is printed whether or not devices are found in probe */
 656#ifdef MODULE
 657        printk(version);
 658#endif
 659        return pci_module_init (&ne2k_driver);
 660}
 661
 662
 663static void __exit ne2k_pci_cleanup(void)
 664{
 665        pci_unregister_driver (&ne2k_driver);
 666}
 667
 668module_init(ne2k_pci_init);
 669module_exit(ne2k_pci_cleanup);
 670
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.