root/drivers/net/eexpress.c

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

DEFINITIONS

This source file includes following definitions.
  1. express_probe
  2. eexp_probe1
  3. eexp_open
  4. eexp_send_packet
  5. eexp_interrupt
  6. eexp_close
  7. eexp_get_stats
  8. set_multicast_list
  9. read_eeprom
  10. init_82586_mem
  11. init_rx_bufs
  12. hardware_send_packet
  13. eexp_rx
  14. init_module
  15. cleanup_module

   1 /* eexpress.c: Intel EtherExpress device driver for Linux. */
   2 /*
   3         Written 1993 by Donald Becker.
   4         Copyright 1993 United States Government as represented by the Director,
   5         National Security Agency.  This software may only be used and distributed
   6         according to the terms of the GNU Public License as modified by SRC,
   7         incorporated herein by reference.
   8 
   9         The author may be reached as becker@super.org or
  10         C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715
  11 
  12         Things remaining to do:
  13         Check that the 586 and ASIC are reset/unreset at the right times.
  14         Check tx and rx buffer setup.
  15         The current Tx is single-buffer-only.
  16         Move the theory of operation and memory map documentation.
  17         Rework the board error reset
  18         The statistics need to be updated correctly.
  19 
  20         Modularized by Pauline Middelink <middelin@polyware.iaf.nl>
  21         Changed to support io= irq= by Alan Cox <Alan.Cox@linux.org>
  22 */
  23 
  24 static const char *version =
  25         "eexpress.c:v0.07 1/19/94 Donald Becker (becker@super.org)\n";
  26 
  27 #include <linux/config.h>
  28 
  29 /*
  30   Sources:
  31         This driver wouldn't have been written with the availability of the
  32         Crynwr driver source code.      It provided a known-working implementation
  33         that filled in the gaping holes of the Intel documentation.  Three cheers
  34         for Russ Nelson.
  35 
  36         Intel Microcommunications Databook, Vol. 1, 1990. It provides just enough
  37         info that the casual reader might think that it documents the i82586.
  38 */
  39 
  40 #ifdef MODULE
  41 #include <linux/module.h>
  42 #include <linux/version.h>
  43 #endif
  44 
  45 #include <linux/kernel.h>
  46 #include <linux/sched.h>
  47 #include <linux/types.h>
  48 #include <linux/fcntl.h>
  49 #include <linux/interrupt.h>
  50 #include <linux/ptrace.h>
  51 #include <linux/ioport.h>
  52 #include <linux/string.h>
  53 #include <linux/in.h>
  54 #include <asm/system.h>
  55 #include <asm/bitops.h>
  56 #include <asm/io.h>
  57 #include <asm/dma.h>
  58 #include <linux/errno.h>
  59 
  60 #include <linux/netdevice.h>
  61 #include <linux/etherdevice.h>
  62 #include <linux/skbuff.h>
  63 #include <linux/malloc.h>
  64 
  65 /* use 0 for production, 1 for verification, 2..7 for debug */
  66 #ifndef NET_DEBUG
  67 #define NET_DEBUG 2
  68 #endif
  69 static unsigned int net_debug = NET_DEBUG;
  70 
  71 /*
  72                         Details of the i82586.
  73 
  74    You'll really need the databook to understand the details of this part,
  75    but the outline is that the i82586 has two separate processing units.
  76 
  77    The Rx unit uses a list of frame descriptors and a list of data buffer
  78    descriptors.  We use full-sized (1518 byte) data buffers, so there is
  79    a one-to-one pairing of frame descriptors to buffer descriptors.
  80 
  81    The Tx ("command") unit executes a list of commands that look like:
  82                 Status word             Written by the 82586 when the command is done.
  83                 Command word    Command in lower 3 bits, post-command action in upper 3
  84                 Link word               The address of the next command.
  85                 Parameters              (as needed).
  86 
  87         Some definitions related to the Command Word are:
  88  */
  89 #define CMD_EOL         0x8000                  /* The last command of the list, stop. */
  90 #define CMD_SUSP        0x4000                  /* Suspend after doing cmd. */
  91 #define CMD_INTR        0x2000                  /* Interrupt after doing cmd. */
  92 
  93 enum commands {
  94         CmdNOp = 0, CmdSASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
  95         CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7};
  96 
  97 /* Information that need to be kept for each board. */
  98 struct net_local {
  99         struct enet_statistics stats;
 100         int last_restart;
 101         short rx_head;
 102         short rx_tail;
 103         short tx_head;
 104         short tx_cmd_link;
 105         short tx_reap;
 106 };
 107 
 108 /*
 109                 Details of the EtherExpress Implementation
 110   The EtherExpress takes an unusual approach to host access to packet buffer
 111   memory.  The host can use either the Dataport, with independent
 112   autoincrementing read and write pointers, or it can I/O map 32 bytes of the
 113   memory using the "Shadow Memory Pointer" (SMB) as follows:
 114                         ioaddr                                          Normal EtherExpress registers
 115                         ioaddr+0x4000...0x400f          Buffer Memory at SMB...SMB+15
 116                         ioaddr+0x8000...0x800f          Buffer Memory at SMB+16...SMB+31
 117                         ioaddr+0xC000...0xC007          "" SMB+16...SMB+23 (hardware flaw?)
 118                         ioaddr+0xC008...0xC00f          Buffer Memory at 0x0008...0x000f
 119   The last I/O map set is useful if you put the i82586 System Command Block
 120   (the command mailbox) exactly at 0x0008.  (There seems to be some
 121   undocumented init structure at 0x0000-7, so I had to use the Crywnr memory
 122   setup verbatim for those four words anyway.)
 123 
 124   A problem with using either one of these mechanisms is that you must run
 125   single-threaded, or the interrupt handler must restore a changed value of
 126   the read, write, or SMB pointers.
 127 
 128   Unlike the Crynwr driver, my driver mostly ignores the I/O mapped "feature"
 129   and relies heavily on the dataport for buffer memory access.  To minimize
 130   switching, the read_pointer is dedicated to the Rx interrupt handler, and
 131   the write_pointer is used by the send_packet() routine (it's carefully saved
 132   and restored when it's needed by the interrupt handler).
 133   */
 134 
 135 /* Offsets from the base I/O address. */
 136 #define DATAPORT        0       /* Data Transfer Register. */
 137 #define WRITE_PTR       2       /* Write Address Pointer. */
 138 #define READ_PTR        4       /* Read Address Pointer. */
 139 #define SIGNAL_CA       6       /* Frob the 82586 Channel Attention line. */
 140 #define SET_IRQ         7       /* IRQ Select. */
 141 #define SHADOW_PTR      8       /* Shadow Memory Bank Pointer. */
 142 #define MEM_Ctrl        11
 143 #define MEM_Page_Ctrl   12
 144 #define Config          13
 145 #define EEPROM_Ctrl             14
 146 #define ID_PORT         15
 147 
 148 #define EEXPRESS_IO_EXTENT 16
 149 
 150 /*      EEPROM_Ctrl bits. */
 151 
 152 #define EE_SHIFT_CLK    0x01    /* EEPROM shift clock. */
 153 #define EE_CS                   0x02    /* EEPROM chip select. */
 154 #define EE_DATA_WRITE   0x04    /* EEPROM chip data in. */
 155 #define EE_DATA_READ    0x08    /* EEPROM chip data out. */
 156 #define EE_CTRL_BITS    (EE_SHIFT_CLK | EE_CS | EE_DATA_WRITE | EE_DATA_READ)
 157 #define ASIC_RESET              0x40
 158 #define _586_RESET              0x80
 159 
 160 /* Offsets to elements of the System Control Block structure. */
 161 #define SCB_STATUS      0xc008
 162 #define SCB_CMD         0xc00A
 163 #define  CUC_START       0x0100
 164 #define  CUC_RESUME      0x0200
 165 #define  CUC_SUSPEND 0x0300
 166 #define  RX_START        0x0010
 167 #define  RX_RESUME       0x0020
 168 #define  RX_SUSPEND      0x0030
 169 #define SCB_CBL         0xc00C  /* Command BLock offset. */
 170 #define SCB_RFA         0xc00E  /* Rx Frame Area offset. */
 171 
 172 /*
 173   What follows in 'init_words[]' is the "program" that is downloaded to the
 174   82586 memory.  It's mostly tables and command blocks, and starts at the
 175   reset address 0xfffff6.
 176 
 177   Even with the additional "don't care" values, doing it this way takes less
 178   program space than initializing the individual tables, and I feel it's much
 179   cleaner.
 180 
 181   The databook is particularly useless for the first two structures; they are
 182   completely undocumented.  I had to use the Crynwr driver as an example.
 183 
 184    The memory setup is as follows:
 185    */
 186 
 187 #define CONFIG_CMD      0x0018
 188 #define SET_SA_CMD      0x0024
 189 #define SA_OFFSET       0x002A
 190 #define IDLELOOP        0x30
 191 #define TDR_CMD         0x38
 192 #define TDR_TIME        0x3C
 193 #define DUMP_CMD        0x40
 194 #define DIAG_CMD        0x48
 195 #define SET_MC_CMD      0x4E
 196 #define DUMP_DATA       0x56    /* A 170 byte buffer for dump and Set-MC into. */
 197 
 198 #define TX_BUF_START    0x0100
 199 #define NUM_TX_BUFS     4
 200 #define TX_BUF_SIZE             0x0680  /* packet+header+TBD+extra (1518+14+20+16) */
 201 #define TX_BUF_END              0x2000
 202 
 203 #define RX_BUF_START    0x2000
 204 #define RX_BUF_SIZE     (0x640) /* packet+header+RBD+extra */
 205 #define RX_BUF_END              0x4000
 206 
 207 /*
 208   That's it: only 86 bytes to set up the beast, including every extra
 209   command available.  The 170 byte buffer at DUMP_DATA is shared between the
 210   Dump command (called only by the diagnostic program) and the SetMulticastList
 211   command.
 212 
 213   To complete the memory setup you only have to write the station address at
 214   SA_OFFSET and create the Tx & Rx buffer lists.
 215 
 216   The Tx command chain and buffer list is setup as follows:
 217   A Tx command table, with the data buffer pointing to...
 218   A Tx data buffer descriptor.  The packet is in a single buffer, rather than
 219      chaining together several smaller buffers.
 220   A NoOp command, which initially points to itself,
 221   And the packet data.
 222 
 223   A transmit is done by filling in the Tx command table and data buffer,
 224   re-writing the NoOp command, and finally changing the offset of the last
 225   command to point to the current Tx command.  When the Tx command is finished,
 226   it jumps to the NoOp, when it loops until the next Tx command changes the
 227   "link offset" in the NoOp.  This way the 82586 never has to go through the
 228   slow restart sequence.
 229 
 230   The Rx buffer list is set up in the obvious ring structure.  We have enough
 231   memory (and low enough interrupt latency) that we can avoid the complicated
 232   Rx buffer linked lists by alway associating a full-size Rx data buffer with
 233   each Rx data frame.
 234 
 235   I current use four transmit buffers starting at TX_BUF_START (0x0100), and
 236   use the rest of memory, from RX_BUF_START to RX_BUF_END, for Rx buffers.
 237 
 238   */
 239 
 240 static short init_words[] = {
 241         0x0000,                                 /* Set bus size to 16 bits. */
 242         0x0000,0x0000,                  /* Set control mailbox (SCB) addr. */
 243         0,0,                                    /* pad to 0x000000. */
 244         0x0001,                                 /* Status word that's cleared when init is done. */
 245         0x0008,0,0,                             /* SCB offset, (skip, skip) */
 246 
 247         0,0xf000|RX_START|CUC_START,    /* SCB status and cmd. */
 248         CONFIG_CMD,                             /* Command list pointer, points to Configure. */
 249         RX_BUF_START,                           /* Rx block list. */
 250         0,0,0,0,                                /* Error count: CRC, align, buffer, overrun. */
 251 
 252         /* 0x0018: Configure command.  Change to put MAC data with packet. */
 253         0, CmdConfigure,                /* Status, command.             */
 254         SET_SA_CMD,                             /* Next command is Set Station Addr. */
 255         0x0804,                                 /* "4" bytes of config data, 8 byte FIFO. */
 256         0x2e40,                                 /* Magic values, including MAC data location. */
 257         0,                                              /* Unused pad word. */
 258 
 259         /* 0x0024: Setup station address command. */
 260         0, CmdSASetup,
 261         SET_MC_CMD,                             /* Next command. */
 262         0xaa00,0xb000,0x0bad,   /* Station address (to be filled in) */
 263 
 264         /* 0x0030: NOP, looping back to itself.  Point to first Tx buffer to Tx. */
 265         0, CmdNOp, IDLELOOP, 0 /* pad */,
 266 
 267         /* 0x0038: A unused Time-Domain Reflectometer command. */
 268         0, CmdTDR, IDLELOOP, 0,
 269 
 270         /* 0x0040: An unused Dump State command. */
 271         0, CmdDump, IDLELOOP, DUMP_DATA,
 272 
 273         /* 0x0048: An unused Diagnose command. */
 274         0, CmdDiagnose, IDLELOOP,
 275 
 276         /* 0x004E: An empty set-multicast-list command. */
 277 #ifdef initial_text_tx
 278         0, CmdMulticastList, DUMP_DATA, 0,
 279 #else
 280         0, CmdMulticastList, IDLELOOP, 0,
 281 #endif
 282 
 283         /* 0x0056: A continuous transmit command, only here for testing. */
 284         0, CmdTx, DUMP_DATA, DUMP_DATA+8, 0x83ff, -1, DUMP_DATA, 0,
 285 };
 286 
 287 /* Index to functions, as function prototypes. */
 288 
 289 extern int express_probe(struct device *dev);   /* Called from Space.c */
 290 
 291 static int      eexp_probe1(struct device *dev, short ioaddr);
 292 static int      eexp_open(struct device *dev);
 293 static int      eexp_send_packet(struct sk_buff *skb, struct device *dev);
 294 static void     eexp_interrupt(int irq, struct pt_regs *regs);
 295 static void eexp_rx(struct device *dev);
 296 static int      eexp_close(struct device *dev);
 297 static struct enet_statistics *eexp_get_stats(struct device *dev);
 298 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
 299 
 300 static int read_eeprom(int ioaddr, int location);
 301 static void hardware_send_packet(struct device *dev, void *buf, short length);
 302 static void init_82586_mem(struct device *dev);
 303 static void init_rx_bufs(struct device *dev);
 304 
 305 
 306 /* Check for a network adaptor of this type, and return '0' iff one exists.
 307    If dev->base_addr == 0, probe all likely locations.
 308    If dev->base_addr == 1, always return failure.
 309    If dev->base_addr == 2, (detachable devices only) allocate space for the
 310    device and return success.
 311    */
 312 int
 313 express_probe(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 314 {
 315         /* Don't probe all settable addresses, 0x[23][0-7]0, just common ones. */
 316         int *port, ports[] = {0x300, 0x270, 0x320, 0x340, 0};
 317         int base_addr = dev->base_addr;
 318 
 319         if (base_addr > 0x1ff)  /* Check a single specified location. */
 320                 return eexp_probe1(dev, base_addr);
 321         else if (base_addr > 0)
 322                 return ENXIO;           /* Don't probe at all. */
 323 
 324         for (port = &ports[0]; *port; port++) {
 325                 short id_addr = *port + ID_PORT;
 326                 unsigned short sum = 0;
 327                 int i;
 328 #ifdef notdef
 329                 for (i = 16; i > 0; i--)
 330                         sum += inb(id_addr);
 331                 printk("EtherExpress ID checksum is %04x.\n", sum);
 332 #else
 333                 for (i = 4; i > 0; i--) {
 334                         short id_val = inb(id_addr);
 335                         sum |= (id_val >> 4) << ((id_val & 3) << 2);
 336                 }
 337 #endif
 338                 if (sum == 0xbaba
 339                         && eexp_probe1(dev, *port) == 0)
 340                         return 0;
 341         }
 342 
 343         return ENODEV;
 344 }
 345 
 346 int eexp_probe1(struct device *dev, short ioaddr)
     /* [previous][next][first][last][top][bottom][index][help] */
 347 {
 348         unsigned short station_addr[3];
 349         int i;
 350 
 351         printk("%s: EtherExpress at %#x,", dev->name, ioaddr);
 352 
 353         /* The station address is stored !backwards! in the EEPROM, reverse
 354            after reading.  (Hmmm, a little brain-damage there at Intel, eh?) */
 355         station_addr[0] = read_eeprom(ioaddr, 2);
 356         station_addr[1] = read_eeprom(ioaddr, 3);
 357         station_addr[2] = read_eeprom(ioaddr, 4);
 358 
 359         /* Check the first three octets of the S.A. for the manufacturer's code. */
 360         if (station_addr[2] != 0x00aa || (station_addr[1] & 0xff00) != 0x0000) {
 361                 printk(" rejected (invalid address %04x%04x%04x).\n",
 362                            station_addr[2], station_addr[1], station_addr[0]);
 363                 return ENODEV;
 364         }
 365 
 366         /* We've committed to using the board, and can start filling in *dev. */
 367         request_region(ioaddr, EEXPRESS_IO_EXTENT, "eexpress");
 368         dev->base_addr = ioaddr;
 369 
 370         for (i = 0; i < 6; i++) {
 371                 dev->dev_addr[i] = ((unsigned char*)station_addr)[5-i];
 372                 printk(" %02x", dev->dev_addr[i]);
 373         }
 374 
 375         /* There is no reason for the driver to care, but I print out the
 376            interface to minimize bogus bug reports. */
 377         {
 378                 char irqmap[] = {0, 9, 3, 4, 5, 10, 11, 0};
 379                 const char *ifmap[] = {"AUI", "BNC", "10baseT"};
 380                 enum iftype {AUI=0, BNC=1, TP=2};
 381                 unsigned short setupval = read_eeprom(ioaddr, 0);
 382 
 383                 dev->irq = irqmap[setupval >> 13];
 384                 dev->if_port = (setupval & 0x1000) == 0 ? AUI :
 385                         read_eeprom(ioaddr, 5) & 0x1 ? TP : BNC;
 386                 printk(", IRQ %d, Interface %s.\n", dev->irq, ifmap[dev->if_port]);
 387                 /* Release the IRQ line so that it can be shared if we don't use the
 388                    ethercard. */
 389                 outb(0x00, ioaddr + SET_IRQ);
 390         }
 391 
 392         /* It's now OK to leave the board in reset, pending the open(). */
 393         outb(ASIC_RESET, ioaddr + EEPROM_Ctrl);
 394 
 395         if ((dev->mem_start & 0xf) > 0)
 396                 net_debug = dev->mem_start & 7;
 397 
 398         if (net_debug)
 399                 printk(version);
 400 
 401         /* Initialize the device structure. */
 402         dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
 403         if (dev->priv == NULL)
 404                 return -ENOMEM;
 405         memset(dev->priv, 0, sizeof(struct net_local));
 406 
 407         dev->open               = eexp_open;
 408         dev->stop               = eexp_close;
 409         dev->hard_start_xmit = eexp_send_packet;
 410         dev->get_stats  = eexp_get_stats;
 411         dev->set_multicast_list = &set_multicast_list;
 412 
 413         /* Fill in the fields of the device structure with ethernet-generic values. */
 414         
 415         ether_setup(dev);
 416         
 417         return 0;
 418 }
 419 
 420 
 421 /* Reverse IRQ map: the value to put in the SET_IRQ reg. for IRQ<index>. */
 422 static char irqrmap[]={0,0,1,2,3,4,0,0,0,1,5,6,0,0,0,0};
 423 
 424 static int
 425 eexp_open(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 426 {
 427         int ioaddr = dev->base_addr;
 428 
 429         if (dev->irq == 0  ||  irqrmap[dev->irq] == 0)
 430                 return -ENXIO;
 431 
 432         if (irq2dev_map[dev->irq] != 0
 433                 /* This is always true, but avoid the false IRQ. */
 434                 || (irq2dev_map[dev->irq] = dev) == 0
 435                 || request_irq(dev->irq, &eexp_interrupt, 0, "EExpress")) {
 436                 return -EAGAIN;
 437         }
 438 
 439         /* Initialize the 82586 memory and start it. */
 440         init_82586_mem(dev);
 441 
 442         /* Enable the interrupt line. */
 443         outb(irqrmap[dev->irq] | 0x08, ioaddr + SET_IRQ);
 444 
 445         dev->tbusy = 0;
 446         dev->interrupt = 0;
 447         dev->start = 1;
 448 #ifdef MODULE
 449         MOD_INC_USE_COUNT;
 450 #endif
 451         return 0;
 452 }
 453 
 454 static int
 455 eexp_send_packet(struct sk_buff *skb, struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 456 {
 457         struct net_local *lp = (struct net_local *)dev->priv;
 458         int ioaddr = dev->base_addr;
 459 
 460         if (dev->tbusy) {
 461                 /* If we get here, some higher level has decided we are broken.
 462                    There should really be a "kick me" function call instead. */
 463                 int tickssofar = jiffies - dev->trans_start;
 464                 if (tickssofar < 5)
 465                         return 1;
 466                 if (net_debug > 1)
 467                         printk("%s: transmit timed out, %s?  ", dev->name,
 468                                    inw(ioaddr+SCB_STATUS) & 0x8000 ? "IRQ conflict" :
 469                                    "network cable problem");
 470                 lp->stats.tx_errors++;
 471                 /* Try to restart the adaptor. */
 472                 if (lp->last_restart == lp->stats.tx_packets) {
 473                         if (net_debug > 1) printk("Resetting board.\n");
 474                         /* Completely reset the adaptor. */
 475                         init_82586_mem(dev);
 476                 } else {
 477                         /* Issue the channel attention signal and hope it "gets better". */
 478                         if (net_debug > 1) printk("Kicking board.\n");
 479                         outw(0xf000|CUC_START|RX_START, ioaddr + SCB_CMD);
 480                         outb(0, ioaddr + SIGNAL_CA);
 481                         lp->last_restart = lp->stats.tx_packets;
 482                 }
 483                 dev->tbusy=0;
 484                 dev->trans_start = jiffies;
 485         }
 486 
 487         /* If some higher layer thinks we've missed an tx-done interrupt
 488            we are passed NULL. Caution: dev_tint() handles the cli()/sti()
 489            itself. */
 490         if (skb == NULL) {
 491                 dev_tint(dev);
 492                 return 0;
 493         }
 494 
 495         /* Block a timer-based transmit from overlapping. */
 496         if (set_bit(0, (void*)&dev->tbusy) != 0)
 497                 printk("%s: Transmitter access conflict.\n", dev->name);
 498         else {
 499                 short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
 500                 unsigned char *buf = skb->data;
 501 
 502                 /* Disable the 82586's input to the interrupt line. */
 503                 outb(irqrmap[dev->irq], ioaddr + SET_IRQ);
 504                 hardware_send_packet(dev, buf, length);
 505                 dev->trans_start = jiffies;
 506                 /* Enable the 82586 interrupt input. */
 507                 outb(0x08 | irqrmap[dev->irq], ioaddr + SET_IRQ);
 508         }
 509 
 510         dev_kfree_skb (skb, FREE_WRITE);
 511 
 512         /* You might need to clean up and record Tx statistics here. */
 513         lp->stats.tx_aborted_errors++;
 514 
 515         return 0;
 516 }
 517 
 518 /*      The typical workload of the driver:
 519         Handle the network interface interrupts. */
 520 static void
 521 eexp_interrupt(int irq, struct pt_regs *regs)
     /* [previous][next][first][last][top][bottom][index][help] */
 522 {
 523         struct device *dev = (struct device *)(irq2dev_map[irq]);
 524         struct net_local *lp;
 525         int ioaddr, status, boguscount = 0;
 526         short ack_cmd;
 527 
 528         if (dev == NULL) {
 529                 printk ("net_interrupt(): irq %d for unknown device.\n", irq);
 530                 return;
 531         }
 532         dev->interrupt = 1;
 533         
 534         ioaddr = dev->base_addr;
 535         lp = (struct net_local *)dev->priv;
 536         
 537         status = inw(ioaddr + SCB_STATUS);
 538         
 539     if (net_debug > 4) {
 540                 printk("%s: EExp interrupt, status %4.4x.\n", dev->name, status);
 541     }
 542 
 543         /* Disable the 82586's input to the interrupt line. */
 544         outb(irqrmap[dev->irq], ioaddr + SET_IRQ);
 545 
 546         /* Reap the Tx packet buffers. */
 547         while (lp->tx_reap != lp->tx_head) {    /* if (status & 0x8000) */
 548                 unsigned short tx_status;
 549                 outw(lp->tx_reap, ioaddr + READ_PTR);
 550                 tx_status = inw(ioaddr);
 551                 if (tx_status == 0) {
 552                         if (net_debug > 5)  printk("Couldn't reap %#x.\n", lp->tx_reap);
 553                         break;
 554                 }
 555                 if (tx_status & 0x2000) {
 556                         lp->stats.tx_packets++;
 557                         lp->stats.collisions += tx_status & 0xf;
 558                         dev->tbusy = 0;
 559                         mark_bh(NET_BH);        /* Inform upper layers. */
 560                 } else {
 561                         lp->stats.tx_errors++;
 562                         if (tx_status & 0x0600)  lp->stats.tx_carrier_errors++;
 563                         if (tx_status & 0x0100)  lp->stats.tx_fifo_errors++;
 564                         if (!(tx_status & 0x0040))  lp->stats.tx_heartbeat_errors++;
 565                         if (tx_status & 0x0020)  lp->stats.tx_aborted_errors++;
 566                 }
 567                 if (net_debug > 5)
 568                         printk("Reaped %x, Tx status %04x.\n" , lp->tx_reap, tx_status);
 569                 lp->tx_reap += TX_BUF_SIZE;
 570                 if (lp->tx_reap > TX_BUF_END - TX_BUF_SIZE)
 571                         lp->tx_reap = TX_BUF_START;
 572                 if (++boguscount > 4)
 573                         break;
 574         }
 575 
 576         if (status & 0x4000) { /* Packet received. */
 577                 if (net_debug > 5)
 578                         printk("Received packet, rx_head %04x.\n", lp->rx_head);
 579                 eexp_rx(dev);
 580         }
 581 
 582         /* Acknowledge the interrupt sources. */
 583         ack_cmd = status & 0xf000;
 584 
 585         if ((status & 0x0700) != 0x0200  &&  dev->start) {
 586                 short saved_write_ptr = inw(ioaddr + WRITE_PTR);
 587                 if (net_debug > 1)
 588                         printk("%s: Command unit stopped, status %04x, restarting.\n",
 589                                    dev->name, status);
 590                 /* If this ever occurs we must re-write the idle loop, reset
 591                    the Tx list, and do a complete restart of the command unit. */
 592                 outw(IDLELOOP, ioaddr + WRITE_PTR);
 593                 outw(0, ioaddr);
 594                 outw(CmdNOp, ioaddr);
 595                 outw(IDLELOOP, ioaddr);
 596                 outw(IDLELOOP, SCB_CBL);
 597                 lp->tx_cmd_link = IDLELOOP + 4;
 598                 lp->tx_head = lp->tx_reap = TX_BUF_START;
 599                 /* Restore the saved write pointer. */
 600                 outw(saved_write_ptr, ioaddr + WRITE_PTR);
 601                 ack_cmd |= CUC_START;
 602         }
 603 
 604         if ((status & 0x0070) != 0x0040  &&  dev->start) {
 605                 short saved_write_ptr = inw(ioaddr + WRITE_PTR);
 606                 /* The Rx unit is not ready, it must be hung.  Restart the receiver by
 607                    initializing the rx buffers, and issuing an Rx start command. */
 608                 lp->stats.rx_errors++;
 609                 if (net_debug > 1) {
 610                         int cur_rxbuf = RX_BUF_START;
 611                         printk("%s: Rx unit stopped status %04x rx head %04x tail %04x.\n",
 612                                    dev->name, status, lp->rx_head, lp->rx_tail);
 613                         while (cur_rxbuf <= RX_BUF_END - RX_BUF_SIZE) {
 614                                 int i;
 615                                 printk("  Rx buf at %04x:", cur_rxbuf);
 616                                 outw(cur_rxbuf, ioaddr + READ_PTR);
 617                                 for (i = 0; i < 0x20; i += 2)
 618                                         printk(" %04x", inw(ioaddr));
 619                                 printk(".\n");
 620                                 cur_rxbuf += RX_BUF_SIZE;
 621                         }
 622                 }
 623                 init_rx_bufs(dev);
 624                 outw(RX_BUF_START, SCB_RFA);
 625                 outw(saved_write_ptr, ioaddr + WRITE_PTR);
 626                 ack_cmd |= RX_START;
 627         }
 628 
 629         outw(ack_cmd, ioaddr + SCB_CMD);
 630         outb(0, ioaddr + SIGNAL_CA);
 631 
 632     if (net_debug > 5) {
 633                 printk("%s: EExp exiting interrupt, status %4.4x.\n", dev->name,
 634                            inw(ioaddr + SCB_CMD));
 635     }
 636         /* Enable the 82586's input to the interrupt line. */
 637         outb(irqrmap[dev->irq] | 0x08, ioaddr + SET_IRQ);
 638         return;
 639 }
 640 
 641 static int
 642 eexp_close(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 643 {
 644         int ioaddr = dev->base_addr;
 645 
 646         dev->tbusy = 1;
 647         dev->start = 0;
 648 
 649         /* Flush the Tx and disable Rx. */
 650         outw(RX_SUSPEND | CUC_SUSPEND, ioaddr + SCB_CMD);
 651         outb(0, ioaddr + SIGNAL_CA);
 652 
 653         /* Disable the physical interrupt line. */
 654         outb(0, ioaddr + SET_IRQ);
 655 
 656         free_irq(dev->irq);
 657 
 658         irq2dev_map[dev->irq] = 0;
 659 
 660         /* Update the statistics here. */
 661 
 662 #ifdef MODULE
 663         MOD_DEC_USE_COUNT;
 664 #endif
 665         return 0;
 666 }
 667 
 668 /* Get the current statistics.  This may be called with the card open or
 669    closed. */
 670 static struct enet_statistics *
 671 eexp_get_stats(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 672 {
 673         struct net_local *lp = (struct net_local *)dev->priv;
 674 
 675         /* ToDo: decide if there are any useful statistics from the SCB. */
 676 
 677         return &lp->stats;
 678 }
 679 
 680 /* Set or clear the multicast filter for this adaptor.
 681    num_addrs == -1      Promiscuous mode, receive all packets
 682    num_addrs == 0       Normal mode, clear multicast list
 683    num_addrs > 0        Multicast mode, receive normal and MC packets, and do
 684                         best-effort filtering.
 685  */
 686 static void
 687 set_multicast_list(struct device *dev, int num_addrs, void *addrs)
     /* [previous][next][first][last][top][bottom][index][help] */
 688 {
 689 /* This doesn't work yet */
 690 #if 0
 691         short ioaddr = dev->base_addr;
 692         if (num_addrs < 0) {
 693                 /* Not written yet, this requires expanding the init_words config
 694                    cmd. */
 695         } else if (num_addrs > 0) {
 696                 /* Fill in the SET_MC_CMD with the number of address bytes, followed
 697                    by the list of multicast addresses to be accepted. */
 698                 outw(SET_MC_CMD + 6, ioaddr + WRITE_PTR);
 699                 outw(num_addrs * 6, ioaddr);
 700                 outsw(ioaddr, addrs, num_addrs*3);              /* 3 = addr len in words */
 701                 /* We must trigger a whole 586 reset due to a bug. */
 702         } else {
 703                 /* Not written yet, this requires expanding the init_words config
 704                    cmd. */
 705                 outw(99, ioaddr);               /* Disable promiscuous mode, use normal mode */
 706         }
 707 #endif
 708 }
 709 
 710 /* The horrible routine to read a word from the serial EEPROM. */
 711 
 712 /* The delay between EEPROM clock transitions. */
 713 #define eeprom_delay()  { int _i = 40; while (--_i > 0) { __SLOW_DOWN_IO; }}
 714 #define EE_READ_CMD (6 << 6)
 715 
 716 int
 717 read_eeprom(int ioaddr, int location)
     /* [previous][next][first][last][top][bottom][index][help] */
 718 {
 719         int i;
 720         unsigned short retval = 0;
 721         short ee_addr = ioaddr + EEPROM_Ctrl;
 722         int read_cmd = location | EE_READ_CMD;
 723         short ctrl_val = EE_CS | _586_RESET;
 724         
 725         outb(ctrl_val, ee_addr);
 726         
 727         /* Shift the read command bits out. */
 728         for (i = 8; i >= 0; i--) {
 729                 short outval = (read_cmd & (1 << i)) ? ctrl_val | EE_DATA_WRITE
 730                         : ctrl_val;
 731                 outb(outval, ee_addr);
 732                 outb(outval | EE_SHIFT_CLK, ee_addr);   /* EEPROM clock tick. */
 733                 eeprom_delay();
 734                 outb(outval, ee_addr);  /* Finish EEPROM a clock tick. */
 735                 eeprom_delay();
 736         }
 737         outb(ctrl_val, ee_addr);
 738         
 739         for (i = 16; i > 0; i--) {
 740                 outb(ctrl_val | EE_SHIFT_CLK, ee_addr);  eeprom_delay();
 741                 retval = (retval << 1) | ((inb(ee_addr) & EE_DATA_READ) ? 1 : 0);
 742                 outb(ctrl_val, ee_addr);  eeprom_delay();
 743         }
 744 
 745         /* Terminate the EEPROM access. */
 746         ctrl_val &= ~EE_CS;
 747         outb(ctrl_val | EE_SHIFT_CLK, ee_addr);
 748         eeprom_delay();
 749         outb(ctrl_val, ee_addr);
 750         eeprom_delay();
 751         return retval;
 752 }
 753 
 754 static void
 755 init_82586_mem(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 756 {
 757         struct net_local *lp = (struct net_local *)dev->priv;
 758         short ioaddr = dev->base_addr;
 759 
 760         /* Enable loopback to protect the wire while starting up.
 761            This is Superstition From Crynwr. */
 762         outb(inb(ioaddr + Config) | 0x02, ioaddr + Config);
 763 
 764         /* Hold the 586 in reset during the memory initialization. */
 765         outb(_586_RESET, ioaddr + EEPROM_Ctrl);
 766 
 767         /* Place the write pointer at 0xfff6 (address-aliased to 0xfffff6). */
 768         outw(0xfff6, ioaddr + WRITE_PTR);
 769         outsw(ioaddr, init_words, sizeof(init_words)>>1);
 770 
 771         /* Fill in the station address. */
 772         outw(SA_OFFSET, ioaddr + WRITE_PTR);
 773         outsw(ioaddr, dev->dev_addr, 3);
 774 
 775         /* The Tx-block list is written as needed.  We just set up the values. */
 776 #ifdef initial_text_tx
 777         lp->tx_cmd_link = DUMP_DATA + 4;
 778 #else
 779         lp->tx_cmd_link = IDLELOOP + 4;
 780 #endif
 781         lp->tx_head = lp->tx_reap = TX_BUF_START;
 782 
 783         init_rx_bufs(dev);
 784 
 785         /* Start the 586 by releasing the reset line. */
 786         outb(0x00, ioaddr + EEPROM_Ctrl);
 787 
 788         /* This was time consuming to track down: you need to give two channel
 789            attention signals to reliably start up the i82586. */
 790         outb(0, ioaddr + SIGNAL_CA);
 791 
 792         {
 793                 int boguscnt = 50;
 794                 while (inw(ioaddr + SCB_STATUS) == 0)
 795                         if (--boguscnt == 0) {
 796                                 printk("%s: i82586 initialization timed out with status %04x, cmd %04x.\n",
 797                                            dev->name, inw(ioaddr + SCB_STATUS), inw(ioaddr + SCB_CMD));
 798                                 break;
 799                         }
 800                 /* Issue channel-attn -- the 82586 won't start without it. */
 801                 outb(0, ioaddr + SIGNAL_CA);
 802         }
 803 
 804         /* Disable loopback. */
 805         outb(inb(ioaddr + Config) & ~0x02, ioaddr + Config);
 806         if (net_debug > 4)
 807                 printk("%s: Initialized 82586, status %04x.\n", dev->name,
 808                            inw(ioaddr + SCB_STATUS));
 809         return;
 810 }
 811 
 812 /* Initialize the Rx-block list. */
 813 static void init_rx_bufs(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 814 {
 815         struct net_local *lp = (struct net_local *)dev->priv;
 816         short ioaddr = dev->base_addr;
 817 
 818         int cur_rxbuf = lp->rx_head = RX_BUF_START;
 819         
 820         /* Initialize each Rx frame + data buffer. */
 821         do {    /* While there is room for one more. */
 822                 outw(cur_rxbuf, ioaddr + WRITE_PTR);
 823                 outw(0x0000, ioaddr);                           /* Status */
 824                 outw(0x0000, ioaddr);                           /* Command */
 825                 outw(cur_rxbuf + RX_BUF_SIZE, ioaddr); /* Link */
 826                 outw(cur_rxbuf + 22, ioaddr);           /* Buffer offset */
 827                 outw(0xFeed, ioaddr);                           /* Pad for dest addr. */
 828                 outw(0xF00d, ioaddr);
 829                 outw(0xF001, ioaddr);
 830                 outw(0x0505, ioaddr);                           /* Pad for source addr. */
 831                 outw(0x2424, ioaddr);
 832                 outw(0x6565, ioaddr);
 833                 outw(0xdeaf, ioaddr);                           /* Pad for protocol. */
 834 
 835                 outw(0x0000, ioaddr);                           /* Buffer: Actual count */
 836                 outw(-1, ioaddr);                                       /* Buffer: Next (none). */
 837                 outw(cur_rxbuf + 0x20, ioaddr);         /* Buffer: Address low */
 838                 outw(0x0000, ioaddr);
 839                 /* Finally, the number of bytes in the buffer. */
 840                 outw(0x8000 + RX_BUF_SIZE-0x20, ioaddr);
 841                 
 842                 lp->rx_tail = cur_rxbuf;
 843                 cur_rxbuf += RX_BUF_SIZE;
 844         } while (cur_rxbuf <= RX_BUF_END - RX_BUF_SIZE);
 845         
 846         /* Terminate the list by setting the EOL bit, and wrap the pointer to make
 847            the list a ring. */
 848         outw(lp->rx_tail + 2, ioaddr + WRITE_PTR);
 849         outw(0xC000, ioaddr);                                   /* Command, mark as last. */
 850         outw(lp->rx_head, ioaddr);                              /* Link */
 851 }
 852 
 853 static void
 854 hardware_send_packet(struct device *dev, void *buf, short length)
     /* [previous][next][first][last][top][bottom][index][help] */
 855 {
 856         struct net_local *lp = (struct net_local *)dev->priv;
 857         short ioaddr = dev->base_addr;
 858         short tx_block = lp->tx_head;
 859 
 860         /* Set the write pointer to the Tx block, and put out the header. */
 861         outw(tx_block, ioaddr + WRITE_PTR);
 862         outw(0x0000, ioaddr);           /* Tx status */
 863         outw(CMD_INTR|CmdTx, ioaddr);           /* Tx command */
 864         outw(tx_block+16, ioaddr);      /* Next command is a NoOp. */
 865         outw(tx_block+8, ioaddr);       /* Data Buffer offset. */
 866 
 867         /* Output the data buffer descriptor. */
 868         outw(length | 0x8000, ioaddr); /* Byte count parameter. */
 869         outw(-1, ioaddr);                       /* No next data buffer. */
 870         outw(tx_block+22, ioaddr);      /* Buffer follows the NoOp command. */
 871         outw(0x0000, ioaddr);           /* Buffer address high bits (always zero). */
 872 
 873         /* Output the Loop-back NoOp command. */
 874         outw(0x0000, ioaddr);           /* Tx status */
 875         outw(CmdNOp, ioaddr);           /* Tx command */
 876         outw(tx_block+16, ioaddr);      /* Next is myself. */
 877 
 878         /* Output the packet using the write pointer.
 879            Hmmm, it feels a little like a 3c501! */
 880         outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
 881 
 882         /* Set the old command link pointing to this send packet. */
 883         outw(lp->tx_cmd_link, ioaddr + WRITE_PTR);
 884         outw(tx_block, ioaddr);
 885         lp->tx_cmd_link = tx_block + 20;
 886 
 887         /* Set the next free tx region. */
 888         lp->tx_head = tx_block + TX_BUF_SIZE;
 889         if (lp->tx_head > TX_BUF_END - TX_BUF_SIZE)
 890                 lp->tx_head = TX_BUF_START;
 891 
 892     if (net_debug > 4) {
 893                 printk("%s: EExp @%x send length = %d, tx_block %3x, next %3x, "
 894                            "reap %4x status %4.4x.\n", dev->name, ioaddr, length,
 895                            tx_block, lp->tx_head, lp->tx_reap, inw(ioaddr + SCB_STATUS));
 896     }
 897 
 898         if (lp->tx_head != lp->tx_reap)
 899                 dev->tbusy = 0;
 900 }
 901 
 902 static void
 903 eexp_rx(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 904 {
 905         struct net_local *lp = (struct net_local *)dev->priv;
 906         short ioaddr = dev->base_addr;
 907         short saved_write_ptr = inw(ioaddr + WRITE_PTR);
 908         short rx_head = lp->rx_head;
 909         short rx_tail = lp->rx_tail;
 910         short boguscount = 10;
 911         short frame_status;
 912 
 913         /* Set the read pointer to the Rx frame. */
 914         outw(rx_head, ioaddr + READ_PTR);
 915         while ((frame_status = inw(ioaddr)) < 0) {              /* Command complete */
 916                 short rfd_cmd = inw(ioaddr);
 917                 short next_rx_frame = inw(ioaddr);
 918                 short data_buffer_addr = inw(ioaddr);
 919                 short pkt_len;
 920                 
 921                 /* Set the read pointer the data buffer. */
 922                 outw(data_buffer_addr, ioaddr + READ_PTR);
 923                 pkt_len = inw(ioaddr);
 924 
 925                 if (rfd_cmd != 0  ||  data_buffer_addr != rx_head + 22
 926                         ||  (pkt_len & 0xC000) != 0xC000) {
 927                         printk("%s: Rx frame at %#x corrupted, status %04x cmd %04x"
 928                                    "next %04x data-buf @%04x %04x.\n", dev->name, rx_head,
 929                                    frame_status, rfd_cmd, next_rx_frame, data_buffer_addr,
 930                                    pkt_len);
 931                 } else if ((frame_status & 0x2000) == 0) {
 932                         /* Frame Rxed, but with error. */
 933                         lp->stats.rx_errors++;
 934                         if (frame_status & 0x0800) lp->stats.rx_crc_errors++;
 935                         if (frame_status & 0x0400) lp->stats.rx_frame_errors++;
 936                         if (frame_status & 0x0200) lp->stats.rx_fifo_errors++;
 937                         if (frame_status & 0x0100) lp->stats.rx_over_errors++;
 938                         if (frame_status & 0x0080) lp->stats.rx_length_errors++;
 939                 } else {
 940                         /* Malloc up new buffer. */
 941                         struct sk_buff *skb;
 942 
 943                         pkt_len &= 0x3fff;
 944                         skb = dev_alloc_skb(pkt_len+2);
 945                         if (skb == NULL) {
 946                                 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
 947                                 lp->stats.rx_dropped++;
 948                                 break;
 949                         }
 950                         skb->dev = dev;
 951                         skb_reserve(skb,2);
 952 
 953                         outw(data_buffer_addr + 10, ioaddr + READ_PTR);
 954 
 955                         insw(ioaddr, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
 956                 
 957                         skb->protocol=eth_type_trans(skb,dev);
 958                         netif_rx(skb);
 959                         lp->stats.rx_packets++;
 960                 }
 961 
 962                 /* Clear the status word and set End-of-List on the rx frame. */
 963                 outw(rx_head, ioaddr + WRITE_PTR);
 964                 outw(0x0000, ioaddr);
 965                 outw(0xC000, ioaddr);
 966 #ifndef final_version
 967                 if (next_rx_frame != rx_head + RX_BUF_SIZE
 968                         && next_rx_frame != RX_BUF_START) {
 969                         printk("%s: Rx next frame at %#x is %#x instead of %#x.\n", dev->name,
 970                                    rx_head, next_rx_frame, rx_head + RX_BUF_SIZE);
 971                         next_rx_frame = rx_head + RX_BUF_SIZE;
 972                         if (next_rx_frame >= RX_BUF_END - RX_BUF_SIZE)
 973                                 next_rx_frame = RX_BUF_START;
 974                 }
 975 #endif
 976                 outw(rx_tail+2, ioaddr + WRITE_PTR);
 977                 outw(0x0000, ioaddr);   /* Clear the end-of-list on the prev. RFD. */
 978 
 979 #ifndef final_version
 980                 outw(rx_tail+4, ioaddr + READ_PTR);
 981                 if (inw(ioaddr) != rx_head) {
 982                         printk("%s: Rx buf link mismatch, at %04x link %04x instead of %04x.\n",
 983                                    dev->name, rx_tail, (outw(rx_tail+4, ioaddr + READ_PTR),inw(ioaddr)),
 984                                    rx_head);
 985                         outw(rx_head, ioaddr);
 986                 }
 987 #endif
 988 
 989                 rx_tail = rx_head;
 990                 rx_head = next_rx_frame;
 991                 if (--boguscount == 0)
 992                         break;
 993                 outw(rx_head, ioaddr + READ_PTR);
 994         }
 995         
 996         lp->rx_head = rx_head;
 997         lp->rx_tail = rx_tail;
 998         
 999         /* Restore the original write pointer. */
1000         outw(saved_write_ptr, ioaddr + WRITE_PTR);
1001 }
1002 
1003 #ifdef MODULE
1004 char kernel_version[] = UTS_RELEASE;
1005 static char devicename[9] = { 0, };
1006 static struct device dev_eexpress = {
1007         devicename, /* device name is inserted by linux/drivers/net/net_init.c */
1008         0, 0, 0, 0,
1009         0, 0,
1010         0, 0, 0, NULL, express_probe };
1011         
1012 
1013 int irq=0x300;
1014 int io=0;       
1015 
1016 int
1017 init_module(void)
     /* [previous][next][first][last][top][bottom][index][help] */
1018 {
1019         if (io == 0)
1020                 printk("eexpress: You should not use auto-probing with insmod!\n");
1021         dev_eexpress.base_addr=io;
1022         dev_eexpress.irq=irq;
1023         if (register_netdev(&dev_eexpress) != 0)
1024                 return -EIO;
1025         return 0;
1026 }
1027 
1028 void
1029 cleanup_module(void)
     /* [previous][next][first][last][top][bottom][index][help] */
1030 {
1031         if (MOD_IN_USE)
1032                 printk("eexpress: device busy, remove delayed\n");
1033         else
1034         {
1035                 unregister_netdev(&dev_eexpress);
1036                 kfree_s(dev_eexpress.priv,sizeof(struct net_local));
1037                 dev_eexpress.priv=NULL;
1038 
1039                 /* If we don't do this, we can't re-insmod it later. */
1040                 release_region(dev_eexpress.base_addr, EEXPRESS_IO_EXTENT);
1041         }
1042 }
1043 #endif /* MODULE */
1044 /*
1045  * Local variables:
1046  *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -I/usr/src/linux/drivers/net -Wall -Wstrict-prototypes -O6 -m486 -c eexpress.c"
1047  *  version-control: t
1048  *  kept-new-versions: 5
1049  *  tab-width: 4
1050  * End:
1051  */

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