root/drivers/net/3c59x.c

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

DEFINITIONS

This source file includes following definitions.
  1. init_module
  2. tc59x_probe
  3. vortex_scan
  4. vortex_found_device
  5. vortex_probe1
  6. vortex_open
  7. vortex_timer
  8. vortex_start_xmit
  9. vortex_interrupt
  10. vortex_rx
  11. vortex_close
  12. vortex_get_stats
  13. update_stats
  14. set_multicast_list
  15. cleanup_module

   1 /* 3c59x.c: A 3Com 3c590/3c595 "Vortex" ethernet driver for linux. */
   2 /*
   3         Written 1995 by Donald Becker.
   4 
   5         This software may be used and distributed according to the terms
   6         of the GNU Public License, incorporated herein by reference.
   7 
   8         This driver is for the 3Com "Vortex" series ethercards.  Members of
   9         the series include the 3c590 PCI EtherLink III and 3c595-Tx PCI Fast
  10         EtherLink.  It also works with the 10Mbs-only 3c590 PCI EtherLink III.
  11 
  12         The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
  13         Center of Excellence in Space Data and Information Sciences
  14            Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
  15 */
  16 
  17 static char *version = "3c59x.c:v0.13 2/13/96 becker@cesdis.gsfc.nasa.gov\n";
  18 
  19 /* "Knobs" that turn on special features. */
  20 /* Allow the use of bus master transfers instead of programmed-I/O for the
  21    Tx process.  Bus master transfers are always disabled by default, but
  22    iff this is set they may be turned on using 'options'. */
  23 #define VORTEX_BUS_MASTER
  24 
  25 /* Put out somewhat more debugging messages. (0 - no msg, 1 minimal msgs). */
  26 #define VORTEX_DEBUG 1
  27 
  28 #include <linux/module.h>
  29 
  30 #include <linux/kernel.h>
  31 #include <linux/sched.h>
  32 #include <linux/string.h>
  33 #include <linux/ptrace.h>
  34 #include <linux/errno.h>
  35 #include <linux/in.h>
  36 #include <linux/ioport.h>
  37 #include <linux/malloc.h>
  38 #include <linux/interrupt.h>
  39 #include <linux/pci.h>
  40 #include <linux/bios32.h>
  41 #include <linux/timer.h>
  42 #include <asm/bitops.h>
  43 #include <asm/io.h>
  44 
  45 #include <linux/netdevice.h>
  46 #include <linux/etherdevice.h>
  47 #include <linux/skbuff.h>
  48 
  49 #ifdef HAVE_SHARED_IRQ
  50 #define USE_SHARED_IRQ
  51 #include <linux/shared_irq.h>
  52 #endif
  53 
  54 /* The total size is twice that of the original EtherLinkIII series: the
  55    runtime register window, window 1, is now always mapped in. */
  56 #define VORTEX_TOTAL_SIZE 0x20
  57 
  58 #ifdef HAVE_DEVLIST
  59 struct netdev_entry tc59x_drv =
  60 {"Vortex", vortex_pci_probe, VORTEX_TOTAL_SIZE, NULL};
  61 #endif
  62 
  63 #ifdef VORTEX_DEBUG
  64 int vortex_debug = VORTEX_DEBUG;
  65 #else
  66 int vortex_debug = 1;
  67 #endif
  68 
  69 static int product_ids[] = {0x5900, 0x5950, 0x5951, 0x5952, 0, 0};
  70 static const char *product_names[] = {
  71         "3c590 Vortex 10Mbps",
  72         "3c595 Vortex 100baseTX",
  73         "3c595 Vortex 100baseT4",
  74         "3c595 Vortex 100base-MII",
  75         "EISA Vortex 3c597",
  76 };
  77 #define DEMON_INDEX 5                   /* Caution!  Must be consistent with above! */
  78 
  79 /*
  80                                 Theory of Operation
  81 
  82 I. Board Compatibility
  83 
  84 This device driver is designed for the 3Com FastEtherLink, 3Com's PCI to
  85 10/100baseT adapter.  It also works with the 3c590, a similar product
  86 with only a 10Mbs interface.
  87 
  88 II. Board-specific settings
  89 
  90 PCI bus devices are configured by the system at boot time, so no jumpers
  91 need to be set on the board.  The system BIOS should be set to assign the
  92 PCI INTA signal to an otherwise unused system IRQ line.  While it's
  93 physically possible to shared PCI interrupt lines, the 1.2.0 kernel doesn't
  94 support it.
  95 
  96 III. Driver operation
  97 
  98 The 3c59x series use an interface that's very similar to the previous 3c5x9
  99 series.  The primary interface is two programmed-I/O FIFOs, with an
 100 alternate single-contiguous-region bus-master transfer (see next).
 101 
 102 One extension that is advertised in a very large font is that the adapters
 103 are capable of being bus masters.  Unfortunately this capability is only for
 104 a single contiguous region making it less useful than the list of transfer
 105 regions available with the DEC Tulip or AMD PCnet.  Given the significant
 106 performance impact of taking an extra interrupt for each transfer, using
 107 DMA transfers is a win only with large blocks.
 108 
 109 IIIC. Synchronization
 110 The driver runs as two independent, single-threaded flows of control.  One
 111 is the send-packet routine, which enforces single-threaded use by the
 112 dev->tbusy flag.  The other thread is the interrupt handler, which is single
 113 threaded by the hardware and other software.
 114 
 115 IV. Notes
 116 
 117 Thanks to Cameron Spitzer and Terry Murphy of 3Com for providing both
 118 3c590 and 3c595 boards.
 119 The name "Vortex" is the internal 3Com project name for the PCI ASIC, and
 120 the not-yet-released (3/95) EISA version is called "Demon".  According to
 121 Terry these names come from rides at the local amusement park.
 122 
 123 The new chips support both ethernet (1.5K) and FDDI (4.5K) packet sizes!
 124 This driver only supports ethernet packets because of the skbuff allocation
 125 limit of 4K.
 126 */
 127 
 128 #define TCOM_VENDOR_ID  0x10B7          /* 3Com's manufacturer's ID. */
 129 
 130 /* Operational definitions.
 131    These are not used by other compilation units and thus are not
 132    exported in a ".h" file.
 133 
 134    First the windows.  There are eight register windows, with the command
 135    and status registers available in each.
 136    */
 137 #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
 138 #define EL3_CMD 0x0e
 139 #define EL3_STATUS 0x0e
 140 
 141 /* The top five bits written to EL3_CMD are a command, the lower
 142    11 bits are the parameter, if applicable.
 143    Note that 11 parameters bits was fine for ethernet, but the new chip
 144    can handle FDDI length frames (~4500 octets) and now parameters count
 145    32-bit 'Dwords' rather than octets. */
 146 
 147 enum vortex_cmd {
 148         TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
 149         RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
 150         TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
 151         FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
 152         SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
 153         SetTxThreshold = 18<<11, SetTxStart = 19<<11,
 154         StartDMAUp = 20<<11, StartDMADown = (20<<11)+1, StatsEnable = 21<<11,
 155         StatsDisable = 22<<11, StopCoax = 23<<11,};
 156 
 157 /* The SetRxFilter command accepts the following classes: */
 158 enum RxFilter {
 159         RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
 160 
 161 /* Bits in the general status register. */
 162 enum vortex_status {
 163         IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
 164         TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
 165         IntReq = 0x0040, StatsFull = 0x0080, DMADone = 1<<8,
 166         DMAInProgress = 1<<11,                  /* DMA controller is still busy.*/
 167         CmdInProgress = 1<<12,                  /* EL3_CMD is still busy.*/
 168 };
 169 
 170 /* Register window 1 offsets, the window used in normal operation.
 171    On the Vortex this window is always mapped at offsets 0x10-0x1f. */
 172 enum Window1 {
 173         TX_FIFO = 0x10,  RX_FIFO = 0x10,  RxErrors = 0x14,
 174         RxStatus = 0x18,  Timer=0x1A, TxStatus = 0x1B,
 175         TxFree = 0x1C, /* Remaining free bytes in Tx buffer. */
 176 };
 177 enum Window0 {
 178         Wn0EepromCmd = 10,              /* Window 0: EEPROM command register. */
 179 };
 180 enum Win0_EEPROM_bits {
 181         EEPROM_Read = 0x80, EEPROM_WRITE = 0x40, EEPROM_ERASE = 0xC0,
 182         EEPROM_EWENB = 0x30,            /* Enable erasing/writing for 10 msec. */
 183         EEPROM_EWDIS = 0x00,            /* Disable EWENB before 10 msec timeout. */
 184 };
 185 /* EEPROM locations. */
 186 enum eeprom_offset {
 187         PhysAddr01=0, PhysAddr23=1, PhysAddr45=2, ModelID=3,
 188         EtherLink3ID=7, IFXcvrIO=8, IRQLine=9,
 189         NodeAddr01=10, NodeAddr23=11, NodeAddr45=12,
 190         DriverTune=13, Checksum=15};
 191 
 192 enum Window3 {                  /* Window 3: MAC/config bits. */
 193         Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
 194 };
 195 union wn3_config {
 196         int i;
 197         struct w3_config_fields {
 198                 unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
 199                 int pad8:8;
 200                 unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1;
 201                 int pad24:8;
 202         } u;
 203 };
 204 
 205 enum Window4 {
 206         Wn4_Media = 0x0A,               /* Window 4: Various transcvr/media bits. */
 207 };
 208 enum Win4_Media_bits {
 209         Media_TP = 0x00C0,              /* Enable link beat and jabber for 10baseT. */
 210 };
 211 enum Window7 {                                  /* Window 7: Bus Master control. */
 212         Wn7_MasterAddr = 0, Wn7_MasterLen = 6, Wn7_MasterStatus = 12,
 213 };
 214 
 215 struct vortex_private {
 216         char devname[8];                        /* "ethN" string, also for kernel debug. */
 217         const char *product_name;
 218         struct device *next_module;
 219         struct enet_statistics stats;
 220 #ifdef VORTEX_BUS_MASTER
 221         struct sk_buff *tx_skb;         /* Packet being eaten by bus master ctrl.  */
 222 #endif
 223         struct timer_list timer;        /* Media selection timer. */
 224         int options;                            /* User-settable driver options (none yet). */
 225         unsigned int media_override:3, full_duplex:1, bus_master:1, autoselect:1;
 226 };
 227 
 228 static char *if_names[] = {
 229         "10baseT", "10Mbs AUI", "undefined", "10base2",
 230         "100baseTX", "100baseFX", "MII", "undefined"};
 231 
 232 static int vortex_scan(struct device *dev);
 233 static int vortex_found_device(struct device *dev, int ioaddr, int irq,
 234                                                            int product_index, int options);
 235 static int vortex_probe1(struct device *dev);
 236 static int vortex_open(struct device *dev);
 237 static void vortex_timer(unsigned long arg);
 238 static int vortex_start_xmit(struct sk_buff *skb, struct device *dev);
 239 static int vortex_rx(struct device *dev);
 240 static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 241 static int vortex_close(struct device *dev);
 242 static void update_stats(int addr, struct device *dev);
 243 static struct enet_statistics *vortex_get_stats(struct device *dev);
 244 static void set_multicast_list(struct device *dev);
 245 
 246 
 247 /* Unlike the other PCI cards the 59x cards don't need a large contiguous
 248    memory region, so making the driver a loadable module is feasible.
 249 
 250    Unfortunately maximizing the shared code between the integrated and
 251    module version of the driver results in a complicated set of initialization
 252    procedures.
 253    init_module() -- modules /  tc59x_init()  -- built-in
 254                 The wrappers for vortex_scan()
 255    vortex_scan()                 The common routine that scans for PCI and EISA cards
 256    vortex_found_device() Allocate a device structure when we find a card.
 257                                         Different versions exist for modules and built-in.
 258    vortex_probe1()              Fill in the device structure -- this is separated
 259                                         so that the modules code can put it in dev->init.
 260 */
 261 /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
 262 /* Note: this is the only limit on the number of cards supported!! */
 263 int options[8] = { -1, -1, -1, -1, -1, -1, -1, -1,};
 264 
 265 #ifdef MODULE
 266 static int debug = -1;
 267 /* A list of all installed Vortex devices, for removing the driver module. */
 268 static struct device *root_vortex_dev = NULL;
 269 
 270 int
 271 init_module(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 272 {
 273         int cards_found;
 274 
 275         if (debug >= 0)
 276                 vortex_debug = debug;
 277         if (vortex_debug)
 278                 printk(version);
 279 
 280         root_vortex_dev = NULL;
 281         cards_found = vortex_scan(0);
 282         return cards_found < 0 ? cards_found : 0;
 283 }
 284 
 285 #else
 286 unsigned long tc59x_probe(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 287 {
 288         int cards_found = 0;
 289 
 290         cards_found = vortex_scan(dev);
 291 
 292         if (vortex_debug > 0  &&  cards_found)
 293                 printk(version);
 294 
 295         return cards_found ? 0 : -ENODEV;
 296 }
 297 #endif  /* not MODULE */
 298 
 299 static int vortex_scan(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 300 {
 301         int cards_found = 0;
 302 
 303         if (pcibios_present()) {
 304                 static int pci_index = 0;
 305                 for (; pci_index < 8; pci_index++) {
 306                         unsigned char pci_bus, pci_device_fn, pci_irq_line, pci_latency;
 307                         unsigned int pci_ioaddr;
 308                         unsigned short pci_command;
 309                         int index;
 310 
 311                         for (index = 0; product_ids[index]; index++) {
 312                                 if ( ! pcibios_find_device(TCOM_VENDOR_ID, product_ids[index],
 313                                                                                    pci_index, &pci_bus,
 314                                                                                    &pci_device_fn))
 315                                         break;
 316                         }
 317                         if ( ! product_ids[index])
 318                                 break;
 319 
 320                         pcibios_read_config_byte(pci_bus, pci_device_fn,
 321                                                                          PCI_INTERRUPT_LINE, &pci_irq_line);
 322                         pcibios_read_config_dword(pci_bus, pci_device_fn,
 323                                                                           PCI_BASE_ADDRESS_0, &pci_ioaddr);
 324                         /* Remove I/O space marker in bit 0. */
 325                         pci_ioaddr &= ~3;
 326 
 327 #ifdef VORTEX_BUS_MASTER
 328                         /* Get and check the bus-master and latency values.
 329                            Some PCI BIOSes fail to set the master-enable bit, and
 330                            the latency timer must be set to the maximum value to avoid
 331                            data corruption that occurs when the timer expires during
 332                            a transfer.  Yes, it's a bug. */
 333                         pcibios_read_config_word(pci_bus, pci_device_fn,
 334                                                                          PCI_COMMAND, &pci_command);
 335                         if ( ! (pci_command & PCI_COMMAND_MASTER)) {
 336                                 printk("  PCI Master Bit has not been set! Setting...\n");
 337                                 pci_command |= PCI_COMMAND_MASTER;
 338                                 pcibios_write_config_word(pci_bus, pci_device_fn,
 339                                                                                   PCI_COMMAND, pci_command);
 340                         }
 341                         pcibios_read_config_byte(pci_bus, pci_device_fn,
 342                                                                                  PCI_LATENCY_TIMER, &pci_latency);
 343                         if (pci_latency != 255) {
 344                                 printk("  Overriding PCI latency timer (CFLT) setting of %d, new value is 255.\n", pci_latency);
 345                                 pcibios_write_config_byte(pci_bus, pci_device_fn,
 346                                                                                   PCI_LATENCY_TIMER, 255);
 347                         }
 348 #endif  /* VORTEX_BUS_MASTER */
 349                         vortex_found_device(dev, pci_ioaddr, pci_irq_line, index,
 350                                                                 dev && dev->mem_start ? dev->mem_start
 351                                                                 : options[cards_found]);
 352                         dev = 0;
 353                         cards_found++;
 354                 }
 355         }
 356 
 357         /* Now check all slots of the EISA bus. */
 358         if (EISA_bus) {
 359                 static int ioaddr = 0x1000;
 360                 for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
 361                         /* Check the standard EISA ID register for an encoded '3Com'. */
 362                         if (inw(ioaddr + 0xC80) != 0x6d50)
 363                                 continue;
 364                         /* Check for a product that we support. */
 365                         if ((inw(ioaddr + 0xC82) & 0xFFF0) != 0x5970
 366                                 && (inw(ioaddr + 0xC82) & 0xFFF0) != 0x5920)
 367                                 continue;
 368                         vortex_found_device(dev, ioaddr, inw(ioaddr + 0xC88) >> 12,
 369                                                                 DEMON_INDEX,  dev && dev->mem_start
 370                                                                 ? dev->mem_start : options[cards_found]);
 371                         dev = 0;
 372                         cards_found++;
 373                 }
 374         }
 375 
 376         return cards_found;
 377 }
 378 
 379 static int vortex_found_device(struct device *dev, int ioaddr, int irq,
     /* [previous][next][first][last][top][bottom][index][help] */
 380                                                            int product_index, int options)
 381 {
 382         struct vortex_private *vp;
 383 
 384 #ifdef MODULE
 385         /* Allocate and fill new device structure. */
 386         int dev_size = sizeof(struct device) +
 387                 sizeof(struct vortex_private);
 388         
 389         dev = (struct device *) kmalloc(dev_size, GFP_KERNEL);
 390         memset(dev, 0, dev_size);
 391         dev->priv = ((void *)dev) + sizeof(struct device);
 392         vp = (struct vortex_private *)dev->priv;
 393         dev->name = vp->devname; /* An empty string. */
 394         dev->base_addr = ioaddr;
 395         dev->irq = irq;
 396         dev->init = vortex_probe1;
 397         vp->product_name = product_names[product_index];
 398         vp->options = options;
 399         if (options >= 0) {
 400                 vp->media_override = ((options & 7) == 2)  ?  0  :  options & 7;
 401                 vp->full_duplex = (options & 8) ? 1 : 0;
 402                 vp->bus_master = (options & 16) ? 1 : 0;
 403         } else {
 404                 vp->media_override = 7;
 405                 vp->full_duplex = 0;
 406                 vp->bus_master = 0;
 407         }
 408         ether_setup(dev);
 409         vp->next_module = root_vortex_dev;
 410         root_vortex_dev = dev;
 411         if (register_netdev(dev) != 0)
 412                 return -EIO;
 413 #else  /* not a MODULE */
 414         if (dev) {
 415                 dev->priv = kmalloc(sizeof (struct vortex_private), GFP_KERNEL);
 416                 memset(dev->priv, 0, sizeof (struct vortex_private));
 417         }
 418         dev = init_etherdev(dev, sizeof(struct vortex_private));
 419         dev->base_addr = ioaddr;
 420         dev->irq = irq;
 421         vp  = (struct vortex_private *)dev->priv;
 422         vp->product_name = product_names[product_index];
 423         vp->options = options;
 424         if (options >= 0) {
 425                 vp->media_override = ((options & 7) == 2)  ?  0  :  options & 7;
 426                 vp->full_duplex = (options & 8) ? 1 : 0;
 427                 vp->bus_master = (options & 16) ? 1 : 0;
 428         } else {
 429                 vp->media_override = 7;
 430                 vp->full_duplex = 0;
 431                 vp->bus_master = 0;
 432         }
 433 
 434         vortex_probe1(dev);
 435 #endif /* MODULE */
 436         return 0;
 437 }
 438 
 439 static int vortex_probe1(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 440 {
 441         int ioaddr = dev->base_addr;
 442         struct vortex_private *vp = (struct vortex_private *)dev->priv;
 443         int i;
 444 
 445         printk("%s: 3Com %s at %#3x,", dev->name,
 446                    vp->product_name, ioaddr);
 447 
 448         /* Read the station address from the EEPROM. */
 449         EL3WINDOW(0);
 450         for (i = 0; i < 3; i++) {
 451                 short *phys_addr = (short *)dev->dev_addr;
 452                 int timer;
 453                 outw(EEPROM_Read + PhysAddr01 + i, ioaddr + Wn0EepromCmd);
 454                 /* Pause for at least 162 us. for the read to take place. */
 455                 for (timer = 0; timer < 162*4 + 400; timer++) {
 456                         SLOW_DOWN_IO;
 457                         if ((inw(ioaddr + Wn0EepromCmd) & 0x8000) == 0)
 458                                 break;
 459                 }
 460                 phys_addr[i] = htons(inw(ioaddr + 12));
 461         }
 462         for (i = 0; i < 6; i++)
 463                 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
 464         printk(", IRQ %d\n", dev->irq);
 465         /* Tell them about an invalid IRQ. */
 466         if (vortex_debug && (dev->irq <= 0 || dev->irq > 15))
 467                 printk(" *** Warning: this IRQ is unlikely to work!\n");
 468 
 469         {
 470                 char *ram_split[] = {"5:3", "3:1", "1:1", "invalid"};
 471                 union wn3_config config;
 472                 EL3WINDOW(3);
 473                 config.i = inl(ioaddr + Wn3_Config);
 474                 if (vortex_debug > 1)
 475                         printk("  Internal config register is %4.4x, transceivers %#x.\n",
 476                                    config.i, inw(ioaddr + Wn3_Options));
 477                 printk("  %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
 478                            8 << config.u.ram_size,
 479                            config.u.ram_width ? "word" : "byte",
 480                            ram_split[config.u.ram_split],
 481                            config.u.autoselect ? "autoselect/" : "",
 482                            if_names[config.u.xcvr]);
 483                 dev->if_port = config.u.xcvr;
 484                 vp->autoselect = config.u.autoselect;
 485         }
 486 
 487         /* We do a request_region() only to register /proc/ioports info. */
 488         request_region(ioaddr, VORTEX_TOTAL_SIZE, vp->product_name);
 489 
 490         /* The 3c59x-specific entries in the device structure. */
 491         dev->open = &vortex_open;
 492         dev->hard_start_xmit = &vortex_start_xmit;
 493         dev->stop = &vortex_close;
 494         dev->get_stats = &vortex_get_stats;
 495         dev->set_multicast_list = &set_multicast_list;
 496 #if defined (HAVE_SET_MAC_ADDR) && 0
 497         dev->set_mac_address = &set_mac_address;
 498 #endif
 499 
 500         return 0;
 501 }
 502 
 503 
 504 static int
 505 vortex_open(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 506 {
 507         int ioaddr = dev->base_addr;
 508         struct vortex_private *vp = (struct vortex_private *)dev->priv;
 509         union wn3_config config;
 510         int i;
 511 
 512         /* Before initializing select the active media port. */
 513         EL3WINDOW(3);
 514         if (vp->full_duplex)
 515                 outb(0x20, ioaddr + Wn3_MAC_Ctrl); /* Set the full-duplex bit. */
 516         config.i = inl(ioaddr + Wn3_Config);
 517 
 518         if (vp->media_override != 7) {
 519                 if (vortex_debug > 1)
 520                         printk("%s: Media override to transceiver %d (%s).\n",
 521                                    dev->name, vp->media_override, if_names[vp->media_override]);
 522                 config.u.xcvr = vp->media_override;
 523                 dev->if_port = vp->media_override;
 524                 outl(config.i, ioaddr + Wn3_Config);
 525         }
 526 
 527         if (vortex_debug > 1) {
 528                 printk("%s: vortex_open() InternalConfig %8.8x.\n",
 529                         dev->name, config.i);
 530         }
 531 
 532         outw(TxReset, ioaddr + EL3_CMD);
 533         for (i = 20; i >= 0 ; i--)
 534                 if ( ! inw(ioaddr + EL3_STATUS) & CmdInProgress)
 535                         break;
 536 
 537         outw(RxReset, ioaddr + EL3_CMD);
 538         /* Wait a few ticks for the RxReset command to complete. */
 539         for (i = 20; i >= 0 ; i--)
 540                 if ( ! inw(ioaddr + EL3_STATUS) & CmdInProgress)
 541                         break;
 542 
 543         outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
 544 
 545 #ifdef USE_SHARED_IRQ
 546         i = request_shared_irq(dev->irq, &vortex_interrupt, dev, vp->product_name);
 547         if (i)                                          /* Error */
 548                 return i;
 549 #else
 550         if (dev->irq == 0  ||  irq2dev_map[dev->irq] != NULL)
 551                 return -EAGAIN;
 552         irq2dev_map[dev->irq] = dev;
 553         if (request_irq(dev->irq, &vortex_interrupt, 0, vp->product_name, NULL)) {
 554                 irq2dev_map[dev->irq] = NULL;
 555                 return -EAGAIN;
 556         }
 557 #endif
 558 
 559         if (vortex_debug > 1) {
 560                 EL3WINDOW(4);
 561                 printk("%s: vortex_open() irq %d media status %4.4x.\n",
 562                            dev->name, dev->irq, inw(ioaddr + Wn4_Media));
 563         }
 564 
 565         /* Set the station address and mask in window 2 each time opened. */
 566         EL3WINDOW(2);
 567         for (i = 0; i < 6; i++)
 568                 outb(dev->dev_addr[i], ioaddr + i);
 569         for (; i < 12; i+=2)
 570                 outw(0, ioaddr + i);
 571 
 572         if (dev->if_port == 3)
 573                 /* Start the thinnet transceiver. We should really wait 50ms...*/
 574                 outw(StartCoax, ioaddr + EL3_CMD);
 575         else if (dev->if_port == 0) {
 576                 /* 10baseT interface, enabled link beat and jabber check. */
 577                 EL3WINDOW(4);
 578                 outw(inw(ioaddr + Wn4_Media) | Media_TP, ioaddr + Wn4_Media);
 579         }
 580 
 581         /* Switch to the stats window, and clear all stats by reading. */
 582         outw(StatsDisable, ioaddr + EL3_CMD);
 583         EL3WINDOW(6);
 584         for (i = 0; i < 10; i++)        
 585                 inb(ioaddr + i);
 586         inw(ioaddr + 10);
 587         inw(ioaddr + 12);
 588         /* New: On the Vortex we must also clear the BadSSD counter. */
 589         EL3WINDOW(4);
 590         inb(ioaddr + 12);
 591 
 592         /* Switch to register set 7 for normal use. */
 593         EL3WINDOW(7);
 594 
 595         /* Accept b-case and phys addr only. */
 596         outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
 597         outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
 598 
 599         dev->tbusy = 0;
 600         dev->interrupt = 0;
 601         dev->start = 1;
 602 
 603         outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
 604         outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
 605         /* Allow status bits to be seen. */
 606         outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
 607         /* Ack all pending events, and set active indicator mask. */
 608         outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
 609                  ioaddr + EL3_CMD);
 610         outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
 611                  | DMADone, ioaddr + EL3_CMD);
 612 
 613 #ifdef MODULE
 614         MOD_INC_USE_COUNT;
 615 #endif
 616 
 617         if (vp->autoselect) {
 618                 init_timer(&vp->timer);
 619                 vp->timer.expires = (14*HZ)/10;                         /* 1.4 sec. */
 620                 vp->timer.data = (unsigned long)dev;
 621                 vp->timer.function = &vortex_timer;    /* timer handler */
 622                 add_timer(&vp->timer);
 623         }
 624         return 0;
 625 }
 626 
 627 static void vortex_timer(unsigned long data)
     /* [previous][next][first][last][top][bottom][index][help] */
 628 {
 629         struct device *dev = (struct device *)data;
 630         if (vortex_debug > 2)
 631                 printk("%s: Media selection timer tick happened.\n", dev->name);
 632         /* ToDo: active media selection here! */
 633 }
 634 
 635 static int
 636 vortex_start_xmit(struct sk_buff *skb, struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 637 {
 638         struct vortex_private *vp = (struct vortex_private *)dev->priv;
 639         int ioaddr = dev->base_addr;
 640 
 641         /* Transmitter timeout, serious problems. */
 642         if (dev->tbusy) {
 643                 int tickssofar = jiffies - dev->trans_start;
 644                 if (tickssofar < 40)
 645                         return 1;
 646                 printk("%s: transmit timed out, tx_status %2.2x status %4.4x.\n",
 647                            dev->name, inb(ioaddr + TxStatus), inw(ioaddr + EL3_STATUS));
 648                 vp->stats.tx_errors++;
 649                 /* Issue TX_RESET and TX_START commands. */
 650                 outw(TxReset, ioaddr + EL3_CMD);
 651                 {
 652                         int i;
 653                         for (i = 20; i >= 0 ; i--)
 654                                 if ( ! inw(ioaddr + EL3_STATUS) & CmdInProgress)
 655                                         break;
 656                 }
 657                 outw(TxEnable, ioaddr + EL3_CMD);
 658                 dev->trans_start = jiffies;
 659                 dev->tbusy = 0;
 660                 return 0;
 661         }
 662 
 663         if (skb == NULL || skb->len <= 0) {
 664                 printk("%s: Obsolete driver layer request made: skbuff==NULL.\n",
 665                            dev->name);
 666                 dev_tint(dev);
 667                 return 0;
 668         }
 669 
 670         /* Block a timer-based transmit from overlapping.  This could better be
 671            done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
 672            If this ever occurs the queue layer is doing something evil! */
 673         if (set_bit(0, (void*)&dev->tbusy) != 0) {
 674                 printk("%s: Transmitter access conflict.\n", dev->name);
 675                 return 1;
 676         }
 677 
 678         /* Put out the doubleword header... */
 679         outl(skb->len, ioaddr + TX_FIFO);
 680 #ifdef VORTEX_BUS_MASTER
 681         if (vp->bus_master) {
 682                 /* Set the bus-master controller to transfer the packet. */
 683                 outl((int)(skb->data), ioaddr + Wn7_MasterAddr);
 684                 outw((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
 685                 vp->tx_skb = skb;
 686                 outw(StartDMADown, ioaddr + EL3_CMD);
 687         } else {
 688                 /* ... and the packet rounded to a doubleword. */
 689                 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
 690                 dev_kfree_skb (skb, FREE_WRITE);
 691                 if (inw(ioaddr + TxFree) > 1536) {
 692                         dev->tbusy = 0;
 693                 } else
 694                         /* Interrupt us when the FIFO has room for max-sized packet. */
 695                         outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
 696         }
 697 #else
 698         /* ... and the packet rounded to a doubleword. */
 699         outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
 700         dev_kfree_skb (skb, FREE_WRITE);
 701         if (inw(ioaddr + TxFree) > 1536) {
 702                 dev->tbusy = 0;
 703         } else
 704                 /* Interrupt us when the FIFO has room for max-sized packet. */
 705                 outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
 706 #endif  /* bus master */
 707 
 708         dev->trans_start = jiffies;
 709 
 710         /* Clear the Tx status stack. */
 711         {
 712                 short tx_status;
 713                 int i = 4;
 714 
 715                 while (--i > 0  &&      (tx_status = inb(ioaddr + TxStatus)) > 0) {
 716                         if (tx_status & 0x3C) {         /* A Tx-disabling error occurred.  */
 717                                 if (vortex_debug > 2)
 718                                   printk("%s: Tx error, status %2.2x.\n",
 719                                                  dev->name, tx_status);
 720                                 if (tx_status & 0x04) vp->stats.tx_fifo_errors++;
 721                                 if (tx_status & 0x38) vp->stats.tx_aborted_errors++;
 722                                 if (tx_status & 0x30) {
 723                                         int j;
 724                                         outw(TxReset, ioaddr + EL3_CMD);
 725                                         for (j = 20; j >= 0 ; j--)
 726                                                 if ( ! inw(ioaddr + EL3_STATUS) & CmdInProgress)
 727                                                         break;
 728                                 }
 729                                 outw(TxEnable, ioaddr + EL3_CMD);
 730                         }
 731                         outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
 732                 }
 733         }
 734         return 0;
 735 }
 736 
 737 /* The interrupt handler does all of the Rx thread work and cleans up
 738    after the Tx thread. */
 739 static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
     /* [previous][next][first][last][top][bottom][index][help] */
 740 {
 741 #ifdef USE_SHARED_IRQ
 742         struct device *dev = (struct device *)(irq == 0 ? regs : irq2dev_map[irq]);
 743 #else
 744         struct device *dev = (struct device *)(irq2dev_map[irq]);
 745 #endif
 746         struct vortex_private *lp;
 747         int ioaddr, status;
 748         int latency;
 749         int i = 0;
 750 
 751         if (dev == NULL) {
 752                 printk ("vortex_interrupt(): irq %d for unknown device.\n", irq);
 753                 return;
 754         }
 755 
 756         if (dev->interrupt)
 757                 printk("%s: Re-entering the interrupt handler.\n", dev->name);
 758         dev->interrupt = 1;
 759 
 760         ioaddr = dev->base_addr;
 761         latency = inb(ioaddr + Timer);
 762         lp = (struct vortex_private *)dev->priv;
 763 
 764         status = inw(ioaddr + EL3_STATUS);
 765 
 766         if (vortex_debug > 4)
 767                 printk("%s: interrupt, status %4.4x, timer %d.\n", dev->name,
 768                            status, latency);
 769         if ((status & 0xE000) != 0xE000) {
 770                 static int donedidthis=0;
 771                 /* Some interrupt controllers store a bogus interrupt from boot-time.
 772                    Ignore a single early interrupt, but don't hang the machine for
 773                    other interrupt problems. */
 774                 if (donedidthis++ > 1) {
 775                         printk("%s: Bogus interrupt, bailing. Status %4.4x, start=%d.\n",
 776                                    dev->name, status, dev->start);
 777                         free_irq(dev->irq, NULL);
 778                 }
 779         }
 780 
 781         do {
 782                 if (vortex_debug > 5)
 783                                 printk("%s: In interrupt loop, status %4.4x.\n",
 784                                            dev->name, status);
 785                 if (status & RxComplete)
 786                         vortex_rx(dev);
 787 
 788                 if (status & TxAvailable) {
 789                         if (vortex_debug > 5)
 790                                 printk("        TX room bit was handled.\n");
 791                         /* There's room in the FIFO for a full-sized packet. */
 792                         outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
 793                         dev->tbusy = 0;
 794                         mark_bh(NET_BH);
 795                 }
 796 #ifdef VORTEX_BUS_MASTER
 797                 if (status & DMADone) {
 798                         outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
 799                         dev->tbusy = 0;
 800                         mark_bh(NET_BH);
 801                 }
 802 #endif
 803                 if (status & (AdapterFailure | RxEarly | StatsFull)) {
 804                         /* Handle all uncommon interrupts at once. */
 805                         if (status & RxEarly) {                         /* Rx early is unused. */
 806                                 vortex_rx(dev);
 807                                 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
 808                         }
 809                         if (status & StatsFull) {       /* Empty statistics. */
 810                                 static int DoneDidThat = 0;
 811                                 if (vortex_debug > 4)
 812                                         printk("%s: Updating stats.\n", dev->name);
 813                                 update_stats(ioaddr, dev);
 814                                 /* DEBUG HACK: Disable statistics as an interrupt source. */
 815                                 /* This occurs when we have the wrong media type! */
 816                                 if (DoneDidThat == 0  &&
 817                                         inw(ioaddr + EL3_STATUS) & StatsFull) {
 818                                         int win, reg;
 819                                         printk("%s: Updating stats failed, disabling stats as an"
 820                                                    " interrupt source.\n", dev->name);
 821                                         for (win = 0; win < 8; win++) {
 822                                                 EL3WINDOW(win);
 823                                                 printk("\n Vortex window %d:", win);
 824                                                 for (reg = 0; reg < 16; reg++)
 825                                                         printk(" %2.2x", inb(ioaddr+reg));
 826                                         }
 827                                         EL3WINDOW(7);
 828                                         outw(SetIntrEnb | 0x18, ioaddr + EL3_CMD);
 829                                         DoneDidThat++;
 830                                 }
 831                         }
 832                         if (status & AdapterFailure) {
 833                                 /* Adapter failure requires Rx reset and reinit. */
 834                                 outw(RxReset, ioaddr + EL3_CMD);
 835                                 /* Set the Rx filter to the current state. */
 836                                 outw(SetRxFilter | RxStation | RxBroadcast
 837                                          | (dev->flags & IFF_ALLMULTI ? RxMulticast : 0)
 838                                          | (dev->flags & IFF_PROMISC ? RxProm : 0),
 839                                          ioaddr + EL3_CMD);
 840                                 outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
 841                                 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
 842                         }
 843                 }
 844 
 845                 if (++i > 10) {
 846                         printk("%s: Infinite loop in interrupt, status %4.4x.  "
 847                                    "Disabling functions (%4.4x).\n",
 848                                    dev->name, status, SetStatusEnb | ((~status) & 0xFE));
 849                         /* Disable all pending interrupts. */
 850                         outw(SetStatusEnb | ((~status) & 0xFE), ioaddr + EL3_CMD);
 851                         outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
 852                         break;
 853                 }
 854                 /* Acknowledge the IRQ. */
 855                 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
 856 
 857         } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
 858 
 859         if (vortex_debug > 4)
 860                 printk("%s: exiting interrupt, status %4.4x.\n", dev->name, status);
 861 
 862         dev->interrupt = 0;
 863         return;
 864 }
 865 
 866 static int
 867 vortex_rx(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 868 {
 869         struct vortex_private *vp = (struct vortex_private *)dev->priv;
 870         int ioaddr = dev->base_addr;
 871         int i;
 872         short rx_status;
 873 
 874         if (vortex_debug > 5)
 875                 printk("   In rx_packet(), status %4.4x, rx_status %4.4x.\n",
 876                            inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
 877         while ((rx_status = inw(ioaddr + RxStatus)) > 0) {
 878                 if (rx_status & 0x4000) { /* Error, update stats. */
 879                         unsigned char rx_error = inb(ioaddr + RxErrors);
 880                         if (vortex_debug > 4)
 881                                 printk(" Rx error: status %2.2x.\n", rx_error);
 882                         vp->stats.rx_errors++;
 883                         if (rx_error & 0x01)  vp->stats.rx_over_errors++;
 884                         if (rx_error & 0x02)  vp->stats.rx_length_errors++;
 885                         if (rx_error & 0x04)  vp->stats.rx_frame_errors++;
 886                         if (rx_error & 0x08)  vp->stats.rx_crc_errors++;
 887                         if (rx_error & 0x10)  vp->stats.rx_length_errors++;
 888                 } else {
 889                         /* The packet length: up to 4.5K!. */
 890                         short pkt_len = rx_status & 0x1fff;
 891                         struct sk_buff *skb;
 892 
 893                         skb = dev_alloc_skb(pkt_len + 5);
 894                         if (vortex_debug > 4)
 895                                 printk("Receiving packet size %d status %4.4x.\n",
 896                                            pkt_len, rx_status);
 897                         if (skb != NULL) {
 898                                 skb->dev = dev;
 899                                 skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
 900                                 /* 'skb_put()' points to the start of sk_buff data area. */
 901                                 insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
 902                                          (pkt_len + 3) >> 2);
 903                                 skb->protocol = eth_type_trans(skb, dev);
 904                                 netif_rx(skb);
 905                                 outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
 906                                 /* Wait a limited time to go to next packet. */
 907                                 for (i = 200; i >= 0; i--)
 908                                         if ( ! inw(ioaddr + EL3_STATUS) & CmdInProgress)
 909                                                 break;
 910                                 vp->stats.rx_packets++;
 911                                 continue;
 912                         } else if (vortex_debug)
 913                                 printk("%s: Couldn't allocate a sk_buff of size %d.\n",
 914                                            dev->name, pkt_len);
 915                 }
 916                 vp->stats.rx_dropped++;
 917                 outw(RxDiscard, ioaddr + EL3_CMD);
 918                 /* Wait a limited time to skip this packet. */
 919                 for (i = 200; i >= 0; i--)
 920                         if ( ! inw(ioaddr + EL3_STATUS) & CmdInProgress)
 921                                 break;
 922         }
 923 
 924         return 0;
 925 }
 926 
 927 static int
 928 vortex_close(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 929 {
 930         int ioaddr = dev->base_addr;
 931 
 932         dev->start = 0;
 933         dev->tbusy = 1;
 934 
 935         if (vortex_debug > 1)
 936                 printk("%s: vortex_close() status %4.4x, Tx status %2.2x.\n",
 937                            dev->name, inw(ioaddr + EL3_STATUS), inb(ioaddr + TxStatus));
 938 
 939         /* Turn off statistics ASAP.  We update lp->stats below. */
 940         outw(StatsDisable, ioaddr + EL3_CMD);
 941 
 942         /* Disable the receiver and transmitter. */
 943         outw(RxDisable, ioaddr + EL3_CMD);
 944         outw(TxDisable, ioaddr + EL3_CMD);
 945 
 946         if (dev->if_port == 3)
 947                 /* Turn off thinnet power.  Green! */
 948                 outw(StopCoax, ioaddr + EL3_CMD);
 949         else if (dev->if_port == 0) {
 950                 /* Disable link beat and jabber, if_port may change ere next open(). */
 951                 EL3WINDOW(4);
 952                 outw(inw(ioaddr + Wn4_Media) & ~Media_TP, ioaddr + Wn4_Media);
 953         }
 954 
 955 #ifdef USE_SHARED_IRQ
 956         free_shared_irq(dev->irq, dev);
 957 #else
 958         free_irq(dev->irq, NULL);
 959         /* Mmmm, we should disable all interrupt sources here. */
 960         irq2dev_map[dev->irq] = 0;
 961 #endif
 962 
 963         update_stats(ioaddr, dev);
 964 #ifdef MODULE
 965         MOD_DEC_USE_COUNT;
 966 #endif
 967 
 968         return 0;
 969 }
 970 
 971 static struct enet_statistics *
 972 vortex_get_stats(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 973 {
 974         struct vortex_private *vp = (struct vortex_private *)dev->priv;
 975         unsigned long flags;
 976 
 977         save_flags(flags);
 978         cli();
 979         update_stats(dev->base_addr, dev);
 980         restore_flags(flags);
 981         return &vp->stats;
 982 }
 983 
 984 /*  Update statistics.
 985         Unlike with the EL3 we need not worry about interrupts changing
 986         the window setting from underneath us, but we must still guard
 987         against a race condition with a StatsUpdate interrupt updating the
 988         table.  This is done by checking that the ASM (!) code generated uses
 989         atomic updates with '+='.
 990         */
 991 static void update_stats(int ioaddr, struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
 992 {
 993         struct vortex_private *vp = (struct vortex_private *)dev->priv;
 994 
 995         /* Unlike the 3c5x9 we need not turn off stats updates while reading. */
 996         /* Switch to the stats window, and read everything. */
 997         EL3WINDOW(6);
 998         vp->stats.tx_carrier_errors             += inb(ioaddr + 0);
 999         vp->stats.tx_heartbeat_errors   += inb(ioaddr + 1);
1000         /* Multiple collisions. */              inb(ioaddr + 2);
1001         vp->stats.collisions                    += inb(ioaddr + 3);
1002         vp->stats.tx_window_errors              += inb(ioaddr + 4);
1003         vp->stats.rx_fifo_errors                += inb(ioaddr + 5);
1004         vp->stats.tx_packets                    += inb(ioaddr + 6);
1005         vp->stats.tx_packets                    += (inb(ioaddr + 9)&0x30) << 4;
1006         /* Rx packets   */                              inb(ioaddr + 7);   /* Must read to clear */
1007         /* Tx deferrals */                              inb(ioaddr + 8);
1008         /* Don't bother with register 9, an extension of registers 6&7.
1009            If we do use the 6&7 values the atomic update assumption above
1010            is invalid. */
1011         inw(ioaddr + 10);       /* Total Rx and Tx octets. */
1012         inw(ioaddr + 12);
1013         /* New: On the Vortex we must also clear the BadSSD counter. */
1014         EL3WINDOW(4);
1015         inb(ioaddr + 12);
1016 
1017         /* We change back to window 7 (not 1) with the Vortex. */
1018         EL3WINDOW(7);
1019         return;
1020 }
1021 
1022 /* There are two version of set_multicast_list() to support both v1.2 and
1023    v1.4 kernels. */
1024 static void
1025 set_multicast_list(struct device *dev)
     /* [previous][next][first][last][top][bottom][index][help] */
1026 {
1027         short ioaddr = dev->base_addr;
1028 
1029         if ((dev->mc_list)  ||  (dev->flags & IFF_ALLMULTI)) {
1030                 outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
1031                 if (vortex_debug > 3) {
1032                         printk("%s: Setting Rx multicast mode, %d addresses.\n",
1033                                    dev->name, dev->mc_count);
1034                 }
1035         } else if (dev->flags & IFF_PROMISC) {
1036                 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1037                          ioaddr + EL3_CMD);
1038         } else
1039                 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1040 }
1041 
1042 
1043 #ifdef MODULE
1044 void
1045 cleanup_module(void)
     /* [previous][next][first][last][top][bottom][index][help] */
1046 {
1047         struct device *next_dev;
1048 
1049         /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
1050         while (root_vortex_dev) {
1051                 next_dev = ((struct vortex_private *)root_vortex_dev->priv)->next_module;
1052                 unregister_netdev(root_vortex_dev);
1053                 release_region(root_vortex_dev->base_addr, VORTEX_TOTAL_SIZE);
1054                 kfree(root_vortex_dev);
1055                 root_vortex_dev = next_dev;
1056         }
1057 }
1058 #endif /* MODULE */
1059 
1060 /*
1061  * Local variables:
1062  *  compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c 3c59x.c -o 3c59x.o"
1063  *  c-indent-level: 4
1064  *  tab-width: 4
1065  * End:
1066  */

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