linux-old/drivers/net/ni52.c
<<
>>
Prefs
   1/*
   2 * net-3-driver for the NI5210 card (i82586 Ethernet chip)
   3 *
   4 * This is an extension to the Linux operating system, and is covered by the
   5 * same GNU General Public License that covers that work.
   6 *
   7 * Alphacode 0.82 (96/09/29) for Linux 2.0.0 (or later)
   8 * Copyrights (c) 1994,1995,1996 by M.Hipp (hippm@informatik.uni-tuebingen.de)
   9 *    [feel free to mail ....]
  10 *
  11 * when using as module: (no autoprobing!)
  12 *   compile with:
  13 *       gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ -DMODULE -c ni52.c
  14 *   run with e.g:
  15 *       insmod ni52.o io=0x360 irq=9 memstart=0xd0000 memend=0xd4000
  16 *
  17 * CAN YOU PLEASE REPORT ME YOUR PERFORMANCE EXPERIENCES !!.
  18 *
  19 * If you find a bug, please report me:
  20 *   The kernel panic output and any kmsg from the ni52 driver
  21 *   the ni5210-driver-version and the linux-kernel version
  22 *   how many shared memory (memsize) on the netcard,
  23 *   bootprom: yes/no, base_addr, mem_start
  24 *   maybe the ni5210-card revision and the i82586 version
  25 *
  26 * autoprobe for: base_addr: 0x300,0x280,0x360,0x320,0x340
  27 *                mem_start: 0xd0000,0xd2000,0xc8000,0xca000,0xd4000,0xd6000,
  28 *                           0xd8000,0xcc000,0xce000,0xda000,0xdc000
  29 *
  30 * sources:
  31 *   skeleton.c from Donald Becker
  32 *
  33 * I have also done a look in the following sources: (mail me if you need them)
  34 *   crynwr-packet-driver by Russ Nelson
  35 *   Garret A. Wollman's (fourth) i82586-driver for BSD
  36 *   (before getting an i82596 (yes 596 not 586) manual, the existing drivers helped
  37 *    me a lot to understand this tricky chip.)
  38 *
  39 * Known Problems:
  40 *   The internal sysbus seems to be slow. So we often lose packets because of
  41 *   overruns while receiving from a fast remote host.
  42 *   This can slow down TCP connections. Maybe the newer ni5210 cards are better.
  43 *   my experience is, that if a machine sends with more then about 500-600K/s
  44 *   the fifo/sysbus overflows.
  45 *
  46 * IMPORTANT NOTE:
  47 *   On fast networks, it's a (very) good idea to have 16K shared memory. With
  48 *   8K, we can store only 4 receive frames, so it can (easily) happen that a remote
  49 *   machine 'overruns' our system.
  50 *
  51 * Known i82586/card problems (I'm sure, there are many more!):
  52 *   Running the NOP-mode, the i82586 sometimes seems to forget to report
  53 *   every xmit-interrupt until we restart the CU.
  54 *   Another MAJOR bug is, that the RU sometimes seems to ignore the EL-Bit
  55 *   in the RBD-Struct which indicates an end of the RBD queue.
  56 *   Instead, the RU fetches another (randomly selected and
  57 *   usually used) RBD and begins to fill it. (Maybe, this happens only if
  58 *   the last buffer from the previous RFD fits exact into the queue and
  59 *   the next RFD can't fetch an initial RBD. Anyone knows more? )
  60 *
  61 * results from ftp performance tests with Linux 1.2.5
  62 *   send and receive about 350-400 KByte/s (peak up to 460 kbytes/s)
  63 *   sending in NOP-mode: peak performance up to 530K/s (but better don't run this mode)
  64 */
  65
  66/*
  67 * 29.Sept.96: virt_to_bus changes for new memory scheme
  68 * 19.Feb.96: more Mcast changes, module support (MH)
  69 *
  70 * 18.Nov.95: Mcast changes (AC).
  71 *
  72 * 23.April.95: fixed(?) receiving problems by configuring a RFD more
  73 *              than the number of RBD's. Can maybe cause other problems.
  74 * 18.April.95: Added MODULE support (MH)
  75 * 17.April.95: MC related changes in init586() and set_multicast_list().
  76 *              removed use of 'jiffies' in init586() (MH)
  77 *
  78 * 19.Sep.94: Added Multicast support (not tested yet) (MH)
  79 *
  80 * 18.Sep.94: Workaround for 'EL-Bug'. Removed flexible RBD-handling.
  81 *            Now, every RFD has exact one RBD. (MH)
  82 *
  83 * 14.Sep.94: added promiscuous mode, a few cleanups (MH)
  84 *
  85 * 19.Aug.94: changed request_irq() parameter (MH)
  86 *
  87 * 20.July.94: removed cleanup bugs, removed a 16K-mem-probe-bug (MH)
  88 *
  89 * 19.July.94: lotsa cleanups .. (MH)
  90 *
  91 * 17.July.94: some patches ... verified to run with 1.1.29 (MH)
  92 *
  93 * 4.July.94: patches for Linux 1.1.24  (MH)
  94 *
  95 * 26.March.94: patches for Linux 1.0 and iomem-auto-probe (MH)
  96 *
  97 * 30.Sep.93: Added nop-chain .. driver now runs with only one Xmit-Buff, too (MH)
  98 *
  99 * < 30.Sep.93: first versions
 100 */
 101
 102static int debuglevel;  /* debug-printk 0: off 1: a few 2: more */
 103static int automatic_resume; /* experimental .. better should be zero */
 104static int rfdadd;      /* rfdadd=1 may be better for 8K MEM cards */
 105static int fifo=0x8;    /* don't change */
 106
 107/* #define REALLY_SLOW_IO */
 108
 109#include <linux/module.h>
 110#include <linux/kernel.h>
 111#include <linux/string.h>
 112#include <linux/errno.h>
 113#include <linux/ioport.h>
 114#include <linux/slab.h>
 115#include <linux/interrupt.h>
 116#include <linux/delay.h>
 117#include <linux/init.h>
 118#include <asm/bitops.h>
 119#include <asm/io.h>
 120
 121#include <linux/netdevice.h>
 122#include <linux/etherdevice.h>
 123#include <linux/skbuff.h>
 124
 125#include "ni52.h"
 126
 127#define DEBUG       /* debug on */
 128#define SYSBUSVAL 1 /* 8 Bit */
 129
 130#define ni_attn586()  {outb(0,dev->base_addr+NI52_ATTENTION);}
 131#define ni_reset586() {outb(0,dev->base_addr+NI52_RESET);}
 132#define ni_disint()   {outb(0,dev->base_addr+NI52_INTDIS);}
 133#define ni_enaint()   {outb(0,dev->base_addr+NI52_INTENA);}
 134
 135#define make32(ptr16) (p->memtop + (short) (ptr16) )
 136#define make24(ptr32) ( ((char *) (ptr32)) - p->base)
 137#define make16(ptr32) ((unsigned short) ((unsigned long)(ptr32) - (unsigned long) p->memtop ))
 138
 139/******************* how to calculate the buffers *****************************
 140
 141  * IMPORTANT NOTE: if you configure only one NUM_XMIT_BUFFS, the driver works
 142  * --------------- in a different (more stable?) mode. Only in this mode it's
 143  *                 possible to configure the driver with 'NO_NOPCOMMANDS'
 144
 145sizeof(scp)=12; sizeof(scb)=16; sizeof(iscp)=8;
 146sizeof(scp)+sizeof(iscp)+sizeof(scb) = 36 = INIT
 147sizeof(rfd) = 24; sizeof(rbd) = 12;
 148sizeof(tbd) = 8; sizeof(transmit_cmd) = 16;
 149sizeof(nop_cmd) = 8;
 150
 151  * if you don't know the driver, better do not change these values: */
 152
 153#define RECV_BUFF_SIZE 1524 /* slightly oversized */
 154#define XMIT_BUFF_SIZE 1524 /* slightly oversized */
 155#define NUM_XMIT_BUFFS 1    /* config for both, 8K and 16K shmem */
 156#define NUM_RECV_BUFFS_8  4 /* config for 8K shared mem */
 157#define NUM_RECV_BUFFS_16 9 /* config for 16K shared mem */
 158#define NO_NOPCOMMANDS      /* only possible with NUM_XMIT_BUFFS=1 */
 159
 160/**************************************************************************/
 161
 162/* different DELAYs */
 163#define DELAY(x) mdelay(32 * x);
 164#define DELAY_16(); { udelay(16); }
 165#define DELAY_18(); { udelay(4); }
 166
 167/* wait for command with timeout: */
 168#define WAIT_4_SCB_CMD() \
 169{ int i; \
 170  for(i=0;i<16384;i++) { \
 171    if(!p->scb->cmd_cuc) break; \
 172    DELAY_18(); \
 173    if(i == 16383) { \
 174      printk("%s: scb_cmd timed out: %04x,%04x .. disabling i82586!!\n",dev->name,p->scb->cmd_cuc,p->scb->cus); \
 175       if(!p->reseted) { p->reseted = 1; ni_reset586(); } } } }
 176
 177#define WAIT_4_SCB_CMD_RUC() { int i; \
 178  for(i=0;i<16384;i++) { \
 179    if(!p->scb->cmd_ruc) break; \
 180    DELAY_18(); \
 181    if(i == 16383) { \
 182      printk("%s: scb_cmd (ruc) timed out: %04x,%04x .. disabling i82586!!\n",dev->name,p->scb->cmd_ruc,p->scb->rus); \
 183       if(!p->reseted) { p->reseted = 1; ni_reset586(); } } } }
 184
 185#define WAIT_4_STAT_COMPL(addr) { int i; \
 186   for(i=0;i<32767;i++) { \
 187     if((addr)->cmd_status & STAT_COMPL) break; \
 188     DELAY_16(); DELAY_16(); } }
 189
 190#define NI52_TOTAL_SIZE 16
 191#define NI52_ADDR0 0x02
 192#define NI52_ADDR1 0x07
 193#define NI52_ADDR2 0x01
 194
 195static int     ni52_probe1(struct net_device *dev,int ioaddr);
 196static void    ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr);
 197static int     ni52_open(struct net_device *dev);
 198static int     ni52_close(struct net_device *dev);
 199static int     ni52_send_packet(struct sk_buff *,struct net_device *);
 200static struct  net_device_stats *ni52_get_stats(struct net_device *dev);
 201static void    set_multicast_list(struct net_device *dev);
 202static void    ni52_timeout(struct net_device *dev);
 203#if 0
 204static void    ni52_dump(struct net_device *,void *);
 205#endif
 206
 207/* helper-functions */
 208static int     init586(struct net_device *dev);
 209static int     check586(struct net_device *dev,char *where,unsigned size);
 210static void    alloc586(struct net_device *dev);
 211static void    startrecv586(struct net_device *dev);
 212static void   *alloc_rfa(struct net_device *dev,void *ptr);
 213static void    ni52_rcv_int(struct net_device *dev);
 214static void    ni52_xmt_int(struct net_device *dev);
 215static void    ni52_rnr_int(struct net_device *dev);
 216
 217struct priv
 218{
 219        struct net_device_stats stats;
 220        unsigned long base;
 221        char *memtop;
 222        long int lock;
 223        int reseted;
 224        volatile struct rfd_struct      *rfd_last,*rfd_top,*rfd_first;
 225        volatile struct scp_struct      *scp;   /* volatile is important */
 226        volatile struct iscp_struct     *iscp;  /* volatile is important */
 227        volatile struct scb_struct      *scb;   /* volatile is important */
 228        volatile struct tbd_struct      *xmit_buffs[NUM_XMIT_BUFFS];
 229        volatile struct transmit_cmd_struct *xmit_cmds[NUM_XMIT_BUFFS];
 230#if (NUM_XMIT_BUFFS == 1)
 231        volatile struct nop_cmd_struct *nop_cmds[2];
 232#else
 233        volatile struct nop_cmd_struct *nop_cmds[NUM_XMIT_BUFFS];
 234#endif
 235        volatile int            nop_point,num_recv_buffs;
 236        volatile char           *xmit_cbuffs[NUM_XMIT_BUFFS];
 237        volatile int            xmit_count,xmit_last;
 238};
 239
 240/**********************************************
 241 * close device
 242 */
 243static int ni52_close(struct net_device *dev)
 244{
 245        free_irq(dev->irq, dev);
 246
 247        ni_reset586(); /* the hard way to stop the receiver */
 248
 249        netif_stop_queue(dev);
 250
 251        return 0;
 252}
 253
 254/**********************************************
 255 * open device
 256 */
 257static int ni52_open(struct net_device *dev)
 258{
 259        int ret;
 260
 261        ni_disint();
 262        alloc586(dev);
 263        init586(dev);
 264        startrecv586(dev);
 265        ni_enaint();
 266
 267        ret = request_irq(dev->irq, &ni52_interrupt,0,dev->name,dev);
 268        if (ret)
 269        {
 270                ni_reset586();
 271                return ret;
 272        }
 273
 274        netif_start_queue(dev);
 275
 276        return 0; /* most done by init */
 277}
 278
 279/**********************************************
 280 * Check to see if there's an 82586 out there.
 281 */
 282static int check586(struct net_device *dev,char *where,unsigned size)
 283{
 284        struct priv pb;
 285        struct priv *p = /* (struct priv *) dev->priv*/ &pb;
 286        char *iscp_addrs[2];
 287        int i;
 288
 289        p->base = (unsigned long) bus_to_virt((unsigned long)where) + size - 0x01000000;
 290        p->memtop = bus_to_virt((unsigned long)where) + size;
 291        p->scp = (struct scp_struct *)(p->base + SCP_DEFAULT_ADDRESS);
 292        memset((char *)p->scp,0, sizeof(struct scp_struct));
 293        for(i=0;i<sizeof(struct scp_struct);i++) /* memory was writeable? */
 294                if(((char *)p->scp)[i])
 295                        return 0;
 296        p->scp->sysbus = SYSBUSVAL;                             /* 1 = 8Bit-Bus, 0 = 16 Bit */
 297        if(p->scp->sysbus != SYSBUSVAL)
 298                return 0;
 299
 300        iscp_addrs[0] = bus_to_virt((unsigned long)where);
 301        iscp_addrs[1]= (char *) p->scp - sizeof(struct iscp_struct);
 302
 303        for(i=0;i<2;i++)
 304        {
 305                p->iscp = (struct iscp_struct *) iscp_addrs[i];
 306                memset((char *)p->iscp,0, sizeof(struct iscp_struct));
 307
 308                p->scp->iscp = make24(p->iscp);
 309                p->iscp->busy = 1;
 310
 311                ni_reset586();
 312                ni_attn586();
 313                DELAY(1);       /* wait a while... */
 314
 315                if(p->iscp->busy) /* i82586 clears 'busy' after successful init */
 316                        return 0;
 317        }
 318        return 1;
 319}
 320
 321/******************************************************************
 322 * set iscp at the right place, called by ni52_probe1 and open586.
 323 */
 324static void alloc586(struct net_device *dev)
 325{
 326        struct priv *p =        (struct priv *) dev->priv;
 327
 328        ni_reset586();
 329        DELAY(1);
 330
 331        p->scp  = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS);
 332        p->scb  = (struct scb_struct *) bus_to_virt(dev->mem_start);
 333        p->iscp = (struct iscp_struct *) ((char *)p->scp - sizeof(struct iscp_struct));
 334
 335        memset((char *) p->iscp,0,sizeof(struct iscp_struct));
 336        memset((char *) p->scp ,0,sizeof(struct scp_struct));
 337
 338        p->scp->iscp = make24(p->iscp);
 339        p->scp->sysbus = SYSBUSVAL;
 340        p->iscp->scb_offset = make16(p->scb);
 341
 342        p->iscp->busy = 1;
 343        ni_reset586();
 344        ni_attn586();
 345
 346        DELAY(1);
 347
 348        if(p->iscp->busy)
 349                printk("%s: Init-Problems (alloc).\n",dev->name);
 350
 351        p->reseted = 0;
 352
 353        memset((char *)p->scb,0,sizeof(struct scb_struct));
 354}
 355
 356/**********************************************
 357 * probe the ni5210-card
 358 */
 359int __init ni52_probe(struct net_device *dev)
 360{
 361#ifndef MODULE
 362        int *port;
 363        static int ports[] = {0x300, 0x280, 0x360 , 0x320 , 0x340, 0};
 364#endif
 365        int base_addr = dev->base_addr;
 366
 367        SET_MODULE_OWNER(dev);
 368
 369        if (base_addr > 0x1ff)          /* Check a single specified location. */
 370                return ni52_probe1(dev, base_addr);
 371        else if (base_addr > 0)         /* Don't probe at all. */
 372                return -ENXIO;
 373
 374#ifdef MODULE
 375        printk("%s: no autoprobing allowed for modules.\n",dev->name);
 376#else
 377        for (port = ports; *port; port++) {
 378                int ioaddr = *port;
 379                dev->base_addr = ioaddr;
 380                if (ni52_probe1(dev, ioaddr) == 0)
 381                        return 0;
 382        }
 383
 384#ifdef FULL_IO_PROBE
 385        for(dev->base_addr=0x200; dev->base_addr<0x400; dev->base_addr+=8)
 386                if (ni52_probe1(dev, dev->base_addr) == 0)
 387                        return 0;
 388#endif
 389
 390#endif
 391
 392        dev->base_addr = base_addr;
 393        return -ENODEV;
 394}
 395
 396static int __init ni52_probe1(struct net_device *dev,int ioaddr)
 397{
 398        int i, size, retval;
 399
 400        if (!request_region(ioaddr, NI52_TOTAL_SIZE, dev->name))
 401                return -EBUSY;
 402
 403        if( !(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) ||
 404            !(inb(ioaddr+NI52_MAGIC2) == NI52_MAGICVAL2)) {
 405                retval = -ENODEV;
 406                goto out;
 407        }
 408
 409        for(i=0;i<ETH_ALEN;i++)
 410                dev->dev_addr[i] = inb(dev->base_addr+i);
 411
 412        if(dev->dev_addr[0] != NI52_ADDR0 || dev->dev_addr[1] != NI52_ADDR1
 413                 || dev->dev_addr[2] != NI52_ADDR2) {
 414                retval = -ENODEV;
 415                goto out;
 416        }
 417
 418        printk("%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr);
 419
 420        /*
 421         * check (or search) IO-Memory, 8K and 16K
 422         */
 423#ifdef MODULE
 424        size = dev->mem_end - dev->mem_start;
 425        if(size != 0x2000 && size != 0x4000) {
 426                printk("\n%s: Illegal memory size %d. Allowed is 0x2000 or 0x4000 bytes.\n",dev->name,size);
 427                retval = -ENODEV;
 428                goto out;
 429        }
 430        if(!check586(dev,(char *) dev->mem_start,size)) {
 431                printk("?memcheck, Can't find memory at 0x%lx with size %d!\n",dev->mem_start,size);
 432                retval = -ENODEV;
 433                goto out;
 434        }
 435#else
 436        if(dev->mem_start != 0) /* no auto-mem-probe */
 437        {
 438                size = 0x4000; /* check for 16K mem */
 439                if(!check586(dev,(char *) dev->mem_start,size)) {
 440                        size = 0x2000; /* check for 8K mem */
 441                        if(!check586(dev,(char *) dev->mem_start,size)) {
 442                                printk("?memprobe, Can't find memory at 0x%lx!\n",dev->mem_start);
 443                                retval = -ENODEV;
 444                                goto out;
 445                        }
 446                }
 447        }
 448        else
 449        {
 450                static long memaddrs[] = { 0xc8000,0xca000,0xcc000,0xce000,0xd0000,0xd2000,
 451                                        0xd4000,0xd6000,0xd8000,0xda000,0xdc000, 0 };
 452                for(i=0;;i++)
 453                {
 454                        if(!memaddrs[i]) {
 455                                printk("?memprobe, Can't find io-memory!\n");
 456                                retval = -ENODEV;
 457                                goto out;
 458                        }
 459                        dev->mem_start = memaddrs[i];
 460                        size = 0x2000; /* check for 8K mem */
 461                        if(check586(dev,(char *)dev->mem_start,size)) /* 8K-check */
 462                                break;
 463                        size = 0x4000; /* check for 16K mem */
 464                        if(check586(dev,(char *)dev->mem_start,size)) /* 16K-check */
 465                                break;
 466                }
 467        }
 468        dev->mem_end = dev->mem_start + size; /* set mem_end showed by 'ifconfig' */
 469#endif
 470
 471        dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL);
 472        if(dev->priv == NULL) {
 473                printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name);
 474                retval = -ENOMEM;
 475                goto out;
 476        }
 477                                                                                                                                        /* warning: we don't free it on errors */
 478        memset((char *) dev->priv,0,sizeof(struct priv));
 479
 480        ((struct priv *) (dev->priv))->memtop = bus_to_virt(dev->mem_start) + size;
 481        ((struct priv *) (dev->priv))->base =   (unsigned long) bus_to_virt(dev->mem_start) + size - 0x01000000;
 482        alloc586(dev);
 483
 484        /* set number of receive-buffs according to memsize */
 485        if(size == 0x2000)
 486                ((struct priv *) dev->priv)->num_recv_buffs = NUM_RECV_BUFFS_8;
 487        else
 488                ((struct priv *) dev->priv)->num_recv_buffs = NUM_RECV_BUFFS_16;
 489
 490        printk("Memaddr: 0x%lx, Memsize: %d, ",dev->mem_start,size);
 491
 492        if(dev->irq < 2)
 493        {
 494                autoirq_setup(0);
 495                ni_reset586();
 496                ni_attn586();
 497                if(!(dev->irq = autoirq_report(2)))
 498                {
 499                        printk("?autoirq, Failed to detect IRQ line!\n");
 500                        kfree(dev->priv);
 501                        dev->priv = NULL;
 502                        retval = -EAGAIN;
 503                        goto out;
 504                }
 505                printk("IRQ %d (autodetected).\n",dev->irq);
 506        }
 507        else    {
 508                if(dev->irq == 2)
 509                        dev->irq = 9;
 510                printk("IRQ %d (assigned and not checked!).\n",dev->irq);
 511        }
 512
 513        dev->open               = ni52_open;
 514        dev->stop               = ni52_close;
 515        dev->get_stats          = ni52_get_stats;
 516        dev->tx_timeout         = ni52_timeout;
 517        dev->watchdog_timeo     = HZ/20;
 518        dev->hard_start_xmit    = ni52_send_packet;
 519        dev->set_multicast_list = set_multicast_list;
 520
 521        dev->if_port            = 0;
 522
 523        ether_setup(dev);
 524
 525        return 0;
 526out:
 527        release_region(ioaddr, NI52_TOTAL_SIZE);
 528        return retval;
 529}
 530
 531/**********************************************
 532 * init the chip (ni52-interrupt should be disabled?!)
 533 * needs a correct 'allocated' memory
 534 */
 535
 536static int init586(struct net_device *dev)
 537{
 538        void *ptr;
 539        int i,result=0;
 540        struct priv *p = (struct priv *) dev->priv;
 541        volatile struct configure_cmd_struct    *cfg_cmd;
 542        volatile struct iasetup_cmd_struct *ias_cmd;
 543        volatile struct tdr_cmd_struct *tdr_cmd;
 544        volatile struct mcsetup_cmd_struct *mc_cmd;
 545        struct dev_mc_list *dmi=dev->mc_list;
 546        int num_addrs=dev->mc_count;
 547
 548        ptr = (void *) ((char *)p->scb + sizeof(struct scb_struct));
 549
 550        cfg_cmd = (struct configure_cmd_struct *)ptr; /* configure-command */
 551        cfg_cmd->cmd_status     = 0;
 552        cfg_cmd->cmd_cmd        = CMD_CONFIGURE | CMD_LAST;
 553        cfg_cmd->cmd_link       = 0xffff;
 554
 555        cfg_cmd->byte_cnt       = 0x0a; /* number of cfg bytes */
 556        cfg_cmd->fifo           = fifo; /* fifo-limit (8=tx:32/rx:64) */
 557        cfg_cmd->sav_bf         = 0x40; /* hold or discard bad recv frames (bit 7) */
 558        cfg_cmd->adr_len        = 0x2e; /* addr_len |!src_insert |pre-len |loopback */
 559        cfg_cmd->priority       = 0x00;
 560        cfg_cmd->ifs            = 0x60;
 561        cfg_cmd->time_low       = 0x00;
 562        cfg_cmd->time_high      = 0xf2;
 563        cfg_cmd->promisc        = 0;
 564        if(dev->flags & IFF_ALLMULTI) {
 565                int len = ((char *) p->iscp - (char *) ptr - 8) / 6;
 566                if(num_addrs > len)     {
 567                        printk("%s: switching to promisc. mode\n",dev->name);
 568                        dev->flags|=IFF_PROMISC;
 569                }
 570        }
 571        if(dev->flags&IFF_PROMISC)
 572        {
 573                         cfg_cmd->promisc=1;
 574                         dev->flags|=IFF_PROMISC;
 575        }
 576        cfg_cmd->carr_coll      = 0x00;
 577
 578        p->scb->cbl_offset      = make16(cfg_cmd);
 579        p->scb->cmd_ruc         = 0;
 580
 581        p->scb->cmd_cuc         = CUC_START; /* cmd.-unit start */
 582        ni_attn586();
 583
 584        WAIT_4_STAT_COMPL(cfg_cmd);
 585
 586        if((cfg_cmd->cmd_status & (STAT_OK|STAT_COMPL)) != (STAT_COMPL|STAT_OK))
 587        {
 588                printk("%s: configure command failed: %x\n",dev->name,cfg_cmd->cmd_status);
 589                return 1;
 590        }
 591
 592        /*
 593         * individual address setup
 594         */
 595
 596        ias_cmd = (struct iasetup_cmd_struct *)ptr;
 597
 598        ias_cmd->cmd_status     = 0;
 599        ias_cmd->cmd_cmd        = CMD_IASETUP | CMD_LAST;
 600        ias_cmd->cmd_link       = 0xffff;
 601
 602        memcpy((char *)&ias_cmd->iaddr,(char *) dev->dev_addr,ETH_ALEN);
 603
 604        p->scb->cbl_offset = make16(ias_cmd);
 605
 606        p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */
 607        ni_attn586();
 608
 609        WAIT_4_STAT_COMPL(ias_cmd);
 610
 611        if((ias_cmd->cmd_status & (STAT_OK|STAT_COMPL)) != (STAT_OK|STAT_COMPL)) {
 612                printk("%s (ni52): individual address setup command failed: %04x\n",dev->name,ias_cmd->cmd_status);
 613                return 1;
 614        }
 615
 616        /*
 617         * TDR, wire check .. e.g. no resistor e.t.c
 618         */
 619         
 620        tdr_cmd = (struct tdr_cmd_struct *)ptr;
 621
 622        tdr_cmd->cmd_status     = 0;
 623        tdr_cmd->cmd_cmd        = CMD_TDR | CMD_LAST;
 624        tdr_cmd->cmd_link       = 0xffff;
 625        tdr_cmd->status         = 0;
 626
 627        p->scb->cbl_offset = make16(tdr_cmd);
 628        p->scb->cmd_cuc = CUC_START; /* cmd.-unit start */
 629        ni_attn586();
 630
 631        WAIT_4_STAT_COMPL(tdr_cmd);
 632
 633        if(!(tdr_cmd->cmd_status & STAT_COMPL))
 634        {
 635                printk("%s: Problems while running the TDR.\n",dev->name);
 636        }
 637        else
 638        {
 639                DELAY_16(); /* wait for result */
 640                result = tdr_cmd->status;
 641
 642                p->scb->cmd_cuc = p->scb->cus & STAT_MASK;
 643                ni_attn586(); /* ack the interrupts */
 644
 645                if(result & TDR_LNK_OK)
 646                        ;
 647                else if(result & TDR_XCVR_PRB)
 648                        printk("%s: TDR: Transceiver problem. Check the cable(s)!\n",dev->name);
 649                else if(result & TDR_ET_OPN)
 650                        printk("%s: TDR: No correct termination %d clocks away.\n",dev->name,result & TDR_TIMEMASK);
 651                else if(result & TDR_ET_SRT)
 652                {
 653                        if (result & TDR_TIMEMASK) /* time == 0 -> strange :-) */
 654                                printk("%s: TDR: Detected a short circuit %d clocks away.\n",dev->name,result & TDR_TIMEMASK);
 655                }
 656                else
 657                        printk("%s: TDR: Unknown status %04x\n",dev->name,result);
 658        }
 659
 660        /*
 661         * Multicast setup
 662         */
 663        if(num_addrs && !(dev->flags & IFF_PROMISC) )
 664        {
 665                mc_cmd = (struct mcsetup_cmd_struct *) ptr;
 666                mc_cmd->cmd_status = 0;
 667                mc_cmd->cmd_cmd = CMD_MCSETUP | CMD_LAST;
 668                mc_cmd->cmd_link = 0xffff;
 669                mc_cmd->mc_cnt = num_addrs * 6;
 670
 671                for(i=0;i<num_addrs;i++,dmi=dmi->next)
 672                        memcpy((char *) mc_cmd->mc_list[i], dmi->dmi_addr,6);
 673
 674                p->scb->cbl_offset = make16(mc_cmd);
 675                p->scb->cmd_cuc = CUC_START;
 676                ni_attn586();
 677
 678                WAIT_4_STAT_COMPL(mc_cmd);
 679
 680                if( (mc_cmd->cmd_status & (STAT_COMPL|STAT_OK)) != (STAT_COMPL|STAT_OK) )
 681                        printk("%s: Can't apply multicast-address-list.\n",dev->name);
 682        }
 683
 684        /*
 685         * alloc nop/xmit-cmds
 686         */
 687#if (NUM_XMIT_BUFFS == 1)
 688        for(i=0;i<2;i++)
 689        {
 690                p->nop_cmds[i]                  = (struct nop_cmd_struct *)ptr;
 691                p->nop_cmds[i]->cmd_cmd         = CMD_NOP;
 692                p->nop_cmds[i]->cmd_status      = 0;
 693                p->nop_cmds[i]->cmd_link        = make16((p->nop_cmds[i]));
 694                ptr = (char *) ptr + sizeof(struct nop_cmd_struct);
 695        }
 696#else
 697        for(i=0;i<NUM_XMIT_BUFFS;i++)
 698        {
 699                p->nop_cmds[i]                  = (struct nop_cmd_struct *)ptr;
 700                p->nop_cmds[i]->cmd_cmd         = CMD_NOP;
 701                p->nop_cmds[i]->cmd_status      = 0;
 702                p->nop_cmds[i]->cmd_link        = make16((p->nop_cmds[i]));
 703                ptr = (char *) ptr + sizeof(struct nop_cmd_struct);
 704        }
 705#endif
 706
 707        ptr = alloc_rfa(dev,(void *)ptr); /* init receive-frame-area */
 708
 709        /*
 710         * alloc xmit-buffs / init xmit_cmds
 711         */
 712        for(i=0;i<NUM_XMIT_BUFFS;i++)
 713        {
 714                p->xmit_cmds[i] = (struct transmit_cmd_struct *)ptr; /*transmit cmd/buff 0*/
 715                ptr = (char *) ptr + sizeof(struct transmit_cmd_struct);
 716                p->xmit_cbuffs[i] = (char *)ptr; /* char-buffs */
 717                ptr = (char *) ptr + XMIT_BUFF_SIZE;
 718                p->xmit_buffs[i] = (struct tbd_struct *)ptr; /* TBD */
 719                ptr = (char *) ptr + sizeof(struct tbd_struct);
 720                if((void *)ptr > (void *)p->iscp)
 721                {
 722                        printk("%s: not enough shared-mem for your configuration!\n",dev->name);
 723                        return 1;
 724                }
 725                memset((char *)(p->xmit_cmds[i]) ,0, sizeof(struct transmit_cmd_struct));
 726                memset((char *)(p->xmit_buffs[i]),0, sizeof(struct tbd_struct));
 727                p->xmit_cmds[i]->cmd_link = make16(p->nop_cmds[(i+1)%NUM_XMIT_BUFFS]);
 728                p->xmit_cmds[i]->cmd_status = STAT_COMPL;
 729                p->xmit_cmds[i]->cmd_cmd = CMD_XMIT | CMD_INT;
 730                p->xmit_cmds[i]->tbd_offset = make16((p->xmit_buffs[i]));
 731                p->xmit_buffs[i]->next = 0xffff;
 732                p->xmit_buffs[i]->buffer = make24((p->xmit_cbuffs[i]));
 733        }
 734
 735        p->xmit_count = 0;
 736        p->xmit_last    = 0;
 737#ifndef NO_NOPCOMMANDS
 738        p->nop_point    = 0;
 739#endif
 740
 741         /*
 742                * 'start transmitter'
 743                */
 744#ifndef NO_NOPCOMMANDS
 745        p->scb->cbl_offset = make16(p->nop_cmds[0]);
 746        p->scb->cmd_cuc = CUC_START;
 747        ni_attn586();
 748        WAIT_4_SCB_CMD();
 749#else
 750        p->xmit_cmds[0]->cmd_link = make16(p->xmit_cmds[0]);
 751        p->xmit_cmds[0]->cmd_cmd        = CMD_XMIT | CMD_SUSPEND | CMD_INT;
 752#endif
 753
 754        /*
 755         * ack. interrupts
 756         */
 757        p->scb->cmd_cuc = p->scb->cus & STAT_MASK;
 758        ni_attn586();
 759        DELAY_16();
 760
 761        ni_enaint();
 762
 763        return 0;
 764}
 765
 766/******************************************************
 767 * This is a helper routine for ni52_rnr_int() and init586().
 768 * It sets up the Receive Frame Area (RFA).
 769 */
 770
 771static void *alloc_rfa(struct net_device *dev,void *ptr)
 772{
 773        volatile struct rfd_struct *rfd = (struct rfd_struct *)ptr;
 774        volatile struct rbd_struct *rbd;
 775        int i;
 776        struct priv *p = (struct priv *) dev->priv;
 777
 778        memset((char *) rfd,0,sizeof(struct rfd_struct)*(p->num_recv_buffs+rfdadd));
 779        p->rfd_first = rfd;
 780
 781        for(i = 0; i < (p->num_recv_buffs+rfdadd); i++) {
 782                rfd[i].next = make16(rfd + (i+1) % (p->num_recv_buffs+rfdadd) );
 783                rfd[i].rbd_offset = 0xffff;
 784        }
 785        rfd[p->num_recv_buffs-1+rfdadd].last = RFD_SUSP;         /* RU suspend */
 786
 787        ptr = (void *) (rfd + (p->num_recv_buffs + rfdadd) );
 788
 789        rbd = (struct rbd_struct *) ptr;
 790        ptr = (void *) (rbd + p->num_recv_buffs);
 791
 792         /* clr descriptors */
 793        memset((char *) rbd,0,sizeof(struct rbd_struct)*(p->num_recv_buffs));
 794
 795        for(i=0;i<p->num_recv_buffs;i++)
 796        {
 797                rbd[i].next = make16((rbd + (i+1) % p->num_recv_buffs));
 798                rbd[i].size = RECV_BUFF_SIZE;
 799                rbd[i].buffer = make24(ptr);
 800                ptr = (char *) ptr + RECV_BUFF_SIZE;
 801        }
 802
 803        p->rfd_top      = p->rfd_first;
 804        p->rfd_last = p->rfd_first + (p->num_recv_buffs - 1 + rfdadd);
 805
 806        p->scb->rfa_offset              = make16(p->rfd_first);
 807        p->rfd_first->rbd_offset        = make16(rbd);
 808
 809        return ptr;
 810}
 811
 812
 813/**************************************************
 814 * Interrupt Handler ...
 815 */
 816
 817static void ni52_interrupt(int irq,void *dev_id,struct pt_regs *reg_ptr)
 818{
 819        struct net_device *dev = dev_id;
 820        unsigned short stat;
 821        int cnt=0;
 822        struct priv *p;
 823
 824        if (!dev) {
 825                printk ("ni5210-interrupt: irq %d for unknown device.\n",irq);
 826                return;
 827        }
 828        p = (struct priv *) dev->priv;
 829
 830        if(debuglevel > 1)
 831                printk("I");
 832
 833        WAIT_4_SCB_CMD(); /* wait for last command      */
 834
 835        while((stat=p->scb->cus & STAT_MASK))
 836        {
 837                p->scb->cmd_cuc = stat;
 838                ni_attn586();
 839
 840                if(stat & STAT_FR)       /* received a frame */
 841                        ni52_rcv_int(dev);
 842
 843                if(stat & STAT_RNR) /* RU went 'not ready' */
 844                {
 845                        printk("(R)");
 846                        if(p->scb->rus & RU_SUSPEND) /* special case: RU_SUSPEND */
 847                        {
 848                                WAIT_4_SCB_CMD();
 849                                p->scb->cmd_ruc = RUC_RESUME;
 850                                ni_attn586();
 851                                WAIT_4_SCB_CMD_RUC();
 852                        }
 853                        else
 854                        {
 855                                printk("%s: Receiver-Unit went 'NOT READY': %04x/%02x.\n",dev->name,(int) stat,(int) p->scb->rus);
 856                                ni52_rnr_int(dev);
 857                        }
 858                }
 859
 860                if(stat & STAT_CX)              /* command with I-bit set complete */
 861                         ni52_xmt_int(dev);
 862
 863#ifndef NO_NOPCOMMANDS
 864                if(stat & STAT_CNA)     /* CU went 'not ready' */
 865                {
 866                        if(netif_running(dev))
 867                                printk("%s: oops! CU has left active state. stat: %04x/%02x.\n",dev->name,(int) stat,(int) p->scb->cus);
 868                }
 869#endif
 870
 871                if(debuglevel > 1)
 872                        printk("%d",cnt++);
 873
 874                WAIT_4_SCB_CMD(); /* wait for ack. (ni52_xmt_int can be faster than ack!!) */
 875                if(p->scb->cmd_cuc)      /* timed out? */
 876                {
 877                        printk("%s: Acknowledge timed out.\n",dev->name);
 878                        ni_disint();
 879                        break;
 880                }
 881        }
 882
 883        if(debuglevel > 1)
 884                printk("i");
 885}
 886
 887/*******************************************************
 888 * receive-interrupt
 889 */
 890
 891static void ni52_rcv_int(struct net_device *dev)
 892{
 893        int status,cnt=0;
 894        unsigned short totlen;
 895        struct sk_buff *skb;
 896        struct rbd_struct *rbd;
 897        struct priv *p = (struct priv *) dev->priv;
 898
 899        if(debuglevel > 0)
 900                printk("R");
 901
 902        for(;(status = p->rfd_top->stat_high) & RFD_COMPL;)
 903        {
 904                        rbd = (struct rbd_struct *) make32(p->rfd_top->rbd_offset);
 905
 906                        if(status & RFD_OK) /* frame received without error? */
 907                        {
 908                                if( (totlen = rbd->status) & RBD_LAST) /* the first and the last buffer? */
 909                                {
 910                                        totlen &= RBD_MASK; /* length of this frame */
 911                                        rbd->status = 0;
 912                                        skb = (struct sk_buff *) dev_alloc_skb(totlen+2);
 913                                        if(skb != NULL)
 914                                        {
 915                                                skb->dev = dev;
 916                                                skb_reserve(skb,2);
 917                                                skb_put(skb,totlen);
 918                                                eth_copy_and_sum(skb,(char *) p->base+(unsigned long) rbd->buffer,totlen,0);
 919                                                skb->protocol=eth_type_trans(skb,dev);
 920                                                netif_rx(skb);
 921                                                dev->last_rx = jiffies;
 922                                                p->stats.rx_packets++;
 923                                                p->stats.rx_bytes += totlen;
 924                                        }
 925                                        else
 926                                                p->stats.rx_dropped++;
 927                                }
 928                                else
 929                                {
 930                                        int rstat;
 931                                                 /* free all RBD's until RBD_LAST is set */
 932                                        totlen = 0;
 933                                        while(!((rstat=rbd->status) & RBD_LAST))
 934                                        {
 935                                                totlen += rstat & RBD_MASK;
 936                                                if(!rstat)
 937                                                {
 938                                                        printk("%s: Whoops .. no end mark in RBD list\n",dev->name);
 939                                                        break;
 940                                                }
 941                                                rbd->status = 0;
 942                                                rbd = (struct rbd_struct *) make32(rbd->next);
 943                                        }
 944                                        totlen += rstat & RBD_MASK;
 945                                        rbd->status = 0;
 946                                        printk("%s: received oversized frame! length: %d\n",dev->name,totlen);
 947                                        p->stats.rx_dropped++;
 948                         }
 949                }
 950                else /* frame !(ok), only with 'save-bad-frames' */
 951                {
 952                        printk("%s: oops! rfd-error-status: %04x\n",dev->name,status);
 953                        p->stats.rx_errors++;
 954                }
 955                p->rfd_top->stat_high = 0;
 956                p->rfd_top->last = RFD_SUSP; /* maybe exchange by RFD_LAST */
 957                p->rfd_top->rbd_offset = 0xffff;
 958                p->rfd_last->last = 0;                          /* delete RFD_SUSP      */
 959                p->rfd_last = p->rfd_top;
 960                p->rfd_top = (struct rfd_struct *) make32(p->rfd_top->next); /* step to next RFD */
 961                p->scb->rfa_offset = make16(p->rfd_top);
 962
 963                if(debuglevel > 0)
 964                        printk("%d",cnt++);
 965        }
 966
 967        if(automatic_resume)
 968        {
 969                WAIT_4_SCB_CMD();
 970                p->scb->cmd_ruc = RUC_RESUME;
 971                ni_attn586();
 972                WAIT_4_SCB_CMD_RUC();
 973        }
 974
 975#ifdef WAIT_4_BUSY
 976        {
 977                int i;
 978                for(i=0;i<1024;i++)
 979                {
 980                        if(p->rfd_top->status)
 981                                break;
 982                        DELAY_16();
 983                        if(i == 1023)
 984                                printk("%s: RU hasn't fetched next RFD (not busy/complete)\n",dev->name);
 985                }
 986        }
 987#endif
 988
 989#if 0
 990        if(!at_least_one)
 991        {
 992                int i;
 993                volatile struct rfd_struct *rfds=p->rfd_top;
 994                volatile struct rbd_struct *rbds;
 995                printk("%s: received a FC intr. without having a frame: %04x %d\n",dev->name,status,old_at_least);
 996                for(i=0;i< (p->num_recv_buffs+4);i++)
 997                {
 998                        rbds = (struct rbd_struct *) make32(rfds->rbd_offset);
 999                        printk("%04x:%04x ",rfds->status,rbds->status);
1000                        rfds = (struct rfd_struct *) make32(rfds->next);
1001                }
1002                printk("\nerrs: %04x %04x stat: %04x\n",(int)p->scb->rsc_errs,(int)p->scb->ovrn_errs,(int)p->scb->status);
1003                printk("\nerrs: %04x %04x rus: %02x, cus: %02x\n",(int)p->scb->rsc_errs,(int)p->scb->ovrn_errs,(int)p->scb->rus,(int)p->scb->cus);
1004        }
1005        old_at_least = at_least_one;
1006#endif
1007
1008        if(debuglevel > 0)
1009                printk("r");
1010}
1011
1012/**********************************************************
1013 * handle 'Receiver went not ready'.
1014 */
1015
1016static void ni52_rnr_int(struct net_device *dev)
1017{
1018        struct priv *p = (struct priv *) dev->priv;
1019
1020        p->stats.rx_errors++;
1021
1022        WAIT_4_SCB_CMD();               /* wait for the last cmd, WAIT_4_FULLSTAT?? */
1023        p->scb->cmd_ruc = RUC_ABORT; /* usually the RU is in the 'no resource'-state .. abort it now. */
1024        ni_attn586();
1025        WAIT_4_SCB_CMD_RUC();           /* wait for accept cmd. */
1026
1027        alloc_rfa(dev,(char *)p->rfd_first);
1028/* maybe add a check here, before restarting the RU */
1029        startrecv586(dev); /* restart RU */
1030
1031        printk("%s: Receive-Unit restarted. Status: %04x\n",dev->name,p->scb->rus);
1032
1033}
1034
1035/**********************************************************
1036 * handle xmit - interrupt
1037 */
1038
1039static void ni52_xmt_int(struct net_device *dev)
1040{
1041        int status;
1042        struct priv *p = (struct priv *) dev->priv;
1043
1044        if(debuglevel > 0)
1045                printk("X");
1046
1047        status = p->xmit_cmds[p->xmit_last]->cmd_status;
1048        if(!(status & STAT_COMPL))
1049                printk("%s: strange .. xmit-int without a 'COMPLETE'\n",dev->name);
1050
1051        if(status & STAT_OK)
1052        {
1053                p->stats.tx_packets++;
1054                p->stats.collisions += (status & TCMD_MAXCOLLMASK);
1055        }
1056        else
1057        {
1058                p->stats.tx_errors++;
1059                if(status & TCMD_LATECOLL) {
1060                        printk("%s: late collision detected.\n",dev->name);
1061                        p->stats.collisions++;
1062                }
1063                else if(status & TCMD_NOCARRIER) {
1064                        p->stats.tx_carrier_errors++;
1065                        printk("%s: no carrier detected.\n",dev->name);
1066                }
1067                else if(status & TCMD_LOSTCTS)
1068                        printk("%s: loss of CTS detected.\n",dev->name);
1069                else if(status & TCMD_UNDERRUN) {
1070                        p->stats.tx_fifo_errors++;
1071                        printk("%s: DMA underrun detected.\n",dev->name);
1072                }
1073                else if(status & TCMD_MAXCOLL) {
1074                        printk("%s: Max. collisions exceeded.\n",dev->name);
1075                        p->stats.collisions += 16;
1076                }
1077        }
1078
1079#if (NUM_XMIT_BUFFS > 1)
1080        if( (++p->xmit_last) == NUM_XMIT_BUFFS)
1081                p->xmit_last = 0;
1082#endif
1083        netif_wake_queue(dev);
1084}
1085
1086/***********************************************************
1087 * (re)start the receiver
1088 */
1089
1090static void startrecv586(struct net_device *dev)
1091{
1092        struct priv *p = (struct priv *) dev->priv;
1093
1094        WAIT_4_SCB_CMD();
1095        WAIT_4_SCB_CMD_RUC();
1096        p->scb->rfa_offset = make16(p->rfd_first);
1097        p->scb->cmd_ruc = RUC_START;
1098        ni_attn586();           /* start cmd. */
1099        WAIT_4_SCB_CMD_RUC();   /* wait for accept cmd. (no timeout!!) */
1100}
1101
1102static void ni52_timeout(struct net_device *dev)
1103{
1104        struct priv *p = (struct priv *) dev->priv;
1105#ifndef NO_NOPCOMMANDS
1106        if(p->scb->cus & CU_ACTIVE) /* COMMAND-UNIT active? */
1107        {
1108                netif_wake_queue(dev);
1109#ifdef DEBUG
1110                printk("%s: strange ... timeout with CU active?!?\n",dev->name);
1111                printk("%s: X0: %04x N0: %04x N1: %04x %d\n",dev->name,(int)p->xmit_cmds[0]->cmd_status,(int)p->nop_cmds[0]->cmd_status,(int)p->nop_cmds[1]->cmd_status,(int)p->nop_point);
1112#endif
1113                p->scb->cmd_cuc = CUC_ABORT;
1114                ni_attn586();
1115                WAIT_4_SCB_CMD();
1116                p->scb->cbl_offset = make16(p->nop_cmds[p->nop_point]);
1117                p->scb->cmd_cuc = CUC_START;
1118                ni_attn586();
1119                WAIT_4_SCB_CMD();
1120                dev->trans_start = jiffies;
1121                return 0;
1122        }
1123#endif
1124        {
1125#ifdef DEBUG
1126                printk("%s: xmitter timed out, try to restart! stat: %02x\n",dev->name,p->scb->cus);
1127                printk("%s: command-stats: %04x %04x\n",dev->name,p->xmit_cmds[0]->cmd_status,p->xmit_cmds[1]->cmd_status);
1128                printk("%s: check, whether you set the right interrupt number!\n",dev->name);
1129#endif
1130                ni52_close(dev);
1131                ni52_open(dev);
1132        }
1133        dev->trans_start = jiffies;
1134}
1135
1136/******************************************************
1137 * send frame
1138 */
1139
1140static int ni52_send_packet(struct sk_buff *skb, struct net_device *dev)
1141{
1142        int len,i;
1143#ifndef NO_NOPCOMMANDS
1144        int next_nop;
1145#endif
1146        struct priv *p = (struct priv *) dev->priv;
1147
1148        if(skb->len > XMIT_BUFF_SIZE)
1149        {
1150                printk("%s: Sorry, max. framelength is %d bytes. The length of your frame is %d bytes.\n",dev->name,XMIT_BUFF_SIZE,skb->len);
1151                return 0;
1152        }
1153
1154        netif_stop_queue(dev);
1155
1156#if(NUM_XMIT_BUFFS > 1)
1157        if(test_and_set_bit(0,(void *) &p->lock)) {
1158                printk("%s: Queue was locked\n",dev->name);
1159                return 1;
1160        }
1161        else
1162#endif
1163        {
1164                memcpy((char *)p->xmit_cbuffs[p->xmit_count],(char *)(skb->data),skb->len);
1165                len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
1166
1167#if (NUM_XMIT_BUFFS == 1)
1168#       ifdef NO_NOPCOMMANDS
1169
1170#ifdef DEBUG
1171                if(p->scb->cus & CU_ACTIVE)
1172                {
1173                        printk("%s: Hmmm .. CU is still running and we wanna send a new packet.\n",dev->name);
1174                        printk("%s: stat: %04x %04x\n",dev->name,p->scb->cus,p->xmit_cmds[0]->cmd_status);
1175                }
1176#endif
1177
1178                p->xmit_buffs[0]->size = TBD_LAST | len;
1179                for(i=0;i<16;i++)
1180                {
1181                        p->xmit_cmds[0]->cmd_status = 0;
1182                        WAIT_4_SCB_CMD();
1183                        if( (p->scb->cus & CU_STATUS) == CU_SUSPEND)
1184                                p->scb->cmd_cuc = CUC_RESUME;
1185                        else
1186                        {
1187                                p->scb->cbl_offset = make16(p->xmit_cmds[0]);
1188                                p->scb->cmd_cuc = CUC_START;
1189                        }
1190
1191                        ni_attn586();
1192                        dev->trans_start = jiffies;
1193                        if(!i)
1194                                dev_kfree_skb(skb);
1195                        WAIT_4_SCB_CMD();
1196                        if( (p->scb->cus & CU_ACTIVE)) /* test it, because CU sometimes doesn't start immediately */
1197                                break;
1198                        if(p->xmit_cmds[0]->cmd_status)
1199                                break;
1200                        if(i==15)
1201                                printk("%s: Can't start transmit-command.\n",dev->name);
1202                }
1203#       else
1204                next_nop = (p->nop_point + 1) & 0x1;
1205                p->xmit_buffs[0]->size = TBD_LAST | len;
1206
1207                p->xmit_cmds[0]->cmd_link        = p->nop_cmds[next_nop]->cmd_link
1208                                                                                                                                = make16((p->nop_cmds[next_nop]));
1209                p->xmit_cmds[0]->cmd_status = p->nop_cmds[next_nop]->cmd_status = 0;
1210
1211                p->nop_cmds[p->nop_point]->cmd_link = make16((p->xmit_cmds[0]));
1212                dev->trans_start = jiffies;
1213                p->nop_point = next_nop;
1214                dev_kfree_skb(skb);
1215#       endif
1216#else
1217                p->xmit_buffs[p->xmit_count]->size = TBD_LAST | len;
1218                if( (next_nop = p->xmit_count + 1) == NUM_XMIT_BUFFS )
1219                        next_nop = 0;
1220
1221                p->xmit_cmds[p->xmit_count]->cmd_status = 0;
1222                /* linkpointer of xmit-command already points to next nop cmd */
1223                p->nop_cmds[next_nop]->cmd_link = make16((p->nop_cmds[next_nop]));
1224                p->nop_cmds[next_nop]->cmd_status = 0;
1225
1226                p->nop_cmds[p->xmit_count]->cmd_link = make16((p->xmit_cmds[p->xmit_count]));
1227                dev->trans_start = jiffies;
1228                p->xmit_count = next_nop;
1229
1230                {
1231                        unsigned long flags;
1232                        save_flags(flags);
1233                        cli();
1234                        if(p->xmit_count != p->xmit_last)
1235                                netif_wake_queue(dev);
1236                        p->lock = 0;
1237                        restore_flags(flags);
1238                }
1239                dev_kfree_skb(skb);
1240#endif
1241        }
1242        return 0;
1243}
1244
1245/*******************************************
1246 * Someone wanna have the statistics
1247 */
1248
1249static struct net_device_stats *ni52_get_stats(struct net_device *dev)
1250{
1251        struct priv *p = (struct priv *) dev->priv;
1252        unsigned short crc,aln,rsc,ovrn;
1253
1254        crc = p->scb->crc_errs; /* get error-statistic from the ni82586 */
1255        p->scb->crc_errs = 0;
1256        aln = p->scb->aln_errs;
1257        p->scb->aln_errs = 0;
1258        rsc = p->scb->rsc_errs;
1259        p->scb->rsc_errs = 0;
1260        ovrn = p->scb->ovrn_errs;
1261        p->scb->ovrn_errs = 0;
1262
1263        p->stats.rx_crc_errors += crc;
1264        p->stats.rx_fifo_errors += ovrn;
1265        p->stats.rx_frame_errors += aln;
1266        p->stats.rx_dropped += rsc;
1267
1268        return &p->stats;
1269}
1270
1271/********************************************************
1272 * Set MC list ..
1273 */
1274
1275static void set_multicast_list(struct net_device *dev)
1276{
1277        netif_stop_queue(dev);
1278        ni_disint();
1279        alloc586(dev);
1280        init586(dev);
1281        startrecv586(dev);
1282        ni_enaint();
1283        netif_wake_queue(dev);
1284}
1285
1286#ifdef MODULE
1287static struct net_device dev_ni52;
1288
1289/* set: io,irq,memstart,memend or set it when calling insmod */
1290static int irq=9;
1291static int io=0x300;
1292static long memstart;   /* e.g 0xd0000 */
1293static long memend;     /* e.g 0xd4000 */
1294
1295MODULE_PARM(io, "i");
1296MODULE_PARM(irq, "i");
1297MODULE_PARM(memstart, "l");
1298MODULE_PARM(memend, "l");
1299MODULE_PARM_DESC(io, "NI5210 I/O base address,required");
1300MODULE_PARM_DESC(irq, "NI5210 IRQ number,required");
1301MODULE_PARM_DESC(memstart, "NI5210 memory base address,required");
1302MODULE_PARM_DESC(memend, "NI5210 memory end address,required");
1303
1304int init_module(void)
1305{
1306        if(io <= 0x0 || !memend || !memstart || irq < 2) {
1307                printk("ni52: Autoprobing not allowed for modules.\nni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n");
1308                return -ENODEV;
1309        }
1310        dev_ni52.init = ni52_probe;
1311        dev_ni52.irq = irq;
1312        dev_ni52.base_addr = io;
1313        dev_ni52.mem_end = memend;
1314        dev_ni52.mem_start = memstart;
1315        if (register_netdev(&dev_ni52) != 0)
1316                return -EIO;
1317        return 0;
1318}
1319
1320void cleanup_module(void)
1321{
1322        release_region(dev_ni52.base_addr, NI52_TOTAL_SIZE);
1323        unregister_netdev(&dev_ni52);
1324        kfree(dev_ni52.priv);
1325        dev_ni52.priv = NULL;
1326}
1327#endif /* MODULE */
1328
1329#if 0
1330/*
1331 * DUMP .. we expect a not running CMD unit and enough space
1332 */
1333void ni52_dump(struct net_device *dev,void *ptr)
1334{
1335        struct priv *p = (struct priv *) dev->priv;
1336        struct dump_cmd_struct *dump_cmd = (struct dump_cmd_struct *) ptr;
1337        int i;
1338
1339        p->scb->cmd_cuc = CUC_ABORT;
1340        ni_attn586();
1341        WAIT_4_SCB_CMD();
1342        WAIT_4_SCB_CMD_RUC();
1343
1344        dump_cmd->cmd_status = 0;
1345        dump_cmd->cmd_cmd = CMD_DUMP | CMD_LAST;
1346        dump_cmd->dump_offset = make16((dump_cmd + 1));
1347        dump_cmd->cmd_link = 0xffff;
1348
1349        p->scb->cbl_offset = make16(dump_cmd);
1350        p->scb->cmd_cuc = CUC_START;
1351        ni_attn586();
1352        WAIT_4_STAT_COMPL(dump_cmd);
1353
1354        if( (dump_cmd->cmd_status & (STAT_COMPL|STAT_OK)) != (STAT_COMPL|STAT_OK) )
1355                                printk("%s: Can't get dump information.\n",dev->name);
1356
1357        for(i=0;i<170;i++) {
1358                printk("%02x ",(int) ((unsigned char *) (dump_cmd + 1))[i]);
1359                if(i % 24 == 23)
1360                        printk("\n");
1361        }
1362        printk("\n");
1363}
1364#endif
1365MODULE_LICENSE("GPL");
1366
1367/*
1368 * END: linux/drivers/net/ni52.c
1369 */
1370
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.