Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.17.
   1/* Intel Professional Workstation/panther ethernet driver */
   2/* lp486e.c: A panther 82596 ethernet driver for linux. */
   3/*
   4    History and copyrights:
   5
   6    Driver skeleton
   7        Written 1993 by Donald Becker.
   8        Copyright 1993 United States Government as represented by the Director,
   9        National Security Agency.  This software may only be used and
  10	distributed according to the terms of the GNU General Public License
  11	as modified by SRC, incorporated herein by reference.
  12
  13        The author may be reached as becker@scyld.com, or C/O
  14	Scyld Computing Corporation
  15	410 Severn Ave., Suite 210
  16	Annapolis MD 21403
  17
  18    Apricot
  19        Written 1994 by Mark Evans.
  20        This driver is for the Apricot 82596 bus-master interface
  21
  22        Modularised 12/94 Mark Evans
  23
  24    Professional Workstation
  25	Derived from apricot.c by Ard van Breemen
  26	<ard@murphy.nl>|<ard@cstmel.hobby.nl>|<ard@cstmel.nl.eu.org>
  27
  28	Credits:
  29	Thanks to Murphy Software BV for letting me write this in their time.
  30	Well, actually, I get paid doing this...
  31	(Also: see http://www.murphy.nl for murphy, and my homepage ~ard for
  32	more information on the Professional Workstation)
  33
  34    Present version
  35	aeb@cwi.nl
  36*/
  37/*
  38    There are currently two motherboards that I know of in the
  39    professional workstation. The only one that I know is the
  40    intel panther motherboard. -- ard
  41*/
  42/*
  43The pws is equipped with an intel 82596. This is a very intelligent controller
  44which runs its own micro-code. Communication with the hostprocessor is done
  45through linked lists of commands and buffers in the hostprocessors memory.
  46A complete description of the 82596 is available from intel. Search for
  47a file called "29021806.pdf". It is a complete description of the chip itself.
  48To use it for the pws some additions are needed regarding generation of
  49the PORT and CA signal, and the interrupt glue needed for a pc.
  50I/O map:
  51PORT  SIZE ACTION MEANING
  520xCB0    2 WRITE  Lower 16 bits for PORT command
  530xCB2    2 WRITE  Upper 16 bits for PORT command, and issue of PORT command
  540xCB4    1 WRITE  Generation of CA signal
  550xCB8    1 WRITE  Clear interrupt glue
  56All other communication is through memory!
  57*/
  58
  59#include <linux/module.h>
  60#include <linux/init.h>
  61#include <linux/delay.h>
  62#include <linux/kernel.h>
  63#include <linux/string.h>
  64#include <linux/errno.h>
  65#include <linux/ioport.h>
  66#include <linux/slab.h>
  67#include <linux/interrupt.h>
  68#include <linux/netdevice.h>
  69#include <linux/etherdevice.h>
  70#include <linux/skbuff.h>
  71#include <linux/bitops.h>
  72
  73#include <asm/io.h>
  74#include <asm/dma.h>
  75
  76#define DRV_NAME "lp486e"
  77
  78/* debug print flags */
  79#define LOG_SRCDST    0x80000000
  80#define LOG_STATINT   0x40000000
  81#define LOG_STARTINT  0x20000000
  82
  83#define i596_debug debug
  84
  85static int i596_debug = 0;
  86
  87static const char * const medianame[] = {
  88	"10baseT", "AUI",
  89	"10baseT-FD", "AUI-FD",
  90};
  91
  92#define LP486E_TOTAL_SIZE 16
  93
  94#define I596_NULL (0xffffffff)
  95
  96#define CMD_EOL		0x8000	/* The last command of the list, stop. */
  97#define CMD_SUSP	0x4000	/* Suspend after doing cmd. */
  98#define CMD_INTR	0x2000	/* Interrupt after doing cmd. */
  99
 100#define CMD_FLEX	0x0008	/* Enable flexible memory model */
 101
 102enum commands {
 103	CmdNOP = 0,
 104	CmdIASetup = 1,
 105	CmdConfigure = 2,
 106	CmdMulticastList = 3,
 107	CmdTx = 4,
 108	CmdTDR = 5,
 109	CmdDump = 6,
 110	CmdDiagnose = 7
 111};
 112
 113#if 0
 114static const char *CUcmdnames[8] = { "NOP", "IASetup", "Configure", "MulticastList",
 115				     "Tx", "TDR", "Dump", "Diagnose" };
 116#endif
 117
 118/* Status word bits */
 119#define	STAT_CX		0x8000	/* The CU finished executing a command
 120				   with the Interrupt bit set */
 121#define	STAT_FR		0x4000	/* The RU finished receiving a frame */
 122#define	STAT_CNA	0x2000	/* The CU left the active state */
 123#define	STAT_RNR	0x1000	/* The RU left the active state */
 124#define STAT_ACK	(STAT_CX | STAT_FR | STAT_CNA | STAT_RNR)
 125#define	STAT_CUS	0x0700	/* Status of CU: 0: idle, 1: suspended,
 126				   2: active, 3-7: unused */
 127#define STAT_RUS	0x00f0	/* Status of RU: 0: idle, 1: suspended,
 128				   2: no resources, 4: ready,
 129				   10: no resources due to no more RBDs,
 130				   12: no more RBDs, other: unused */
 131#define	STAT_T		0x0008	/* Bus throttle timers loaded */
 132#define	STAT_ZERO	0x0807	/* Always zero */
 133
 134#if 0
 135static char *CUstates[8] = {
 136	"idle", "suspended", "active", 0, 0, 0, 0, 0
 137};
 138static char *RUstates[16] = {
 139	"idle", "suspended", "no resources", 0, "ready", 0, 0, 0,
 140	0, 0, "no RBDs", 0, "out of RBDs", 0, 0, 0
 141};
 142
 143static void
 144i596_out_status(int status) {
 145	int bad = 0;
 146	char *s;
 147
 148	printk("status %4.4x:", status);
 149	if (status == 0xffff)
 150		printk(" strange..\n");
 151	else {
 152		if (status & STAT_CX)
 153			printk("  CU done");
 154		if (status & STAT_CNA)
 155			printk("  CU stopped");
 156		if (status & STAT_FR)
 157			printk("  got a frame");
 158		if (status & STAT_RNR)
 159			printk("  RU stopped");
 160		if (status & STAT_T)
 161			printk("  throttled");
 162		if (status & STAT_ZERO)
 163			bad = 1;
 164		s = CUstates[(status & STAT_CUS) >> 8];
 165		if (!s)
 166			bad = 1;
 167		else
 168			printk("  CU(%s)", s);
 169		s = RUstates[(status & STAT_RUS) >> 4];
 170		if (!s)
 171			bad = 1;
 172		else
 173			printk("  RU(%s)", s);
 174		if (bad)
 175			printk("  bad status");
 176		printk("\n");
 177	}
 178}
 179#endif
 180
 181/* Command word bits */
 182#define ACK_CX		0x8000
 183#define ACK_FR		0x4000
 184#define ACK_CNA		0x2000
 185#define ACK_RNR		0x1000
 186
 187#define CUC_START	0x0100
 188#define CUC_RESUME	0x0200
 189#define CUC_SUSPEND	0x0300
 190#define CUC_ABORT	0x0400
 191
 192#define RX_START	0x0010
 193#define RX_RESUME	0x0020
 194#define RX_SUSPEND	0x0030
 195#define RX_ABORT	0x0040
 196
 197typedef u32 phys_addr;
 198
 199static inline phys_addr
 200va_to_pa(void *x) {
 201	return x ? virt_to_bus(x) : I596_NULL;
 202}
 203
 204static inline void *
 205pa_to_va(phys_addr x) {
 206	return (x == I596_NULL) ? NULL : bus_to_virt(x);
 207}
 208
 209/* status bits for cmd */
 210#define CMD_STAT_C	0x8000	/* CU command complete */
 211#define CMD_STAT_B	0x4000	/* CU command in progress */
 212#define CMD_STAT_OK	0x2000	/* CU command completed without errors */
 213#define CMD_STAT_A	0x1000	/* CU command abnormally terminated */
 214
 215struct i596_cmd {		/* 8 bytes */
 216	unsigned short status;
 217	unsigned short command;
 218	phys_addr pa_next;	/* va_to_pa(struct i596_cmd *next) */
 219};
 220
 221#define EOF		0x8000
 222#define SIZE_MASK	0x3fff
 223
 224struct i596_tbd {
 225	unsigned short size;
 226	unsigned short pad;
 227	phys_addr pa_next;	/* va_to_pa(struct i596_tbd *next) */
 228	phys_addr pa_data;	/* va_to_pa(char *data) */
 229	struct sk_buff *skb;
 230};
 231
 232struct tx_cmd {
 233	struct i596_cmd cmd;
 234	phys_addr pa_tbd;	/* va_to_pa(struct i596_tbd *tbd) */
 235	unsigned short size;
 236	unsigned short pad;
 237};
 238
 239/* status bits for rfd */
 240#define RFD_STAT_C	0x8000	/* Frame reception complete */
 241#define RFD_STAT_B	0x4000	/* Frame reception in progress */
 242#define RFD_STAT_OK	0x2000	/* Frame received without errors */
 243#define RFD_STATUS	0x1fff
 244#define RFD_LENGTH_ERR	0x1000
 245#define RFD_CRC_ERR	0x0800
 246#define RFD_ALIGN_ERR	0x0400
 247#define RFD_NOBUFS_ERR	0x0200
 248#define RFD_DMA_ERR	0x0100	/* DMA overrun failure to acquire system bus */
 249#define RFD_SHORT_FRAME_ERR	0x0080
 250#define RFD_NOEOP_ERR	0x0040
 251#define RFD_TRUNC_ERR	0x0020
 252#define RFD_MULTICAST  0x0002	/* 0: destination had our address
 253				   1: destination was broadcast/multicast */
 254#define RFD_COLLISION  0x0001
 255
 256/* receive frame descriptor */
 257struct i596_rfd {
 258	unsigned short stat;
 259	unsigned short cmd;
 260	phys_addr pa_next;	/* va_to_pa(struct i596_rfd *next) */
 261	phys_addr pa_rbd;	/* va_to_pa(struct i596_rbd *rbd) */
 262	unsigned short count;
 263	unsigned short size;
 264	char data[1532];
 265};
 266
 267#define RBD_EL		0x8000
 268#define RBD_P		0x4000
 269#define RBD_SIZEMASK	0x3fff
 270#define RBD_EOF		0x8000
 271#define RBD_F		0x4000
 272
 273/* receive buffer descriptor */
 274struct i596_rbd {
 275	unsigned short size;
 276	unsigned short pad;
 277	phys_addr pa_next;	/* va_to_pa(struct i596_tbd *next) */
 278	phys_addr pa_data;	/* va_to_pa(char *data) */
 279	phys_addr pa_prev;	/* va_to_pa(struct i596_tbd *prev) */
 280
 281	/* Driver private part */
 282	struct sk_buff *skb;
 283};
 284
 285#define RX_RING_SIZE 64
 286#define RX_SKBSIZE (ETH_FRAME_LEN+10)
 287#define RX_RBD_SIZE 32
 288
 289/* System Control Block - 40 bytes */
 290struct i596_scb {
 291	u16 status;		/* 0 */
 292	u16 command;		/* 2 */
 293	phys_addr pa_cmd;	/* 4 - va_to_pa(struct i596_cmd *cmd) */
 294	phys_addr pa_rfd;	/* 8 - va_to_pa(struct i596_rfd *rfd) */
 295	u32 crc_err;		/* 12 */
 296	u32 align_err;		/* 16 */
 297	u32 resource_err;	/* 20 */
 298	u32 over_err;		/* 24 */
 299	u32 rcvdt_err;		/* 28 */
 300	u32 short_err;		/* 32 */
 301	u16 t_on;		/* 36 */
 302	u16 t_off;		/* 38 */
 303};
 304
 305/* Intermediate System Configuration Pointer - 8 bytes */
 306struct i596_iscp {
 307	u32 busy;		/* 0 */
 308	phys_addr pa_scb;	/* 4 - va_to_pa(struct i596_scb *scb) */
 309};
 310
 311/* System Configuration Pointer - 12 bytes */
 312struct i596_scp {
 313	u32 sysbus;		/* 0 */
 314	u32 pad;		/* 4 */
 315	phys_addr pa_iscp;	/* 8 - va_to_pa(struct i596_iscp *iscp) */
 316};
 317
 318/* Selftest and dump results - needs 16-byte alignment */
 319/*
 320 * The size of the dump area is 304 bytes. When the dump is executed
 321 * by the Port command an extra word will be appended to the dump area.
 322 * The extra word is a copy of the Dump status word (containing the
 323 * C, B, OK bits). [I find 0xa006, with a0 for C+OK and 6 for dump]
 324 */
 325struct i596_dump {
 326	u16 dump[153];		/* (304 = 130h) + 2 bytes */
 327};
 328
 329struct i596_private {		/* aligned to a 16-byte boundary */
 330	struct i596_scp scp;	/* 0 - needs 16-byte alignment */
 331	struct i596_iscp iscp;	/* 12 */
 332	struct i596_scb scb;	/* 20 */
 333	u32 dummy;		/* 60 */
 334	struct i596_dump dump;	/* 64 - needs 16-byte alignment */
 335
 336	struct i596_cmd set_add;
 337	char eth_addr[8];	/* directly follows set_add */
 338
 339	struct i596_cmd set_conf;
 340	char i596_config[16];	/* directly follows set_conf */
 341
 342	struct i596_cmd tdr;
 343	unsigned long tdr_stat;	/* directly follows tdr */
 344
 345	int last_restart;
 346	struct i596_rbd *rbd_list;
 347	struct i596_rbd *rbd_tail;
 348	struct i596_rfd *rx_tail;
 349	struct i596_cmd *cmd_tail;
 350	struct i596_cmd *cmd_head;
 351	int cmd_backlog;
 352	unsigned long last_cmd;
 353	spinlock_t cmd_lock;
 354};
 355
 356static char init_setup[14] = {
 357	0x8E,	/* length 14 bytes, prefetch on */
 358	0xC8,	/* default: fifo to 8, monitor off */
 359	0x40,	/* default: don't save bad frames (apricot.c had 0x80) */
 360	0x2E,	/* (default is 0x26)
 361		   No source address insertion, 8 byte preamble */
 362	0x00,	/* default priority and backoff */
 363	0x60,	/* default interframe spacing */
 364	0x00,	/* default slot time LSB */
 365	0xf2,	/* default slot time and nr of retries */
 366	0x00,	/* default various bits
 367		   (0: promiscuous mode, 1: broadcast disable,
 368		    2: encoding mode, 3: transmit on no CRS,
 369		    4: no CRC insertion, 5: CRC type,
 370		    6: bit stuffing, 7: padding) */
 371	0x00,	/* default carrier sense and collision detect */
 372	0x40,	/* default minimum frame length */
 373	0xff,	/* (default is 0xff, and that is what apricot.c has;
 374		   elp486.c has 0xfb: Enable crc append in memory.) */
 375	0x00,	/* default: not full duplex */
 376	0x7f	/* (default is 0x3f) multi IA */
 377};
 378
 379static int i596_open(struct net_device *dev);
 380static netdev_tx_t i596_start_xmit(struct sk_buff *skb, struct net_device *dev);
 381static irqreturn_t i596_interrupt(int irq, void *dev_id);
 382static int i596_close(struct net_device *dev);
 383static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd);
 384static void print_eth(char *);
 385static void set_multicast_list(struct net_device *dev);
 386static void i596_tx_timeout(struct net_device *dev);
 387
 388static int
 389i596_timeout(struct net_device *dev, char *msg, int ct) {
 390	struct i596_private *lp;
 391	int boguscnt = ct;
 392
 393	lp = netdev_priv(dev);
 394	while (lp->scb.command) {
 395		if (--boguscnt == 0) {
 396			printk("%s: %s timed out - stat %4.4x, cmd %4.4x\n",
 397			       dev->name, msg,
 398			       lp->scb.status, lp->scb.command);
 399			return 1;
 400		}
 401		udelay(5);
 402		barrier();
 403	}
 404	return 0;
 405}
 406
 407static inline int
 408init_rx_bufs(struct net_device *dev, int num) {
 409	struct i596_private *lp;
 410	struct i596_rfd *rfd;
 411	int i;
 412	// struct i596_rbd *rbd;
 413
 414	lp = netdev_priv(dev);
 415	lp->scb.pa_rfd = I596_NULL;
 416
 417	for (i = 0; i < num; i++) {
 418		rfd = kmalloc(sizeof(struct i596_rfd), GFP_KERNEL);
 419		if (rfd == NULL)
 420			break;
 421
 422		rfd->stat = 0;
 423		rfd->pa_rbd = I596_NULL;
 424		rfd->count = 0;
 425		rfd->size = 1532;
 426		if (i == 0) {
 427			rfd->cmd = CMD_EOL;
 428			lp->rx_tail = rfd;
 429		} else {
 430			rfd->cmd = 0;
 431		}
 432		rfd->pa_next = lp->scb.pa_rfd;
 433		lp->scb.pa_rfd = va_to_pa(rfd);
 434		lp->rx_tail->pa_next = lp->scb.pa_rfd;
 435	}
 436
 437#if 0
 438	for (i = 0; i<RX_RBD_SIZE; i++) {
 439		rbd = kmalloc(sizeof(struct i596_rbd), GFP_KERNEL);
 440		if (rbd) {
 441			rbd->pad = 0;
 442			rbd->count = 0;
 443			rbd->skb = dev_alloc_skb(RX_SKBSIZE);
 444			if (!rbd->skb) {
 445				printk("dev_alloc_skb failed");
 446			}
 447			rbd->next = rfd->rbd;
 448			if (i) {
 449				rfd->rbd->prev = rbd;
 450				rbd->size = RX_SKBSIZE;
 451			} else {
 452				rbd->size = (RX_SKBSIZE | RBD_EL);
 453				lp->rbd_tail = rbd;
 454			}
 455
 456			rfd->rbd = rbd;
 457		} else {
 458			printk("Could not kmalloc rbd\n");
 459		}
 460	}
 461	lp->rbd_tail->next = rfd->rbd;
 462#endif
 463	return i;
 464}
 465
 466static inline void
 467remove_rx_bufs(struct net_device *dev) {
 468	struct i596_private *lp;
 469	struct i596_rfd *rfd;
 470
 471	lp = netdev_priv(dev);
 472	lp->rx_tail->pa_next = I596_NULL;
 473
 474	do {
 475		rfd = pa_to_va(lp->scb.pa_rfd);
 476		lp->scb.pa_rfd = rfd->pa_next;
 477		kfree(rfd);
 478	} while (rfd != lp->rx_tail);
 479
 480	lp->rx_tail = NULL;
 481
 482#if 0
 483	for (lp->rbd_list) {
 484	}
 485#endif
 486}
 487
 488#define PORT_RESET              0x00    /* reset 82596 */
 489#define PORT_SELFTEST           0x01    /* selftest */
 490#define PORT_ALTSCP             0x02    /* alternate SCB address */
 491#define PORT_DUMP               0x03    /* dump */
 492
 493#define IOADDR	0xcb0		/* real constant */
 494#define IRQ	10		/* default IRQ - can be changed by ECU */
 495
 496/* The 82596 requires two 16-bit write cycles for a port command */
 497static inline void
 498PORT(phys_addr a, unsigned int cmd) {
 499	if (a & 0xf)
 500		printk("lp486e.c: PORT: address not aligned\n");
 501	outw(((a & 0xffff) | cmd), IOADDR);
 502	outw(((a>>16) & 0xffff), IOADDR+2);
 503}
 504
 505static inline void
 506CA(void) {
 507	outb(0, IOADDR+4);
 508	udelay(8);
 509}
 510
 511static inline void
 512CLEAR_INT(void) {
 513	outb(0, IOADDR+8);
 514}
 515
 516#if 0
 517/* selftest or dump */
 518static void
 519i596_port_do(struct net_device *dev, int portcmd, char *cmdname) {
 520	struct i596_private *lp = netdev_priv(dev);
 521	u16 *outp;
 522	int i, m;
 523
 524	memset((void *)&(lp->dump), 0, sizeof(struct i596_dump));
 525	outp = &(lp->dump.dump[0]);
 526
 527	PORT(va_to_pa(outp), portcmd);
 528	mdelay(30);             /* random, unmotivated */
 529
 530	printk("lp486e i82596 %s result:\n", cmdname);
 531	for (m = ARRAY_SIZE(lp->dump.dump); m && lp->dump.dump[m-1] == 0; m--)
 532		;
 533	for (i = 0; i < m; i++) {
 534		printk(" %04x", lp->dump.dump[i]);
 535		if (i%8 == 7)
 536			printk("\n");
 537	}
 538	printk("\n");
 539}
 540#endif
 541
 542static int
 543i596_scp_setup(struct net_device *dev) {
 544	struct i596_private *lp = netdev_priv(dev);
 545	int boguscnt;
 546
 547	/* Setup SCP, ISCP, SCB */
 548	/*
 549	 * sysbus bits:
 550	 *  only a single byte is significant - here 0x44
 551	 *  0x80: big endian mode (details depend on stepping)
 552	 *  0x40: 1
 553	 *  0x20: interrupt pin is active low
 554	 *  0x10: lock function disabled
 555	 *  0x08: external triggering of bus throttle timers
 556	 *  0x06: 00: 82586 compat mode, 01: segmented mode, 10: linear mode
 557	 *  0x01: unused
 558	 */
 559	lp->scp.sysbus = 0x00440000; 		/* linear mode */
 560	lp->scp.pad = 0;			/* must be zero */
 561	lp->scp.pa_iscp = va_to_pa(&(lp->iscp));
 562
 563	/*
 564	 * The CPU sets the ISCP to 1 before it gives the first CA()
 565	 */
 566	lp->iscp.busy = 0x0001;
 567	lp->iscp.pa_scb = va_to_pa(&(lp->scb));
 568
 569	lp->scb.command = 0;
 570	lp->scb.status = 0;
 571	lp->scb.pa_cmd = I596_NULL;
 572	/* lp->scb.pa_rfd has been initialised already */
 573
 574	lp->last_cmd = jiffies;
 575	lp->cmd_backlog = 0;
 576	lp->cmd_head = NULL;
 577
 578	/*
 579	 * Reset the 82596.
 580	 * We need to wait 10 systemclock cycles, and
 581	 * 5 serial clock cycles.
 582	 */
 583	PORT(0, PORT_RESET);	/* address part ignored */
 584	udelay(100);
 585
 586	/*
 587	 * Before the CA signal is asserted, the default SCP address
 588	 * (0x00fffff4) can be changed to a 16-byte aligned value
 589	 */
 590	PORT(va_to_pa(&lp->scp), PORT_ALTSCP);	/* change the scp address */
 591
 592	/*
 593	 * The initialization procedure begins when a
 594	 * Channel Attention signal is asserted after a reset.
 595	 */
 596
 597	CA();
 598
 599	/*
 600	 * The ISCP busy is cleared by the 82596 after the SCB address is read.
 601	 */
 602	boguscnt = 100;
 603	while (lp->iscp.busy) {
 604		if (--boguscnt == 0) {
 605			/* No i82596 present? */
 606			printk("%s: i82596 initialization timed out\n",
 607			       dev->name);
 608			return 1;
 609		}
 610		udelay(5);
 611		barrier();
 612	}
 613	/* I find here boguscnt==100, so no delay was required. */
 614
 615	return 0;
 616}
 617
 618static int
 619init_i596(struct net_device *dev) {
 620	struct i596_private *lp;
 621
 622	if (i596_scp_setup(dev))
 623		return 1;
 624
 625	lp = netdev_priv(dev);
 626	lp->scb.command = 0;
 627
 628	memcpy ((void *)lp->i596_config, init_setup, 14);
 629	lp->set_conf.command = CmdConfigure;
 630	i596_add_cmd(dev, (void *)&lp->set_conf);
 631
 632	memcpy ((void *)lp->eth_addr, dev->dev_addr, 6);
 633	lp->set_add.command = CmdIASetup;
 634	i596_add_cmd(dev, (struct i596_cmd *)&lp->set_add);
 635
 636	lp->tdr.command = CmdTDR;
 637	i596_add_cmd(dev, (struct i596_cmd *)&lp->tdr);
 638
 639	if (lp->scb.command && i596_timeout(dev, "i82596 init", 200))
 640		return 1;
 641
 642	lp->scb.command = RX_START;
 643	CA();
 644
 645	barrier();
 646
 647	if (lp->scb.command && i596_timeout(dev, "Receive Unit start", 100))
 648		return 1;
 649
 650	return 0;
 651}
 652
 653/* Receive a single frame */
 654static inline int
 655i596_rx_one(struct net_device *dev, struct i596_private *lp,
 656	    struct i596_rfd *rfd, int *frames) {
 657
 658	if (rfd->stat & RFD_STAT_OK) {
 659		/* a good frame */
 660		int pkt_len = (rfd->count & 0x3fff);
 661		struct sk_buff *skb = dev_alloc_skb(pkt_len);
 662
 663		(*frames)++;
 664
 665		if (rfd->cmd & CMD_EOL)
 666			printk("Received on EOL\n");
 667
 668		if (skb == NULL) {
 669			printk ("%s: i596_rx Memory squeeze, "
 670				"dropping packet.\n", dev->name);
 671			dev->stats.rx_dropped++;
 672			return 1;
 673		}
 674
 675		memcpy(skb_put(skb,pkt_len), rfd->data, pkt_len);
 676
 677		skb->protocol = eth_type_trans(skb,dev);
 678		netif_rx(skb);
 679		dev->stats.rx_packets++;
 680	} else {
 681#if 0
 682		printk("Frame reception error status %04x\n",
 683		       rfd->stat);
 684#endif
 685		dev->stats.rx_errors++;
 686		if (rfd->stat & RFD_COLLISION)
 687			dev->stats.collisions++;
 688		if (rfd->stat & RFD_SHORT_FRAME_ERR)
 689			dev->stats.rx_length_errors++;
 690		if (rfd->stat & RFD_DMA_ERR)
 691			dev->stats.rx_over_errors++;
 692		if (rfd->stat & RFD_NOBUFS_ERR)
 693			dev->stats.rx_fifo_errors++;
 694		if (rfd->stat & RFD_ALIGN_ERR)
 695			dev->stats.rx_frame_errors++;
 696		if (rfd->stat & RFD_CRC_ERR)
 697			dev->stats.rx_crc_errors++;
 698		if (rfd->stat & RFD_LENGTH_ERR)
 699			dev->stats.rx_length_errors++;
 700	}
 701	rfd->stat = rfd->count = 0;
 702	return 0;
 703}
 704
 705static int
 706i596_rx(struct net_device *dev) {
 707	struct i596_private *lp = netdev_priv(dev);
 708	struct i596_rfd *rfd;
 709	int frames = 0;
 710
 711	while (1) {
 712		rfd = pa_to_va(lp->scb.pa_rfd);
 713		if (!rfd) {
 714			printk(KERN_ERR "i596_rx: NULL rfd?\n");
 715			return 0;
 716		}
 717#if 1
 718		if (rfd->stat && !(rfd->stat & (RFD_STAT_C | RFD_STAT_B)))
 719			printk("SF:%p-%04x\n", rfd, rfd->stat);
 720#endif
 721		if (!(rfd->stat & RFD_STAT_C))
 722			break;		/* next one not ready */
 723		if (i596_rx_one(dev, lp, rfd, &frames))
 724			break;		/* out of memory */
 725		rfd->cmd = CMD_EOL;
 726		lp->rx_tail->cmd = 0;
 727		lp->rx_tail = rfd;
 728		lp->scb.pa_rfd = rfd->pa_next;
 729		barrier();
 730	}
 731
 732	return frames;
 733}
 734
 735static void
 736i596_cleanup_cmd(struct net_device *dev) {
 737	struct i596_private *lp;
 738	struct i596_cmd *cmd;
 739
 740	lp = netdev_priv(dev);
 741	while (lp->cmd_head) {
 742		cmd = (struct i596_cmd *)lp->cmd_head;
 743
 744		lp->cmd_head = pa_to_va(lp->cmd_head->pa_next);
 745		lp->cmd_backlog--;
 746
 747		switch ((cmd->command) & 0x7) {
 748			case CmdTx: {
 749				struct tx_cmd *tx_cmd = (struct tx_cmd *) cmd;
 750				struct i596_tbd * tx_cmd_tbd;
 751				tx_cmd_tbd = pa_to_va(tx_cmd->pa_tbd);
 752
 753				dev_kfree_skb_any(tx_cmd_tbd->skb);
 754
 755				dev->stats.tx_errors++;
 756				dev->stats.tx_aborted_errors++;
 757
 758				cmd->pa_next = I596_NULL;
 759				kfree((unsigned char *)tx_cmd);
 760				netif_wake_queue(dev);
 761				break;
 762			}
 763			case CmdMulticastList: {
 764				// unsigned short count = *((unsigned short *) (ptr + 1));
 765
 766				cmd->pa_next = I596_NULL;
 767				kfree((unsigned char *)cmd);
 768				break;
 769			}
 770			default: {
 771				cmd->pa_next = I596_NULL;
 772				break;
 773			}
 774		}
 775		barrier();
 776	}
 777
 778	if (lp->scb.command && i596_timeout(dev, "i596_cleanup_cmd", 100))
 779		;
 780
 781	lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
 782}
 783
 784static void i596_reset(struct net_device *dev, struct i596_private *lp, int ioaddr) {
 785
 786	if (lp->scb.command && i596_timeout(dev, "i596_reset", 100))
 787		;
 788
 789	netif_stop_queue(dev);
 790
 791	lp->scb.command = CUC_ABORT | RX_ABORT;
 792	CA();
 793	barrier();
 794
 795	/* wait for shutdown */
 796	if (lp->scb.command && i596_timeout(dev, "i596_reset(2)", 400))
 797		;
 798
 799	i596_cleanup_cmd(dev);
 800	i596_rx(dev);
 801
 802	netif_start_queue(dev);
 803	/*dev_kfree_skb(skb, FREE_WRITE);*/
 804	init_i596(dev);
 805}
 806
 807static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd) {
 808	struct i596_private *lp = netdev_priv(dev);
 809	int ioaddr = dev->base_addr;
 810	unsigned long flags;
 811
 812	cmd->status = 0;
 813	cmd->command |= (CMD_EOL | CMD_INTR);
 814	cmd->pa_next = I596_NULL;
 815
 816	spin_lock_irqsave(&lp->cmd_lock, flags);
 817
 818	if (lp->cmd_head) {
 819		lp->cmd_tail->pa_next = va_to_pa(cmd);
 820	} else {
 821		lp->cmd_head = cmd;
 822		if (lp->scb.command && i596_timeout(dev, "i596_add_cmd", 100))
 823			;
 824		lp->scb.pa_cmd = va_to_pa(cmd);
 825		lp->scb.command = CUC_START;
 826		CA();
 827	}
 828	lp->cmd_tail = cmd;
 829	lp->cmd_backlog++;
 830
 831	lp->cmd_head = pa_to_va(lp->scb.pa_cmd);
 832	spin_unlock_irqrestore(&lp->cmd_lock, flags);
 833
 834	if (lp->cmd_backlog > 16) {
 835		int tickssofar = jiffies - lp->last_cmd;
 836		if (tickssofar < HZ/4)
 837			return;
 838
 839		printk(KERN_WARNING "%s: command unit timed out, status resetting.\n", dev->name);
 840		i596_reset(dev, lp, ioaddr);
 841	}
 842}
 843
 844static int i596_open(struct net_device *dev)
 845{
 846	int i;
 847
 848	i = request_irq(dev->irq, i596_interrupt, IRQF_SHARED, dev->name, dev);
 849	if (i) {
 850		printk(KERN_ERR "%s: IRQ %d not free\n", dev->name, dev->irq);
 851		return i;
 852	}
 853
 854	if ((i = init_rx_bufs(dev, RX_RING_SIZE)) < RX_RING_SIZE)
 855		printk(KERN_ERR "%s: only able to allocate %d receive buffers\n", dev->name, i);
 856
 857	if (i < 4) {
 858		free_irq(dev->irq, dev);
 859		return -EAGAIN;
 860	}
 861	netif_start_queue(dev);
 862	init_i596(dev);
 863	return 0;			/* Always succeed */
 864}
 865
 866static netdev_tx_t i596_start_xmit (struct sk_buff *skb, struct net_device *dev) {
 867	struct tx_cmd *tx_cmd;
 868	short length;
 869
 870	length = skb->len;
 871
 872	if (length < ETH_ZLEN) {
 873		if (skb_padto(skb, ETH_ZLEN))
 874			return NETDEV_TX_OK;
 875		length = ETH_ZLEN;
 876	}
 877
 878	tx_cmd = kmalloc((sizeof (struct tx_cmd) + sizeof (struct i596_tbd)), GFP_ATOMIC);
 879	if (tx_cmd == NULL) {
 880		printk(KERN_WARNING "%s: i596_xmit Memory squeeze, dropping packet.\n", dev->name);
 881		dev->stats.tx_dropped++;
 882		dev_kfree_skb (skb);
 883	} else {
 884		struct i596_tbd *tx_cmd_tbd;
 885		tx_cmd_tbd = (struct i596_tbd *) (tx_cmd + 1);
 886		tx_cmd->pa_tbd = va_to_pa (tx_cmd_tbd);
 887		tx_cmd_tbd->pa_next = I596_NULL;
 888
 889		tx_cmd->cmd.command = (CMD_FLEX | CmdTx);
 890
 891		tx_cmd->pad = 0;
 892		tx_cmd->size = 0;
 893		tx_cmd_tbd->pad = 0;
 894		tx_cmd_tbd->size = (EOF | length);
 895
 896		tx_cmd_tbd->pa_data = va_to_pa (skb->data);
 897		tx_cmd_tbd->skb = skb;
 898
 899		if (i596_debug & LOG_SRCDST)
 900			print_eth (skb->data);
 901
 902		i596_add_cmd (dev, (struct i596_cmd *) tx_cmd);
 903
 904		dev->stats.tx_packets++;
 905	}
 906
 907	return NETDEV_TX_OK;
 908}
 909
 910static void
 911i596_tx_timeout (struct net_device *dev) {
 912	struct i596_private *lp = netdev_priv(dev);
 913	int ioaddr = dev->base_addr;
 914
 915	/* Transmitter timeout, serious problems. */
 916	printk(KERN_WARNING "%s: transmit timed out, status resetting.\n", dev->name);
 917	dev->stats.tx_errors++;
 918
 919	/* Try to restart the adaptor */
 920	if (lp->last_restart == dev->stats.tx_packets) {
 921		printk ("Resetting board.\n");
 922
 923		/* Shutdown and restart */
 924		i596_reset (dev, lp, ioaddr);
 925	} else {
 926		/* Issue a channel attention signal */
 927		printk ("Kicking board.\n");
 928		lp->scb.command = (CUC_START | RX_START);
 929		CA();
 930		lp->last_restart = dev->stats.tx_packets;
 931	}
 932	netif_wake_queue(dev);
 933}
 934
 935static void print_eth(char *add)
 936{
 937	int i;
 938
 939	printk ("Dest  ");
 940	for (i = 0; i < 6; i++)
 941		printk(" %2.2X", (unsigned char) add[i]);
 942	printk ("\n");
 943
 944	printk ("Source");
 945	for (i = 0; i < 6; i++)
 946		printk(" %2.2X", (unsigned char) add[i+6]);
 947	printk ("\n");
 948
 949	printk ("type %2.2X%2.2X\n",
 950		(unsigned char) add[12], (unsigned char) add[13]);
 951}
 952
 953static const struct net_device_ops i596_netdev_ops = {
 954	.ndo_open		= i596_open,
 955	.ndo_stop		= i596_close,
 956	.ndo_start_xmit		= i596_start_xmit,
 957	.ndo_set_multicast_list = set_multicast_list,
 958	.ndo_tx_timeout		= i596_tx_timeout,
 959	.ndo_change_mtu		= eth_change_mtu,
 960	.ndo_set_mac_address 	= eth_mac_addr,
 961	.ndo_validate_addr	= eth_validate_addr,
 962};
 963
 964static int __init lp486e_probe(struct net_device *dev) {
 965	struct i596_private *lp;
 966	unsigned char eth_addr[6] = { 0, 0xaa, 0, 0, 0, 0 };
 967	unsigned char *bios;
 968	int i, j;
 969	int ret = -ENOMEM;
 970	static int probed;
 971
 972	if (probed)
 973		return -ENODEV;
 974	probed++;
 975
 976	if (!request_region(IOADDR, LP486E_TOTAL_SIZE, DRV_NAME)) {
 977		printk(KERN_ERR "lp486e: IO address 0x%x in use\n", IOADDR);
 978		return -EBUSY;
 979	}
 980
 981	lp = netdev_priv(dev);
 982	spin_lock_init(&lp->cmd_lock);
 983
 984	/*
 985	 * Do we really have this thing?
 986	 */
 987	if (i596_scp_setup(dev)) {
 988		ret = -ENODEV;
 989		goto err_out_kfree;
 990	}
 991
 992	dev->base_addr = IOADDR;
 993	dev->irq = IRQ;
 994
 995
 996	/*
 997	 * How do we find the ethernet address? I don't know.
 998	 * One possibility is to look at the EISA configuration area
 999	 * [0xe8000-0xe9fff]. This contains the ethernet address
1000	 * but not at a fixed address - things depend on setup options.
1001	 *
1002	 * If we find no address, or the wrong address, use
1003	 *   ifconfig eth0 hw ether a1:a2:a3:a4:a5:a6
1004	 * with the value found in the BIOS setup.
1005	 */
1006	bios = bus_to_virt(0xe8000);
1007	for (j = 0; j < 0x2000; j++) {
1008		if (bios[j] == 0 && bios[j+1] == 0xaa && bios[j+2] == 0) {
1009			printk("%s: maybe address at BIOS 0x%x:",
1010			       dev->name, 0xe8000+j);
1011			for (i = 0; i < 6; i++) {
1012				eth_addr[i] = bios[i+j];
1013				printk(" %2.2X", eth_addr[i]);
1014			}
1015			printk("\n");
1016		}
1017	}
1018
1019	printk("%s: lp486e 82596 at %#3lx, IRQ %d,",
1020	       dev->name, dev->base_addr, dev->irq);
1021	for (i = 0; i < 6; i++)
1022		printk(" %2.2X", dev->dev_addr[i] = eth_addr[i]);
1023	printk("\n");
1024
1025	/* The LP486E-specific entries in the device structure. */
1026	dev->netdev_ops = &i596_netdev_ops;
1027	dev->watchdog_timeo = 5*HZ;
1028
1029#if 0
1030	/* selftest reports 0x320925ae - don't know what that means */
1031	i596_port_do(dev, PORT_SELFTEST, "selftest");
1032	i596_port_do(dev, PORT_DUMP, "dump");
1033#endif
1034	return 0;
1035
1036err_out_kfree:
1037	release_region(IOADDR, LP486E_TOTAL_SIZE);
1038	return ret;
1039}
1040
1041static inline void
1042i596_handle_CU_completion(struct net_device *dev,
1043			  struct i596_private *lp,
1044			  unsigned short status,
1045			  unsigned short *ack_cmdp) {
1046	struct i596_cmd *cmd;
1047	int frames_out = 0;
1048	int commands_done = 0;
1049	int cmd_val;
1050	unsigned long flags;
1051
1052	spin_lock_irqsave(&lp->cmd_lock, flags);
1053	cmd = lp->cmd_head;
1054
1055	while (lp->cmd_head && (lp->cmd_head->status & CMD_STAT_C)) {
1056		cmd = lp->cmd_head;
1057
1058		lp->cmd_head = pa_to_va(lp->cmd_head->pa_next);
1059		lp->cmd_backlog--;
1060
1061		commands_done++;
1062		cmd_val = cmd->command & 0x7;
1063#if 0
1064		printk("finished CU %s command (%d)\n",
1065		       CUcmdnames[cmd_val], cmd_val);
1066#endif
1067		switch (cmd_val) {
1068		case CmdTx:
1069		{
1070			struct tx_cmd *tx_cmd;
1071			struct i596_tbd *tx_cmd_tbd;
1072
1073			tx_cmd = (struct tx_cmd *) cmd;
1074			tx_cmd_tbd = pa_to_va(tx_cmd->pa_tbd);
1075
1076			frames_out++;
1077			if (cmd->status & CMD_STAT_OK) {
1078				if (i596_debug)
1079					print_eth(pa_to_va(tx_cmd_tbd->pa_data));
1080			} else {
1081				dev->stats.tx_errors++;
1082				if (i596_debug)
1083					printk("transmission failure:%04x\n",
1084					       cmd->status);
1085				if (cmd->status & 0x0020)
1086					dev->stats.collisions++;
1087				if (!(cmd->status & 0x0040))
1088					dev->stats.tx_heartbeat_errors++;
1089				if (cmd->status & 0x0400)
1090					dev->stats.tx_carrier_errors++;
1091				if (cmd->status & 0x0800)
1092					dev->stats.collisions++;
1093				if (cmd->status & 0x1000)
1094					dev->stats.tx_aborted_errors++;
1095			}
1096			dev_kfree_skb_irq(tx_cmd_tbd->skb);
1097
1098			cmd->pa_next = I596_NULL;
1099			kfree((unsigned char *)tx_cmd);
1100			netif_wake_queue(dev);
1101			break;
1102		}
1103
1104		case CmdMulticastList:
1105			cmd->pa_next = I596_NULL;
1106			kfree((unsigned char *)cmd);
1107			break;
1108
1109		case CmdTDR:
1110		{
1111			unsigned long status = *((unsigned long *) (cmd + 1));
1112			if (status & 0x8000) {
1113				if (i596_debug)
1114					printk("%s: link ok.\n", dev->name);
1115			} else {
1116				if (status & 0x4000)
1117					printk("%s: Transceiver problem.\n",
1118					       dev->name);
1119				if (status & 0x2000)
1120					printk("%s: Termination problem.\n",
1121					       dev->name);
1122				if (status & 0x1000)
1123					printk("%s: Short circuit.\n",
1124					       dev->name);
1125				printk("%s: Time %ld.\n",
1126				       dev->name, status & 0x07ff);
1127			}
1128		}
1129		default:
1130			cmd->pa_next = I596_NULL;
1131			lp->last_cmd = jiffies;
1132
1133		}
1134		barrier();
1135	}
1136
1137	cmd = lp->cmd_head;
1138	while (cmd && (cmd != lp->cmd_tail)) {
1139		cmd->command &= 0x1fff;
1140		cmd = pa_to_va(cmd->pa_next);
1141		barrier();
1142	}
1143
1144	if (lp->cmd_head)
1145		*ack_cmdp |= CUC_START;
1146	lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
1147	spin_unlock_irqrestore(&lp->cmd_lock, flags);
1148}
1149
1150static irqreturn_t
1151i596_interrupt(int irq, void *dev_instance)
1152{
1153	struct net_device *dev = dev_instance;
1154	struct i596_private *lp = netdev_priv(dev);
1155	unsigned short status, ack_cmd = 0;
1156	int frames_in = 0;
1157
1158	/*
1159	 * The 82596 examines the command, performs the required action,
1160	 * and then clears the SCB command word.
1161	 */
1162	if (lp->scb.command && i596_timeout(dev, "interrupt", 40))
1163		;
1164
1165	/*
1166	 * The status word indicates the status of the 82596.
1167	 * It is modified only by the 82596.
1168	 *
1169	 * [So, we must not clear it. I find often status 0xffff,
1170	 *  which is not one of the values allowed by the docs.]
1171	 */
1172	status = lp->scb.status;
1173#if 0
1174	if (i596_debug) {
1175		printk("%s: i596 interrupt, ", dev->name);
1176		i596_out_status(status);
1177	}
1178#endif
1179	/* Impossible, but it happens - perhaps when we get
1180	   a receive interrupt but scb.pa_rfd is I596_NULL. */
1181	if (status == 0xffff) {
1182		printk("%s: i596_interrupt: got status 0xffff\n", dev->name);
1183		goto out;
1184	}
1185
1186	ack_cmd = (status & STAT_ACK);
1187
1188	if (status & (STAT_CX | STAT_CNA))
1189		i596_handle_CU_completion(dev, lp, status, &ack_cmd);
1190
1191	if (status & (STAT_FR | STAT_RNR)) {
1192		/* Restart the receive unit when it got inactive somehow */
1193		if ((status & STAT_RNR) && netif_running(dev))
1194			ack_cmd |= RX_START;
1195
1196		if (status & STAT_FR) {
1197			frames_in = i596_rx(dev);
1198			if (!frames_in)
1199				printk("receive frame reported, but no frames\n");
1200		}
1201	}
1202
1203	/* acknowledge the interrupt */
1204	/*
1205	if ((lp->scb.pa_cmd != I596_NULL) && netif_running(dev))
1206		ack_cmd |= CUC_START;
1207	*/
1208
1209	if (lp->scb.command && i596_timeout(dev, "i596 interrupt", 100))
1210		;
1211
1212	lp->scb.command = ack_cmd;
1213
1214	CLEAR_INT();
1215	CA();
1216
1217 out:
1218	return IRQ_HANDLED;
1219}
1220
1221static int i596_close(struct net_device *dev) {
1222	struct i596_private *lp = netdev_priv(dev);
1223
1224	netif_stop_queue(dev);
1225
1226	if (i596_debug)
1227		printk("%s: Shutting down ethercard, status was %4.4x.\n",
1228		       dev->name, lp->scb.status);
1229
1230	lp->scb.command = (CUC_ABORT | RX_ABORT);
1231	CA();
1232
1233	i596_cleanup_cmd(dev);
1234
1235	if (lp->scb.command && i596_timeout(dev, "i596_close", 200))
1236		;
1237
1238	free_irq(dev->irq, dev);
1239	remove_rx_bufs(dev);
1240
1241	return 0;
1242}
1243
1244/*
1245*	Set or clear the multicast filter for this adaptor.
1246*/
1247
1248static void set_multicast_list(struct net_device *dev) {
1249	struct i596_private *lp = netdev_priv(dev);
1250	struct i596_cmd *cmd;
1251
1252	if (i596_debug > 1)
1253		printk ("%s: set multicast list %d\n",
1254			dev->name, netdev_mc_count(dev));
1255
1256	if (!netdev_mc_empty(dev)) {
1257		struct netdev_hw_addr *ha;
1258		char *cp;
1259		cmd = kmalloc(sizeof(struct i596_cmd) + 2 +
1260			      netdev_mc_count(dev) * 6, GFP_ATOMIC);
1261		if (cmd == NULL) {
1262			printk (KERN_ERR "%s: set_multicast Memory squeeze.\n", dev->name);
1263			return;
1264		}
1265		cmd->command = CmdMulticastList;
1266		*((unsigned short *) (cmd + 1)) = netdev_mc_count(dev) * 6;
1267		cp = ((char *)(cmd + 1))+2;
1268		netdev_for_each_mc_addr(ha, dev) {
1269			memcpy(cp, ha->addr, 6);
1270			cp += 6;
1271		}
1272		if (i596_debug & LOG_SRCDST)
1273			print_eth (((char *)(cmd + 1)) + 2);
1274		i596_add_cmd(dev, cmd);
1275	} else {
1276		if (lp->set_conf.pa_next != I596_NULL) {
1277			return;
1278		}
1279		if (netdev_mc_empty(dev) &&
1280		    !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
1281			lp->i596_config[8] &= ~0x01;
1282		} else {
1283			lp->i596_config[8] |= 0x01;
1284		}
1285
1286		i596_add_cmd(dev, (struct i596_cmd *) &lp->set_conf);
1287	}
1288}
1289
1290MODULE_AUTHOR("Ard van Breemen <ard@cstmel.nl.eu.org>");
1291MODULE_DESCRIPTION("Intel Panther onboard i82596 driver");
1292MODULE_LICENSE("GPL");
1293
1294static struct net_device *dev_lp486e;
1295static int full_duplex;
1296static int options;
1297static int io = IOADDR;
1298static int irq = IRQ;
1299
1300module_param(debug, int, 0);
1301//module_param(max_interrupt_work, int, 0);
1302//module_param(reverse_probe, int, 0);
1303//module_param(rx_copybreak, int, 0);
1304module_param(options, int, 0);
1305module_param(full_duplex, int, 0);
1306
1307static int __init lp486e_init_module(void) {
1308	int err;
1309	struct net_device *dev = alloc_etherdev(sizeof(struct i596_private));
1310	if (!dev)
1311		return -ENOMEM;
1312
1313	dev->irq = irq;
1314	dev->base_addr = io;
1315	err = lp486e_probe(dev);
1316	if (err) {
1317		free_netdev(dev);
1318		return err;
1319	}
1320	err = register_netdev(dev);
1321	if (err) {
1322		release_region(dev->base_addr, LP486E_TOTAL_SIZE);
1323		free_netdev(dev);
1324		return err;
1325	}
1326	dev_lp486e = dev;
1327	full_duplex = 0;
1328	options = 0;
1329	return 0;
1330}
1331
1332static void __exit lp486e_cleanup_module(void) {
1333	unregister_netdev(dev_lp486e);
1334	release_region(dev_lp486e->base_addr, LP486E_TOTAL_SIZE);
1335	free_netdev(dev_lp486e);
1336}
1337
1338module_init(lp486e_init_module);
1339module_exit(lp486e_cleanup_module);