Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1/* cs89x0.c: A Crystal Semiconductor (Now Cirrus Logic) CS89[02]0
   2 *  driver for linux.
   3 */
   4
   5/*
   6	Written 1996 by Russell Nelson, with reference to skeleton.c
   7	written 1993-1994 by Donald Becker.
   8
   9	This software may be used and distributed according to the terms
  10	of the GNU General Public License, incorporated herein by reference.
  11
  12        The author may be reached at nelson@crynwr.com, Crynwr
  13        Software, 521 Pleasant Valley Rd., Potsdam, NY 13676
  14
  15  Changelog:
  16
  17  Mike Cruse        : mcruse@cti-ltd.com
  18                    : Changes for Linux 2.0 compatibility.
  19                    : Added dev_id parameter in net_interrupt(),
  20                    : request_irq() and free_irq(). Just NULL for now.
  21
  22  Mike Cruse        : Added MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT macros
  23                    : in net_open() and net_close() so kerneld would know
  24                    : that the module is in use and wouldn't eject the
  25                    : driver prematurely.
  26
  27  Mike Cruse        : Rewrote init_module() and cleanup_module using 8390.c
  28                    : as an example. Disabled autoprobing in init_module(),
  29                    : not a good thing to do to other devices while Linux
  30                    : is running from all accounts.
  31
  32  Russ Nelson       : Jul 13 1998.  Added RxOnly DMA support.
  33
  34  Melody Lee        : Aug 10 1999.  Changes for Linux 2.2.5 compatibility.
  35                    : email: ethernet@crystal.cirrus.com
  36
  37  Alan Cox          : Removed 1.2 support, added 2.1 extra counters.
  38
  39  Andrew Morton     : Kernel 2.3.48
  40                    : Handle kmalloc() failures
  41                    : Other resource allocation fixes
  42                    : Add SMP locks
  43                    : Integrate Russ Nelson's ALLOW_DMA functionality back in.
  44                    : If ALLOW_DMA is true, make DMA runtime selectable
  45                    : Folded in changes from Cirrus (Melody Lee
  46                    : <klee@crystal.cirrus.com>)
  47                    : Don't call netif_wake_queue() in net_send_packet()
  48                    : Fixed an out-of-mem bug in dma_rx()
  49                    : Updated Documentation/networking/cs89x0.txt
  50
  51  Andrew Morton     : Kernel 2.3.99-pre1
  52                    : Use skb_reserve to longword align IP header (two places)
  53                    : Remove a delay loop from dma_rx()
  54                    : Replace '100' with HZ
  55                    : Clean up a couple of skb API abuses
  56                    : Added 'cs89x0_dma=N' kernel boot option
  57                    : Correctly initialise lp->lock in non-module compile
  58
  59  Andrew Morton     : Kernel 2.3.99-pre4-1
  60                    : MOD_INC/DEC race fix (see
  61                    : http://www.uwsg.indiana.edu/hypermail/linux/kernel/0003.3/1532.html)
  62
  63  Andrew Morton     : Kernel 2.4.0-test7-pre2
  64                    : Enhanced EEPROM support to cover more devices,
  65                    :   abstracted IRQ mapping to support CONFIG_ARCH_CLPS7500 arch
  66                    :   (Jason Gunthorpe <jgg@ualberta.ca>)
  67
  68  Andrew Morton     : Kernel 2.4.0-test11-pre4
  69                    : Use dev->name in request_*() (Andrey Panin)
  70                    : Fix an error-path memleak in init_module()
  71                    : Preserve return value from request_irq()
  72                    : Fix type of `media' module parm (Keith Owens)
  73                    : Use SET_MODULE_OWNER()
  74                    : Tidied up strange request_irq() abuse in net_open().
  75
  76  Andrew Morton     : Kernel 2.4.3-pre1
  77                    : Request correct number of pages for DMA (Hugh Dickens)
  78                    : Select PP_ChipID _after_ unregister_netdev in cleanup_module()
  79                    :  because unregister_netdev() calls get_stats.
  80                    : Make `version[]' __initdata
  81                    : Uninlined the read/write reg/word functions.
  82
  83  Oskar Schirmer    : oskar@scara.com
  84                    : HiCO.SH4 (superh) support added (irq#1, cs89x0_media=)
  85
  86  Deepak Saxena     : dsaxena@plexity.net
  87                    : Intel IXDP2x01 (XScale ixp2x00 NPU) platform support
  88
  89  Dmitry Pervushin  : dpervushin@ru.mvista.com
  90                    : PNX010X platform support
  91
  92  Deepak Saxena     : dsaxena@plexity.net
  93                    : Intel IXDP2351 platform support
  94
  95  Dmitry Pervushin  : dpervushin@ru.mvista.com
  96                    : PNX010X platform support
  97
  98  Domenico Andreoli : cavokz@gmail.com
  99                    : QQ2440 platform support
 100
 101*/
 102
 103/* Always include 'config.h' first in case the user wants to turn on
 104   or override something. */
 105#include <linux/module.h>
 106
 107/*
 108 * Set this to zero to disable DMA code
 109 *
 110 * Note that even if DMA is turned off we still support the 'dma' and  'use_dma'
 111 * module options so we don't break any startup scripts.
 112 */
 113#ifndef CONFIG_ISA_DMA_API
 114#define ALLOW_DMA	0
 115#else
 116#define ALLOW_DMA	1
 117#endif
 118
 119/*
 120 * Set this to zero to remove all the debug statements via
 121 * dead code elimination
 122 */
 123#define DEBUGGING	1
 124
 125/*
 126  Sources:
 127
 128	Crynwr packet driver epktisa.
 129
 130	Crystal Semiconductor data sheets.
 131
 132*/
 133
 134#include <linux/errno.h>
 135#include <linux/netdevice.h>
 136#include <linux/etherdevice.h>
 137#include <linux/kernel.h>
 138#include <linux/types.h>
 139#include <linux/fcntl.h>
 140#include <linux/interrupt.h>
 141#include <linux/ioport.h>
 142#include <linux/in.h>
 143#include <linux/skbuff.h>
 144#include <linux/spinlock.h>
 145#include <linux/string.h>
 146#include <linux/init.h>
 147#include <linux/bitops.h>
 148#include <linux/delay.h>
 149#include <linux/gfp.h>
 150
 151#include <asm/system.h>
 152#include <asm/io.h>
 153#include <asm/irq.h>
 154#if ALLOW_DMA
 155#include <asm/dma.h>
 156#endif
 157
 158#include "cs89x0.h"
 159
 160static char version[] __initdata =
 161"cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton\n";
 162
 163#define DRV_NAME "cs89x0"
 164
 165/* First, a few definitions that the brave might change.
 166   A zero-terminated list of I/O addresses to be probed. Some special flags..
 167      Addr & 1 = Read back the address port, look for signature and reset
 168                 the page window before probing
 169      Addr & 3 = Reset the page window and probe
 170   The CLPS eval board has the Cirrus chip at 0x80090300, in ARM IO space,
 171   but it is possible that a Cirrus board could be plugged into the ISA
 172   slots. */
 173/* The cs8900 has 4 IRQ pins, software selectable. cs8900_irq_map maps
 174   them to system IRQ numbers. This mapping is card specific and is set to
 175   the configuration of the Cirrus Eval board for this chip. */
 176#if defined(CONFIG_MACH_IXDP2351)
 177static unsigned int netcard_portlist[] __used __initdata = {IXDP2351_VIRT_CS8900_BASE, 0};
 178static unsigned int cs8900_irq_map[] = {IRQ_IXDP2351_CS8900, 0, 0, 0};
 179#elif defined(CONFIG_ARCH_IXDP2X01)
 180static unsigned int netcard_portlist[] __used __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0};
 181static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
 182#elif defined(CONFIG_MACH_QQ2440)
 183#include <mach/qq2440.h>
 184static unsigned int netcard_portlist[] __used __initdata = { QQ2440_CS8900_VIRT_BASE + 0x300, 0 };
 185static unsigned int cs8900_irq_map[] = { QQ2440_CS8900_IRQ, 0, 0, 0 };
 186#elif defined(CONFIG_MACH_MX31ADS)
 187#include <mach/board-mx31ads.h>
 188static unsigned int netcard_portlist[] __used __initdata = {
 189	PBC_BASE_ADDRESS + PBC_CS8900A_IOBASE + 0x300, 0
 190};
 191static unsigned cs8900_irq_map[] = {EXPIO_INT_ENET_INT, 0, 0, 0};
 192#else
 193static unsigned int netcard_portlist[] __used __initdata =
 194   { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
 195static unsigned int cs8900_irq_map[] = {10,11,12,5};
 196#endif
 197
 198#if DEBUGGING
 199static unsigned int net_debug = DEBUGGING;
 200#else
 201#define net_debug 0	/* gcc will remove all the debug code for us */
 202#endif
 203
 204/* The number of low I/O ports used by the ethercard. */
 205#define NETCARD_IO_EXTENT	16
 206
 207/* we allow the user to override various values normally set in the EEPROM */
 208#define FORCE_RJ45	0x0001    /* pick one of these three */
 209#define FORCE_AUI	0x0002
 210#define FORCE_BNC	0x0004
 211
 212#define FORCE_AUTO	0x0010    /* pick one of these three */
 213#define FORCE_HALF	0x0020
 214#define FORCE_FULL	0x0030
 215
 216/* Information that need to be kept for each board. */
 217struct net_local {
 218	int chip_type;		/* one of: CS8900, CS8920, CS8920M */
 219	char chip_revision;	/* revision letter of the chip ('A'...) */
 220	int send_cmd;		/* the proper send command: TX_NOW, TX_AFTER_381, or TX_AFTER_ALL */
 221	int auto_neg_cnf;	/* auto-negotiation word from EEPROM */
 222	int adapter_cnf;	/* adapter configuration from EEPROM */
 223	int isa_config;		/* ISA configuration from EEPROM */
 224	int irq_map;		/* IRQ map from EEPROM */
 225	int rx_mode;		/* what mode are we in? 0, RX_MULTCAST_ACCEPT, or RX_ALL_ACCEPT */
 226	int curr_rx_cfg;	/* a copy of PP_RxCFG */
 227	int linectl;		/* either 0 or LOW_RX_SQUELCH, depending on configuration. */
 228	int send_underrun;	/* keep track of how many underruns in a row we get */
 229	int force;		/* force various values; see FORCE* above. */
 230	spinlock_t lock;
 231#if ALLOW_DMA
 232	int use_dma;		/* Flag: we're using dma */
 233	int dma;		/* DMA channel */
 234	int dmasize;		/* 16 or 64 */
 235	unsigned char *dma_buff;	/* points to the beginning of the buffer */
 236	unsigned char *end_dma_buff;	/* points to the end of the buffer */
 237	unsigned char *rx_dma_ptr;	/* points to the next packet  */
 238#endif
 239};
 240
 241/* Index to functions, as function prototypes. */
 242
 243static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular);
 244static int net_open(struct net_device *dev);
 245static netdev_tx_t net_send_packet(struct sk_buff *skb, struct net_device *dev);
 246static irqreturn_t net_interrupt(int irq, void *dev_id);
 247static void set_multicast_list(struct net_device *dev);
 248static void net_timeout(struct net_device *dev);
 249static void net_rx(struct net_device *dev);
 250static int net_close(struct net_device *dev);
 251static struct net_device_stats *net_get_stats(struct net_device *dev);
 252static void reset_chip(struct net_device *dev);
 253static int get_eeprom_data(struct net_device *dev, int off, int len, int *buffer);
 254static int get_eeprom_cksum(int off, int len, int *buffer);
 255static int set_mac_address(struct net_device *dev, void *addr);
 256static void count_rx_errors(int status, struct net_device *dev);
 257#ifdef CONFIG_NET_POLL_CONTROLLER
 258static void net_poll_controller(struct net_device *dev);
 259#endif
 260#if ALLOW_DMA
 261static void get_dma_channel(struct net_device *dev);
 262static void release_dma_buff(struct net_local *lp);
 263#endif
 264
 265/* Example routines you must write ;->. */
 266#define tx_done(dev) 1
 267
 268/*
 269 * Permit 'cs89x0_dma=N' in the kernel boot environment
 270 */
 271#if !defined(MODULE) && (ALLOW_DMA != 0)
 272static int g_cs89x0_dma;
 273
 274static int __init dma_fn(char *str)
 275{
 276	g_cs89x0_dma = simple_strtol(str,NULL,0);
 277	return 1;
 278}
 279
 280__setup("cs89x0_dma=", dma_fn);
 281#endif	/* !defined(MODULE) && (ALLOW_DMA != 0) */
 282
 283#ifndef MODULE
 284static int g_cs89x0_media__force;
 285
 286static int __init media_fn(char *str)
 287{
 288	if (!strcmp(str, "rj45")) g_cs89x0_media__force = FORCE_RJ45;
 289	else if (!strcmp(str, "aui")) g_cs89x0_media__force = FORCE_AUI;
 290	else if (!strcmp(str, "bnc")) g_cs89x0_media__force = FORCE_BNC;
 291	return 1;
 292}
 293
 294__setup("cs89x0_media=", media_fn);
 295
 296
 297/* Check for a network adaptor of this type, and return '0' iff one exists.
 298   If dev->base_addr == 0, probe all likely locations.
 299   If dev->base_addr == 1, always return failure.
 300   If dev->base_addr == 2, allocate space for the device and return success
 301   (detachable devices only).
 302   Return 0 on success.
 303   */
 304
 305struct net_device * __init cs89x0_probe(int unit)
 306{
 307	struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
 308	unsigned *port;
 309	int err = 0;
 310	int irq;
 311	int io;
 312
 313	if (!dev)
 314		return ERR_PTR(-ENODEV);
 315
 316	sprintf(dev->name, "eth%d", unit);
 317	netdev_boot_setup_check(dev);
 318	io = dev->base_addr;
 319	irq = dev->irq;
 320
 321	if (net_debug)
 322		printk("cs89x0:cs89x0_probe(0x%x)\n", io);
 323
 324	if (io > 0x1ff)	{	/* Check a single specified location. */
 325		err = cs89x0_probe1(dev, io, 0);
 326	} else if (io != 0) {	/* Don't probe at all. */
 327		err = -ENXIO;
 328	} else {
 329		for (port = netcard_portlist; *port; port++) {
 330			if (cs89x0_probe1(dev, *port, 0) == 0)
 331				break;
 332			dev->irq = irq;
 333		}
 334		if (!*port)
 335			err = -ENODEV;
 336	}
 337	if (err)
 338		goto out;
 339	return dev;
 340out:
 341	free_netdev(dev);
 342	printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUP\n");
 343	return ERR_PTR(err);
 344}
 345#endif
 346
 347#if defined(CONFIG_MACH_IXDP2351)
 348static u16
 349readword(unsigned long base_addr, int portno)
 350{
 351	return __raw_readw(base_addr + (portno << 1));
 352}
 353
 354static void
 355writeword(unsigned long base_addr, int portno, u16 value)
 356{
 357	__raw_writew(value, base_addr + (portno << 1));
 358}
 359#elif defined(CONFIG_ARCH_IXDP2X01)
 360static u16
 361readword(unsigned long base_addr, int portno)
 362{
 363	return __raw_readl(base_addr + (portno << 1));
 364}
 365
 366static void
 367writeword(unsigned long base_addr, int portno, u16 value)
 368{
 369	__raw_writel(value, base_addr + (portno << 1));
 370}
 371#else
 372static u16
 373readword(unsigned long base_addr, int portno)
 374{
 375	return inw(base_addr + portno);
 376}
 377
 378static void
 379writeword(unsigned long base_addr, int portno, u16 value)
 380{
 381	outw(value, base_addr + portno);
 382}
 383#endif
 384
 385static void
 386readwords(unsigned long base_addr, int portno, void *buf, int length)
 387{
 388	u8 *buf8 = (u8 *)buf;
 389
 390	do {
 391		u16 tmp16;
 392
 393		tmp16 = readword(base_addr, portno);
 394		*buf8++ = (u8)tmp16;
 395		*buf8++ = (u8)(tmp16 >> 8);
 396	} while (--length);
 397}
 398
 399static void
 400writewords(unsigned long base_addr, int portno, void *buf, int length)
 401{
 402	u8 *buf8 = (u8 *)buf;
 403
 404	do {
 405		u16 tmp16;
 406
 407		tmp16 = *buf8++;
 408		tmp16 |= (*buf8++) << 8;
 409		writeword(base_addr, portno, tmp16);
 410	} while (--length);
 411}
 412
 413static u16
 414readreg(struct net_device *dev, u16 regno)
 415{
 416	writeword(dev->base_addr, ADD_PORT, regno);
 417	return readword(dev->base_addr, DATA_PORT);
 418}
 419
 420static void
 421writereg(struct net_device *dev, u16 regno, u16 value)
 422{
 423	writeword(dev->base_addr, ADD_PORT, regno);
 424	writeword(dev->base_addr, DATA_PORT, value);
 425}
 426
 427static int __init
 428wait_eeprom_ready(struct net_device *dev)
 429{
 430	int timeout = jiffies;
 431	/* check to see if the EEPROM is ready, a timeout is used -
 432	   just in case EEPROM is ready when SI_BUSY in the
 433	   PP_SelfST is clear */
 434	while(readreg(dev, PP_SelfST) & SI_BUSY)
 435		if (jiffies - timeout >= 40)
 436			return -1;
 437	return 0;
 438}
 439
 440static int __init
 441get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
 442{
 443	int i;
 444
 445	if (net_debug > 3) printk("EEPROM data from %x for %x:\n",off,len);
 446	for (i = 0; i < len; i++) {
 447		if (wait_eeprom_ready(dev) < 0) return -1;
 448		/* Now send the EEPROM read command and EEPROM location to read */
 449		writereg(dev, PP_EECMD, (off + i) | EEPROM_READ_CMD);
 450		if (wait_eeprom_ready(dev) < 0) return -1;
 451		buffer[i] = readreg(dev, PP_EEData);
 452		if (net_debug > 3) printk("%04x ", buffer[i]);
 453	}
 454	if (net_debug > 3) printk("\n");
 455        return 0;
 456}
 457
 458static int  __init
 459get_eeprom_cksum(int off, int len, int *buffer)
 460{
 461	int i, cksum;
 462
 463	cksum = 0;
 464	for (i = 0; i < len; i++)
 465		cksum += buffer[i];
 466	cksum &= 0xffff;
 467	if (cksum == 0)
 468		return 0;
 469	return -1;
 470}
 471
 472#ifdef CONFIG_NET_POLL_CONTROLLER
 473/*
 474 * Polling receive - used by netconsole and other diagnostic tools
 475 * to allow network i/o with interrupts disabled.
 476 */
 477static void net_poll_controller(struct net_device *dev)
 478{
 479	disable_irq(dev->irq);
 480	net_interrupt(dev->irq, dev);
 481	enable_irq(dev->irq);
 482}
 483#endif
 484
 485static const struct net_device_ops net_ops = {
 486	.ndo_open		= net_open,
 487	.ndo_stop		= net_close,
 488	.ndo_tx_timeout		= net_timeout,
 489	.ndo_start_xmit 	= net_send_packet,
 490	.ndo_get_stats		= net_get_stats,
 491	.ndo_set_multicast_list = set_multicast_list,
 492	.ndo_set_mac_address 	= set_mac_address,
 493#ifdef CONFIG_NET_POLL_CONTROLLER
 494	.ndo_poll_controller	= net_poll_controller,
 495#endif
 496	.ndo_change_mtu		= eth_change_mtu,
 497	.ndo_validate_addr	= eth_validate_addr,
 498};
 499
 500/* This is the real probe routine.  Linux has a history of friendly device
 501   probes on the ISA bus.  A good device probes avoids doing writes, and
 502   verifies that the correct device exists and functions.
 503   Return 0 on success.
 504 */
 505
 506static int __init
 507cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
 508{
 509	struct net_local *lp = netdev_priv(dev);
 510	static unsigned version_printed;
 511	int i;
 512	int tmp;
 513	unsigned rev_type = 0;
 514	int eeprom_buff[CHKSUM_LEN];
 515	int retval;
 516
 517	/* Initialize the device structure. */
 518	if (!modular) {
 519		memset(lp, 0, sizeof(*lp));
 520		spin_lock_init(&lp->lock);
 521#ifndef MODULE
 522#if ALLOW_DMA
 523		if (g_cs89x0_dma) {
 524			lp->use_dma = 1;
 525			lp->dma = g_cs89x0_dma;
 526			lp->dmasize = 16;	/* Could make this an option... */
 527		}
 528#endif
 529		lp->force = g_cs89x0_media__force;
 530#endif
 531
 532#if defined(CONFIG_MACH_QQ2440)
 533		lp->force |= FORCE_RJ45 | FORCE_FULL;
 534#endif
 535        }
 536
 537	/* Grab the region so we can find another board if autoIRQ fails. */
 538	/* WTF is going on here? */
 539	if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) {
 540		printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n",
 541				DRV_NAME, ioaddr, NETCARD_IO_EXTENT);
 542		retval = -EBUSY;
 543		goto out1;
 544	}
 545
 546	/* if they give us an odd I/O address, then do ONE write to
 547           the address port, to get it back to address zero, where we
 548           expect to find the EISA signature word. An IO with a base of 0x3
 549	   will skip the test for the ADD_PORT. */
 550	if (ioaddr & 1) {
 551		if (net_debug > 1)
 552			printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr);
 553	        if ((ioaddr & 2) != 2)
 554	        	if ((readword(ioaddr & ~3, ADD_PORT) & ADD_MASK) != ADD_SIG) {
 555				printk(KERN_ERR "%s: bad signature 0x%x\n",
 556					dev->name, readword(ioaddr & ~3, ADD_PORT));
 557		        	retval = -ENODEV;
 558				goto out2;
 559			}
 560	}
 561
 562	ioaddr &= ~3;
 563	printk(KERN_DEBUG "PP_addr at %x[%x]: 0x%x\n",
 564			ioaddr, ADD_PORT, readword(ioaddr, ADD_PORT));
 565	writeword(ioaddr, ADD_PORT, PP_ChipID);
 566
 567	tmp = readword(ioaddr, DATA_PORT);
 568	if (tmp != CHIP_EISA_ID_SIG) {
 569		printk(KERN_DEBUG "%s: incorrect signature at %x[%x]: 0x%x!="
 570			CHIP_EISA_ID_SIG_STR "\n",
 571			dev->name, ioaddr, DATA_PORT, tmp);
 572  		retval = -ENODEV;
 573  		goto out2;
 574	}
 575
 576	/* Fill in the 'dev' fields. */
 577	dev->base_addr = ioaddr;
 578
 579	/* get the chip type */
 580	rev_type = readreg(dev, PRODUCT_ID_ADD);
 581	lp->chip_type = rev_type &~ REVISON_BITS;
 582	lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A';
 583
 584	/* Check the chip type and revision in order to set the correct send command
 585	CS8920 revision C and CS8900 revision F can use the faster send. */
 586	lp->send_cmd = TX_AFTER_381;
 587	if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
 588		lp->send_cmd = TX_NOW;
 589	if (lp->chip_type != CS8900 && lp->chip_revision >= 'C')
 590		lp->send_cmd = TX_NOW;
 591
 592	if (net_debug  &&  version_printed++ == 0)
 593		printk(version);
 594
 595	printk(KERN_INFO "%s: cs89%c0%s rev %c found at %#3lx ",
 596	       dev->name,
 597	       lp->chip_type==CS8900?'0':'2',
 598	       lp->chip_type==CS8920M?"M":"",
 599	       lp->chip_revision,
 600	       dev->base_addr);
 601
 602	reset_chip(dev);
 603
 604        /* Here we read the current configuration of the chip. If there
 605	   is no Extended EEPROM then the idea is to not disturb the chip
 606	   configuration, it should have been correctly setup by automatic
 607	   EEPROM read on reset. So, if the chip says it read the EEPROM
 608	   the driver will always do *something* instead of complain that
 609	   adapter_cnf is 0. */
 610
 611
 612        if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) ==
 613	      (EEPROM_OK|EEPROM_PRESENT)) {
 614	        /* Load the MAC. */
 615		for (i=0; i < ETH_ALEN/2; i++) {
 616	                unsigned int Addr;
 617			Addr = readreg(dev, PP_IA+i*2);
 618		        dev->dev_addr[i*2] = Addr & 0xFF;
 619		        dev->dev_addr[i*2+1] = Addr >> 8;
 620		}
 621
 622	   	/* Load the Adapter Configuration.
 623		   Note:  Barring any more specific information from some
 624		   other source (ie EEPROM+Schematics), we would not know
 625		   how to operate a 10Base2 interface on the AUI port.
 626		   However, since we  do read the status of HCB1 and use
 627		   settings that always result in calls to control_dc_dc(dev,0)
 628		   a BNC interface should work if the enable pin
 629		   (dc/dc converter) is on HCB1. It will be called AUI
 630		   however. */
 631
 632		lp->adapter_cnf = 0;
 633		i = readreg(dev, PP_LineCTL);
 634		/* Preserve the setting of the HCB1 pin. */
 635		if ((i & (HCB1 | HCB1_ENBL)) ==  (HCB1 | HCB1_ENBL))
 636			lp->adapter_cnf |= A_CNF_DC_DC_POLARITY;
 637		/* Save the sqelch bit */
 638		if ((i & LOW_RX_SQUELCH) == LOW_RX_SQUELCH)
 639			lp->adapter_cnf |= A_CNF_EXTND_10B_2 | A_CNF_LOW_RX_SQUELCH;
 640		/* Check if the card is in 10Base-t only mode */
 641		if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == 0)
 642			lp->adapter_cnf |=  A_CNF_10B_T | A_CNF_MEDIA_10B_T;
 643		/* Check if the card is in AUI only mode */
 644		if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUI_ONLY)
 645			lp->adapter_cnf |=  A_CNF_AUI | A_CNF_MEDIA_AUI;
 646		/* Check if the card is in Auto mode. */
 647		if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUTO_AUI_10BASET)
 648			lp->adapter_cnf |=  A_CNF_AUI | A_CNF_10B_T |
 649			A_CNF_MEDIA_AUI | A_CNF_MEDIA_10B_T | A_CNF_MEDIA_AUTO;
 650
 651		if (net_debug > 1)
 652			printk(KERN_INFO "%s: PP_LineCTL=0x%x, adapter_cnf=0x%x\n",
 653					dev->name, i, lp->adapter_cnf);
 654
 655		/* IRQ. Other chips already probe, see below. */
 656		if (lp->chip_type == CS8900)
 657			lp->isa_config = readreg(dev, PP_CS8900_ISAINT) & INT_NO_MASK;
 658
 659		printk( "[Cirrus EEPROM] ");
 660	}
 661
 662        printk("\n");
 663
 664	/* First check to see if an EEPROM is attached. */
 665
 666	if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)
 667		printk(KERN_WARNING "cs89x0: No EEPROM, relying on command line....\n");
 668	else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
 669		printk(KERN_WARNING "\ncs89x0: EEPROM read failed, relying on command line.\n");
 670        } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
 671		/* Check if the chip was able to read its own configuration starting
 672		   at 0 in the EEPROM*/
 673		if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) !=
 674		    (EEPROM_OK|EEPROM_PRESENT))
 675                	printk(KERN_WARNING "cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line\n");
 676
 677        } else {
 678		/* This reads an extended EEPROM that is not documented
 679		   in the CS8900 datasheet. */
 680
 681                /* get transmission control word  but keep the autonegotiation bits */
 682                if (!lp->auto_neg_cnf) lp->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET/2];
 683                /* Store adapter configuration */
 684                if (!lp->adapter_cnf) lp->adapter_cnf = eeprom_buff[ADAPTER_CNF_OFFSET/2];
 685                /* Store ISA configuration */
 686                lp->isa_config = eeprom_buff[ISA_CNF_OFFSET/2];
 687                dev->mem_start = eeprom_buff[PACKET_PAGE_OFFSET/2] << 8;
 688
 689                /* eeprom_buff has 32-bit ints, so we can't just memcpy it */
 690                /* store the initial memory base address */
 691                for (i = 0; i < ETH_ALEN/2; i++) {
 692                        dev->dev_addr[i*2] = eeprom_buff[i];
 693                        dev->dev_addr[i*2+1] = eeprom_buff[i] >> 8;
 694                }
 695		if (net_debug > 1)
 696			printk(KERN_DEBUG "%s: new adapter_cnf: 0x%x\n",
 697				dev->name, lp->adapter_cnf);
 698        }
 699
 700        /* allow them to force multiple transceivers.  If they force multiple, autosense */
 701        {
 702		int count = 0;
 703		if (lp->force & FORCE_RJ45)	{lp->adapter_cnf |= A_CNF_10B_T; count++; }
 704		if (lp->force & FORCE_AUI) 	{lp->adapter_cnf |= A_CNF_AUI; count++; }
 705		if (lp->force & FORCE_BNC)	{lp->adapter_cnf |= A_CNF_10B_2; count++; }
 706		if (count > 1)			{lp->adapter_cnf |= A_CNF_MEDIA_AUTO; }
 707		else if (lp->force & FORCE_RJ45){lp->adapter_cnf |= A_CNF_MEDIA_10B_T; }
 708		else if (lp->force & FORCE_AUI)	{lp->adapter_cnf |= A_CNF_MEDIA_AUI; }
 709		else if (lp->force & FORCE_BNC)	{lp->adapter_cnf |= A_CNF_MEDIA_10B_2; }
 710        }
 711
 712	if (net_debug > 1)
 713		printk(KERN_DEBUG "%s: after force 0x%x, adapter_cnf=0x%x\n",
 714			dev->name, lp->force, lp->adapter_cnf);
 715
 716        /* FIXME: We don't let you set dc-dc polarity or low RX squelch from the command line: add it here */
 717
 718        /* FIXME: We don't let you set the IMM bit from the command line: add it to lp->auto_neg_cnf here */
 719
 720        /* FIXME: we don't set the Ethernet address on the command line.  Use
 721           ifconfig IFACE hw ether AABBCCDDEEFF */
 722
 723	printk(KERN_INFO "cs89x0 media %s%s%s",
 724	       (lp->adapter_cnf & A_CNF_10B_T)?"RJ-45,":"",
 725	       (lp->adapter_cnf & A_CNF_AUI)?"AUI,":"",
 726	       (lp->adapter_cnf & A_CNF_10B_2)?"BNC,":"");
 727
 728	lp->irq_map = 0xffff;
 729
 730	/* If this is a CS8900 then no pnp soft */
 731	if (lp->chip_type != CS8900 &&
 732	    /* Check if the ISA IRQ has been set  */
 733		(i = readreg(dev, PP_CS8920_ISAINT) & 0xff,
 734		 (i != 0 && i < CS8920_NO_INTS))) {
 735		if (!dev->irq)
 736			dev->irq = i;
 737	} else {
 738		i = lp->isa_config & INT_NO_MASK;
 739		if (lp->chip_type == CS8900) {
 740#ifdef CONFIG_CS89x0_NONISA_IRQ
 741		        i = cs8900_irq_map[0];
 742#else
 743			/* Translate the IRQ using the IRQ mapping table. */
 744			if (i >= ARRAY_SIZE(cs8900_irq_map))
 745				printk("\ncs89x0: invalid ISA interrupt number %d\n", i);
 746			else
 747				i = cs8900_irq_map[i];
 748
 749			lp->irq_map = CS8900_IRQ_MAP; /* fixed IRQ map for CS8900 */
 750		} else {
 751			int irq_map_buff[IRQ_MAP_LEN/2];
 752
 753			if (get_eeprom_data(dev, IRQ_MAP_EEPROM_DATA,
 754					    IRQ_MAP_LEN/2,
 755					    irq_map_buff) >= 0) {
 756				if ((irq_map_buff[0] & 0xff) == PNP_IRQ_FRMT)
 757					lp->irq_map = (irq_map_buff[0]>>8) | (irq_map_buff[1] << 8);
 758			}
 759#endif
 760		}
 761		if (!dev->irq)
 762			dev->irq = i;
 763	}
 764
 765	printk(" IRQ %d", dev->irq);
 766
 767#if ALLOW_DMA
 768	if (lp->use_dma) {
 769		get_dma_channel(dev);
 770		printk(", DMA %d", dev->dma);
 771	}
 772	else
 773#endif
 774	{
 775		printk(", programmed I/O");
 776	}
 777
 778	/* print the ethernet address. */
 779	printk(", MAC %pM", dev->dev_addr);
 780
 781	dev->netdev_ops	= &net_ops;
 782	dev->watchdog_timeo = HZ;
 783
 784	printk("\n");
 785	if (net_debug)
 786		printk("cs89x0_probe1() successful\n");
 787
 788	retval = register_netdev(dev);
 789	if (retval)
 790		goto out3;
 791	return 0;
 792out3:
 793	writeword(dev->base_addr, ADD_PORT, PP_ChipID);
 794out2:
 795	release_region(ioaddr & ~3, NETCARD_IO_EXTENT);
 796out1:
 797	return retval;
 798}
 799
 800
 801/*********************************
 802 * This page contains DMA routines
 803**********************************/
 804
 805#if ALLOW_DMA
 806
 807#define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
 808
 809static void
 810get_dma_channel(struct net_device *dev)
 811{
 812	struct net_local *lp = netdev_priv(dev);
 813
 814	if (lp->dma) {
 815		dev->dma = lp->dma;
 816		lp->isa_config |= ISA_RxDMA;
 817	} else {
 818		if ((lp->isa_config & ANY_ISA_DMA) == 0)
 819			return;
 820		dev->dma = lp->isa_config & DMA_NO_MASK;
 821		if (lp->chip_type == CS8900)
 822			dev->dma += 5;
 823		if (dev->dma < 5 || dev->dma > 7) {
 824			lp->isa_config &= ~ANY_ISA_DMA;
 825			return;
 826		}
 827	}
 828}
 829
 830static void
 831write_dma(struct net_device *dev, int chip_type, int dma)
 832{
 833	struct net_local *lp = netdev_priv(dev);
 834	if ((lp->isa_config & ANY_ISA_DMA) == 0)
 835		return;
 836	if (chip_type == CS8900) {
 837		writereg(dev, PP_CS8900_ISADMA, dma-5);
 838	} else {
 839		writereg(dev, PP_CS8920_ISADMA, dma);
 840	}
 841}
 842
 843static void
 844set_dma_cfg(struct net_device *dev)
 845{
 846	struct net_local *lp = netdev_priv(dev);
 847
 848	if (lp->use_dma) {
 849		if ((lp->isa_config & ANY_ISA_DMA) == 0) {
 850			if (net_debug > 3)
 851				printk("set_dma_cfg(): no DMA\n");
 852			return;
 853		}
 854		if (lp->isa_config & ISA_RxDMA) {
 855			lp->curr_rx_cfg |= RX_DMA_ONLY;
 856			if (net_debug > 3)
 857				printk("set_dma_cfg(): RX_DMA_ONLY\n");
 858		} else {
 859			lp->curr_rx_cfg |= AUTO_RX_DMA;	/* not that we support it... */
 860			if (net_debug > 3)
 861				printk("set_dma_cfg(): AUTO_RX_DMA\n");
 862		}
 863	}
 864}
 865
 866static int
 867dma_bufcfg(struct net_device *dev)
 868{
 869	struct net_local *lp = netdev_priv(dev);
 870	if (lp->use_dma)
 871		return (lp->isa_config & ANY_ISA_DMA)? RX_DMA_ENBL : 0;
 872	else
 873		return 0;
 874}
 875
 876static int
 877dma_busctl(struct net_device *dev)
 878{
 879	int retval = 0;
 880	struct net_local *lp = netdev_priv(dev);
 881	if (lp->use_dma) {
 882		if (lp->isa_config & ANY_ISA_DMA)
 883			retval |= RESET_RX_DMA; /* Reset the DMA pointer */
 884		if (lp->isa_config & DMA_BURST)
 885			retval |= DMA_BURST_MODE; /* Does ISA config specify DMA burst ? */
 886		if (lp->dmasize == 64)
 887			retval |= RX_DMA_SIZE_64K; /* did they ask for 64K? */
 888		retval |= MEMORY_ON;	/* we need memory enabled to use DMA. */
 889	}
 890	return retval;
 891}
 892
 893static void
 894dma_rx(struct net_device *dev)
 895{
 896	struct net_local *lp = netdev_priv(dev);
 897	struct sk_buff *skb;
 898	int status, length;
 899	unsigned char *bp = lp->rx_dma_ptr;
 900
 901	status = bp[0] + (bp[1]<<8);
 902	length = bp[2] + (bp[3]<<8);
 903	bp += 4;
 904	if (net_debug > 5) {
 905		printk(	"%s: receiving DMA packet at %lx, status %x, length %x\n",
 906			dev->name, (unsigned long)bp, status, length);
 907	}
 908	if ((status & RX_OK) == 0) {
 909		count_rx_errors(status, dev);
 910		goto skip_this_frame;
 911	}
 912
 913	/* Malloc up new buffer. */
 914	skb = dev_alloc_skb(length + 2);
 915	if (skb == NULL) {
 916		if (net_debug)	/* I don't think we want to do this to a stressed system */
 917			printk("%s: Memory squeeze, dropping packet.\n", dev->name);
 918		dev->stats.rx_dropped++;
 919
 920		/* AKPM: advance bp to the next frame */
 921skip_this_frame:
 922		bp += (length + 3) & ~3;
 923		if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
 924		lp->rx_dma_ptr = bp;
 925		return;
 926	}
 927	skb_reserve(skb, 2);	/* longword align L3 header */
 928
 929	if (bp + length > lp->end_dma_buff) {
 930		int semi_cnt = lp->end_dma_buff - bp;
 931		memcpy(skb_put(skb,semi_cnt), bp, semi_cnt);
 932		memcpy(skb_put(skb,length - semi_cnt), lp->dma_buff,
 933		       length - semi_cnt);
 934	} else {
 935		memcpy(skb_put(skb,length), bp, length);
 936	}
 937	bp += (length + 3) & ~3;
 938	if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
 939	lp->rx_dma_ptr = bp;
 940
 941	if (net_debug > 3) {
 942		printk(	"%s: received %d byte DMA packet of type %x\n",
 943			dev->name, length,
 944			(skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
 945	}
 946        skb->protocol=eth_type_trans(skb,dev);
 947	netif_rx(skb);
 948	dev->stats.rx_packets++;
 949	dev->stats.rx_bytes += length;
 950}
 951
 952#endif	/* ALLOW_DMA */
 953
 954static void __init reset_chip(struct net_device *dev)
 955{
 956#if !defined(CONFIG_MACH_MX31ADS)
 957#if !defined(CS89x0_NONISA_IRQ)
 958	struct net_local *lp = netdev_priv(dev);
 959	int ioaddr = dev->base_addr;
 960#endif /* CS89x0_NONISA_IRQ */
 961	int reset_start_time;
 962
 963	writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
 964
 965	/* wait 30 ms */
 966	msleep(30);
 967
 968#if !defined(CS89x0_NONISA_IRQ)
 969	if (lp->chip_type != CS8900) {
 970		/* Hardware problem requires PNP registers to be reconfigured after a reset */
 971		writeword(ioaddr, ADD_PORT, PP_CS8920_ISAINT);
 972		outb(dev->irq, ioaddr + DATA_PORT);
 973		outb(0,      ioaddr + DATA_PORT + 1);
 974
 975		writeword(ioaddr, ADD_PORT, PP_CS8920_ISAMemB);
 976		outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT);
 977		outb((dev->mem_start >> 8) & 0xff,   ioaddr + DATA_PORT + 1);
 978	}
 979#endif /* CS89x0_NONISA_IRQ */
 980
 981	/* Wait until the chip is reset */
 982	reset_start_time = jiffies;
 983	while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
 984		;
 985#endif /* !CONFIG_MACH_MX31ADS */
 986}
 987
 988
 989static void
 990control_dc_dc(struct net_device *dev, int on_not_off)
 991{
 992	struct net_local *lp = netdev_priv(dev);
 993	unsigned int selfcontrol;
 994	int timenow = jiffies;
 995	/* control the DC to DC convertor in the SelfControl register.
 996	   Note: This is hooked up to a general purpose pin, might not
 997	   always be a DC to DC convertor. */
 998
 999	selfcontrol = HCB1_ENBL; /* Enable the HCB1 bit as an output */
1000	if (((lp->adapter_cnf & A_CNF_DC_DC_POLARITY) != 0) ^ on_not_off)
1001		selfcontrol |= HCB1;
1002	else
1003		selfcontrol &= ~HCB1;
1004	writereg(dev, PP_SelfCTL, selfcontrol);
1005
1006	/* Wait for the DC/DC converter to power up - 500ms */
1007	while (jiffies - timenow < HZ)
1008		;
1009}
1010
1011#define DETECTED_NONE  0
1012#define DETECTED_RJ45H 1
1013#define DETECTED_RJ45F 2
1014#define DETECTED_AUI   3
1015#define DETECTED_BNC   4
1016
1017static int
1018detect_tp(struct net_device *dev)
1019{
1020	struct net_local *lp = netdev_priv(dev);
1021	int timenow = jiffies;
1022	int fdx;
1023
1024	if (net_debug > 1) printk("%s: Attempting TP\n", dev->name);
1025
1026        /* If connected to another full duplex capable 10-Base-T card the link pulses
1027           seem to be lost when the auto detect bit in the LineCTL is set.
1028           To overcome this the auto detect bit will be cleared whilst testing the
1029           10-Base-T interface.  This would not be necessary for the sparrow chip but
1030           is simpler to do it anyway. */
1031	writereg(dev, PP_LineCTL, lp->linectl &~ AUI_ONLY);
1032	control_dc_dc(dev, 0);
1033
1034        /* Delay for the hardware to work out if the TP cable is present - 150ms */
1035	for (timenow = jiffies; jiffies - timenow < 15; )
1036                ;
1037	if ((readreg(dev, PP_LineST) & LINK_OK) == 0)
1038		return DETECTED_NONE;
1039
1040	if (lp->chip_type == CS8900) {
1041                switch (lp->force & 0xf0) {
1042#if 0
1043                case FORCE_AUTO:
1044			printk("%s: cs8900 doesn't autonegotiate\n",dev->name);
1045                        return DETECTED_NONE;
1046#endif
1047		/* CS8900 doesn't support AUTO, change to HALF*/
1048                case FORCE_AUTO:
1049			lp->force &= ~FORCE_AUTO;
1050                        lp->force |= FORCE_HALF;
1051			break;
1052		case FORCE_HALF:
1053			break;
1054                case FORCE_FULL:
1055			writereg(dev, PP_TestCTL, readreg(dev, PP_TestCTL) | FDX_8900);
1056			break;
1057                }
1058		fdx = readreg(dev, PP_TestCTL) & FDX_8900;
1059	} else {
1060		switch (lp->force & 0xf0) {
1061		case FORCE_AUTO:
1062			lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1063			break;
1064		case FORCE_HALF:
1065			lp->auto_neg_cnf = 0;
1066			break;
1067		case FORCE_FULL:
1068			lp->auto_neg_cnf = RE_NEG_NOW | ALLOW_FDX;
1069			break;
1070                }
1071
1072		writereg(dev, PP_AutoNegCTL, lp->auto_neg_cnf & AUTO_NEG_MASK);
1073
1074		if ((lp->auto_neg_cnf & AUTO_NEG_BITS) == AUTO_NEG_ENABLE) {
1075			printk(KERN_INFO "%s: negotiating duplex...\n",dev->name);
1076			while (readreg(dev, PP_AutoNegST) & AUTO_NEG_BUSY) {
1077				if (jiffies - timenow > 4000) {
1078					printk(KERN_ERR "**** Full / half duplex auto-negotiation timed out ****\n");
1079					break;
1080				}
1081			}
1082		}
1083		fdx = readreg(dev, PP_AutoNegST) & FDX_ACTIVE;
1084	}
1085	if (fdx)
1086		return DETECTED_RJ45F;
1087	else
1088		return DETECTED_RJ45H;
1089}
1090
1091/* send a test packet - return true if carrier bits are ok */
1092static int
1093send_test_pkt(struct net_device *dev)
1094{
1095	char test_packet[] = { 0,0,0,0,0,0, 0,0,0,0,0,0,
1096				 0, 46, /* A 46 in network order */
1097				 0, 0, /* DSAP=0 & SSAP=0 fields */
1098				 0xf3, 0 /* Control (Test Req + P bit set) */ };
1099	long timenow = jiffies;
1100
1101	writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_TX_ON);
1102
1103	memcpy(test_packet,          dev->dev_addr, ETH_ALEN);
1104	memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN);
1105
1106        writeword(dev->base_addr, TX_CMD_PORT, TX_AFTER_ALL);
1107        writeword(dev->base_addr, TX_LEN_PORT, ETH_ZLEN);
1108
1109	/* Test to see if the chip has allocated memory for the packet */
1110	while (jiffies - timenow < 5)
1111		if (readreg(dev, PP_BusST) & READY_FOR_TX_NOW)
1112			break;
1113	if (jiffies - timenow >= 5)
1114		return 0;	/* this shouldn't happen */
1115
1116	/* Write the contents of the packet */
1117	writewords(dev->base_addr, TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1);
1118
1119	if (net_debug > 1) printk("Sending test packet ");
1120	/* wait a couple of jiffies for packet to be received */
1121	for (timenow = jiffies; jiffies - timenow < 3; )
1122                ;
1123        if ((readreg(dev, PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) {
1124                if (net_debug > 1) printk("succeeded\n");
1125                return 1;
1126        }
1127	if (net_debug > 1) printk("failed\n");
1128	return 0;
1129}
1130
1131
1132static int
1133detect_aui(struct net_device *dev)
1134{
1135	struct net_local *lp = netdev_priv(dev);
1136
1137	if (net_debug > 1) printk("%s: Attempting AUI\n", dev->name);
1138	control_dc_dc(dev, 0);
1139
1140	writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1141
1142	if (send_test_pkt(dev))
1143		return DETECTED_AUI;
1144	else
1145		return DETECTED_NONE;
1146}
1147
1148static int
1149detect_bnc(struct net_device *dev)
1150{
1151	struct net_local *lp = netdev_priv(dev);
1152
1153	if (net_debug > 1) printk("%s: Attempting BNC\n", dev->name);
1154	control_dc_dc(dev, 1);
1155
1156	writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1157
1158	if (send_test_pkt(dev))
1159		return DETECTED_BNC;
1160	else
1161		return DETECTED_NONE;
1162}
1163
1164
1165static void
1166write_irq(struct net_device *dev, int chip_type, int irq)
1167{
1168	int i;
1169
1170	if (chip_type == CS8900) {
1171		/* Search the mapping table for the corresponding IRQ pin. */
1172		for (i = 0; i != ARRAY_SIZE(cs8900_irq_map); i++)
1173			if (cs8900_irq_map[i] == irq)
1174				break;
1175		/* Not found */
1176		if (i == ARRAY_SIZE(cs8900_irq_map))
1177			i = 3;
1178		writereg(dev, PP_CS8900_ISAINT, i);
1179	} else {
1180		writereg(dev, PP_CS8920_ISAINT, irq);
1181	}
1182}
1183
1184/* Open/initialize the board.  This is called (in the current kernel)
1185   sometime after booting when the 'ifconfig' program is run.
1186
1187   This routine should set everything up anew at each open, even
1188   registers that "should" only need to be set once at boot, so that
1189   there is non-reboot way to recover if something goes wrong.
1190   */
1191
1192/* AKPM: do we need to do any locking here? */
1193
1194static int
1195net_open(struct net_device *dev)
1196{
1197	struct net_local *lp = netdev_priv(dev);
1198	int result = 0;
1199	int i;
1200	int ret;
1201
1202	if (dev->irq < 2) {
1203		/* Allow interrupts to be generated by the chip */
1204/* Cirrus' release had this: */
1205#if 0
1206		writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1207#endif
1208/* And 2.3.47 had this: */
1209		writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1210
1211		for (i = 2; i < CS8920_NO_INTS; i++) {
1212			if ((1 << i) & lp->irq_map) {
1213				if (request_irq(i, net_interrupt, 0, dev->name, dev) == 0) {
1214					dev->irq = i;
1215					write_irq(dev, lp->chip_type, i);
1216					/* writereg(dev, PP_BufCFG, GENERATE_SW_INTERRUPT); */
1217					break;
1218				}
1219			}
1220		}
1221
1222		if (i >= CS8920_NO_INTS) {
1223			writereg(dev, PP_BusCTL, 0);	/* disable interrupts. */
1224			printk(KERN_ERR "cs89x0: can't get an interrupt\n");
1225			ret = -EAGAIN;
1226			goto bad_out;
1227		}
1228	}
1229	else
1230	{
1231#ifndef CONFIG_CS89x0_NONISA_IRQ
1232		if (((1 << dev->irq) & lp->irq_map) == 0) {
1233			printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
1234                               dev->name, dev->irq, lp->irq_map);
1235			ret = -EAGAIN;
1236			goto bad_out;
1237		}
1238#endif
1239/* FIXME: Cirrus' release had this: */
1240		writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1241/* And 2.3.47 had this: */
1242#if 0
1243		writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1244#endif
1245		write_irq(dev, lp->chip_type, dev->irq);
1246		ret = request_irq(dev->irq, net_interrupt, 0, dev->name, dev);
1247		if (ret) {
1248			printk(KERN_ERR "cs89x0: request_irq(%d) failed\n", dev->irq);
1249			goto bad_out;
1250		}
1251	}
1252
1253#if ALLOW_DMA
1254	if (lp->use_dma) {
1255		if (lp->isa_config & ANY_ISA_DMA) {
1256			unsigned long flags;
1257			lp->dma_buff = (unsigned char *)__get_dma_pages(GFP_KERNEL,
1258							get_order(lp->dmasize * 1024));
1259
1260			if (!lp->dma_buff) {
1261				printk(KERN_ERR "%s: cannot get %dK memory for DMA\n", dev->name, lp->dmasize);
1262				goto release_irq;
1263			}
1264			if (net_debug > 1) {
1265				printk(	"%s: dma %lx %lx\n",
1266					dev->name,
1267					(unsigned long)lp->dma_buff,
1268					(unsigned long)isa_virt_to_bus(lp->dma_buff));
1269			}
1270			if ((unsigned long) lp->dma_buff >= MAX_DMA_ADDRESS ||
1271			    !dma_page_eq(lp->dma_buff, lp->dma_buff+lp->dmasize*1024-1)) {
1272				printk(KERN_ERR "%s: not usable as DMA buffer\n", dev->name);
1273				goto release_irq;
1274			}
1275			memset(lp->dma_buff, 0, lp->dmasize * 1024);	/* Why? */
1276			if (request_dma(dev->dma, dev->name)) {
1277				printk(KERN_ERR "%s: cannot get dma channel %d\n", dev->name, dev->dma);
1278				goto release_irq;
1279			}
1280			write_dma(dev, lp->chip_type, dev->dma);
1281			lp->rx_dma_ptr = lp->dma_buff;
1282			lp->end_dma_buff = lp->dma_buff + lp->dmasize*1024;
1283			spin_lock_irqsave(&lp->lock, flags);
1284			disable_dma(dev->dma);
1285			clear_dma_ff(dev->dma);
1286			set_dma_mode(dev->dma, DMA_RX_MODE); /* auto_init as well */
1287			set_dma_addr(dev->dma, isa_virt_to_bus(lp->dma_buff));
1288			set_dma_count(dev->dma, lp->dmasize*1024);
1289			enable_dma(dev->dma);
1290			spin_unlock_irqrestore(&lp->lock, flags);
1291		}
1292	}
1293#endif	/* ALLOW_DMA */
1294
1295	/* set the Ethernet address */
1296	for (i=0; i < ETH_ALEN/2; i++)
1297		writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1298
1299	/* while we're testing the interface, leave interrupts disabled */
1300	writereg(dev, PP_BusCTL, MEMORY_ON);
1301
1302	/* Set the LineCTL quintuplet based on adapter configuration read from EEPROM */
1303	if ((lp->adapter_cnf & A_CNF_EXTND_10B_2) && (lp->adapter_cnf & A_CNF_LOW_RX_SQUELCH))
1304                lp->linectl = LOW_RX_SQUELCH;
1305	else
1306                lp->linectl = 0;
1307
1308        /* check to make sure that they have the "right" hardware available */
1309	switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1310	case A_CNF_MEDIA_10B_T: result = lp->adapter_cnf & A_CNF_10B_T; break;
1311	case A_CNF_MEDIA_AUI:   result = lp->adapter_cnf & A_CNF_AUI; break;
1312	case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;
1313        default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);
1314        }
1315        if (!result) {
1316                printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name);
1317release_dma:
1318#if ALLOW_DMA
1319		free_dma(dev->dma);
1320release_irq:
1321		release_dma_buff(lp);
1322#endif
1323                writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) & ~(SERIAL_TX_ON | SERIAL_RX_ON));
1324                free_irq(dev->irq, dev);
1325		ret = -EAGAIN;
1326		goto bad_out;
1327	}
1328
1329        /* set the hardware to the configured choice */
1330	switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1331	case A_CNF_MEDIA_10B_T:
1332                result = detect_tp(dev);
1333                if (result==DETECTED_NONE) {
1334                        printk(KERN_WARNING "%s: 10Base-T (RJ-45) has no cable\n", dev->name);
1335                        if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1336                                result = DETECTED_RJ45H; /* Yes! I don't care if I see a link pulse */
1337                }
1338		break;
1339	case A_CNF_MEDIA_AUI:
1340                result = detect_aui(dev);
1341                if (result==DETECTED_NONE) {
1342                        printk(KERN_WARNING "%s: 10Base-5 (AUI) has no cable\n", dev->name);
1343                        if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1344                                result = DETECTED_AUI; /* Yes! I don't care if I see a carrrier */
1345                }
1346		break;
1347	case A_CNF_MEDIA_10B_2:
1348                result = detect_bnc(dev);
1349                if (result==DETECTED_NONE) {
1350                        printk(KERN_WARNING "%s: 10Base-2 (BNC) has no cable\n", dev->name);
1351                        if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1352                                result = DETECTED_BNC; /* Yes! I don't care if I can xmit a packet */
1353                }
1354		break;
1355	case A_CNF_MEDIA_AUTO:
1356		writereg(dev, PP_LineCTL, lp->linectl | AUTO_AUI_10BASET);
1357		if (lp->adapter_cnf & A_CNF_10B_T)
1358			if ((result = detect_tp(dev)) != DETECTED_NONE)
1359				break;
1360		if (lp->adapter_cnf & A_CNF_AUI)
1361			if ((result = detect_aui(dev)) != DETECTED_NONE)
1362				break;
1363		if (lp->adapter_cnf & A_CNF_10B_2)
1364			if ((result = detect_bnc(dev)) != DETECTED_NONE)
1365				break;
1366		printk(KERN_ERR "%s: no media detected\n", dev->name);
1367		goto release_dma;
1368	}
1369	switch(result) {
1370	case DETECTED_NONE:
1371		printk(KERN_ERR "%s: no network cable attached to configured media\n", dev->name);
1372		goto release_dma;
1373	case DETECTED_RJ45H:
1374		printk(KERN_INFO "%s: using half-duplex 10Base-T (RJ-45)\n", dev->name);
1375		break;
1376	case DETECTED_RJ45F:
1377		printk(KERN_INFO "%s: using full-duplex 10Base-T (RJ-45)\n", dev->name);
1378		break;
1379	case DETECTED_AUI:
1380		printk(KERN_INFO "%s: using 10Base-5 (AUI)\n", dev->name);
1381		break;
1382	case DETECTED_BNC:
1383		printk(KERN_INFO "%s: using 10Base-2 (BNC)\n", dev->name);
1384		break;
1385	}
1386
1387	/* Turn on both receive and transmit operations */
1388	writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
1389
1390	/* Receive only error free packets addressed to this card */
1391	lp->rx_mode = 0;
1392	writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
1393
1394	lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
1395
1396	if (lp->isa_config & STREAM_TRANSFER)
1397		lp->curr_rx_cfg |= RX_STREAM_ENBL;
1398#if ALLOW_DMA
1399	set_dma_cfg(dev);
1400#endif
1401	writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
1402
1403	writereg(dev, PP_TxCFG, TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |
1404		TX_LATE_COL_ENBL | TX_JBR_ENBL | TX_ANY_COL_ENBL | TX_16_COL_ENBL);
1405
1406	writereg(dev, PP_BufCFG, READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |
1407#if ALLOW_DMA
1408		dma_bufcfg(dev) |
1409#endif
1410		TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL);
1411
1412	/* now that we've got our act together, enable everything */
1413	writereg(dev, PP_BusCTL, ENABLE_IRQ
1414		 | (dev->mem_start?MEMORY_ON : 0) /* turn memory on */
1415#if ALLOW_DMA
1416		 | dma_busctl(dev)
1417#endif
1418                 );
1419        netif_start_queue(dev);
1420	if (net_debug > 1)
1421		printk("cs89x0: net_open() succeeded\n");
1422	return 0;
1423bad_out:
1424	return ret;
1425}
1426
1427static void net_timeout(struct net_device *dev)
1428{
1429	/* If we get here, some higher level has decided we are broken.
1430	   There should really be a "kick me" function call instead. */
1431	if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
1432		   tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
1433	/* Try to restart the adaptor. */
1434	netif_wake_queue(dev);
1435}
1436
1437static netdev_tx_t net_send_packet(struct sk_buff *skb,struct net_device *dev)
1438{
1439	struct net_local *lp = netdev_priv(dev);
1440	unsigned long flags;
1441
1442	if (net_debug > 3) {
1443		printk("%s: sent %d byte packet of type %x\n",
1444			dev->name, skb->len,
1445			(skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1446	}
1447
1448	/* keep the upload from being interrupted, since we
1449                  ask the chip to start transmitting before the
1450                  whole packet has been completely uploaded. */
1451
1452	spin_lock_irqsave(&lp->lock, flags);
1453	netif_stop_queue(dev);
1454
1455	/* initiate a transmit sequence */
1456	writeword(dev->base_addr, TX_CMD_PORT, lp->send_cmd);
1457	writeword(dev->base_addr, TX_LEN_PORT, skb->len);
1458
1459	/* Test to see if the chip has allocated memory for the packet */
1460	if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
1461		/*
1462		 * Gasp!  It hasn't.  But that shouldn't happen since
1463		 * we're waiting for TxOk, so return 1 and requeue this packet.
1464		 */
1465
1466		spin_unlock_irqrestore(&lp->lock, flags);
1467		if (net_debug) printk("cs89x0: Tx buffer not free!\n");
1468		return NETDEV_TX_BUSY;
1469	}
1470	/* Write the contents of the packet */
1471	writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
1472	spin_unlock_irqrestore(&lp->lock, flags);
1473	dev->stats.tx_bytes += skb->len;
1474	dev_kfree_skb (skb);
1475
1476	/*
1477	 * We DO NOT call netif_wake_queue() here.
1478	 * We also DO NOT call netif_start_queue().
1479	 *
1480	 * Either of these would cause another bottom half run through
1481	 * net_send_packet() before this packet has fully gone out.  That causes
1482	 * us to hit the "Gasp!" above and the send is rescheduled.  it runs like
1483	 * a dog.  We just return and wait for the Tx completion interrupt handler
1484	 * to restart the netdevice layer
1485	 */
1486
1487	return NETDEV_TX_OK;
1488}
1489
1490/* The typical workload of the driver:
1491   Handle the network interface interrupts. */
1492
1493static irqreturn_t net_interrupt(int irq, void *dev_id)
1494{
1495	struct net_device *dev = dev_id;
1496	struct net_local *lp;
1497	int ioaddr, status;
1498 	int handled = 0;
1499
1500	ioaddr = dev->base_addr;
1501	lp = netdev_priv(dev);
1502
1503	/* we MUST read all the events out of the ISQ, otherwise we'll never
1504           get interrupted again.  As a consequence, we can't have any limit
1505           on the number of times we loop in the interrupt handler.  The
1506           hardware guarantees that eventually we'll run out of events.  Of
1507           course, if you're on a slow machine, and packets are arriving
1508           faster than you can read them off, you're screwed.  Hasta la
1509           vista, baby!  */
1510	while ((status = readword(dev->base_addr, ISQ_PORT))) {
1511		if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status);
1512		handled = 1;
1513		switch(status & ISQ_EVENT_MASK) {
1514		case ISQ_RECEIVER_EVENT:
1515			/* Got a packet(s). */
1516			net_rx(dev);
1517			break;
1518		case ISQ_TRANSMITTER_EVENT:
1519			dev->stats.tx_packets++;
1520			netif_wake_queue(dev);	/* Inform upper layers. */
1521			if ((status & (	TX_OK |
1522					TX_LOST_CRS |
1523					TX_SQE_ERROR |
1524					TX_LATE_COL |
1525					TX_16_COL)) != TX_OK) {
1526				if ((status & TX_OK) == 0)
1527					dev->stats.tx_errors++;
1528				if (status & TX_LOST_CRS)
1529					dev->stats.tx_carrier_errors++;
1530				if (status & TX_SQE_ERROR)
1531					dev->stats.tx_heartbeat_errors++;
1532				if (status & TX_LATE_COL)
1533					dev->stats.tx_window_errors++;
1534				if (status & TX_16_COL)
1535					dev->stats.tx_aborted_errors++;
1536			}
1537			break;
1538		case ISQ_BUFFER_EVENT:
1539			if (status & READY_FOR_TX) {
1540				/* we tried to transmit a packet earlier,
1541                                   but inexplicably ran out of buffers.
1542                                   That shouldn't happen since we only ever
1543                                   load one packet.  Shrug.  Do the right
1544                                   thing anyway. */
1545				netif_wake_queue(dev);	/* Inform upper layers. */
1546			}
1547			if (status & TX_UNDERRUN) {
1548				if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);
1549                                lp->send_underrun++;
1550                                if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
1551                                else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
1552				/* transmit cycle is done, although
1553				   frame wasn't transmitted - this
1554				   avoids having to wait for the upper
1555				   layers to timeout on us, in the
1556				   event of a tx underrun */
1557				netif_wake_queue(dev);	/* Inform upper layers. */
1558                        }
1559#if ALLOW_DMA
1560			if (lp->use_dma && (status & RX_DMA)) {
1561				int count = readreg(dev, PP_DmaFrameCnt);
1562				while(count) {
1563					if (net_debug > 5)
1564						printk("%s: receiving %d DMA frames\n", dev->name, count);
1565					if (net_debug > 2 && count >1)
1566						printk("%s: receiving %d DMA frames\n", dev->name, count);
1567					dma_rx(dev);
1568					if (--count == 0)
1569						count = readreg(dev, PP_DmaFrameCnt);
1570					if (net_debug > 2 && count > 0)
1571						printk("%s: continuing with %d DMA frames\n", dev->name, count);
1572				}
1573			}
1574#endif
1575			break;
1576		case ISQ_RX_MISS_EVENT:
1577			dev->stats.rx_missed_errors += (status >> 6);
1578			break;
1579		case ISQ_TX_COL_EVENT:
1580			dev->stats.collisions += (status >> 6);
1581			break;
1582		}
1583	}
1584	return IRQ_RETVAL(handled);
1585}
1586
1587static void
1588count_rx_errors(int status, struct net_device *dev)
1589{
1590	dev->stats.rx_errors++;
1591	if (status & RX_RUNT)
1592		dev->stats.rx_length_errors++;
1593	if (status & RX_EXTRA_DATA)
1594		dev->stats.rx_length_errors++;
1595	if ((status & RX_CRC_ERROR) && !(status & (RX_EXTRA_DATA|RX_RUNT)))
1596		/* per str 172 */
1597		dev->stats.rx_crc_errors++;
1598	if (status & RX_DRIBBLE)
1599		dev->stats.rx_frame_errors++;
1600}
1601
1602/* We have a good packet(s), get it/them out of the buffers. */
1603static void
1604net_rx(struct net_device *dev)
1605{
1606	struct sk_buff *skb;
1607	int status, length;
1608
1609	int ioaddr = dev->base_addr;
1610	status = readword(ioaddr, RX_FRAME_PORT);
1611	length = readword(ioaddr, RX_FRAME_PORT);
1612
1613	if ((status & RX_OK) == 0) {
1614		count_rx_errors(status, dev);
1615		return;
1616	}
1617
1618	/* Malloc up new buffer. */
1619	skb = dev_alloc_skb(length + 2);
1620	if (skb == NULL) {
1621#if 0		/* Again, this seems a cruel thing to do */
1622		printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1623#endif
1624		dev->stats.rx_dropped++;
1625		return;
1626	}
1627	skb_reserve(skb, 2);	/* longword align L3 header */
1628
1629	readwords(ioaddr, RX_FRAME_PORT, skb_put(skb, length), length >> 1);
1630	if (length & 1)
1631		skb->data[length-1] = readword(ioaddr, RX_FRAME_PORT);
1632
1633	if (net_debug > 3) {
1634		printk(	"%s: received %d byte packet of type %x\n",
1635			dev->name, length,
1636			(skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1637	}
1638
1639        skb->protocol=eth_type_trans(skb,dev);
1640	netif_rx(skb);
1641	dev->stats.rx_packets++;
1642	dev->stats.rx_bytes += length;
1643}
1644
1645#if ALLOW_DMA
1646static void release_dma_buff(struct net_local *lp)
1647{
1648	if (lp->dma_buff) {
1649		free_pages((unsigned long)(lp->dma_buff), get_order(lp->dmasize * 1024));
1650		lp->dma_buff = NULL;
1651	}
1652}
1653#endif
1654
1655/* The inverse routine to net_open(). */
1656static int
1657net_close(struct net_device *dev)
1658{
1659#if ALLOW_DMA
1660	struct net_local *lp = netdev_priv(dev);
1661#endif
1662
1663	netif_stop_queue(dev);
1664
1665	writereg(dev, PP_RxCFG, 0);
1666	writereg(dev, PP_TxCFG, 0);
1667	writereg(dev, PP_BufCFG, 0);
1668	writereg(dev, PP_BusCTL, 0);
1669
1670	free_irq(dev->irq, dev);
1671
1672#if ALLOW_DMA
1673	if (lp->use_dma && lp->dma) {
1674		free_dma(dev->dma);
1675		release_dma_buff(lp);
1676	}
1677#endif
1678
1679	/* Update the statistics here. */
1680	return 0;
1681}
1682
1683/* Get the current statistics.	This may be called with the card open or
1684   closed. */
1685static struct net_device_stats *
1686net_get_stats(struct net_device *dev)
1687{
1688	struct net_local *lp = netdev_priv(dev);
1689	unsigned long flags;
1690
1691	spin_lock_irqsave(&lp->lock, flags);
1692	/* Update the statistics from the device registers. */
1693	dev->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
1694	dev->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
1695	spin_unlock_irqrestore(&lp->lock, flags);
1696
1697	return &dev->stats;
1698}
1699
1700static void set_multicast_list(struct net_device *dev)
1701{
1702	struct net_local *lp = netdev_priv(dev);
1703	unsigned long flags;
1704
1705	spin_lock_irqsave(&lp->lock, flags);
1706	if(dev->flags&IFF_PROMISC)
1707	{
1708		lp->rx_mode = RX_ALL_ACCEPT;
1709	}
1710	else if ((dev->flags & IFF_ALLMULTI) || !netdev_mc_empty(dev))
1711	{
1712		/* The multicast-accept list is initialized to accept-all, and we
1713		   rely on higher-level filtering for now. */
1714		lp->rx_mode = RX_MULTCAST_ACCEPT;
1715	}
1716	else
1717		lp->rx_mode = 0;
1718
1719	writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
1720
1721	/* in promiscuous mode, we accept errored packets, so we have to enable interrupts on them also */
1722	writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
1723	     (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
1724	spin_unlock_irqrestore(&lp->lock, flags);
1725}
1726
1727
1728static int set_mac_address(struct net_device *dev, void *p)
1729{
1730	int i;
1731	struct sockaddr *addr = p;
1732
1733	if (netif_running(dev))
1734		return -EBUSY;
1735
1736	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1737
1738	if (net_debug)
1739		printk("%s: Setting MAC address to %pM.\n",
1740		       dev->name, dev->dev_addr);
1741
1742	/* set the Ethernet address */
1743	for (i=0; i < ETH_ALEN/2; i++)
1744		writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1745
1746	return 0;
1747}
1748
1749#ifdef MODULE
1750
1751static struct net_device *dev_cs89x0;
1752
1753/*
1754 * Support the 'debug' module parm even if we're compiled for non-debug to
1755 * avoid breaking someone's startup scripts
1756 */
1757
1758static int io;
1759static int irq;
1760static int debug;
1761static char media[8];
1762static int duplex=-1;
1763
1764static int use_dma;			/* These generate unused var warnings if ALLOW_DMA = 0 */
1765static int dma;
1766static int dmasize=16;			/* or 64 */
1767
1768module_param(io, int, 0);
1769module_param(irq, int, 0);
1770module_param(debug, int, 0);
1771module_param_string(media, media, sizeof(media), 0);
1772module_param(duplex, int, 0);
1773module_param(dma , int, 0);
1774module_param(dmasize , int, 0);
1775module_param(use_dma , int, 0);
1776MODULE_PARM_DESC(io, "cs89x0 I/O base address");
1777MODULE_PARM_DESC(irq, "cs89x0 IRQ number");
1778#if DEBUGGING
1779MODULE_PARM_DESC(debug, "cs89x0 debug level (0-6)");
1780#else
1781MODULE_PARM_DESC(debug, "(ignored)");
1782#endif
1783MODULE_PARM_DESC(media, "Set cs89x0 adapter(s) media type(s) (rj45,bnc,aui)");
1784/* No other value than -1 for duplex seems to be currently interpreted */
1785MODULE_PARM_DESC(duplex, "(ignored)");
1786#if ALLOW_DMA
1787MODULE_PARM_DESC(dma , "cs89x0 ISA DMA channel; ignored if use_dma=0");
1788MODULE_PARM_DESC(dmasize , "cs89x0 DMA size in kB (16,64); ignored if use_dma=0");
1789MODULE_PARM_DESC(use_dma , "cs89x0 using DMA (0-1)");
1790#else
1791MODULE_PARM_DESC(dma , "(ignored)");
1792MODULE_PARM_DESC(dmasize , "(ignored)");
1793MODULE_PARM_DESC(use_dma , "(ignored)");
1794#endif
1795
1796MODULE_AUTHOR("Mike Cruse, Russwll Nelson <nelson@crynwr.com>, Andrew Morton");
1797MODULE_LICENSE("GPL");
1798
1799
1800/*
1801* media=t             - specify media type
1802   or media=2
1803   or media=aui
1804   or medai=auto
1805* duplex=0            - specify forced half/full/autonegotiate duplex
1806* debug=#             - debug level
1807
1808
1809* Default Chip Configuration:
1810  * DMA Burst = enabled
1811  * IOCHRDY Enabled = enabled
1812    * UseSA = enabled
1813    * CS8900 defaults to half-duplex if not specified on command-line
1814    * CS8920 defaults to autoneg if not specified on command-line
1815    * Use reset defaults for other config parameters
1816
1817* Assumptions:
1818  * media type specified is supported (circuitry is present)
1819  * if memory address is > 1MB, then required mem decode hw is present
1820  * if 10B-2, then agent other than driver will enable DC/DC converter
1821    (hw or software util)
1822
1823
1824*/
1825
1826int __init init_module(void)
1827{
1828	struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
1829	struct net_local *lp;
1830	int ret = 0;
1831
1832#if DEBUGGING
1833	net_debug = debug;
1834#else
1835	debug = 0;
1836#endif
1837	if (!dev)
1838		return -ENOMEM;
1839
1840	dev->irq = irq;
1841	dev->base_addr = io;
1842	lp = netdev_priv(dev);
1843
1844#if ALLOW_DMA
1845	if (use_dma) {
1846		lp->use_dma = use_dma;
1847		lp->dma = dma;
1848		lp->dmasize = dmasize;
1849	}
1850#endif
1851
1852	spin_lock_init(&lp->lock);
1853
1854        /* boy, they'd better get these right */
1855        if (!strcmp(media, "rj45"))
1856		lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1857	else if (!strcmp(media, "aui"))
1858		lp->adapter_cnf = A_CNF_MEDIA_AUI   | A_CNF_AUI;
1859	else if (!strcmp(media, "bnc"))
1860		lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;
1861	else
1862		lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1863
1864        if (duplex==-1)
1865		lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1866
1867        if (io == 0) {
1868                printk(KERN_ERR "cs89x0.c: Module autoprobing not allowed.\n");
1869                printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n");
1870                ret = -EPERM;
1871		goto out;
1872        } else if (io <= 0x1ff) {
1873		ret = -ENXIO;
1874		goto out;
1875	}
1876
1877#if ALLOW_DMA
1878	if (use_dma && dmasize != 16 && dmasize != 64) {
1879		printk(KERN_ERR "cs89x0.c: dma size must be either 16K or 64K, not %dK\n", dmasize);
1880		ret = -EPERM;
1881		goto out;
1882	}
1883#endif
1884	ret = cs89x0_probe1(dev, io, 1);
1885	if (ret)
1886		goto out;
1887
1888	dev_cs89x0 = dev;
1889	return 0;
1890out:
1891	free_netdev(dev);
1892	return ret;
1893}
1894
1895void __exit
1896cleanup_module(void)
1897{
1898	unregister_netdev(dev_cs89x0);
1899	writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID);
1900	release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
1901	free_netdev(dev_cs89x0);
1902}
1903#endif /* MODULE */
1904
1905/*
1906 * Local variables:
1907 *  version-control: t
1908 *  kept-new-versions: 5
1909 *  c-indent-level: 8
1910 *  tab-width: 8
1911 * End:
1912 *
1913 */