root/drivers/net/ne.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ne_probe
  2. ne_probe1
  3. ne_reset_8390
  4. ne_get_8390_hdr
  5. ne_block_input
  6. ne_block_output
  7. init_module
  8. cleanup_module

   1 /* 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 Public License, incorporated herein by reference.
  10 
  11     The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
  12     Center of Excellence in Space Data and Information Sciences
  13         Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
  14 
  15     This driver should work with many programmed-I/O 8390-based ethernet
  16     boards.  Currently it supports the NE1000, NE2000, many clones,
  17     and some Cabletron products.
  18 
  19     Changelog:
  20 
  21     Paul Gortmaker      : use ENISR_RDC to monitor Tx PIO uploads, made
  22                           sanity checks and bad clone support optional.
  23     Paul Gortmaker      : new reset code, reset card after probe at boot.
  24 
  25 */
  26 
  27 /* Routines for the NatSemi-based designs (NE[12]000). */
  28 
  29 static const char *version =
  30     "ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
  31 
  32 
  33 #include <linux/module.h>
  34 
  35 #include <linux/kernel.h>
  36 #include <linux/sched.h>
  37 #include <linux/errno.h>
  38 #include <asm/system.h>
  39 #include <asm/io.h>
  40 
  41 #include <linux/netdevice.h>
  42 #include <linux/etherdevice.h>
  43 #include "8390.h"
  44 
  45 /* Some defines that people can play with if so inclined. */
  46 
  47 /* Do we support clones that don't adhere to 14,15 of the SAprom ? */
  48 #define SUPPORT_NE_BAD_CLONES
  49 
  50 /* Do we perform extra sanity checks on stuff ? */
  51 /* #define NE_SANITY_CHECK */
  52 
  53 /* Do we implement the read before write bugfix ? */
  54 /* #define NE_RW_BUGFIX */
  55 
  56 /* ---- No user-serviceable parts below ---- */
  57 
  58 /* A zero-terminated list of I/O addresses to be probed. */
  59 static unsigned int netcard_portlist[] =
  60 { 0x300, 0x280, 0x320, 0x340, 0x360, 0};
  61 
  62 #ifdef SUPPORT_NE_BAD_CLONES
  63 /* A list of bad clones that we none-the-less recognize. */
  64 static struct { const char *name8, *name16; unsigned char SAprefix[4];}
  65 bad_clone_list[] = {
  66     {"DE100", "DE200", {0x00, 0xDE, 0x01,}},
  67     {"DE120", "DE220", {0x00, 0x80, 0xc8,}},
  68     {"DFI1000", "DFI2000", {'D', 'F', 'I',}}, /* Original, eh?  */
  69     {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}},
  70     {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}}, /* Ancient real NE1000. */
  71     {"NN1000", "NN2000",  {0x08, 0x03, 0x08}}, /* Outlaw no-name clone. */
  72     {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}},  /* Outlaw 4-Dimension cards. */
  73     {"Con-Intl_8", "Con-Intl_16", {0x00, 0x00, 0x24}}, /* Connect Int'nl */
  74     {0,}
  75 };
  76 #endif
  77 
  78 #define NE_BASE  (dev->base_addr)
  79 #define NE_CMD          0x00
  80 #define NE_DATAPORT     0x10    /* NatSemi-defined port window offset. */
  81 #define NE_RESET        0x1f    /* Issue a read to reset, a write to clear. */
  82 #define NE_IO_EXTENT    0x20
  83 
  84 #define NE1SM_START_PG  0x20    /* First page of TX buffer */
  85 #define NE1SM_STOP_PG   0x40    /* Last page +1 of RX ring */
  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 ne_probe(struct device *dev);
  90 static int ne_probe1(struct device *dev, int ioaddr);
  91 
  92 static void ne_reset_8390(struct device *dev);
  93 static void ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr,
  94                           int ring_page);
  95 static void ne_block_input(struct device *dev, int count,
  96                           struct sk_buff *skb, int ring_offset);
  97 static void ne_block_output(struct device *dev, const int count,
  98                 const unsigned char *buf, const int start_page);
  99 
 100 
 101 /*  Probe for various non-shared-memory ethercards.
 102 
 103    NEx000-clone boards have a Station Address PROM (SAPROM) in the packet
 104    buffer memory space.  NE2000 clones have 0x57,0x57 in bytes 0x0e,0x0f of
 105    the SAPROM, while other supposed NE2000 clones must be detected by their
 106    SA prefix.
 107 
 108    Reading the SAPROM from a word-wide card with the 8390 set in byte-wide
 109    mode results in doubled values, which can be detected and compensated for.
 110 
 111    The probe is also responsible for initializing the card and filling
 112    in the 'dev' and 'ei_status' structures.
 113 
 114    We use the minimum memory size for some ethercard product lines, iff we can't
 115    distinguish models.  You can increase the packet buffer size by setting
 116    PACKETBUF_MEMSIZE.  Reported Cabletron packet buffer locations are:
 117         E1010   starts at 0x100 and ends at 0x2000.
 118         E1010-x starts at 0x100 and ends at 0x8000. ("-x" means "more memory")
 119         E2010    starts at 0x100 and ends at 0x4000.
 120         E2010-x starts at 0x100 and ends at 0xffff.  */
 121 
 122 #ifdef HAVE_DEVLIST
 123 struct netdev_entry netcard_drv =
 124 {"ne", ne_probe1, NE_IO_EXTENT, netcard_portlist};
 125 #else
 126 
 127 int ne_probe(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 128 {
 129     int i;
 130     int base_addr = dev ? dev->base_addr : 0;
 131 
 132     if (base_addr > 0x1ff)      /* Check a single specified location. */
 133         return ne_probe1(dev, base_addr);
 134     else if (base_addr != 0)    /* Don't probe at all. */
 135         return ENXIO;
 136 
 137     for (i = 0; netcard_portlist[i]; i++) {
 138         int ioaddr = netcard_portlist[i];
 139         if (check_region(ioaddr, NE_IO_EXTENT))
 140             continue;
 141         if (ne_probe1(dev, ioaddr) == 0)
 142             return 0;
 143     }
 144 
 145     return ENODEV;
 146 }
 147 #endif
 148 
 149 static int ne_probe1(struct device *dev, int ioaddr)
     /* [previous][next][first][last][top][bottom][index][help] */
 150 {
 151     int i;
 152     unsigned char SA_prom[32];
 153     int wordlength = 2;
 154     const char *name = NULL;
 155     int start_page, stop_page;
 156     int neX000, ctron;
 157     int reg0 = inb_p(ioaddr);
 158 
 159     if (reg0 == 0xFF)
 160         return ENODEV;
 161 
 162     /* Do a preliminary verification that we have a 8390. */
 163     {   int regd;
 164         outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
 165         regd = inb_p(ioaddr + 0x0d);
 166         outb_p(0xff, ioaddr + 0x0d);
 167         outb_p(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
 168         inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
 169         if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
 170             outb_p(reg0, ioaddr);
 171             outb_p(regd, ioaddr + 0x0d);        /* Restore the old values. */
 172             return ENODEV;
 173         }
 174     }
 175 
 176     printk("NE*000 ethercard probe at %#3x:", ioaddr);
 177 
 178     /* Reset card. Who knows what dain-bramaged state it was left in. */
 179     {   unsigned long reset_start_time = jiffies;
 180 
 181         /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
 182         outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
 183 
 184         while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
 185                 if (jiffies - reset_start_time > 2*HZ/100) {
 186                         printk(" not found (no reset ack).\n");
 187                         return ENODEV;
 188                 }
 189 
 190         outb_p(0xff, ioaddr + EN0_ISR);         /* Ack all intr. */
 191     }
 192 
 193     /* Read the 16 bytes of station address PROM.
 194        We must first initialize registers, similar to NS8390_init(eifdev, 0).
 195        We can't reliably read the SAPROM address without this.
 196        (I learned the hard way!). */
 197     {
 198         struct {unsigned char value, offset; } program_seq[] = {
 199             {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
 200             {0x48,      EN0_DCFG},      /* Set byte-wide (0x48) access. */
 201             {0x00,      EN0_RCNTLO},    /* Clear the count regs. */
 202             {0x00,      EN0_RCNTHI},
 203             {0x00,      EN0_IMR},       /* Mask completion irq. */
 204             {0xFF,      EN0_ISR},
 205             {E8390_RXOFF, EN0_RXCR},    /* 0x20  Set to monitor */
 206             {E8390_TXOFF, EN0_TXCR},    /* 0x02  and loopback mode. */
 207             {32,        EN0_RCNTLO},
 208             {0x00,      EN0_RCNTHI},
 209             {0x00,      EN0_RSARLO},    /* DMA starting at 0x0000. */
 210             {0x00,      EN0_RSARHI},
 211             {E8390_RREAD+E8390_START, E8390_CMD},
 212         };
 213         for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
 214             outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
 215 
 216     }
 217     for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
 218         SA_prom[i] = inb(ioaddr + NE_DATAPORT);
 219         SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
 220         if (SA_prom[i] != SA_prom[i+1])
 221             wordlength = 1;
 222     }
 223 
 224     if (wordlength == 2) {
 225         /* We must set the 8390 for word mode. */
 226         outb_p(0x49, ioaddr + EN0_DCFG);
 227         /* We used to reset the ethercard here, but it doesn't seem
 228            to be necessary. */
 229         /* Un-double the SA_prom values. */
 230         for (i = 0; i < 16; i++)
 231             SA_prom[i] = SA_prom[i+i];
 232         start_page = NESM_START_PG;
 233         stop_page = NESM_STOP_PG;
 234     } else {
 235         start_page = NE1SM_START_PG;
 236         stop_page = NE1SM_STOP_PG;
 237     }
 238 
 239     for(i = 0; i < ETHER_ADDR_LEN; i++) {
 240         dev->dev_addr[i] = SA_prom[i];
 241         printk(" %2.2x", SA_prom[i]);
 242     }
 243 
 244     neX000 = (SA_prom[14] == 0x57  &&  SA_prom[15] == 0x57);
 245     ctron =  (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
 246 
 247     /* Set up the rest of the parameters. */
 248     if (neX000) {
 249         name = (wordlength == 2) ? "NE2000" : "NE1000";
 250     } else if (ctron) {
 251         name = "Cabletron";
 252         start_page = 0x01;
 253         stop_page = (wordlength == 2) ? 0x40 : 0x20;
 254     } else {
 255 #ifdef SUPPORT_NE_BAD_CLONES
 256         /* Ack!  Well, there might be a *bad* NE*000 clone there.
 257            Check for total bogus addresses. */
 258         for (i = 0; bad_clone_list[i].name8; i++) {
 259             if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
 260                 SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
 261                 SA_prom[2] == bad_clone_list[i].SAprefix[2]) {
 262                 if (wordlength == 2) {
 263                     name = bad_clone_list[i].name16;
 264                 } else {
 265                     name = bad_clone_list[i].name8;
 266                 }
 267                 break;
 268             }
 269         }
 270         if (bad_clone_list[i].name8 == NULL) {
 271             printk(" not found (invalid signature %2.2x %2.2x).\n",
 272                    SA_prom[14], SA_prom[15]);
 273             return ENXIO;
 274         }
 275 #else
 276         printk(" not found.\n");
 277         return ENXIO;
 278 #endif
 279 
 280     }
 281 
 282 
 283     if (dev == NULL)
 284         dev = init_etherdev(0, sizeof(struct ei_device));
 285 
 286     if (dev->irq < 2) {
 287         autoirq_setup(0);
 288         outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */
 289         outb_p(0x00, ioaddr + EN0_RCNTLO);
 290         outb_p(0x00, ioaddr + EN0_RCNTHI);
 291         outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */
 292         outb_p(0x00, ioaddr + EN0_IMR);                 /* Mask it again. */
 293         dev->irq = autoirq_report(0);
 294         if (ei_debug > 2)
 295             printk(" autoirq is %d\n", dev->irq);
 296     } else if (dev->irq == 2)
 297         /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
 298            or don't know which one to set. */
 299         dev->irq = 9;
 300     
 301     /* Snarf the interrupt now.  There's no point in waiting since we cannot
 302        share and the board will usually be enabled. */
 303     {
 304         int irqval = request_irq (dev->irq, ei_interrupt, 0, wordlength==2 ? "ne2000":"ne1000");
 305         if (irqval) {
 306             printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
 307             return EAGAIN;
 308         }
 309     }
 310 
 311     dev->base_addr = ioaddr;
 312 
 313     request_region(ioaddr, NE_IO_EXTENT, wordlength==2 ? "ne2000":"ne1000");
 314 
 315     for(i = 0; i < ETHER_ADDR_LEN; i++)
 316         dev->dev_addr[i] = SA_prom[i];
 317 
 318     ethdev_init(dev);
 319     printk("\n%s: %s found at %#x, using IRQ %d.\n",
 320            dev->name, name, ioaddr, dev->irq);
 321 
 322     if (ei_debug > 0)
 323         printk(version);
 324 
 325     ei_status.name = name;
 326     ei_status.tx_start_page = start_page;
 327     ei_status.stop_page = stop_page;
 328     ei_status.word16 = (wordlength == 2);
 329 
 330     ei_status.rx_start_page = start_page + TX_PAGES;
 331 #ifdef PACKETBUF_MEMSIZE
 332     /* Allow the packet buffer size to be overridden by know-it-alls. */
 333     ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
 334 #endif
 335 
 336     ei_status.reset_8390 = &ne_reset_8390;
 337     ei_status.block_input = &ne_block_input;
 338     ei_status.block_output = &ne_block_output;
 339     ei_status.get_8390_hdr = &ne_get_8390_hdr;
 340     NS8390_init(dev, 0);
 341     return 0;
 342 }
 343 
 344 /* Hard reset the card.  This used to pause for the same period that a
 345    8390 reset command required, but that shouldn't be necessary. */
 346 static void
 347 ne_reset_8390(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 348 {
 349     unsigned long reset_start_time = jiffies;
 350 
 351     if (ei_debug > 1) printk("resetting the 8390 t=%ld...", jiffies);
 352 
 353     /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
 354     outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
 355 
 356     ei_status.txing = 0;
 357     ei_status.dmaing = 0;
 358 
 359     /* This check _should_not_ be necessary, omit eventually. */
 360     while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
 361         if (jiffies - reset_start_time > 2*HZ/100) {
 362             printk("%s: ne_reset_8390() did not complete.\n", dev->name);
 363             break;
 364         }
 365     outb_p(ENISR_RESET, NE_BASE + EN0_ISR);     /* Ack intr. */
 366 }
 367 
 368 /* Grab the 8390 specific header. Similar to the block_input routine, but
 369    we don't need to be concerned with ring wrap as the header will be at
 370    the start of a page, so we optimize accordingly. */
 371 
 372 static void
 373 ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
     /* [previous][next][first][last][top][bottom][index][help] */
 374 {
 375 
 376     int nic_base = dev->base_addr;
 377 
 378     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
 379     if (ei_status.dmaing) {
 380         printk("%s: DMAing conflict in ne_get_8390_hdr "
 381            "[DMAstat:%d][irqlock:%d][intr:%d].\n",
 382            dev->name, ei_status.dmaing, ei_status.irqlock,
 383            dev->interrupt);
 384         return;
 385     }
 386 
 387     ei_status.dmaing |= 0x01;
 388     outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
 389     outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
 390     outb_p(0, nic_base + EN0_RCNTHI);
 391     outb_p(0, nic_base + EN0_RSARLO);           /* On page boundary */
 392     outb_p(ring_page, nic_base + EN0_RSARHI);
 393     outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
 394 
 395     if (ei_status.word16)
 396         insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
 397     else
 398         insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
 399 
 400     outb_p(ENISR_RDC, nic_base + EN0_ISR);      /* Ack intr. */
 401     ei_status.dmaing &= ~0x01;
 402 }
 403 
 404 /* Block input and output, similar to the Crynwr packet driver.  If you
 405    are porting to a new ethercard, look at the packet driver source for hints.
 406    The NEx000 doesn't share the on-board packet memory -- you have to put
 407    the packet out through the "remote DMA" dataport using outb. */
 408 
 409 static void
 410 ne_block_input(struct device *dev, int count, struct sk_buff *skb, int ring_offset)
     /* [previous][next][first][last][top][bottom][index][help] */
 411 {
 412 #ifdef NE_SANITY_CHECK
 413     int xfer_count = count;
 414 #endif
 415     int nic_base = dev->base_addr;
 416     char *buf = skb->data;
 417 
 418     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
 419     if (ei_status.dmaing) {
 420         printk("%s: DMAing conflict in ne_block_input "
 421            "[DMAstat:%d][irqlock:%d][intr:%d].\n",
 422            dev->name, ei_status.dmaing, ei_status.irqlock,
 423            dev->interrupt);
 424         return;
 425     }
 426     ei_status.dmaing |= 0x01;
 427     outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
 428     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
 429     outb_p(count >> 8, nic_base + EN0_RCNTHI);
 430     outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
 431     outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
 432     outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
 433     if (ei_status.word16) {
 434       insw(NE_BASE + NE_DATAPORT,buf,count>>1);
 435       if (count & 0x01) {
 436         buf[count-1] = inb(NE_BASE + NE_DATAPORT);
 437 #ifdef NE_SANITY_CHECK
 438         xfer_count++;
 439 #endif
 440       }
 441     } else {
 442         insb(NE_BASE + NE_DATAPORT, buf, count);
 443     }
 444 
 445 #ifdef NE_SANITY_CHECK
 446     /* This was for the ALPHA version only, but enough people have
 447        been encountering problems so it is still here.  If you see
 448        this message you either 1) have a slightly incompatible clone
 449        or 2) have noise/speed problems with your bus. */
 450     if (ei_debug > 1) {         /* DMA termination address check... */
 451         int addr, tries = 20;
 452         do {
 453             /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
 454                -- it's broken for Rx on some cards! */
 455             int high = inb_p(nic_base + EN0_RSARHI);
 456             int low = inb_p(nic_base + EN0_RSARLO);
 457             addr = (high << 8) + low;
 458             if (((ring_offset + xfer_count) & 0xff) == low)
 459                 break;
 460         } while (--tries > 0);
 461         if (tries <= 0)
 462             printk("%s: RX transfer address mismatch,"
 463                    "%#4.4x (expected) vs. %#4.4x (actual).\n",
 464                    dev->name, ring_offset + xfer_count, addr);
 465     }
 466 #endif
 467     outb_p(ENISR_RDC, nic_base + EN0_ISR);      /* Ack intr. */
 468     ei_status.dmaing &= ~0x01;
 469 }
 470 
 471 static void
 472 ne_block_output(struct device *dev, int count,
     /* [previous][next][first][last][top][bottom][index][help] */
 473                 const unsigned char *buf, const int start_page)
 474 {
 475     int nic_base = NE_BASE;
 476     unsigned long dma_start;
 477 #ifdef NE_SANITY_CHECK
 478     int retries = 0;
 479 #endif
 480 
 481     /* Round the count up for word writes.  Do we need to do this?
 482        What effect will an odd byte count have on the 8390?
 483        I should check someday. */
 484     if (ei_status.word16 && (count & 0x01))
 485       count++;
 486 
 487     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
 488     if (ei_status.dmaing) {
 489         printk("%s: DMAing conflict in ne_block_output."
 490            "[DMAstat:%d][irqlock:%d][intr:%d]\n",
 491            dev->name, ei_status.dmaing, ei_status.irqlock,
 492            dev->interrupt);
 493         return;
 494     }
 495     ei_status.dmaing |= 0x01;
 496     /* We should already be in page 0, but to be safe... */
 497     outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
 498 
 499 #ifdef NE_SANITY_CHECK
 500  retry:
 501 #endif
 502 
 503 #ifdef NE8390_RW_BUGFIX
 504     /* Handle the read-before-write bug the same way as the
 505        Crynwr packet driver -- the NatSemi method doesn't work.
 506        Actually this doesn't always work either, but if you have
 507        problems with your NEx000 this is better than nothing! */
 508     outb_p(0x42, nic_base + EN0_RCNTLO);
 509     outb_p(0x00,   nic_base + EN0_RCNTHI);
 510     outb_p(0x42, nic_base + EN0_RSARLO);
 511     outb_p(0x00, nic_base + EN0_RSARHI);
 512     outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
 513     /* Make certain that the dummy read has occurred. */
 514     SLOW_DOWN_IO;
 515     SLOW_DOWN_IO;
 516     SLOW_DOWN_IO;
 517 #endif
 518 
 519     outb_p(ENISR_RDC, nic_base + EN0_ISR);
 520 
 521    /* Now the normal output. */
 522     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
 523     outb_p(count >> 8,   nic_base + EN0_RCNTHI);
 524     outb_p(0x00, nic_base + EN0_RSARLO);
 525     outb_p(start_page, nic_base + EN0_RSARHI);
 526 
 527     outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
 528     if (ei_status.word16) {
 529         outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
 530     } else {
 531         outsb(NE_BASE + NE_DATAPORT, buf, count);
 532     }
 533 
 534     dma_start = jiffies;
 535 
 536 #ifdef NE_SANITY_CHECK
 537     /* This was for the ALPHA version only, but enough people have
 538        been encountering problems so it is still here. */
 539     if (ei_debug > 1) {         /* DMA termination address check... */
 540         int addr, tries = 20;
 541         do {
 542             int high = inb_p(nic_base + EN0_RSARHI);
 543             int low = inb_p(nic_base + EN0_RSARLO);
 544             addr = (high << 8) + low;
 545             if ((start_page << 8) + count == addr)
 546                 break;
 547         } while (--tries > 0);
 548         if (tries <= 0) {
 549             printk("%s: Tx packet transfer address mismatch,"
 550                    "%#4.4x (expected) vs. %#4.4x (actual).\n",
 551                    dev->name, (start_page << 8) + count, addr);
 552             if (retries++ == 0)
 553                 goto retry;
 554         }
 555     }
 556 #endif
 557 
 558     while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
 559         if (jiffies - dma_start > 2*HZ/100) {           /* 20ms */
 560                 printk("%s: timeout waiting for Tx RDC.\n", dev->name);
 561                 ne_reset_8390(dev);
 562                 NS8390_init(dev,1);
 563                 break;
 564         }
 565 
 566     outb_p(ENISR_RDC, nic_base + EN0_ISR);      /* Ack intr. */
 567     ei_status.dmaing &= ~0x01;
 568     return;
 569 }
 570 
 571 #ifdef MODULE
 572 static char devicename[9] = { 0, };
 573 static struct device dev_ne2000 = {
 574         devicename, /* device name is inserted by linux/drivers/net/net_init.c */
 575         0, 0, 0, 0,
 576         0, 0,
 577         0, 0, 0, NULL, ne_probe };
 578 
 579 static int io = 0x300;
 580 static int irq = 0;
 581 
 582 int init_module(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 583 {
 584         if (io == 0)
 585                 printk("ne: You should not use auto-probing with insmod!\n");
 586         dev_ne2000.base_addr = io;
 587         dev_ne2000.irq       = irq;
 588         if (register_netdev(&dev_ne2000) != 0)
 589                 return -EIO;
 590         return 0;
 591 }
 592 
 593 void
 594 cleanup_module(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 595 {
 596         unregister_netdev(&dev_ne2000);
 597 
 598         /* If we don't do this, we can't re-insmod it later. */
 599         free_irq(dev_ne2000.irq);
 600         release_region(dev_ne2000.base_addr, NE_IO_EXTENT);
 601 }
 602 #endif /* MODULE */
 603 
 604 /*
 605  * Local variables:
 606  *  compile-command: "gcc -DKERNEL -Wall -O6 -fomit-frame-pointer -I/usr/src/linux/net/tcp -c ne.c"
 607  *  version-control: t
 608  *  kept-new-versions: 5
 609  * End:
 610  */

/* [previous][next][first][last][top][bottom][index][help] */