Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1/* Intel EtherExpress 16 device driver for Linux
   2 *
   3 * Written by John Sullivan, 1995
   4 *  based on original code by Donald Becker, with changes by
   5 *  Alan Cox and Pauline Middelink.
   6 *
   7 * Support for 8-bit mode by Zoltan Szilagyi <zoltans@cs.arizona.edu>
   8 *
   9 * Many modifications, and currently maintained, by
  10 *  Philip Blundell <philb@gnu.org>
  11 * Added the Compaq LTE  Alan Cox <alan@lxorguk.ukuu.org.uk>
  12 * Added MCA support Adam Fritzler
  13 *
  14 * Note - this driver is experimental still - it has problems on faster
  15 * machines. Someone needs to sit down and go through it line by line with
  16 * a databook...
  17 */
  18
  19/* The EtherExpress 16 is a fairly simple card, based on a shared-memory
  20 * design using the i82586 Ethernet coprocessor.  It bears no relationship,
  21 * as far as I know, to the similarly-named "EtherExpress Pro" range.
  22 *
  23 * Historically, Linux support for these cards has been very bad.  However,
  24 * things seem to be getting better slowly.
  25 */
  26
  27/* If your card is confused about what sort of interface it has (eg it
  28 * persistently reports "10baseT" when none is fitted), running 'SOFTSET /BART'
  29 * or 'SOFTSET /LISA' from DOS seems to help.
  30 */
  31
  32/* Here's the scoop on memory mapping.
  33 *
  34 * There are three ways to access EtherExpress card memory: either using the
  35 * shared-memory mapping, or using PIO through the dataport, or using PIO
  36 * through the "shadow memory" ports.
  37 *
  38 * The shadow memory system works by having the card map some of its memory
  39 * as follows:
  40 *
  41 * (the low five bits of the SMPTR are ignored)
  42 *
  43 *  base+0x4000..400f      memory at SMPTR+0..15
  44 *  base+0x8000..800f      memory at SMPTR+16..31
  45 *  base+0xc000..c007      dubious stuff (memory at SMPTR+16..23 apparently)
  46 *  base+0xc008..c00f      memory at 0x0008..0x000f
  47 *
  48 * This last set (the one at c008) is particularly handy because the SCB
  49 * lives at 0x0008.  So that set of ports gives us easy random access to data
  50 * in the SCB without having to mess around setting up pointers and the like.
  51 * We always use this method to access the SCB (via the scb_xx() functions).
  52 *
  53 * Dataport access works by aiming the appropriate (read or write) pointer
  54 * at the first address you're interested in, and then reading or writing from
  55 * the dataport.  The pointers auto-increment after each transfer.  We use
  56 * this for data transfer.
  57 *
  58 * We don't use the shared-memory system because it allegedly doesn't work on
  59 * all cards, and because it's a bit more prone to go wrong (it's one more
  60 * thing to configure...).
  61 */
  62
  63/* Known bugs:
  64 *
  65 * - The card seems to want to give us two interrupts every time something
  66 *   happens, where just one would be better.
  67 */
  68
  69/*
  70 *
  71 * Note by Zoltan Szilagyi 10-12-96:
  72 *
  73 * I've succeeded in eliminating the "CU wedged" messages, and hence the
  74 * lockups, which were only occurring with cards running in 8-bit mode ("force
  75 * 8-bit operation" in Intel's SoftSet utility). This version of the driver
  76 * sets the 82586 and the ASIC to 8-bit mode at startup; it also stops the
  77 * CU before submitting a packet for transmission, and then restarts it as soon
  78 * as the process of handing the packet is complete. This is definitely an
  79 * unnecessary slowdown if the card is running in 16-bit mode; therefore one
  80 * should detect 16-bit vs 8-bit mode from the EEPROM settings and act
  81 * accordingly. In 8-bit mode with this bugfix I'm getting about 150 K/s for
  82 * ftp's, which is significantly better than I get in DOS, so the overhead of
  83 * stopping and restarting the CU with each transmit is not prohibitive in
  84 * practice.
  85 *
  86 * Update by David Woodhouse 11/5/99:
  87 *
  88 * I've seen "CU wedged" messages in 16-bit mode, on the Alpha architecture.
  89 * I assume that this is because 16-bit accesses are actually handled as two
  90 * 8-bit accesses.
  91 */
  92
  93#ifdef __alpha__
  94#define LOCKUP16 1
  95#endif
  96#ifndef LOCKUP16
  97#define LOCKUP16 0
  98#endif
  99
 100#include <linux/module.h>
 101#include <linux/kernel.h>
 102#include <linux/types.h>
 103#include <linux/fcntl.h>
 104#include <linux/interrupt.h>
 105#include <linux/ioport.h>
 106#include <linux/string.h>
 107#include <linux/in.h>
 108#include <linux/delay.h>
 109#include <linux/errno.h>
 110#include <linux/init.h>
 111#include <linux/netdevice.h>
 112#include <linux/etherdevice.h>
 113#include <linux/skbuff.h>
 114#include <linux/mca-legacy.h>
 115#include <linux/spinlock.h>
 116#include <linux/bitops.h>
 117#include <linux/jiffies.h>
 118
 119#include <asm/system.h>
 120#include <asm/io.h>
 121#include <asm/irq.h>
 122
 123#ifndef NET_DEBUG
 124#define NET_DEBUG 4
 125#endif
 126
 127#include "eexpress.h"
 128
 129#define EEXP_IO_EXTENT  16
 130
 131/*
 132 * Private data declarations
 133 */
 134
 135struct net_local
 136{
 137	unsigned long last_tx;       /* jiffies when last transmit started */
 138	unsigned long init_time;     /* jiffies when eexp_hw_init586 called */
 139	unsigned short rx_first;     /* first rx buf, same as RX_BUF_START */
 140	unsigned short rx_last;      /* last rx buf */
 141	unsigned short rx_ptr;       /* first rx buf to look at */
 142	unsigned short tx_head;      /* next free tx buf */
 143	unsigned short tx_reap;      /* first in-use tx buf */
 144	unsigned short tx_tail;      /* previous tx buf to tx_head */
 145	unsigned short tx_link;      /* last known-executing tx buf */
 146	unsigned short last_tx_restart;   /* set to tx_link when we
 147					     restart the CU */
 148	unsigned char started;
 149	unsigned short rx_buf_start;
 150	unsigned short rx_buf_end;
 151	unsigned short num_tx_bufs;
 152	unsigned short num_rx_bufs;
 153	unsigned char width;         /* 0 for 16bit, 1 for 8bit */
 154	unsigned char was_promisc;
 155	unsigned char old_mc_count;
 156	spinlock_t lock;
 157};
 158
 159/* This is the code and data that is downloaded to the EtherExpress card's
 160 * memory at boot time.
 161 */
 162
 163static unsigned short start_code[] = {
 164/* 0x0000 */
 165	0x0001,                 /* ISCP: busy - cleared after reset */
 166	0x0008,0x0000,0x0000,   /* offset,address (lo,hi) of SCB */
 167
 168	0x0000,0x0000,          /* SCB: status, commands */
 169	0x0000,0x0000,          /* links to first command block,
 170				   first receive descriptor */
 171	0x0000,0x0000,          /* CRC error, alignment error counts */
 172	0x0000,0x0000,          /* out of resources, overrun error counts */
 173
 174	0x0000,0x0000,          /* pad */
 175	0x0000,0x0000,
 176
 177/* 0x20 -- start of 82586 CU program */
 178#define CONF_LINK 0x20
 179	0x0000,Cmd_Config,
 180	0x0032,                 /* link to next command */
 181	0x080c,                 /* 12 bytes follow : fifo threshold=8 */
 182	0x2e40,                 /* don't rx bad frames
 183				 * SRDY/ARDY => ext. sync. : preamble len=8
 184	                         * take addresses from data buffers
 185				 * 6 bytes/address
 186				 */
 187	0x6000,                 /* default backoff method & priority
 188				 * interframe spacing = 0x60 */
 189	0xf200,                 /* slot time=0x200
 190				 * max collision retry = 0xf */
 191#define CONF_PROMISC  0x2e
 192	0x0000,                 /* no HDLC : normal CRC : enable broadcast
 193				 * disable promiscuous/multicast modes */
 194	0x003c,                 /* minimum frame length = 60 octets) */
 195
 196	0x0000,Cmd_SetAddr,
 197	0x003e,                 /* link to next command */
 198#define CONF_HWADDR  0x38
 199	0x0000,0x0000,0x0000,   /* hardware address placed here */
 200
 201	0x0000,Cmd_MCast,
 202	0x0076,                 /* link to next command */
 203#define CONF_NR_MULTICAST 0x44
 204	0x0000,                 /* number of bytes in multicast address(es) */
 205#define CONF_MULTICAST 0x46
 206	0x0000, 0x0000, 0x0000, /* some addresses */
 207	0x0000, 0x0000, 0x0000,
 208	0x0000, 0x0000, 0x0000,
 209	0x0000, 0x0000, 0x0000,
 210	0x0000, 0x0000, 0x0000,
 211	0x0000, 0x0000, 0x0000,
 212	0x0000, 0x0000, 0x0000,
 213	0x0000, 0x0000, 0x0000,
 214
 215#define CONF_DIAG_RESULT  0x76
 216	0x0000, Cmd_Diag,
 217	0x007c,                 /* link to next command */
 218
 219	0x0000,Cmd_TDR|Cmd_INT,
 220	0x0084,
 221#define CONF_TDR_RESULT  0x82
 222	0x0000,
 223
 224	0x0000,Cmd_END|Cmd_Nop, /* end of configure sequence */
 225	0x0084                  /* dummy link */
 226};
 227
 228/* maps irq number to EtherExpress magic value */
 229static char irqrmap[] = { 0,0,1,2,3,4,0,0,0,1,5,6,0,0,0,0 };
 230
 231#ifdef CONFIG_MCA_LEGACY
 232/* mapping of the first four bits of the second POS register */
 233static unsigned short mca_iomap[] = {
 234	0x270, 0x260, 0x250, 0x240, 0x230, 0x220, 0x210, 0x200,
 235	0x370, 0x360, 0x350, 0x340, 0x330, 0x320, 0x310, 0x300
 236};
 237/* bits 5-7 of the second POS register */
 238static char mca_irqmap[] = { 12, 9, 3, 4, 5, 10, 11, 15 };
 239#endif
 240
 241/*
 242 * Prototypes for Linux interface
 243 */
 244
 245static int eexp_open(struct net_device *dev);
 246static int eexp_close(struct net_device *dev);
 247static void eexp_timeout(struct net_device *dev);
 248static netdev_tx_t eexp_xmit(struct sk_buff *buf,
 249			     struct net_device *dev);
 250
 251static irqreturn_t eexp_irq(int irq, void *dev_addr);
 252static void eexp_set_multicast(struct net_device *dev);
 253
 254/*
 255 * Prototypes for hardware access functions
 256 */
 257
 258static void eexp_hw_rx_pio(struct net_device *dev);
 259static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
 260		       unsigned short len);
 261static int eexp_hw_probe(struct net_device *dev,unsigned short ioaddr);
 262static unsigned short eexp_hw_readeeprom(unsigned short ioaddr,
 263					 unsigned char location);
 264
 265static unsigned short eexp_hw_lasttxstat(struct net_device *dev);
 266static void eexp_hw_txrestart(struct net_device *dev);
 267
 268static void eexp_hw_txinit    (struct net_device *dev);
 269static void eexp_hw_rxinit    (struct net_device *dev);
 270
 271static void eexp_hw_init586   (struct net_device *dev);
 272static void eexp_setup_filter (struct net_device *dev);
 273
 274static char *eexp_ifmap[]={"AUI", "BNC", "RJ45"};
 275enum eexp_iftype {AUI=0, BNC=1, TPE=2};
 276
 277#define STARTED_RU      2
 278#define STARTED_CU      1
 279
 280/*
 281 * Primitive hardware access functions.
 282 */
 283
 284static inline unsigned short scb_status(struct net_device *dev)
 285{
 286	return inw(dev->base_addr + 0xc008);
 287}
 288
 289static inline unsigned short scb_rdcmd(struct net_device *dev)
 290{
 291	return inw(dev->base_addr + 0xc00a);
 292}
 293
 294static inline void scb_command(struct net_device *dev, unsigned short cmd)
 295{
 296	outw(cmd, dev->base_addr + 0xc00a);
 297}
 298
 299static inline void scb_wrcbl(struct net_device *dev, unsigned short val)
 300{
 301	outw(val, dev->base_addr + 0xc00c);
 302}
 303
 304static inline void scb_wrrfa(struct net_device *dev, unsigned short val)
 305{
 306	outw(val, dev->base_addr + 0xc00e);
 307}
 308
 309static inline void set_loopback(struct net_device *dev)
 310{
 311	outb(inb(dev->base_addr + Config) | 2, dev->base_addr + Config);
 312}
 313
 314static inline void clear_loopback(struct net_device *dev)
 315{
 316	outb(inb(dev->base_addr + Config) & ~2, dev->base_addr + Config);
 317}
 318
 319static inline unsigned short int SHADOW(short int addr)
 320{
 321	addr &= 0x1f;
 322	if (addr > 0xf) addr += 0x3ff0;
 323	return addr + 0x4000;
 324}
 325
 326/*
 327 * Linux interface
 328 */
 329
 330/*
 331 * checks for presence of EtherExpress card
 332 */
 333
 334static int __init do_express_probe(struct net_device *dev)
 335{
 336	unsigned short *port;
 337	static unsigned short ports[] = { 0x240,0x300,0x310,0x270,0x320,0x340,0 };
 338	unsigned short ioaddr = dev->base_addr;
 339	int dev_irq = dev->irq;
 340	int err;
 341
 342	dev->if_port = 0xff; /* not set */
 343
 344#ifdef CONFIG_MCA_LEGACY
 345	if (MCA_bus) {
 346		int slot = 0;
 347
 348		/*
 349		 * Only find one card at a time.  Subsequent calls
 350		 * will find others, however, proper multicard MCA
 351		 * probing and setup can't be done with the
 352		 * old-style Space.c init routines.  -- ASF
 353		 */
 354		while (slot != MCA_NOTFOUND) {
 355			int pos0, pos1;
 356
 357			slot = mca_find_unused_adapter(0x628B, slot);
 358			if (slot == MCA_NOTFOUND)
 359				break;
 360
 361			pos0 = mca_read_stored_pos(slot, 2);
 362			pos1 = mca_read_stored_pos(slot, 3);
 363			ioaddr = mca_iomap[pos1&0xf];
 364
 365			dev->irq = mca_irqmap[(pos1>>4)&0x7];
 366
 367			/*
 368			 * XXX: Transceiver selection is done
 369			 * differently on the MCA version.
 370			 * How to get it to select something
 371			 * other than external/AUI is currently
 372			 * unknown.  This code is just for looks. -- ASF
 373			 */
 374			if ((pos0 & 0x7) == 0x1)
 375				dev->if_port = AUI;
 376			else if ((pos0 & 0x7) == 0x5) {
 377				if (pos1 & 0x80)
 378					dev->if_port = BNC;
 379				else
 380					dev->if_port = TPE;
 381			}
 382
 383			mca_set_adapter_name(slot, "Intel EtherExpress 16 MCA");
 384			mca_set_adapter_procfn(slot, NULL, dev);
 385			mca_mark_as_used(slot);
 386
 387			break;
 388		}
 389	}
 390#endif
 391	if (ioaddr&0xfe00) {
 392		if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress"))
 393			return -EBUSY;
 394		err = eexp_hw_probe(dev,ioaddr);
 395		release_region(ioaddr, EEXP_IO_EXTENT);
 396		return err;
 397	} else if (ioaddr)
 398		return -ENXIO;
 399
 400	for (port=&ports[0] ; *port ; port++ )
 401	{
 402		unsigned short sum = 0;
 403		int i;
 404		if (!request_region(*port, EEXP_IO_EXTENT, "EtherExpress"))
 405			continue;
 406		for ( i=0 ; i<4 ; i++ )
 407		{
 408			unsigned short t;
 409			t = inb(*port + ID_PORT);
 410			sum |= (t>>4) << ((t & 0x03)<<2);
 411		}
 412		if (sum==0xbaba && !eexp_hw_probe(dev,*port)) {
 413			release_region(*port, EEXP_IO_EXTENT);
 414			return 0;
 415		}
 416		release_region(*port, EEXP_IO_EXTENT);
 417		dev->irq = dev_irq;
 418	}
 419	return -ENODEV;
 420}
 421
 422#ifndef MODULE
 423struct net_device * __init express_probe(int unit)
 424{
 425	struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
 426	int err;
 427
 428	if (!dev)
 429		return ERR_PTR(-ENOMEM);
 430
 431	sprintf(dev->name, "eth%d", unit);
 432	netdev_boot_setup_check(dev);
 433
 434	err = do_express_probe(dev);
 435	if (!err)
 436		return dev;
 437	free_netdev(dev);
 438	return ERR_PTR(err);
 439}
 440#endif
 441
 442/*
 443 * open and initialize the adapter, ready for use
 444 */
 445
 446static int eexp_open(struct net_device *dev)
 447{
 448	int ret;
 449	unsigned short ioaddr = dev->base_addr;
 450	struct net_local *lp = netdev_priv(dev);
 451
 452#if NET_DEBUG > 6
 453	printk(KERN_DEBUG "%s: eexp_open()\n", dev->name);
 454#endif
 455
 456	if (!dev->irq || !irqrmap[dev->irq])
 457		return -ENXIO;
 458
 459	ret = request_irq(dev->irq, eexp_irq, 0, dev->name, dev);
 460	if (ret)
 461		return ret;
 462
 463	if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress")) {
 464		printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
 465			, ioaddr);
 466		goto err_out1;
 467	}
 468	if (!request_region(ioaddr+0x4000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
 469		printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
 470			, ioaddr+0x4000);
 471		goto err_out2;
 472	}
 473	if (!request_region(ioaddr+0x8000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
 474		printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
 475			, ioaddr+0x8000);
 476		goto err_out3;
 477	}
 478	if (!request_region(ioaddr+0xc000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
 479		printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
 480			, ioaddr+0xc000);
 481		goto err_out4;
 482	}
 483
 484	if (lp->width) {
 485		printk("%s: forcing ASIC to 8-bit mode\n", dev->name);
 486		outb(inb(dev->base_addr+Config)&~4, dev->base_addr+Config);
 487	}
 488
 489	eexp_hw_init586(dev);
 490	netif_start_queue(dev);
 491#if NET_DEBUG > 6
 492	printk(KERN_DEBUG "%s: leaving eexp_open()\n", dev->name);
 493#endif
 494	return 0;
 495
 496	err_out4:
 497		release_region(ioaddr+0x8000, EEXP_IO_EXTENT);
 498	err_out3:
 499		release_region(ioaddr+0x4000, EEXP_IO_EXTENT);
 500	err_out2:
 501		release_region(ioaddr, EEXP_IO_EXTENT);
 502	err_out1:
 503		free_irq(dev->irq, dev);
 504		return -EBUSY;
 505}
 506
 507/*
 508 * close and disable the interface, leaving the 586 in reset.
 509 */
 510
 511static int eexp_close(struct net_device *dev)
 512{
 513	unsigned short ioaddr = dev->base_addr;
 514	struct net_local *lp = netdev_priv(dev);
 515
 516	int irq = dev->irq;
 517
 518	netif_stop_queue(dev);
 519
 520	outb(SIRQ_dis|irqrmap[irq],ioaddr+SET_IRQ);
 521	lp->started = 0;
 522	scb_command(dev, SCB_CUsuspend|SCB_RUsuspend);
 523	outb(0,ioaddr+SIGNAL_CA);
 524	free_irq(irq,dev);
 525	outb(i586_RST,ioaddr+EEPROM_Ctrl);
 526	release_region(ioaddr, EEXP_IO_EXTENT);
 527	release_region(ioaddr+0x4000, 16);
 528	release_region(ioaddr+0x8000, 16);
 529	release_region(ioaddr+0xc000, 16);
 530
 531	return 0;
 532}
 533
 534/*
 535 * This gets called when a higher level thinks we are broken.  Check that
 536 * nothing has become jammed in the CU.
 537 */
 538
 539static void unstick_cu(struct net_device *dev)
 540{
 541	struct net_local *lp = netdev_priv(dev);
 542	unsigned short ioaddr = dev->base_addr;
 543
 544	if (lp->started)
 545	{
 546		if (time_after(jiffies, dev_trans_start(dev) + HZ/2))
 547		{
 548			if (lp->tx_link==lp->last_tx_restart)
 549			{
 550				unsigned short boguscount=200,rsst;
 551				printk(KERN_WARNING "%s: Retransmit timed out, status %04x, resetting...\n",
 552				       dev->name, scb_status(dev));
 553				eexp_hw_txinit(dev);
 554				lp->last_tx_restart = 0;
 555				scb_wrcbl(dev, lp->tx_link);
 556				scb_command(dev, SCB_CUstart);
 557				outb(0,ioaddr+SIGNAL_CA);
 558				while (!SCB_complete(rsst=scb_status(dev)))
 559				{
 560					if (!--boguscount)
 561					{
 562						boguscount=200;
 563						printk(KERN_WARNING "%s: Reset timed out status %04x, retrying...\n",
 564						       dev->name,rsst);
 565						scb_wrcbl(dev, lp->tx_link);
 566						scb_command(dev, SCB_CUstart);
 567						outb(0,ioaddr+SIGNAL_CA);
 568					}
 569				}
 570				netif_wake_queue(dev);
 571			}
 572			else
 573			{
 574				unsigned short status = scb_status(dev);
 575				if (SCB_CUdead(status))
 576				{
 577					unsigned short txstatus = eexp_hw_lasttxstat(dev);
 578					printk(KERN_WARNING "%s: Transmit timed out, CU not active status %04x %04x, restarting...\n",
 579					       dev->name, status, txstatus);
 580					eexp_hw_txrestart(dev);
 581				}
 582				else
 583				{
 584					unsigned short txstatus = eexp_hw_lasttxstat(dev);
 585					if (netif_queue_stopped(dev) && !txstatus)
 586					{
 587						printk(KERN_WARNING "%s: CU wedged, status %04x %04x, resetting...\n",
 588						       dev->name,status,txstatus);
 589						eexp_hw_init586(dev);
 590						netif_wake_queue(dev);
 591					}
 592					else
 593					{
 594						printk(KERN_WARNING "%s: transmit timed out\n", dev->name);
 595					}
 596				}
 597			}
 598		}
 599	}
 600	else
 601	{
 602		if (time_after(jiffies, lp->init_time + 10))
 603		{
 604			unsigned short status = scb_status(dev);
 605			printk(KERN_WARNING "%s: i82586 startup timed out, status %04x, resetting...\n",
 606			       dev->name, status);
 607			eexp_hw_init586(dev);
 608			netif_wake_queue(dev);
 609		}
 610	}
 611}
 612
 613static void eexp_timeout(struct net_device *dev)
 614{
 615	struct net_local *lp = netdev_priv(dev);
 616#ifdef CONFIG_SMP
 617	unsigned long flags;
 618#endif
 619	int status;
 620
 621	disable_irq(dev->irq);
 622
 623	/*
 624	 *	Best would be to use synchronize_irq(); spin_lock() here
 625	 *	lets make it work first..
 626	 */
 627
 628#ifdef CONFIG_SMP
 629	spin_lock_irqsave(&lp->lock, flags);
 630#endif
 631
 632	status = scb_status(dev);
 633	unstick_cu(dev);
 634	printk(KERN_INFO "%s: transmit timed out, %s?\n", dev->name,
 635	       (SCB_complete(status)?"lost interrupt":
 636		"board on fire"));
 637	dev->stats.tx_errors++;
 638	lp->last_tx = jiffies;
 639	if (!SCB_complete(status)) {
 640		scb_command(dev, SCB_CUabort);
 641		outb(0,dev->base_addr+SIGNAL_CA);
 642	}
 643	netif_wake_queue(dev);
 644#ifdef CONFIG_SMP
 645	spin_unlock_irqrestore(&lp->lock, flags);
 646#endif
 647}
 648
 649/*
 650 * Called to transmit a packet, or to allow us to right ourselves
 651 * if the kernel thinks we've died.
 652 */
 653static netdev_tx_t eexp_xmit(struct sk_buff *buf, struct net_device *dev)
 654{
 655	short length = buf->len;
 656#ifdef CONFIG_SMP
 657	struct net_local *lp = netdev_priv(dev);
 658	unsigned long flags;
 659#endif
 660
 661#if NET_DEBUG > 6
 662	printk(KERN_DEBUG "%s: eexp_xmit()\n", dev->name);
 663#endif
 664
 665	if (buf->len < ETH_ZLEN) {
 666		if (skb_padto(buf, ETH_ZLEN))
 667			return NETDEV_TX_OK;
 668		length = ETH_ZLEN;
 669	}
 670
 671	disable_irq(dev->irq);
 672
 673	/*
 674	 *	Best would be to use synchronize_irq(); spin_lock() here
 675	 *	lets make it work first..
 676	 */
 677
 678#ifdef CONFIG_SMP
 679	spin_lock_irqsave(&lp->lock, flags);
 680#endif
 681
 682	{
 683		unsigned short *data = (unsigned short *)buf->data;
 684
 685		dev->stats.tx_bytes += length;
 686
 687	        eexp_hw_tx_pio(dev,data,length);
 688	}
 689	dev_kfree_skb(buf);
 690#ifdef CONFIG_SMP
 691	spin_unlock_irqrestore(&lp->lock, flags);
 692#endif
 693	enable_irq(dev->irq);
 694	return NETDEV_TX_OK;
 695}
 696
 697/*
 698 * Handle an EtherExpress interrupt
 699 * If we've finished initializing, start the RU and CU up.
 700 * If we've already started, reap tx buffers, handle any received packets,
 701 * check to make sure we've not become wedged.
 702 */
 703
 704static unsigned short eexp_start_irq(struct net_device *dev,
 705				     unsigned short status)
 706{
 707	unsigned short ack_cmd = SCB_ack(status);
 708	struct net_local *lp = netdev_priv(dev);
 709	unsigned short ioaddr = dev->base_addr;
 710	if ((dev->flags & IFF_UP) && !(lp->started & STARTED_CU)) {
 711		short diag_status, tdr_status;
 712		while (SCB_CUstat(status)==2)
 713			status = scb_status(dev);
 714#if NET_DEBUG > 4
 715		printk("%s: CU went non-active (status %04x)\n",
 716		       dev->name, status);
 717#endif
 718
 719		outw(CONF_DIAG_RESULT & ~31, ioaddr + SM_PTR);
 720		diag_status = inw(ioaddr + SHADOW(CONF_DIAG_RESULT));
 721		if (diag_status & 1<<11) {
 722			printk(KERN_WARNING "%s: 82586 failed self-test\n",
 723			       dev->name);
 724		} else if (!(diag_status & 1<<13)) {
 725			printk(KERN_WARNING "%s: 82586 self-test failed to complete\n", dev->name);
 726		}
 727
 728		outw(CONF_TDR_RESULT & ~31, ioaddr + SM_PTR);
 729		tdr_status = inw(ioaddr + SHADOW(CONF_TDR_RESULT));
 730		if (tdr_status & (TDR_SHORT|TDR_OPEN)) {
 731			printk(KERN_WARNING "%s: TDR reports cable %s at %d tick%s\n", dev->name, (tdr_status & TDR_SHORT)?"short":"broken", tdr_status & TDR_TIME, ((tdr_status & TDR_TIME) != 1) ? "s" : "");
 732		}
 733		else if (tdr_status & TDR_XCVRPROBLEM) {
 734			printk(KERN_WARNING "%s: TDR reports transceiver problem\n", dev->name);
 735		}
 736		else if (tdr_status & TDR_LINKOK) {
 737#if NET_DEBUG > 4
 738			printk(KERN_DEBUG "%s: TDR reports link OK\n", dev->name);
 739#endif
 740		} else {
 741			printk("%s: TDR is ga-ga (status %04x)\n", dev->name,
 742			       tdr_status);
 743		}
 744
 745		lp->started |= STARTED_CU;
 746		scb_wrcbl(dev, lp->tx_link);
 747		/* if the RU isn't running, start it now */
 748		if (!(lp->started & STARTED_RU)) {
 749			ack_cmd |= SCB_RUstart;
 750			scb_wrrfa(dev, lp->rx_buf_start);
 751			lp->rx_ptr = lp->rx_buf_start;
 752			lp->started |= STARTED_RU;
 753		}
 754		ack_cmd |= SCB_CUstart | 0x2000;
 755	}
 756
 757	if ((dev->flags & IFF_UP) && !(lp->started & STARTED_RU) && SCB_RUstat(status)==4)
 758		lp->started|=STARTED_RU;
 759
 760	return ack_cmd;
 761}
 762
 763static void eexp_cmd_clear(struct net_device *dev)
 764{
 765	unsigned long int oldtime = jiffies;
 766	while (scb_rdcmd(dev) && (time_before(jiffies, oldtime + 10)));
 767	if (scb_rdcmd(dev)) {
 768		printk("%s: command didn't clear\n", dev->name);
 769	}
 770}
 771
 772static irqreturn_t eexp_irq(int dummy, void *dev_info)
 773{
 774	struct net_device *dev = dev_info;
 775	struct net_local *lp;
 776	unsigned short ioaddr,status,ack_cmd;
 777	unsigned short old_read_ptr, old_write_ptr;
 778
 779	lp = netdev_priv(dev);
 780	ioaddr = dev->base_addr;
 781
 782	spin_lock(&lp->lock);
 783
 784	old_read_ptr = inw(ioaddr+READ_PTR);
 785	old_write_ptr = inw(ioaddr+WRITE_PTR);
 786
 787	outb(SIRQ_dis|irqrmap[dev->irq], ioaddr+SET_IRQ);
 788
 789	status = scb_status(dev);
 790
 791#if NET_DEBUG > 4
 792	printk(KERN_DEBUG "%s: interrupt (status %x)\n", dev->name, status);
 793#endif
 794
 795	if (lp->started == (STARTED_CU | STARTED_RU)) {
 796
 797		do {
 798			eexp_cmd_clear(dev);
 799
 800			ack_cmd = SCB_ack(status);
 801			scb_command(dev, ack_cmd);
 802			outb(0,ioaddr+SIGNAL_CA);
 803
 804			eexp_cmd_clear(dev);
 805
 806			if (SCB_complete(status)) {
 807				if (!eexp_hw_lasttxstat(dev)) {
 808					printk("%s: tx interrupt but no status\n", dev->name);
 809				}
 810			}
 811
 812			if (SCB_rxdframe(status))
 813				eexp_hw_rx_pio(dev);
 814
 815			status = scb_status(dev);
 816		} while (status & 0xc000);
 817
 818		if (SCB_RUdead(status))
 819		{
 820			printk(KERN_WARNING "%s: RU stopped: status %04x\n",
 821			       dev->name,status);
 822#if 0
 823			printk(KERN_WARNING "%s: cur_rfd=%04x, cur_rbd=%04x\n", dev->name, lp->cur_rfd, lp->cur_rbd);
 824			outw(lp->cur_rfd, ioaddr+READ_PTR);
 825			printk(KERN_WARNING "%s: [%04x]\n", dev->name, inw(ioaddr+DATAPORT));
 826			outw(lp->cur_rfd+6, ioaddr+READ_PTR);
 827			printk(KERN_WARNING "%s: rbd is %04x\n", dev->name, rbd= inw(ioaddr+DATAPORT));
 828			outw(rbd, ioaddr+READ_PTR);
 829			printk(KERN_WARNING "%s: [%04x %04x] ", dev->name, inw(ioaddr+DATAPORT), inw(ioaddr+DATAPORT));
 830			outw(rbd+8, ioaddr+READ_PTR);
 831			printk("[%04x]\n", inw(ioaddr+DATAPORT));
 832#endif
 833			dev->stats.rx_errors++;
 834#if 1
 835		        eexp_hw_rxinit(dev);
 836#else
 837			lp->cur_rfd = lp->first_rfd;
 838#endif
 839			scb_wrrfa(dev, lp->rx_buf_start);
 840			scb_command(dev, SCB_RUstart);
 841			outb(0,ioaddr+SIGNAL_CA);
 842		}
 843	} else {
 844		if (status & 0x8000)
 845			ack_cmd = eexp_start_irq(dev, status);
 846		else
 847			ack_cmd = SCB_ack(status);
 848		scb_command(dev, ack_cmd);
 849		outb(0,ioaddr+SIGNAL_CA);
 850	}
 851
 852	eexp_cmd_clear(dev);
 853
 854	outb(SIRQ_en|irqrmap[dev->irq], ioaddr+SET_IRQ);
 855
 856#if NET_DEBUG > 6
 857	printk("%s: leaving eexp_irq()\n", dev->name);
 858#endif
 859	outw(old_read_ptr, ioaddr+READ_PTR);
 860	outw(old_write_ptr, ioaddr+WRITE_PTR);
 861
 862	spin_unlock(&lp->lock);
 863	return IRQ_HANDLED;
 864}
 865
 866/*
 867 * Hardware access functions
 868 */
 869
 870/*
 871 * Set the cable type to use.
 872 */
 873
 874static void eexp_hw_set_interface(struct net_device *dev)
 875{
 876	unsigned char oldval = inb(dev->base_addr + 0x300e);
 877	oldval &= ~0x82;
 878	switch (dev->if_port) {
 879	case TPE:
 880		oldval |= 0x2;
 881	case BNC:
 882		oldval |= 0x80;
 883		break;
 884	}
 885	outb(oldval, dev->base_addr+0x300e);
 886	mdelay(20);
 887}
 888
 889/*
 890 * Check all the receive buffers, and hand any received packets
 891 * to the upper levels. Basic sanity check on each frame
 892 * descriptor, though we don't bother trying to fix broken ones.
 893 */
 894
 895static void eexp_hw_rx_pio(struct net_device *dev)
 896{
 897	struct net_local *lp = netdev_priv(dev);
 898	unsigned short rx_block = lp->rx_ptr;
 899	unsigned short boguscount = lp->num_rx_bufs;
 900	unsigned short ioaddr = dev->base_addr;
 901	unsigned short status;
 902
 903#if NET_DEBUG > 6
 904	printk(KERN_DEBUG "%s: eexp_hw_rx()\n", dev->name);
 905#endif
 906
 907 	do {
 908 		unsigned short rfd_cmd, rx_next, pbuf, pkt_len;
 909
 910		outw(rx_block, ioaddr + READ_PTR);
 911		status = inw(ioaddr + DATAPORT);
 912
 913		if (FD_Done(status))
 914		{
 915			rfd_cmd = inw(ioaddr + DATAPORT);
 916			rx_next = inw(ioaddr + DATAPORT);
 917			pbuf = inw(ioaddr + DATAPORT);
 918
 919			outw(pbuf, ioaddr + READ_PTR);
 920			pkt_len = inw(ioaddr + DATAPORT);
 921
 922			if (rfd_cmd!=0x0000)
 923  			{
 924				printk(KERN_WARNING "%s: rfd_cmd not zero:0x%04x\n",
 925				       dev->name, rfd_cmd);
 926				continue;
 927			}
 928			else if (pbuf!=rx_block+0x16)
 929			{
 930				printk(KERN_WARNING "%s: rfd and rbd out of sync 0x%04x 0x%04x\n",
 931				       dev->name, rx_block+0x16, pbuf);
 932				continue;
 933			}
 934			else if ((pkt_len & 0xc000)!=0xc000)
 935			{
 936				printk(KERN_WARNING "%s: EOF or F not set on received buffer (%04x)\n",
 937				       dev->name, pkt_len & 0xc000);
 938  				continue;
 939  			}
 940  			else if (!FD_OK(status))
 941			{
 942				dev->stats.rx_errors++;
 943				if (FD_CRC(status))
 944					dev->stats.rx_crc_errors++;
 945				if (FD_Align(status))
 946					dev->stats.rx_frame_errors++;
 947				if (FD_Resrc(status))
 948					dev->stats.rx_fifo_errors++;
 949				if (FD_DMA(status))
 950					dev->stats.rx_over_errors++;
 951				if (FD_Short(status))
 952					dev->stats.rx_length_errors++;
 953			}
 954			else
 955			{
 956				struct sk_buff *skb;
 957				pkt_len &= 0x3fff;
 958				skb = dev_alloc_skb(pkt_len+16);
 959				if (skb == NULL)
 960				{
 961					printk(KERN_WARNING "%s: Memory squeeze, dropping packet\n",dev->name);
 962					dev->stats.rx_dropped++;
 963					break;
 964				}
 965				skb_reserve(skb, 2);
 966				outw(pbuf+10, ioaddr+READ_PTR);
 967			        insw(ioaddr+DATAPORT, skb_put(skb,pkt_len),(pkt_len+1)>>1);
 968				skb->protocol = eth_type_trans(skb,dev);
 969				netif_rx(skb);
 970				dev->stats.rx_packets++;
 971				dev->stats.rx_bytes += pkt_len;
 972			}
 973			outw(rx_block, ioaddr+WRITE_PTR);
 974			outw(0, ioaddr+DATAPORT);
 975			outw(0, ioaddr+DATAPORT);
 976			rx_block = rx_next;
 977		}
 978	} while (FD_Done(status) && boguscount--);
 979	lp->rx_ptr = rx_block;
 980}
 981
 982/*
 983 * Hand a packet to the card for transmission
 984 * If we get here, we MUST have already checked
 985 * to make sure there is room in the transmit
 986 * buffer region.
 987 */
 988
 989static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
 990		       unsigned short len)
 991{
 992	struct net_local *lp = netdev_priv(dev);
 993	unsigned short ioaddr = dev->base_addr;
 994
 995	if (LOCKUP16 || lp->width) {
 996		/* Stop the CU so that there is no chance that it
 997		   jumps off to a bogus address while we are writing the
 998		   pointer to the next transmit packet in 8-bit mode --
 999		   this eliminates the "CU wedged" errors in 8-bit mode.
1000		   (Zoltan Szilagyi 10-12-96) */
1001		scb_command(dev, SCB_CUsuspend);
1002		outw(0xFFFF, ioaddr+SIGNAL_CA);
1003	}
1004
1005 	outw(lp->tx_head, ioaddr + WRITE_PTR);
1006
1007	outw(0x0000, ioaddr + DATAPORT);
1008        outw(Cmd_INT|Cmd_Xmit, ioaddr + DATAPORT);
1009	outw(lp->tx_head+0x08, ioaddr + DATAPORT);
1010	outw(lp->tx_head+0x0e, ioaddr + DATAPORT);
1011
1012	outw(0x0000, ioaddr + DATAPORT);
1013	outw(0x0000, ioaddr + DATAPORT);
1014	outw(lp->tx_head+0x08, ioaddr + DATAPORT);
1015
1016	outw(0x8000|len, ioaddr + DATAPORT);
1017	outw(-1, ioaddr + DATAPORT);
1018	outw(lp->tx_head+0x16, ioaddr + DATAPORT);
1019	outw(0, ioaddr + DATAPORT);
1020
1021	outsw(ioaddr + DATAPORT, buf, (len+1)>>1);
1022
1023	outw(lp->tx_tail+0xc, ioaddr + WRITE_PTR);
1024	outw(lp->tx_head, ioaddr + DATAPORT);
1025
1026	dev->trans_start = jiffies;
1027	lp->tx_tail = lp->tx_head;
1028	if (lp->tx_head==TX_BUF_START+((lp->num_tx_bufs-1)*TX_BUF_SIZE))
1029		lp->tx_head = TX_BUF_START;
1030	else
1031		lp->tx_head += TX_BUF_SIZE;
1032	if (lp->tx_head != lp->tx_reap)
1033		netif_wake_queue(dev);
1034
1035	if (LOCKUP16 || lp->width) {
1036		/* Restart the CU so that the packet can actually
1037		   be transmitted. (Zoltan Szilagyi 10-12-96) */
1038		scb_command(dev, SCB_CUresume);
1039		outw(0xFFFF, ioaddr+SIGNAL_CA);
1040	}
1041
1042	dev->stats.tx_packets++;
1043	lp->last_tx = jiffies;
1044}
1045
1046static const struct net_device_ops eexp_netdev_ops = {
1047	.ndo_open 		= eexp_open,
1048	.ndo_stop 		= eexp_close,
1049	.ndo_start_xmit		= eexp_xmit,
1050	.ndo_set_multicast_list = eexp_set_multicast,
1051	.ndo_tx_timeout		= eexp_timeout,
1052	.ndo_change_mtu		= eth_change_mtu,
1053	.ndo_set_mac_address 	= eth_mac_addr,
1054	.ndo_validate_addr	= eth_validate_addr,
1055};
1056
1057/*
1058 * Sanity check the suspected EtherExpress card
1059 * Read hardware address, reset card, size memory and initialize buffer
1060 * memory pointers. These are held in netdev_priv(), in case someone has more
1061 * than one card in a machine.
1062 */
1063
1064static int __init eexp_hw_probe(struct net_device *dev, unsigned short ioaddr)
1065{
1066	unsigned short hw_addr[3];
1067	unsigned char buswidth;
1068	unsigned int memory_size;
1069	int i;
1070	unsigned short xsum = 0;
1071	struct net_local *lp = netdev_priv(dev);
1072
1073	printk("%s: EtherExpress 16 at %#x ",dev->name,ioaddr);
1074
1075	outb(ASIC_RST, ioaddr+EEPROM_Ctrl);
1076	outb(0, ioaddr+EEPROM_Ctrl);
1077	udelay(500);
1078	outb(i586_RST, ioaddr+EEPROM_Ctrl);
1079
1080	hw_addr[0] = eexp_hw_readeeprom(ioaddr,2);
1081	hw_addr[1] = eexp_hw_readeeprom(ioaddr,3);
1082	hw_addr[2] = eexp_hw_readeeprom(ioaddr,4);
1083
1084	/* Standard Address or Compaq LTE Address */
1085	if (!((hw_addr[2]==0x00aa && ((hw_addr[1] & 0xff00)==0x0000)) ||
1086	      (hw_addr[2]==0x0080 && ((hw_addr[1] & 0xff00)==0x5F00))))
1087	{
1088		printk(" rejected: invalid address %04x%04x%04x\n",
1089			hw_addr[2],hw_addr[1],hw_addr[0]);
1090		return -ENODEV;
1091	}
1092
1093	/* Calculate the EEPROM checksum.  Carry on anyway if it's bad,
1094	 * though.
1095	 */
1096	for (i = 0; i < 64; i++)
1097		xsum += eexp_hw_readeeprom(ioaddr, i);
1098	if (xsum != 0xbaba)
1099		printk(" (bad EEPROM xsum 0x%02x)", xsum);
1100
1101	dev->base_addr = ioaddr;
1102	for ( i=0 ; i<6 ; i++ )
1103		dev->dev_addr[i] = ((unsigned char *)hw_addr)[5-i];
1104
1105	{
1106		static const char irqmap[] = { 0, 9, 3, 4, 5, 10, 11, 0 };
1107		unsigned short setupval = eexp_hw_readeeprom(ioaddr,0);
1108
1109		/* Use the IRQ from EEPROM if none was given */
1110		if (!dev->irq)
1111			dev->irq = irqmap[setupval>>13];
1112
1113		if (dev->if_port == 0xff) {
1114			dev->if_port = !(setupval & 0x1000) ? AUI :
1115				eexp_hw_readeeprom(ioaddr,5) & 0x1 ? TPE : BNC;
1116		}
1117
1118		buswidth = !((setupval & 0x400) >> 10);
1119	}
1120
1121	memset(lp, 0, sizeof(struct net_local));
1122	spin_lock_init(&lp->lock);
1123
1124 	printk("(IRQ %d, %s connector, %d-bit bus", dev->irq,
1125 	       eexp_ifmap[dev->if_port], buswidth?8:16);
1126
1127	if (!request_region(dev->base_addr + 0x300e, 1, "EtherExpress"))
1128		return -EBUSY;
1129
1130 	eexp_hw_set_interface(dev);
1131
1132	release_region(dev->base_addr + 0x300e, 1);
1133
1134	/* Find out how much RAM we have on the card */
1135	outw(0, dev->base_addr + WRITE_PTR);
1136	for (i = 0; i < 32768; i++)
1137		outw(0, dev->base_addr + DATAPORT);
1138
1139        for (memory_size = 0; memory_size < 64; memory_size++)
1140	{
1141		outw(memory_size<<10, dev->base_addr + READ_PTR);
1142		if (inw(dev->base_addr+DATAPORT))
1143			break;
1144		outw(memory_size<<10, dev->base_addr + WRITE_PTR);
1145		outw(memory_size | 0x5000, dev->base_addr+DATAPORT);
1146		outw(memory_size<<10, dev->base_addr + READ_PTR);
1147		if (inw(dev->base_addr+DATAPORT) != (memory_size | 0x5000))
1148			break;
1149	}
1150
1151	/* Sort out the number of buffers.  We may have 16, 32, 48 or 64k
1152	 * of RAM to play with.
1153	 */
1154	lp->num_tx_bufs = 4;
1155	lp->rx_buf_end = 0x3ff6;
1156	switch (memory_size)
1157	{
1158	case 64:
1159		lp->rx_buf_end += 0x4000;
1160	case 48:
1161		lp->num_tx_bufs += 4;
1162		lp->rx_buf_end += 0x4000;
1163	case 32:
1164		lp->rx_buf_end += 0x4000;
1165	case 16:
1166		printk(", %dk RAM)\n", memory_size);
1167		break;
1168	default:
1169		printk(") bad memory size (%dk).\n", memory_size);
1170		return -ENODEV;
1171		break;
1172	}
1173
1174	lp->rx_buf_start = TX_BUF_START + (lp->num_tx_bufs*TX_BUF_SIZE);
1175	lp->width = buswidth;
1176
1177	dev->netdev_ops = &eexp_netdev_ops;
1178	dev->watchdog_timeo = 2*HZ;
1179
1180	return register_netdev(dev);
1181}
1182
1183/*
1184 * Read a word from the EtherExpress on-board serial EEPROM.
1185 * The EEPROM contains 64 words of 16 bits.
1186 */
1187static unsigned short __init eexp_hw_readeeprom(unsigned short ioaddr,
1188						    unsigned char location)
1189{
1190	unsigned short cmd = 0x180|(location&0x7f);
1191	unsigned short rval = 0,wval = EC_CS|i586_RST;
1192	int i;
1193
1194	outb(EC_CS|i586_RST,ioaddr+EEPROM_Ctrl);
1195	for (i=0x100 ; i ; i>>=1 )
1196	{
1197		if (cmd&i)
1198			wval |= EC_Wr;
1199		else
1200			wval &= ~EC_Wr;
1201
1202		outb(wval,ioaddr+EEPROM_Ctrl);
1203		outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
1204		eeprom_delay();
1205		outb(wval,ioaddr+EEPROM_Ctrl);
1206		eeprom_delay();
1207	}
1208	wval &= ~EC_Wr;
1209	outb(wval,ioaddr+EEPROM_Ctrl);
1210	for (i=0x8000 ; i ; i>>=1 )
1211	{
1212		outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
1213		eeprom_delay();
1214		if (inb(ioaddr+EEPROM_Ctrl)&EC_Rd)
1215			rval |= i;
1216		outb(wval,ioaddr+EEPROM_Ctrl);
1217		eeprom_delay();
1218	}
1219	wval &= ~EC_CS;
1220	outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
1221	eeprom_delay();
1222	outb(wval,ioaddr+EEPROM_Ctrl);
1223	eeprom_delay();
1224	return rval;
1225}
1226
1227/*
1228 * Reap tx buffers and return last transmit status.
1229 * if ==0 then either:
1230 *    a) we're not transmitting anything, so why are we here?
1231 *    b) we've died.
1232 * otherwise, Stat_Busy(return) means we've still got some packets
1233 * to transmit, Stat_Done(return) means our buffers should be empty
1234 * again
1235 */
1236
1237static unsigned short eexp_hw_lasttxstat(struct net_device *dev)
1238{
1239	struct net_local *lp = netdev_priv(dev);
1240	unsigned short tx_block = lp->tx_reap;
1241	unsigned short status;
1242
1243	if (!netif_queue_stopped(dev) && lp->tx_head==lp->tx_reap)
1244		return 0x0000;
1245
1246	do
1247	{
1248		outw(tx_block & ~31, dev->base_addr + SM_PTR);
1249		status = inw(dev->base_addr + SHADOW(tx_block));
1250		if (!Stat_Done(status))
1251		{
1252			lp->tx_link = tx_block;
1253			return status;
1254		}
1255		else
1256		{
1257			lp->last_tx_restart = 0;
1258			dev->stats.collisions += Stat_NoColl(status);
1259			if (!Stat_OK(status))
1260			{
1261				char *whatsup = NULL;
1262				dev->stats.tx_errors++;
1263  				if (Stat_Abort(status))
1264					dev->stats.tx_aborted_errors++;
1265				if (Stat_TNoCar(status)) {
1266					whatsup = "aborted, no carrier";
1267					dev->stats.tx_carrier_errors++;
1268				}
1269				if (Stat_TNoCTS(status)) {
1270					whatsup = "aborted, lost CTS";
1271					dev->stats.tx_carrier_errors++;
1272				}
1273				if (Stat_TNoDMA(status)) {
1274					whatsup = "FIFO underran";
1275					dev->stats.tx_fifo_errors++;
1276				}
1277				if (Stat_TXColl(status)) {
1278					whatsup = "aborted, too many collisions";
1279					dev->stats.tx_aborted_errors++;
1280				}
1281				if (whatsup)
1282					printk(KERN_INFO "%s: transmit %s\n",
1283					       dev->name, whatsup);
1284			}
1285			else
1286				dev->stats.tx_packets++;
1287		}
1288		if (tx_block == TX_BUF_START+((lp->num_tx_bufs-1)*TX_BUF_SIZE))
1289			lp->tx_reap = tx_block = TX_BUF_START;
1290		else
1291			lp->tx_reap = tx_block += TX_BUF_SIZE;
1292		netif_wake_queue(dev);
1293	}
1294	while (lp->tx_reap != lp->tx_head);
1295
1296	lp->tx_link = lp->tx_tail + 0x08;
1297
1298	return status;
1299}
1300
1301/*
1302 * This should never happen. It is called when some higher routine detects
1303 * that the CU has stopped, to try to restart it from the last packet we knew
1304 * we were working on, or the idle loop if we had finished for the time.
1305 */
1306
1307static void eexp_hw_txrestart(struct net_device *dev)
1308{
1309	struct net_local *lp = netdev_priv(dev);
1310	unsigned short ioaddr = dev->base_addr;
1311
1312	lp->last_tx_restart = lp->tx_link;
1313	scb_wrcbl(dev, lp->tx_link);
1314	scb_command(dev, SCB_CUstart);
1315	outb(0,ioaddr+SIGNAL_CA);
1316
1317	{
1318		unsigned short boguscount=50,failcount=5;
1319		while (!scb_status(dev))
1320		{
1321			if (!--boguscount)
1322			{
1323				if (--failcount)
1324				{
1325					printk(KERN_WARNING "%s: CU start timed out, status %04x, cmd %04x\n", dev->name, scb_status(dev), scb_rdcmd(dev));
1326				        scb_wrcbl(dev, lp->tx_link);
1327					scb_command(dev, SCB_CUstart);
1328					outb(0,ioaddr+SIGNAL_CA);
1329					boguscount = 100;
1330				}
1331				else
1332				{
1333					printk(KERN_WARNING "%s: Failed to restart CU, resetting board...\n",dev->name);
1334					eexp_hw_init586(dev);
1335					netif_wake_queue(dev);
1336					return;
1337				}
1338			}
1339		}
1340	}
1341}
1342
1343/*
1344 * Writes down the list of transmit buffers into card memory.  Each
1345 * entry consists of an 82586 transmit command, followed by a jump
1346 * pointing to itself.  When we want to transmit a packet, we write
1347 * the data into the appropriate transmit buffer and then modify the
1348 * preceding jump to point at the new transmit command.  This means that
1349 * the 586 command unit is continuously active.
1350 */
1351
1352static void eexp_hw_txinit(struct net_device *dev)
1353{
1354	struct net_local *lp = netdev_priv(dev);
1355	unsigned short tx_block = TX_BUF_START;
1356	unsigned short curtbuf;
1357	unsigned short ioaddr = dev->base_addr;
1358
1359	for ( curtbuf=0 ; curtbuf<lp->num_tx_bufs ; curtbuf++ )
1360	{
1361		outw(tx_block, ioaddr + WRITE_PTR);
1362
1363	        outw(0x0000, ioaddr + DATAPORT);
1364		outw(Cmd_INT|Cmd_Xmit, ioaddr + DATAPORT);
1365		outw(tx_block+0x08, ioaddr + DATAPORT);
1366		outw(tx_block+0x0e, ioaddr + DATAPORT);
1367
1368		outw(0x0000, ioaddr + DATAPORT);
1369		outw(0x0000, ioaddr + DATAPORT);
1370		outw(tx_block+0x08, ioaddr + DATAPORT);
1371
1372		outw(0x8000, ioaddr + DATAPORT);
1373		outw(-1, ioaddr + DATAPORT);
1374		outw(tx_block+0x16, ioaddr + DATAPORT);
1375		outw(0x0000, ioaddr + DATAPORT);
1376
1377		tx_block += TX_BUF_SIZE;
1378	}
1379	lp->tx_head = TX_BUF_START;
1380	lp->tx_reap = TX_BUF_START;
1381	lp->tx_tail = tx_block - TX_BUF_SIZE;
1382	lp->tx_link = lp->tx_tail + 0x08;
1383	lp->rx_buf_start = tx_block;
1384
1385}
1386
1387/*
1388 * Write the circular list of receive buffer descriptors to card memory.
1389 * The end of the list isn't marked, which means that the 82586 receive
1390 * unit will loop until buffers become available (this avoids it giving us
1391 * "out of resources" messages).
1392 */
1393
1394static void eexp_hw_rxinit(struct net_device *dev)
1395{
1396	struct net_local *lp = netdev_priv(dev);
1397	unsigned short rx_block = lp->rx_buf_start;
1398	unsigned short ioaddr = dev->base_addr;
1399
1400	lp->num_rx_bufs = 0;
1401	lp->rx_first = lp->rx_ptr = rx_block;
1402	do
1403	{
1404		lp->num_rx_bufs++;
1405
1406		outw(rx_block, ioaddr + WRITE_PTR);
1407
1408		outw(0, ioaddr + DATAPORT);  outw(0, ioaddr+DATAPORT);
1409		outw(rx_block + RX_BUF_SIZE, ioaddr+DATAPORT);
1410		outw(0xffff, ioaddr+DATAPORT);
1411
1412		outw(0x0000, ioaddr+DATAPORT);
1413		outw(0xdead, ioaddr+DATAPORT);
1414		outw(0xdead, ioaddr+DATAPORT);
1415		outw(0xdead, ioaddr+DATAPORT);
1416		outw(0xdead, ioaddr+DATAPORT);
1417		outw(0xdead, ioaddr+DATAPORT);
1418		outw(0xdead, ioaddr+DATAPORT);
1419
1420		outw(0x0000, ioaddr+DATAPORT);
1421		outw(rx_block + RX_BUF_SIZE + 0x16, ioaddr+DATAPORT);
1422		outw(rx_block + 0x20, ioaddr+DATAPORT);
1423		outw(0, ioaddr+DATAPORT);
1424		outw(RX_BUF_SIZE-0x20, ioaddr+DATAPORT);
1425
1426		lp->rx_last = rx_block;
1427		rx_block += RX_BUF_SIZE;
1428	} while (rx_block <= lp->rx_buf_end-RX_BUF_SIZE);
1429
1430
1431	/* Make first Rx frame descriptor point to first Rx buffer
1432           descriptor */
1433	outw(lp->rx_first + 6, ioaddr+WRITE_PTR);
1434	outw(lp->rx_first + 0x16, ioaddr+DATAPORT);
1435
1436	/* Close Rx frame descriptor ring */
1437  	outw(lp->rx_last + 4, ioaddr+WRITE_PTR);
1438  	outw(lp->rx_first, ioaddr+DATAPORT);
1439
1440	/* Close Rx buffer descriptor ring */
1441	outw(lp->rx_last + 0x16 + 2, ioaddr+WRITE_PTR);
1442	outw(lp->rx_first + 0x16, ioaddr+DATAPORT);
1443
1444}
1445
1446/*
1447 * Un-reset the 586, and start the configuration sequence. We don't wait for
1448 * this to finish, but allow the interrupt handler to start the CU and RU for
1449 * us.  We can't start the receive/transmission system up before we know that
1450 * the hardware is configured correctly.
1451 */
1452
1453static void eexp_hw_init586(struct net_device *dev)
1454{
1455	struct net_local *lp = netdev_priv(dev);
1456	unsigned short ioaddr = dev->base_addr;
1457	int i;
1458
1459#if NET_DEBUG > 6
1460	printk("%s: eexp_hw_init586()\n", dev->name);
1461#endif
1462
1463	lp->started = 0;
1464
1465	set_loopback(dev);
1466
1467	outb(SIRQ_dis|irqrmap[dev->irq],ioaddr+SET_IRQ);
1468
1469	/* Download the startup code */
1470	outw(lp->rx_buf_end & ~31, ioaddr + SM_PTR);
1471	outw(lp->width?0x0001:0x0000, ioaddr + 0x8006);
1472	outw(0x0000, ioaddr + 0x8008);
1473	outw(0x0000, ioaddr + 0x800a);
1474	outw(0x0000, ioaddr + 0x800c);
1475	outw(0x0000, ioaddr + 0x800e);
1476
1477	for (i = 0; i < ARRAY_SIZE(start_code) * 2; i+=32) {
1478		int j;
1479		outw(i, ioaddr + SM_PTR);
1480		for (j = 0; j < 16 && (i+j)/2 < ARRAY_SIZE(start_code); j+=2)
1481			outw(start_code[(i+j)/2],
1482			     ioaddr+0x4000+j);
1483		for (j = 0; j < 16 && (i+j+16)/2 < ARRAY_SIZE(start_code); j+=2)
1484			outw(start_code[(i+j+16)/2],
1485			     ioaddr+0x8000+j);
1486	}
1487
1488	/* Do we want promiscuous mode or multicast? */
1489	outw(CONF_PROMISC & ~31, ioaddr+SM_PTR);
1490	i = inw(ioaddr+SHADOW(CONF_PROMISC));
1491	outw((dev->flags & IFF_PROMISC)?(i|1):(i & ~1),
1492	     ioaddr+SHADOW(CONF_PROMISC));
1493	lp->was_promisc = dev->flags & IFF_PROMISC;
1494#if 0
1495	eexp_setup_filter(dev);
1496#endif
1497
1498	/* Write our hardware address */
1499	outw(CONF_HWADDR & ~31, ioaddr+SM_PTR);
1500	outw(((unsigned short *)dev->dev_addr)[0], ioaddr+SHADOW(CONF_HWADDR));
1501	outw(((unsigned short *)dev->dev_addr)[1],
1502	     ioaddr+SHADOW(CONF_HWADDR+2));
1503	outw(((unsigned short *)dev->dev_addr)[2],
1504	     ioaddr+SHADOW(CONF_HWADDR+4));
1505
1506	eexp_hw_txinit(dev);
1507	eexp_hw_rxinit(dev);
1508
1509	outb(0,ioaddr+EEPROM_Ctrl);
1510	mdelay(5);
1511
1512	scb_command(dev, 0xf000);
1513	outb(0,ioaddr+SIGNAL_CA);
1514
1515	outw(0, ioaddr+SM_PTR);
1516
1517	{
1518		unsigned short rboguscount=50,rfailcount=5;
1519		while (inw(ioaddr+0x4000))
1520		{
1521			if (!--rboguscount)
1522			{
1523				printk(KERN_WARNING "%s: i82586 reset timed out, kicking...\n",
1524					dev->name);
1525				scb_command(dev, 0);
1526				outb(0,ioaddr+SIGNAL_CA);
1527				rboguscount = 100;
1528				if (!--rfailcount)
1529				{
1530					printk(KERN_WARNING "%s: i82586 not responding, giving up.\n",
1531						dev->name);
1532					return;
1533				}
1534			}
1535		}
1536	}
1537
1538        scb_wrcbl(dev, CONF_LINK);
1539	scb_command(dev, 0xf000|SCB_CUstart);
1540	outb(0,ioaddr+SIGNAL_CA);
1541
1542	{
1543		unsigned short iboguscount=50,ifailcount=5;
1544		while (!scb_status(dev))
1545		{
1546			if (!--iboguscount)
1547			{
1548				if (--ifailcount)
1549				{
1550					printk(KERN_WARNING "%s: i82586 initialization timed out, status %04x, cmd %04x\n",
1551						dev->name, scb_status(dev), scb_rdcmd(dev));
1552					scb_wrcbl(dev, CONF_LINK);
1553				        scb_command(dev, 0xf000|SCB_CUstart);
1554					outb(0,ioaddr+SIGNAL_CA);
1555					iboguscount = 100;
1556				}
1557				else
1558				{
1559					printk(KERN_WARNING "%s: Failed to initialize i82586, giving up.\n",dev->name);
1560					return;
1561				}
1562			}
1563		}
1564	}
1565
1566	clear_loopback(dev);
1567	outb(SIRQ_en|irqrmap[dev->irq],ioaddr+SET_IRQ);
1568
1569	lp->init_time = jiffies;
1570#if NET_DEBUG > 6
1571        printk("%s: leaving eexp_hw_init586()\n", dev->name);
1572#endif
1573}
1574
1575static void eexp_setup_filter(struct net_device *dev)
1576{
1577	struct netdev_hw_addr *ha;
1578	unsigned short ioaddr = dev->base_addr;
1579	int count = netdev_mc_count(dev);
1580	int i;
1581	if (count > 8) {
1582		printk(KERN_INFO "%s: too many multicast addresses (%d)\n",
1583		       dev->name, count);
1584		count = 8;
1585	}
1586
1587	outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR);
1588	outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST));
1589	i = 0;
1590	netdev_for_each_mc_addr(ha, dev) {
1591		unsigned short *data = (unsigned short *) ha->addr;
1592
1593		if (i == count)
1594			break;
1595		outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR);
1596		outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i)));
1597		outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR);
1598		outw(data[1], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+2));
1599		outw((CONF_MULTICAST+(6*i)+4) & ~31, ioaddr+SM_PTR);
1600		outw(data[2], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+4));
1601		i++;
1602	}
1603}
1604
1605/*
1606 * Set or clear the multicast filter for this adaptor.
1607 */
1608static void
1609eexp_set_multicast(struct net_device *dev)
1610{
1611        unsigned short ioaddr = dev->base_addr;
1612        struct net_local *lp = netdev_priv(dev);
1613        int kick = 0, i;
1614        if ((dev->flags & IFF_PROMISC) != lp->was_promisc) {
1615                outw(CONF_PROMISC & ~31, ioaddr+SM_PTR);
1616                i = inw(ioaddr+SHADOW(CONF_PROMISC));
1617                outw((dev->flags & IFF_PROMISC)?(i|1):(i & ~1),
1618                     ioaddr+SHADOW(CONF_PROMISC));
1619                lp->was_promisc = dev->flags & IFF_PROMISC;
1620                kick = 1;
1621        }
1622        if (!(dev->flags & IFF_PROMISC)) {
1623                eexp_setup_filter(dev);
1624                if (lp->old_mc_count != netdev_mc_count(dev)) {
1625                        kick = 1;
1626                        lp->old_mc_count = netdev_mc_count(dev);
1627                }
1628        }
1629        if (kick) {
1630                unsigned long oj;
1631                scb_command(dev, SCB_CUsuspend);
1632                outb(0, ioaddr+SIGNAL_CA);
1633                outb(0, ioaddr+SIGNAL_CA);
1634#if 0
1635                printk("%s: waiting for CU to go suspended\n", dev->name);
1636#endif
1637                oj = jiffies;
1638                while ((SCB_CUstat(scb_status(dev)) == 2) &&
1639                       (time_before(jiffies, oj + 2000)));
1640		if (SCB_CUstat(scb_status(dev)) == 2)
1641			printk("%s: warning, CU didn't stop\n", dev->name);
1642                lp->started &= ~(STARTED_CU);
1643                scb_wrcbl(dev, CONF_LINK);
1644                scb_command(dev, SCB_CUstart);
1645                outb(0, ioaddr+SIGNAL_CA);
1646        }
1647}
1648
1649
1650/*
1651 * MODULE stuff
1652 */
1653
1654#ifdef MODULE
1655
1656#define EEXP_MAX_CARDS     4    /* max number of cards to support */
1657
1658static struct net_device *dev_eexp[EEXP_MAX_CARDS];
1659static int irq[EEXP_MAX_CARDS];
1660static int io[EEXP_MAX_CARDS];
1661
1662module_param_array(io, int, NULL, 0);
1663module_param_array(irq, int, NULL, 0);
1664MODULE_PARM_DESC(io, "EtherExpress 16 I/O base address(es)");
1665MODULE_PARM_DESC(irq, "EtherExpress 16 IRQ number(s)");
1666MODULE_LICENSE("GPL");
1667
1668
1669/* Ideally the user would give us io=, irq= for every card.  If any parameters
1670 * are specified, we verify and then use them.  If no parameters are given, we
1671 * autoprobe for one card only.
1672 */
1673int __init init_module(void)
1674{
1675	struct net_device *dev;
1676	int this_dev, found = 0;
1677
1678	for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
1679		dev = alloc_etherdev(sizeof(struct net_local));
1680		dev->irq = irq[this_dev];
1681		dev->base_addr = io[this_dev];
1682		if (io[this_dev] == 0) {
1683			if (this_dev)
1684				break;
1685			printk(KERN_NOTICE "eexpress.c: Module autoprobe not recommended, give io=xx.\n");
1686		}
1687		if (do_express_probe(dev) == 0) {
1688			dev_eexp[this_dev] = dev;
1689			found++;
1690			continue;
1691		}
1692		printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]);
1693		free_netdev(dev);
1694		break;
1695	}
1696	if (found)
1697		return 0;
1698	return -ENXIO;
1699}
1700
1701void __exit cleanup_module(void)
1702{
1703	int this_dev;
1704
1705	for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
1706		struct net_device *dev = dev_eexp[this_dev];
1707		if (dev) {
1708			unregister_netdev(dev);
1709			free_netdev(dev);
1710		}
1711	}
1712}
1713#endif
1714
1715/*
1716 * Local Variables:
1717 *  c-file-style: "linux"
1718 *  tab-width: 8
1719 * End:
1720 */