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