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

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