linux/drivers/net/82596.c
<<
>>
Prefs
   1/* 82596.c: A generic 82596 ethernet driver for linux. */
   2/*
   3   Based on Apricot.c
   4   Written 1994 by Mark Evans.
   5   This driver is for the Apricot 82596 bus-master interface
   6
   7   Modularised 12/94 Mark Evans
   8
   9
  10   Modified to support the 82596 ethernet chips on 680x0 VME boards.
  11   by Richard Hirst <richard@sleepie.demon.co.uk>
  12   Renamed to be 82596.c
  13
  14   980825:  Changed to receive directly in to sk_buffs which are
  15   allocated at open() time.  Eliminates copy on incoming frames
  16   (small ones are still copied).  Shared data now held in a
  17   non-cached page, so we can run on 68060 in copyback mode.
  18
  19   TBD:
  20   * look at deferring rx frames rather than discarding (as per tulip)
  21   * handle tx ring full as per tulip
  22   * performance test to tune rx_copybreak
  23
  24   Most of my modifications relate to the braindead big-endian
  25   implementation by Intel.  When the i596 is operating in
  26   'big-endian' mode, it thinks a 32 bit value of 0x12345678
  27   should be stored as 0x56781234.  This is a real pain, when
  28   you have linked lists which are shared by the 680x0 and the
  29   i596.
  30
  31   Driver skeleton
  32   Written 1993 by Donald Becker.
  33   Copyright 1993 United States Government as represented by the Director,
  34   National Security Agency. This software may only be used and distributed
  35   according to the terms of the GNU General Public License as modified by SRC,
  36   incorporated herein by reference.
  37
  38   The author may be reached as becker@scyld.com, or C/O
  39   Scyld Computing Corporation, 410 Severn Ave., Suite 210, Annapolis MD 21403
  40
  41 */
  42
  43#include <linux/module.h>
  44#include <linux/kernel.h>
  45#include <linux/string.h>
  46#include <linux/errno.h>
  47#include <linux/ioport.h>
  48#include <linux/interrupt.h>
  49#include <linux/delay.h>
  50#include <linux/netdevice.h>
  51#include <linux/etherdevice.h>
  52#include <linux/skbuff.h>
  53#include <linux/init.h>
  54#include <linux/bitops.h>
  55#include <linux/gfp.h>
  56
  57#include <asm/io.h>
  58#include <asm/dma.h>
  59#include <asm/pgtable.h>
  60#include <asm/cacheflush.h>
  61
  62static char version[] __initdata =
  63        "82596.c $Revision: 1.5 $\n";
  64
  65#define DRV_NAME        "82596"
  66
  67/* DEBUG flags
  68 */
  69
  70#define DEB_INIT        0x0001
  71#define DEB_PROBE       0x0002
  72#define DEB_SERIOUS     0x0004
  73#define DEB_ERRORS      0x0008
  74#define DEB_MULTI       0x0010
  75#define DEB_TDR         0x0020
  76#define DEB_OPEN        0x0040
  77#define DEB_RESET       0x0080
  78#define DEB_ADDCMD      0x0100
  79#define DEB_STATUS      0x0200
  80#define DEB_STARTTX     0x0400
  81#define DEB_RXADDR      0x0800
  82#define DEB_TXADDR      0x1000
  83#define DEB_RXFRAME     0x2000
  84#define DEB_INTS        0x4000
  85#define DEB_STRUCT      0x8000
  86#define DEB_ANY         0xffff
  87
  88
  89#define DEB(x,y)        if (i596_debug & (x)) y
  90
  91
  92#if defined(CONFIG_MVME16x_NET) || defined(CONFIG_MVME16x_NET_MODULE)
  93#define ENABLE_MVME16x_NET
  94#endif
  95#if defined(CONFIG_BVME6000_NET) || defined(CONFIG_BVME6000_NET_MODULE)
  96#define ENABLE_BVME6000_NET
  97#endif
  98#if defined(CONFIG_APRICOT) || defined(CONFIG_APRICOT_MODULE)
  99#define ENABLE_APRICOT
 100#endif
 101
 102#ifdef ENABLE_MVME16x_NET
 103#include <asm/mvme16xhw.h>
 104#endif
 105#ifdef ENABLE_BVME6000_NET
 106#include <asm/bvme6000hw.h>
 107#endif
 108
 109/*
 110 * Define various macros for Channel Attention, word swapping etc., dependent
 111 * on architecture.  MVME and BVME are 680x0 based, otherwise it is Intel.
 112 */
 113
 114#ifdef __mc68000__
 115#define WSWAPrfd(x)  ((struct i596_rfd *) (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 116#define WSWAPrbd(x)  ((struct i596_rbd *) (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 117#define WSWAPiscp(x) ((struct i596_iscp *)(((u32)(x)<<16) | ((((u32)(x)))>>16)))
 118#define WSWAPscb(x)  ((struct i596_scb *) (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 119#define WSWAPcmd(x)  ((struct i596_cmd *) (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 120#define WSWAPtbd(x)  ((struct i596_tbd *) (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 121#define WSWAPchar(x) ((char *)            (((u32)(x)<<16) | ((((u32)(x)))>>16)))
 122#define ISCP_BUSY       0x00010000
 123#define MACH_IS_APRICOT 0
 124#else
 125#define WSWAPrfd(x)     ((struct i596_rfd *)((long)x))
 126#define WSWAPrbd(x)     ((struct i596_rbd *)((long)x))
 127#define WSWAPiscp(x)    ((struct i596_iscp *)((long)x))
 128#define WSWAPscb(x)     ((struct i596_scb *)((long)x))
 129#define WSWAPcmd(x)     ((struct i596_cmd *)((long)x))
 130#define WSWAPtbd(x)     ((struct i596_tbd *)((long)x))
 131#define WSWAPchar(x)    ((char *)((long)x))
 132#define ISCP_BUSY       0x0001
 133#define MACH_IS_APRICOT 1
 134#endif
 135
 136/*
 137 * The MPU_PORT command allows direct access to the 82596. With PORT access
 138 * the following commands are available (p5-18). The 32-bit port command
 139 * must be word-swapped with the most significant word written first.
 140 * This only applies to VME boards.
 141 */
 142#define PORT_RESET              0x00    /* reset 82596 */
 143#define PORT_SELFTEST           0x01    /* selftest */
 144#define PORT_ALTSCP             0x02    /* alternate SCB address */
 145#define PORT_ALTDUMP            0x03    /* Alternate DUMP address */
 146
 147static int i596_debug = (DEB_SERIOUS|DEB_PROBE);
 148
 149MODULE_AUTHOR("Richard Hirst");
 150MODULE_DESCRIPTION("i82596 driver");
 151MODULE_LICENSE("GPL");
 152
 153module_param(i596_debug, int, 0);
 154MODULE_PARM_DESC(i596_debug, "i82596 debug mask");
 155
 156
 157/* Copy frames shorter than rx_copybreak, otherwise pass on up in
 158 * a full sized sk_buff.  Value of 100 stolen from tulip.c (!alpha).
 159 */
 160static int rx_copybreak = 100;
 161
 162#define PKT_BUF_SZ      1536
 163#define MAX_MC_CNT      64
 164
 165#define I596_TOTAL_SIZE 17
 166
 167#define I596_NULL ((void *)0xffffffff)
 168
 169#define CMD_EOL         0x8000  /* The last command of the list, stop. */
 170#define CMD_SUSP        0x4000  /* Suspend after doing cmd. */
 171#define CMD_INTR        0x2000  /* Interrupt after doing cmd. */
 172
 173#define CMD_FLEX        0x0008  /* Enable flexible memory model */
 174
 175enum commands {
 176        CmdNOp = 0, CmdSASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
 177        CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7
 178};
 179
 180#define STAT_C          0x8000  /* Set to 0 after execution */
 181#define STAT_B          0x4000  /* Command being executed */
 182#define STAT_OK         0x2000  /* Command executed ok */
 183#define STAT_A          0x1000  /* Command aborted */
 184
 185#define  CUC_START      0x0100
 186#define  CUC_RESUME     0x0200
 187#define  CUC_SUSPEND    0x0300
 188#define  CUC_ABORT      0x0400
 189#define  RX_START       0x0010
 190#define  RX_RESUME      0x0020
 191#define  RX_SUSPEND     0x0030
 192#define  RX_ABORT       0x0040
 193
 194#define TX_TIMEOUT      (HZ/20)
 195
 196
 197struct i596_reg {
 198        unsigned short porthi;
 199        unsigned short portlo;
 200        unsigned long ca;
 201};
 202
 203#define EOF             0x8000
 204#define SIZE_MASK       0x3fff
 205
 206struct i596_tbd {
 207        unsigned short size;
 208        unsigned short pad;
 209        struct i596_tbd *next;
 210        char *data;
 211};
 212
 213/* The command structure has two 'next' pointers; v_next is the address of
 214 * the next command as seen by the CPU, b_next is the address of the next
 215 * command as seen by the 82596.  The b_next pointer, as used by the 82596
 216 * always references the status field of the next command, rather than the
 217 * v_next field, because the 82596 is unaware of v_next.  It may seem more
 218 * logical to put v_next at the end of the structure, but we cannot do that
 219 * because the 82596 expects other fields to be there, depending on command
 220 * type.
 221 */
 222
 223struct i596_cmd {
 224        struct i596_cmd *v_next;        /* Address from CPUs viewpoint */
 225        unsigned short status;
 226        unsigned short command;
 227        struct i596_cmd *b_next;        /* Address from i596 viewpoint */
 228};
 229
 230struct tx_cmd {
 231        struct i596_cmd cmd;
 232        struct i596_tbd *tbd;
 233        unsigned short size;
 234        unsigned short pad;
 235        struct sk_buff *skb;    /* So we can free it after tx */
 236};
 237
 238struct tdr_cmd {
 239        struct i596_cmd cmd;
 240        unsigned short status;
 241        unsigned short pad;
 242};
 243
 244struct mc_cmd {
 245        struct i596_cmd cmd;
 246        short mc_cnt;
 247        char mc_addrs[MAX_MC_CNT*6];
 248};
 249
 250struct sa_cmd {
 251        struct i596_cmd cmd;
 252        char eth_addr[8];
 253};
 254
 255struct cf_cmd {
 256        struct i596_cmd cmd;
 257        char i596_config[16];
 258};
 259
 260struct i596_rfd {
 261        unsigned short stat;
 262        unsigned short cmd;
 263        struct i596_rfd *b_next;        /* Address from i596 viewpoint */
 264        struct i596_rbd *rbd;
 265        unsigned short count;
 266        unsigned short size;
 267        struct i596_rfd *v_next;        /* Address from CPUs viewpoint */
 268        struct i596_rfd *v_prev;
 269};
 270
 271struct i596_rbd {
 272    unsigned short count;
 273    unsigned short zero1;
 274    struct i596_rbd *b_next;
 275    unsigned char *b_data;              /* Address from i596 viewpoint */
 276    unsigned short size;
 277    unsigned short zero2;
 278    struct sk_buff *skb;
 279    struct i596_rbd *v_next;
 280    struct i596_rbd *b_addr;            /* This rbd addr from i596 view */
 281    unsigned char *v_data;              /* Address from CPUs viewpoint */
 282};
 283
 284#define TX_RING_SIZE 64
 285#define RX_RING_SIZE 16
 286
 287struct i596_scb {
 288        unsigned short status;
 289        unsigned short command;
 290        struct i596_cmd *cmd;
 291        struct i596_rfd *rfd;
 292        unsigned long crc_err;
 293        unsigned long align_err;
 294        unsigned long resource_err;
 295        unsigned long over_err;
 296        unsigned long rcvdt_err;
 297        unsigned long short_err;
 298        unsigned short t_on;
 299        unsigned short t_off;
 300};
 301
 302struct i596_iscp {
 303        unsigned long stat;
 304        struct i596_scb *scb;
 305};
 306
 307struct i596_scp {
 308        unsigned long sysbus;
 309        unsigned long pad;
 310        struct i596_iscp *iscp;
 311};
 312
 313struct i596_private {
 314        volatile struct i596_scp scp;
 315        volatile struct i596_iscp iscp;
 316        volatile struct i596_scb scb;
 317        struct sa_cmd sa_cmd;
 318        struct cf_cmd cf_cmd;
 319        struct tdr_cmd tdr_cmd;
 320        struct mc_cmd mc_cmd;
 321        unsigned long stat;
 322        int last_restart __attribute__((aligned(4)));
 323        struct i596_rfd *rfd_head;
 324        struct i596_rbd *rbd_head;
 325        struct i596_cmd *cmd_tail;
 326        struct i596_cmd *cmd_head;
 327        int cmd_backlog;
 328        unsigned long last_cmd;
 329        struct i596_rfd rfds[RX_RING_SIZE];
 330        struct i596_rbd rbds[RX_RING_SIZE];
 331        struct tx_cmd tx_cmds[TX_RING_SIZE];
 332        struct i596_tbd tbds[TX_RING_SIZE];
 333        int next_tx_cmd;
 334        spinlock_t lock;
 335};
 336
 337static char init_setup[] =
 338{
 339        0x8E,                   /* length, prefetch on */
 340        0xC8,                   /* fifo to 8, monitor off */
 341#ifdef CONFIG_VME
 342        0xc0,                   /* don't save bad frames */
 343#else
 344        0x80,                   /* don't save bad frames */
 345#endif
 346        0x2E,                   /* No source address insertion, 8 byte preamble */
 347        0x00,                   /* priority and backoff defaults */
 348        0x60,                   /* interframe spacing */
 349        0x00,                   /* slot time LSB */
 350        0xf2,                   /* slot time and retries */
 351        0x00,                   /* promiscuous mode */
 352        0x00,                   /* collision detect */
 353        0x40,                   /* minimum frame length */
 354        0xff,
 355        0x00,
 356        0x7f /*  *multi IA */ };
 357
 358static int i596_open(struct net_device *dev);
 359static netdev_tx_t i596_start_xmit(struct sk_buff *skb, struct net_device *dev);
 360static irqreturn_t i596_interrupt(int irq, void *dev_id);
 361static int i596_close(struct net_device *dev);
 362static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd);
 363static void i596_tx_timeout (struct net_device *dev);
 364static void print_eth(unsigned char *buf, char *str);
 365static void set_multicast_list(struct net_device *dev);
 366
 367static int rx_ring_size = RX_RING_SIZE;
 368static int ticks_limit = 25;
 369static int max_cmd_backlog = TX_RING_SIZE-1;
 370
 371
 372static inline void CA(struct net_device *dev)
 373{
 374#ifdef ENABLE_MVME16x_NET
 375        if (MACH_IS_MVME16x) {
 376                ((struct i596_reg *) dev->base_addr)->ca = 1;
 377        }
 378#endif
 379#ifdef ENABLE_BVME6000_NET
 380        if (MACH_IS_BVME6000) {
 381                volatile u32 i;
 382
 383                i = *(volatile u32 *) (dev->base_addr);
 384        }
 385#endif
 386#ifdef ENABLE_APRICOT
 387        if (MACH_IS_APRICOT) {
 388                outw(0, (short) (dev->base_addr) + 4);
 389        }
 390#endif
 391}
 392
 393
 394static inline void MPU_PORT(struct net_device *dev, int c, volatile void *x)
 395{
 396#ifdef ENABLE_MVME16x_NET
 397        if (MACH_IS_MVME16x) {
 398                struct i596_reg *p = (struct i596_reg *) (dev->base_addr);
 399                p->porthi = ((c) | (u32) (x)) & 0xffff;
 400                p->portlo = ((c) | (u32) (x)) >> 16;
 401        }
 402#endif
 403#ifdef ENABLE_BVME6000_NET
 404        if (MACH_IS_BVME6000) {
 405                u32 v = (u32) (c) | (u32) (x);
 406                v = ((u32) (v) << 16) | ((u32) (v) >> 16);
 407                *(volatile u32 *) dev->base_addr = v;
 408                udelay(1);
 409                *(volatile u32 *) dev->base_addr = v;
 410        }
 411#endif
 412}
 413
 414
 415static inline int wait_istat(struct net_device *dev, struct i596_private *lp, int delcnt, char *str)
 416{
 417        while (--delcnt && lp->iscp.stat)
 418                udelay(10);
 419        if (!delcnt) {
 420                printk(KERN_ERR "%s: %s, status %4.4x, cmd %4.4x.\n",
 421                     dev->name, str, lp->scb.status, lp->scb.command);
 422                return -1;
 423        }
 424        else
 425                return 0;
 426}
 427
 428
 429static inline int wait_cmd(struct net_device *dev, struct i596_private *lp, int delcnt, char *str)
 430{
 431        while (--delcnt && lp->scb.command)
 432                udelay(10);
 433        if (!delcnt) {
 434                printk(KERN_ERR "%s: %s, status %4.4x, cmd %4.4x.\n",
 435                     dev->name, str, lp->scb.status, lp->scb.command);
 436                return -1;
 437        }
 438        else
 439                return 0;
 440}
 441
 442
 443static inline int wait_cfg(struct net_device *dev, struct i596_cmd *cmd, int delcnt, char *str)
 444{
 445        volatile struct i596_cmd *c = cmd;
 446
 447        while (--delcnt && c->command)
 448                udelay(10);
 449        if (!delcnt) {
 450                printk(KERN_ERR "%s: %s.\n", dev->name, str);
 451                return -1;
 452        }
 453        else
 454                return 0;
 455}
 456
 457
 458static void i596_display_data(struct net_device *dev)
 459{
 460        struct i596_private *lp = dev->ml_priv;
 461        struct i596_cmd *cmd;
 462        struct i596_rfd *rfd;
 463        struct i596_rbd *rbd;
 464
 465        printk(KERN_ERR "lp and scp at %p, .sysbus = %08lx, .iscp = %p\n",
 466               &lp->scp, lp->scp.sysbus, lp->scp.iscp);
 467        printk(KERN_ERR "iscp at %p, iscp.stat = %08lx, .scb = %p\n",
 468               &lp->iscp, lp->iscp.stat, lp->iscp.scb);
 469        printk(KERN_ERR "scb at %p, scb.status = %04x, .command = %04x,"
 470                " .cmd = %p, .rfd = %p\n",
 471               &lp->scb, lp->scb.status, lp->scb.command,
 472                lp->scb.cmd, lp->scb.rfd);
 473        printk(KERN_ERR "   errors: crc %lx, align %lx, resource %lx,"
 474               " over %lx, rcvdt %lx, short %lx\n",
 475                lp->scb.crc_err, lp->scb.align_err, lp->scb.resource_err,
 476                lp->scb.over_err, lp->scb.rcvdt_err, lp->scb.short_err);
 477        cmd = lp->cmd_head;
 478        while (cmd != I596_NULL) {
 479                printk(KERN_ERR "cmd at %p, .status = %04x, .command = %04x, .b_next = %p\n",
 480                  cmd, cmd->status, cmd->command, cmd->b_next);
 481                cmd = cmd->v_next;
 482        }
 483        rfd = lp->rfd_head;
 484        printk(KERN_ERR "rfd_head = %p\n", rfd);
 485        do {
 486                printk(KERN_ERR "   %p .stat %04x, .cmd %04x, b_next %p, rbd %p,"
 487                        " count %04x\n",
 488                        rfd, rfd->stat, rfd->cmd, rfd->b_next, rfd->rbd,
 489                        rfd->count);
 490                rfd = rfd->v_next;
 491        } while (rfd != lp->rfd_head);
 492        rbd = lp->rbd_head;
 493        printk(KERN_ERR "rbd_head = %p\n", rbd);
 494        do {
 495                printk(KERN_ERR "   %p .count %04x, b_next %p, b_data %p, size %04x\n",
 496                        rbd, rbd->count, rbd->b_next, rbd->b_data, rbd->size);
 497                rbd = rbd->v_next;
 498        } while (rbd != lp->rbd_head);
 499}
 500
 501
 502#if defined(ENABLE_MVME16x_NET) || defined(ENABLE_BVME6000_NET)
 503static irqreturn_t i596_error(int irq, void *dev_id)
 504{
 505        struct net_device *dev = dev_id;
 506#ifdef ENABLE_MVME16x_NET
 507        if (MACH_IS_MVME16x) {
 508                volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000;
 509
 510                pcc2[0x28] = 1;
 511                pcc2[0x2b] = 0x1d;
 512        }
 513#endif
 514#ifdef ENABLE_BVME6000_NET
 515        if (MACH_IS_BVME6000) {
 516                volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG;
 517
 518                *ethirq = 1;
 519                *ethirq = 3;
 520        }
 521#endif
 522        printk(KERN_ERR "%s: Error interrupt\n", dev->name);
 523        i596_display_data(dev);
 524        return IRQ_HANDLED;
 525}
 526#endif
 527
 528static inline void remove_rx_bufs(struct net_device *dev)
 529{
 530        struct i596_private *lp = dev->ml_priv;
 531        struct i596_rbd *rbd;
 532        int i;
 533
 534        for (i = 0, rbd = lp->rbds; i < rx_ring_size; i++, rbd++) {
 535                if (rbd->skb == NULL)
 536                        break;
 537                dev_kfree_skb(rbd->skb);
 538                rbd->skb = NULL;
 539        }
 540}
 541
 542static inline int init_rx_bufs(struct net_device *dev)
 543{
 544        struct i596_private *lp = dev->ml_priv;
 545        int i;
 546        struct i596_rfd *rfd;
 547        struct i596_rbd *rbd;
 548
 549        /* First build the Receive Buffer Descriptor List */
 550
 551        for (i = 0, rbd = lp->rbds; i < rx_ring_size; i++, rbd++) {
 552                struct sk_buff *skb = dev_alloc_skb(PKT_BUF_SZ);
 553
 554                if (skb == NULL) {
 555                        remove_rx_bufs(dev);
 556                        return -ENOMEM;
 557                }
 558
 559                skb->dev = dev;
 560                rbd->v_next = rbd+1;
 561                rbd->b_next = WSWAPrbd(virt_to_bus(rbd+1));
 562                rbd->b_addr = WSWAPrbd(virt_to_bus(rbd));
 563                rbd->skb = skb;
 564                rbd->v_data = skb->data;
 565                rbd->b_data = WSWAPchar(virt_to_bus(skb->data));
 566                rbd->size = PKT_BUF_SZ;
 567#ifdef __mc68000__
 568                cache_clear(virt_to_phys(skb->data), PKT_BUF_SZ);
 569#endif
 570        }
 571        lp->rbd_head = lp->rbds;
 572        rbd = lp->rbds + rx_ring_size - 1;
 573        rbd->v_next = lp->rbds;
 574        rbd->b_next = WSWAPrbd(virt_to_bus(lp->rbds));
 575
 576        /* Now build the Receive Frame Descriptor List */
 577
 578        for (i = 0, rfd = lp->rfds; i < rx_ring_size; i++, rfd++) {
 579                rfd->rbd = I596_NULL;
 580                rfd->v_next = rfd+1;
 581                rfd->v_prev = rfd-1;
 582                rfd->b_next = WSWAPrfd(virt_to_bus(rfd+1));
 583                rfd->cmd = CMD_FLEX;
 584        }
 585        lp->rfd_head = lp->rfds;
 586        lp->scb.rfd = WSWAPrfd(virt_to_bus(lp->rfds));
 587        rfd = lp->rfds;
 588        rfd->rbd = lp->rbd_head;
 589        rfd->v_prev = lp->rfds + rx_ring_size - 1;
 590        rfd = lp->rfds + rx_ring_size - 1;
 591        rfd->v_next = lp->rfds;
 592        rfd->b_next = WSWAPrfd(virt_to_bus(lp->rfds));
 593        rfd->cmd = CMD_EOL|CMD_FLEX;
 594
 595        return 0;
 596}
 597
 598
 599static void rebuild_rx_bufs(struct net_device *dev)
 600{
 601        struct i596_private *lp = dev->ml_priv;
 602        int i;
 603
 604        /* Ensure rx frame/buffer descriptors are tidy */
 605
 606        for (i = 0; i < rx_ring_size; i++) {
 607                lp->rfds[i].rbd = I596_NULL;
 608                lp->rfds[i].cmd = CMD_FLEX;
 609        }
 610        lp->rfds[rx_ring_size-1].cmd = CMD_EOL|CMD_FLEX;
 611        lp->rfd_head = lp->rfds;
 612        lp->scb.rfd = WSWAPrfd(virt_to_bus(lp->rfds));
 613        lp->rbd_head = lp->rbds;
 614        lp->rfds[0].rbd = WSWAPrbd(virt_to_bus(lp->rbds));
 615}
 616
 617
 618static int init_i596_mem(struct net_device *dev)
 619{
 620        struct i596_private *lp = dev->ml_priv;
 621#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) || defined(ENABLE_APRICOT)
 622        short ioaddr = dev->base_addr;
 623#endif
 624        unsigned long flags;
 625
 626        MPU_PORT(dev, PORT_RESET, NULL);
 627
 628        udelay(100);            /* Wait 100us - seems to help */
 629
 630#if defined(ENABLE_MVME16x_NET) || defined(ENABLE_BVME6000_NET)
 631#ifdef ENABLE_MVME16x_NET
 632        if (MACH_IS_MVME16x) {
 633                volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000;
 634
 635                /* Disable all ints for now */
 636                pcc2[0x28] = 1;
 637                pcc2[0x2a] = 0x48;
 638                /* Following disables snooping.  Snooping is not required
 639                 * as we make appropriate use of non-cached pages for
 640                 * shared data, and cache_push/cache_clear.
 641                 */
 642                pcc2[0x2b] = 0x08;
 643        }
 644#endif
 645#ifdef ENABLE_BVME6000_NET
 646        if (MACH_IS_BVME6000) {
 647                volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG;
 648
 649                *ethirq = 1;
 650        }
 651#endif
 652
 653        /* change the scp address */
 654
 655        MPU_PORT(dev, PORT_ALTSCP, (void *)virt_to_bus((void *)&lp->scp));
 656
 657#elif defined(ENABLE_APRICOT)
 658
 659        {
 660                u32 scp = virt_to_bus(&lp->scp);
 661
 662                /* change the scp address */
 663                outw(0, ioaddr);
 664                outw(0, ioaddr);
 665                outb(4, ioaddr + 0xf);
 666                outw(scp | 2, ioaddr);
 667                outw(scp >> 16, ioaddr);
 668        }
 669#endif
 670
 671        lp->last_cmd = jiffies;
 672
 673#ifdef ENABLE_MVME16x_NET
 674        if (MACH_IS_MVME16x)
 675                lp->scp.sysbus = 0x00000054;
 676#endif
 677#ifdef ENABLE_BVME6000_NET
 678        if (MACH_IS_BVME6000)
 679                lp->scp.sysbus = 0x0000004c;
 680#endif
 681#ifdef ENABLE_APRICOT
 682        if (MACH_IS_APRICOT)
 683                lp->scp.sysbus = 0x00440000;
 684#endif
 685
 686        lp->scp.iscp = WSWAPiscp(virt_to_bus((void *)&lp->iscp));
 687        lp->iscp.scb = WSWAPscb(virt_to_bus((void *)&lp->scb));
 688        lp->iscp.stat = ISCP_BUSY;
 689        lp->cmd_backlog = 0;
 690
 691        lp->cmd_head = lp->scb.cmd = I596_NULL;
 692
 693#ifdef ENABLE_BVME6000_NET
 694        if (MACH_IS_BVME6000) {
 695                lp->scb.t_on  = 7 * 25;
 696                lp->scb.t_off = 1 * 25;
 697        }
 698#endif
 699
 700        DEB(DEB_INIT,printk(KERN_DEBUG "%s: starting i82596.\n", dev->name));
 701
 702#if defined(ENABLE_APRICOT)
 703        (void) inb(ioaddr + 0x10);
 704        outb(4, ioaddr + 0xf);
 705#endif
 706        CA(dev);
 707
 708        if (wait_istat(dev,lp,1000,"initialization timed out"))
 709                goto failed;
 710        DEB(DEB_INIT,printk(KERN_DEBUG "%s: i82596 initialization successful\n", dev->name));
 711
 712        /* Ensure rx frame/buffer descriptors are tidy */
 713        rebuild_rx_bufs(dev);
 714        lp->scb.command = 0;
 715
 716#ifdef ENABLE_MVME16x_NET
 717        if (MACH_IS_MVME16x) {
 718                volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000;
 719
 720                /* Enable ints, etc. now */
 721                pcc2[0x2a] = 0x55;      /* Edge sensitive */
 722                pcc2[0x2b] = 0x15;
 723        }
 724#endif
 725#ifdef ENABLE_BVME6000_NET
 726        if (MACH_IS_BVME6000) {
 727                volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG;
 728
 729                *ethirq = 3;
 730        }
 731#endif
 732
 733
 734        DEB(DEB_INIT,printk(KERN_DEBUG "%s: queuing CmdConfigure\n", dev->name));
 735        memcpy(lp->cf_cmd.i596_config, init_setup, 14);
 736        lp->cf_cmd.cmd.command = CmdConfigure;
 737        i596_add_cmd(dev, &lp->cf_cmd.cmd);
 738
 739        DEB(DEB_INIT,printk(KERN_DEBUG "%s: queuing CmdSASetup\n", dev->name));
 740        memcpy(lp->sa_cmd.eth_addr, dev->dev_addr, 6);
 741        lp->sa_cmd.cmd.command = CmdSASetup;
 742        i596_add_cmd(dev, &lp->sa_cmd.cmd);
 743
 744        DEB(DEB_INIT,printk(KERN_DEBUG "%s: queuing CmdTDR\n", dev->name));
 745        lp->tdr_cmd.cmd.command = CmdTDR;
 746        i596_add_cmd(dev, &lp->tdr_cmd.cmd);
 747
 748        spin_lock_irqsave (&lp->lock, flags);
 749
 750        if (wait_cmd(dev,lp,1000,"timed out waiting to issue RX_START")) {
 751                spin_unlock_irqrestore (&lp->lock, flags);
 752                goto failed;
 753        }
 754        DEB(DEB_INIT,printk(KERN_DEBUG "%s: Issuing RX_START\n", dev->name));
 755        lp->scb.command = RX_START;
 756        CA(dev);
 757
 758        spin_unlock_irqrestore (&lp->lock, flags);
 759
 760        if (wait_cmd(dev,lp,1000,"RX_START not processed"))
 761                goto failed;
 762        DEB(DEB_INIT,printk(KERN_DEBUG "%s: Receive unit started OK\n", dev->name));
 763        return 0;
 764
 765failed:
 766        printk(KERN_CRIT "%s: Failed to initialise 82596\n", dev->name);
 767        MPU_PORT(dev, PORT_RESET, NULL);
 768        return -1;
 769}
 770
 771static inline int i596_rx(struct net_device *dev)
 772{
 773        struct i596_private *lp = dev->ml_priv;
 774        struct i596_rfd *rfd;
 775        struct i596_rbd *rbd;
 776        int frames = 0;
 777
 778        DEB(DEB_RXFRAME,printk(KERN_DEBUG "i596_rx(), rfd_head %p, rbd_head %p\n",
 779                        lp->rfd_head, lp->rbd_head));
 780
 781        rfd = lp->rfd_head;             /* Ref next frame to check */
 782
 783        while ((rfd->stat) & STAT_C) {  /* Loop while complete frames */
 784                if (rfd->rbd == I596_NULL)
 785                        rbd = I596_NULL;
 786                else if (rfd->rbd == lp->rbd_head->b_addr)
 787                        rbd = lp->rbd_head;
 788                else {
 789                        printk(KERN_CRIT "%s: rbd chain broken!\n", dev->name);
 790                        /* XXX Now what? */
 791                        rbd = I596_NULL;
 792                }
 793                DEB(DEB_RXFRAME, printk(KERN_DEBUG "  rfd %p, rfd.rbd %p, rfd.stat %04x\n",
 794                        rfd, rfd->rbd, rfd->stat));
 795
 796                if (rbd != I596_NULL && ((rfd->stat) & STAT_OK)) {
 797                        /* a good frame */
 798                        int pkt_len = rbd->count & 0x3fff;
 799                        struct sk_buff *skb = rbd->skb;
 800                        int rx_in_place = 0;
 801
 802                        DEB(DEB_RXADDR,print_eth(rbd->v_data, "received"));
 803                        frames++;
 804
 805                        /* Check if the packet is long enough to just accept
 806                         * without copying to a properly sized skbuff.
 807                         */
 808
 809                        if (pkt_len > rx_copybreak) {
 810                                struct sk_buff *newskb;
 811
 812                                /* Get fresh skbuff to replace filled one. */
 813                                newskb = dev_alloc_skb(PKT_BUF_SZ);
 814                                if (newskb == NULL) {
 815                                        skb = NULL;     /* drop pkt */
 816                                        goto memory_squeeze;
 817                                }
 818                                /* Pass up the skb already on the Rx ring. */
 819                                skb_put(skb, pkt_len);
 820                                rx_in_place = 1;
 821                                rbd->skb = newskb;
 822                                newskb->dev = dev;
 823                                rbd->v_data = newskb->data;
 824                                rbd->b_data = WSWAPchar(virt_to_bus(newskb->data));
 825#ifdef __mc68000__
 826                                cache_clear(virt_to_phys(newskb->data), PKT_BUF_SZ);
 827#endif
 828                        }
 829                        else
 830                                skb = dev_alloc_skb(pkt_len + 2);
 831memory_squeeze:
 832                        if (skb == NULL) {
 833                                /* XXX tulip.c can defer packets here!! */
 834                                printk(KERN_WARNING "%s: i596_rx Memory squeeze, dropping packet.\n", dev->name);
 835                                dev->stats.rx_dropped++;
 836                        }
 837                        else {
 838                                if (!rx_in_place) {
 839                                        /* 16 byte align the data fields */
 840                                        skb_reserve(skb, 2);
 841                                        memcpy(skb_put(skb,pkt_len), rbd->v_data, pkt_len);
 842                                }
 843                                skb->protocol=eth_type_trans(skb,dev);
 844                                skb->len = pkt_len;
 845#ifdef __mc68000__
 846                                cache_clear(virt_to_phys(rbd->skb->data),
 847                                                pkt_len);
 848#endif
 849                                netif_rx(skb);
 850                                dev->stats.rx_packets++;
 851                                dev->stats.rx_bytes+=pkt_len;
 852                        }
 853                }
 854                else {
 855                        DEB(DEB_ERRORS, printk(KERN_DEBUG "%s: Error, rfd.stat = 0x%04x\n",
 856                                        dev->name, rfd->stat));
 857                        dev->stats.rx_errors++;
 858                        if ((rfd->stat) & 0x0001)
 859                                dev->stats.collisions++;
 860                        if ((rfd->stat) & 0x0080)
 861                                dev->stats.rx_length_errors++;
 862                        if ((rfd->stat) & 0x0100)
 863                                dev->stats.rx_over_errors++;
 864                        if ((rfd->stat) & 0x0200)
 865                                dev->stats.rx_fifo_errors++;
 866                        if ((rfd->stat) & 0x0400)
 867                                dev->stats.rx_frame_errors++;
 868                        if ((rfd->stat) & 0x0800)
 869                                dev->stats.rx_crc_errors++;
 870                        if ((rfd->stat) & 0x1000)
 871                                dev->stats.rx_length_errors++;
 872                }
 873
 874                /* Clear the buffer descriptor count and EOF + F flags */
 875
 876                if (rbd != I596_NULL && (rbd->count & 0x4000)) {
 877                        rbd->count = 0;
 878                        lp->rbd_head = rbd->v_next;
 879                }
 880
 881                /* Tidy the frame descriptor, marking it as end of list */
 882
 883                rfd->rbd = I596_NULL;
 884                rfd->stat = 0;
 885                rfd->cmd = CMD_EOL|CMD_FLEX;
 886                rfd->count = 0;
 887
 888                /* Remove end-of-list from old end descriptor */
 889
 890                rfd->v_prev->cmd = CMD_FLEX;
 891
 892                /* Update record of next frame descriptor to process */
 893
 894                lp->scb.rfd = rfd->b_next;
 895                lp->rfd_head = rfd->v_next;
 896                rfd = lp->rfd_head;
 897        }
 898
 899        DEB(DEB_RXFRAME,printk(KERN_DEBUG "frames %d\n", frames));
 900
 901        return 0;
 902}
 903
 904
 905static void i596_cleanup_cmd(struct net_device *dev, struct i596_private *lp)
 906{
 907        struct i596_cmd *ptr;
 908
 909        while (lp->cmd_head != I596_NULL) {
 910                ptr = lp->cmd_head;
 911                lp->cmd_head = ptr->v_next;
 912                lp->cmd_backlog--;
 913
 914                switch ((ptr->command) & 0x7) {
 915                case CmdTx:
 916                        {
 917                                struct tx_cmd *tx_cmd = (struct tx_cmd *) ptr;
 918                                struct sk_buff *skb = tx_cmd->skb;
 919
 920                                dev_kfree_skb(skb);
 921
 922                                dev->stats.tx_errors++;
 923                                dev->stats.tx_aborted_errors++;
 924
 925                                ptr->v_next = ptr->b_next = I596_NULL;
 926                                tx_cmd->cmd.command = 0;  /* Mark as free */
 927                                break;
 928                        }
 929                default:
 930                        ptr->v_next = ptr->b_next = I596_NULL;
 931                }
 932        }
 933
 934        wait_cmd(dev,lp,100,"i596_cleanup_cmd timed out");
 935        lp->scb.cmd = I596_NULL;
 936}
 937
 938static void i596_reset(struct net_device *dev, struct i596_private *lp,
 939                        int ioaddr)
 940{
 941        unsigned long flags;
 942
 943        DEB(DEB_RESET,printk(KERN_DEBUG "i596_reset\n"));
 944
 945        spin_lock_irqsave (&lp->lock, flags);
 946
 947        wait_cmd(dev,lp,100,"i596_reset timed out");
 948
 949        netif_stop_queue(dev);
 950
 951        lp->scb.command = CUC_ABORT | RX_ABORT;
 952        CA(dev);
 953
 954        /* wait for shutdown */
 955        wait_cmd(dev,lp,1000,"i596_reset 2 timed out");
 956        spin_unlock_irqrestore (&lp->lock, flags);
 957
 958        i596_cleanup_cmd(dev,lp);
 959        i596_rx(dev);
 960
 961        netif_start_queue(dev);
 962        init_i596_mem(dev);
 963}
 964
 965static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd)
 966{
 967        struct i596_private *lp = dev->ml_priv;
 968        int ioaddr = dev->base_addr;
 969        unsigned long flags;
 970
 971        DEB(DEB_ADDCMD,printk(KERN_DEBUG "i596_add_cmd\n"));
 972
 973        cmd->status = 0;
 974        cmd->command |= (CMD_EOL | CMD_INTR);
 975        cmd->v_next = cmd->b_next = I596_NULL;
 976
 977        spin_lock_irqsave (&lp->lock, flags);
 978
 979        if (lp->cmd_head != I596_NULL) {
 980                lp->cmd_tail->v_next = cmd;
 981                lp->cmd_tail->b_next = WSWAPcmd(virt_to_bus(&cmd->status));
 982        } else {
 983                lp->cmd_head = cmd;
 984                wait_cmd(dev,lp,100,"i596_add_cmd timed out");
 985                lp->scb.cmd = WSWAPcmd(virt_to_bus(&cmd->status));
 986                lp->scb.command = CUC_START;
 987                CA(dev);
 988        }
 989        lp->cmd_tail = cmd;
 990        lp->cmd_backlog++;
 991
 992        spin_unlock_irqrestore (&lp->lock, flags);
 993
 994        if (lp->cmd_backlog > max_cmd_backlog) {
 995                unsigned long tickssofar = jiffies - lp->last_cmd;
 996
 997                if (tickssofar < ticks_limit)
 998                        return;
 999
1000                printk(KERN_NOTICE "%s: command unit timed out, status resetting.\n", dev->name);
1001
1002                i596_reset(dev, lp, ioaddr);
1003        }
1004}
1005
1006static int i596_open(struct net_device *dev)
1007{
1008        int res = 0;
1009
1010        DEB(DEB_OPEN,printk(KERN_DEBUG "%s: i596_open() irq %d.\n", dev->name, dev->irq));
1011
1012        if (request_irq(dev->irq, i596_interrupt, 0, "i82596", dev)) {
1013                printk(KERN_ERR "%s: IRQ %d not free\n", dev->name, dev->irq);
1014                return -EAGAIN;
1015        }
1016#ifdef ENABLE_MVME16x_NET
1017        if (MACH_IS_MVME16x) {
1018                if (request_irq(0x56, i596_error, 0, "i82596_error", dev)) {
1019                        res = -EAGAIN;
1020                        goto err_irq_dev;
1021                }
1022        }
1023#endif
1024        res = init_rx_bufs(dev);
1025        if (res)
1026                goto err_irq_56;
1027
1028        netif_start_queue(dev);
1029
1030        if (init_i596_mem(dev)) {
1031                res = -EAGAIN;
1032                goto err_queue;
1033        }
1034
1035        return 0;
1036
1037err_queue:
1038        netif_stop_queue(dev);
1039        remove_rx_bufs(dev);
1040err_irq_56:
1041#ifdef ENABLE_MVME16x_NET
1042        free_irq(0x56, dev);
1043err_irq_dev:
1044#endif
1045        free_irq(dev->irq, dev);
1046
1047        return res;
1048}
1049
1050static void i596_tx_timeout (struct net_device *dev)
1051{
1052        struct i596_private *lp = dev->ml_priv;
1053        int ioaddr = dev->base_addr;
1054
1055        /* Transmitter timeout, serious problems. */
1056        DEB(DEB_ERRORS,printk(KERN_ERR "%s: transmit timed out, status resetting.\n",
1057                        dev->name));
1058
1059        dev->stats.tx_errors++;
1060
1061        /* Try to restart the adaptor */
1062        if (lp->last_restart == dev->stats.tx_packets) {
1063                DEB(DEB_ERRORS,printk(KERN_ERR "Resetting board.\n"));
1064                /* Shutdown and restart */
1065                i596_reset (dev, lp, ioaddr);
1066        } else {
1067                /* Issue a channel attention signal */
1068                DEB(DEB_ERRORS,printk(KERN_ERR "Kicking board.\n"));
1069                lp->scb.command = CUC_START | RX_START;
1070                CA (dev);
1071                lp->last_restart = dev->stats.tx_packets;
1072        }
1073
1074        dev->trans_start = jiffies; /* prevent tx timeout */
1075        netif_wake_queue (dev);
1076}
1077
1078static netdev_tx_t i596_start_xmit(struct sk_buff *skb, struct net_device *dev)
1079{
1080        struct i596_private *lp = dev->ml_priv;
1081        struct tx_cmd *tx_cmd;
1082        struct i596_tbd *tbd;
1083        short length = skb->len;
1084
1085        DEB(DEB_STARTTX,printk(KERN_DEBUG "%s: i596_start_xmit(%x,%p) called\n",
1086                                dev->name, skb->len, skb->data));
1087
1088        if (skb->len < ETH_ZLEN) {
1089                if (skb_padto(skb, ETH_ZLEN))
1090                        return NETDEV_TX_OK;
1091                length = ETH_ZLEN;
1092        }
1093        netif_stop_queue(dev);
1094
1095        tx_cmd = lp->tx_cmds + lp->next_tx_cmd;
1096        tbd = lp->tbds + lp->next_tx_cmd;
1097
1098        if (tx_cmd->cmd.command) {
1099                printk(KERN_NOTICE "%s: xmit ring full, dropping packet.\n",
1100                                dev->name);
1101                dev->stats.tx_dropped++;
1102
1103                dev_kfree_skb(skb);
1104        } else {
1105                if (++lp->next_tx_cmd == TX_RING_SIZE)
1106                        lp->next_tx_cmd = 0;
1107                tx_cmd->tbd = WSWAPtbd(virt_to_bus(tbd));
1108                tbd->next = I596_NULL;
1109
1110                tx_cmd->cmd.command = CMD_FLEX | CmdTx;
1111                tx_cmd->skb = skb;
1112
1113                tx_cmd->pad = 0;
1114                tx_cmd->size = 0;
1115                tbd->pad = 0;
1116                tbd->size = EOF | length;
1117
1118                tbd->data = WSWAPchar(virt_to_bus(skb->data));
1119
1120#ifdef __mc68000__
1121                cache_push(virt_to_phys(skb->data), length);
1122#endif
1123                DEB(DEB_TXADDR,print_eth(skb->data, "tx-queued"));
1124                i596_add_cmd(dev, &tx_cmd->cmd);
1125
1126                dev->stats.tx_packets++;
1127                dev->stats.tx_bytes += length;
1128        }
1129
1130        netif_start_queue(dev);
1131
1132        return NETDEV_TX_OK;
1133}
1134
1135static void print_eth(unsigned char *add, char *str)
1136{
1137        printk(KERN_DEBUG "i596 0x%p, %pM --> %pM %02X%02X, %s\n",
1138               add, add + 6, add, add[12], add[13], str);
1139}
1140
1141static int io = 0x300;
1142static int irq = 10;
1143
1144static const struct net_device_ops i596_netdev_ops = {
1145        .ndo_open               = i596_open,
1146        .ndo_stop               = i596_close,
1147        .ndo_start_xmit         = i596_start_xmit,
1148        .ndo_set_multicast_list = set_multicast_list,
1149        .ndo_tx_timeout         = i596_tx_timeout,
1150        .ndo_change_mtu         = eth_change_mtu,
1151        .ndo_set_mac_address    = eth_mac_addr,
1152        .ndo_validate_addr      = eth_validate_addr,
1153};
1154
1155struct net_device * __init i82596_probe(int unit)
1156{
1157        struct net_device *dev;
1158        int i;
1159        struct i596_private *lp;
1160        char eth_addr[8];
1161        static int probed;
1162        int err;
1163
1164        if (probed)
1165                return ERR_PTR(-ENODEV);
1166        probed++;
1167
1168        dev = alloc_etherdev(0);
1169        if (!dev)
1170                return ERR_PTR(-ENOMEM);
1171
1172        if (unit >= 0) {
1173                sprintf(dev->name, "eth%d", unit);
1174                netdev_boot_setup_check(dev);
1175        } else {
1176                dev->base_addr = io;
1177                dev->irq = irq;
1178        }
1179
1180#ifdef ENABLE_MVME16x_NET
1181        if (MACH_IS_MVME16x) {
1182                if (mvme16x_config & MVME16x_CONFIG_NO_ETHERNET) {
1183                        printk(KERN_NOTICE "Ethernet probe disabled - chip not present\n");
1184                        err = -ENODEV;
1185                        goto out;
1186                }
1187                memcpy(eth_addr, (void *) 0xfffc1f2c, 6);       /* YUCK! Get addr from NOVRAM */
1188                dev->base_addr = MVME_I596_BASE;
1189                dev->irq = (unsigned) MVME16x_IRQ_I596;
1190                goto found;
1191        }
1192#endif
1193#ifdef ENABLE_BVME6000_NET
1194        if (MACH_IS_BVME6000) {
1195                volatile unsigned char *rtc = (unsigned char *) BVME_RTC_BASE;
1196                unsigned char msr = rtc[3];
1197                int i;
1198
1199                rtc[3] |= 0x80;
1200                for (i = 0; i < 6; i++)
1201                        eth_addr[i] = rtc[i * 4 + 7];   /* Stored in RTC RAM at offset 1 */
1202                rtc[3] = msr;
1203                dev->base_addr = BVME_I596_BASE;
1204                dev->irq = (unsigned) BVME_IRQ_I596;
1205                goto found;
1206        }
1207#endif
1208#ifdef ENABLE_APRICOT
1209        {
1210                int checksum = 0;
1211                int ioaddr = 0x300;
1212
1213                /* this is easy the ethernet interface can only be at 0x300 */
1214                /* first check nothing is already registered here */
1215
1216                if (!request_region(ioaddr, I596_TOTAL_SIZE, DRV_NAME)) {
1217                        printk(KERN_ERR "82596: IO address 0x%04x in use\n", ioaddr);
1218                        err = -EBUSY;
1219                        goto out;
1220                }
1221
1222                dev->base_addr = ioaddr;
1223
1224                for (i = 0; i < 8; i++) {
1225                        eth_addr[i] = inb(ioaddr + 8 + i);
1226                        checksum += eth_addr[i];
1227                }
1228
1229                /* checksum is a multiple of 0x100, got this wrong first time
1230                   some machines have 0x100, some 0x200. The DOS driver doesn't
1231                   even bother with the checksum.
1232                   Some other boards trip the checksum.. but then appear as
1233                   ether address 0. Trap these - AC */
1234
1235                if ((checksum % 0x100) ||
1236                    (memcmp(eth_addr, "\x00\x00\x49", 3) != 0)) {
1237                        err = -ENODEV;
1238                        goto out1;
1239                }
1240
1241                dev->irq = 10;
1242                goto found;
1243        }
1244#endif
1245        err = -ENODEV;
1246        goto out;
1247
1248found:
1249        dev->mem_start = (int)__get_free_pages(GFP_ATOMIC, 0);
1250        if (!dev->mem_start) {
1251                err = -ENOMEM;
1252                goto out1;
1253        }
1254
1255        DEB(DEB_PROBE,printk(KERN_INFO "%s: 82596 at %#3lx,", dev->name, dev->base_addr));
1256
1257        for (i = 0; i < 6; i++)
1258                DEB(DEB_PROBE,printk(" %2.2X", dev->dev_addr[i] = eth_addr[i]));
1259
1260        DEB(DEB_PROBE,printk(" IRQ %d.\n", dev->irq));
1261
1262        DEB(DEB_PROBE,printk(KERN_INFO "%s", version));
1263
1264        /* The 82596-specific entries in the device structure. */
1265        dev->netdev_ops = &i596_netdev_ops;
1266        dev->watchdog_timeo = TX_TIMEOUT;
1267
1268        dev->ml_priv = (void *)(dev->mem_start);
1269
1270        lp = dev->ml_priv;
1271        DEB(DEB_INIT,printk(KERN_DEBUG "%s: lp at 0x%08lx (%zd bytes), "
1272                        "lp->scb at 0x%08lx\n",
1273                        dev->name, (unsigned long)lp,
1274                        sizeof(struct i596_private), (unsigned long)&lp->scb));
1275        memset((void *) lp, 0, sizeof(struct i596_private));
1276
1277#ifdef __mc68000__
1278        cache_push(virt_to_phys((void *)(dev->mem_start)), 4096);
1279        cache_clear(virt_to_phys((void *)(dev->mem_start)), 4096);
1280        kernel_set_cachemode((void *)(dev->mem_start), 4096, IOMAP_NOCACHE_SER);
1281#endif
1282        lp->scb.command = 0;
1283        lp->scb.cmd = I596_NULL;
1284        lp->scb.rfd = I596_NULL;
1285        spin_lock_init(&lp->lock);
1286
1287        err = register_netdev(dev);
1288        if (err)
1289                goto out2;
1290        return dev;
1291out2:
1292#ifdef __mc68000__
1293        /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING,
1294         * XXX which may be invalid (CONFIG_060_WRITETHROUGH)
1295         */
1296        kernel_set_cachemode((void *)(dev->mem_start), 4096,
1297                        IOMAP_FULL_CACHING);
1298#endif
1299        free_page ((u32)(dev->mem_start));
1300out1:
1301#ifdef ENABLE_APRICOT
1302        release_region(dev->base_addr, I596_TOTAL_SIZE);
1303#endif
1304out:
1305        free_netdev(dev);
1306        return ERR_PTR(err);
1307}
1308
1309static irqreturn_t i596_interrupt(int irq, void *dev_id)
1310{
1311        struct net_device *dev = dev_id;
1312        struct i596_private *lp;
1313        short ioaddr;
1314        unsigned short status, ack_cmd = 0;
1315        int handled = 0;
1316
1317#ifdef ENABLE_BVME6000_NET
1318        if (MACH_IS_BVME6000) {
1319                if (*(char *) BVME_LOCAL_IRQ_STAT & BVME_ETHERR) {
1320                        i596_error(irq, dev_id);
1321                        return IRQ_HANDLED;
1322                }
1323        }
1324#endif
1325        if (dev == NULL) {
1326                printk(KERN_ERR "i596_interrupt(): irq %d for unknown device.\n", irq);
1327                return IRQ_NONE;
1328        }
1329
1330        ioaddr = dev->base_addr;
1331        lp = dev->ml_priv;
1332
1333        spin_lock (&lp->lock);
1334
1335        wait_cmd(dev,lp,100,"i596 interrupt, timeout");
1336        status = lp->scb.status;
1337
1338        DEB(DEB_INTS,printk(KERN_DEBUG "%s: i596 interrupt, IRQ %d, status %4.4x.\n",
1339                        dev->name, irq, status));
1340
1341        ack_cmd = status & 0xf000;
1342
1343        if ((status & 0x8000) || (status & 0x2000)) {
1344                struct i596_cmd *ptr;
1345
1346                handled = 1;
1347                if ((status & 0x8000))
1348                        DEB(DEB_INTS,printk(KERN_DEBUG "%s: i596 interrupt completed command.\n", dev->name));
1349                if ((status & 0x2000))
1350                        DEB(DEB_INTS,printk(KERN_DEBUG "%s: i596 interrupt command unit inactive %x.\n", dev->name, status & 0x0700));
1351
1352                while ((lp->cmd_head != I596_NULL) && (lp->cmd_head->status & STAT_C)) {
1353                        ptr = lp->cmd_head;
1354
1355                        DEB(DEB_STATUS,printk(KERN_DEBUG "cmd_head->status = %04x, ->command = %04x\n",
1356                                       lp->cmd_head->status, lp->cmd_head->command));
1357                        lp->cmd_head = ptr->v_next;
1358                        lp->cmd_backlog--;
1359
1360                        switch ((ptr->command) & 0x7) {
1361                        case CmdTx:
1362                            {
1363                                struct tx_cmd *tx_cmd = (struct tx_cmd *) ptr;
1364                                struct sk_buff *skb = tx_cmd->skb;
1365
1366                                if ((ptr->status) & STAT_OK) {
1367                                        DEB(DEB_TXADDR,print_eth(skb->data, "tx-done"));
1368                                } else {
1369                                        dev->stats.tx_errors++;
1370                                        if ((ptr->status) & 0x0020)
1371                                                dev->stats.collisions++;
1372                                        if (!((ptr->status) & 0x0040))
1373                                                dev->stats.tx_heartbeat_errors++;
1374                                        if ((ptr->status) & 0x0400)
1375                                                dev->stats.tx_carrier_errors++;
1376                                        if ((ptr->status) & 0x0800)
1377                                                dev->stats.collisions++;
1378                                        if ((ptr->status) & 0x1000)
1379                                                dev->stats.tx_aborted_errors++;
1380                                }
1381
1382                                dev_kfree_skb_irq(skb);
1383
1384                                tx_cmd->cmd.command = 0; /* Mark free */
1385                                break;
1386                            }
1387                        case CmdTDR:
1388                            {
1389                                unsigned short status = ((struct tdr_cmd *)ptr)->status;
1390
1391                                if (status & 0x8000) {
1392                                        DEB(DEB_TDR,printk(KERN_INFO "%s: link ok.\n", dev->name));
1393                                } else {
1394                                        if (status & 0x4000)
1395                                                printk(KERN_ERR "%s: Transceiver problem.\n", dev->name);
1396                                        if (status & 0x2000)
1397                                                printk(KERN_ERR "%s: Termination problem.\n", dev->name);
1398                                        if (status & 0x1000)
1399                                                printk(KERN_ERR "%s: Short circuit.\n", dev->name);
1400
1401                                        DEB(DEB_TDR,printk(KERN_INFO "%s: Time %d.\n", dev->name, status & 0x07ff));
1402                                }
1403                                break;
1404                            }
1405                        case CmdConfigure:
1406                        case CmdMulticastList:
1407                                /* Zap command so set_multicast_list() knows it is free */
1408                                ptr->command = 0;
1409                                break;
1410                        }
1411                        ptr->v_next = ptr->b_next = I596_NULL;
1412                        lp->last_cmd = jiffies;
1413                }
1414
1415                ptr = lp->cmd_head;
1416                while ((ptr != I596_NULL) && (ptr != lp->cmd_tail)) {
1417                        ptr->command &= 0x1fff;
1418                        ptr = ptr->v_next;
1419                }
1420
1421                if ((lp->cmd_head != I596_NULL))
1422                        ack_cmd |= CUC_START;
1423                lp->scb.cmd = WSWAPcmd(virt_to_bus(&lp->cmd_head->status));
1424        }
1425        if ((status & 0x1000) || (status & 0x4000)) {
1426                if ((status & 0x4000))
1427                        DEB(DEB_INTS,printk(KERN_DEBUG "%s: i596 interrupt received a frame.\n", dev->name));
1428                i596_rx(dev);
1429                /* Only RX_START if stopped - RGH 07-07-96 */
1430                if (status & 0x1000) {
1431                        if (netif_running(dev)) {
1432                                DEB(DEB_ERRORS,printk(KERN_ERR "%s: i596 interrupt receive unit inactive, status 0x%x\n", dev->name, status));
1433                                ack_cmd |= RX_START;
1434                                dev->stats.rx_errors++;
1435                                dev->stats.rx_fifo_errors++;
1436                                rebuild_rx_bufs(dev);
1437                        }
1438                }
1439        }
1440        wait_cmd(dev,lp,100,"i596 interrupt, timeout");
1441        lp->scb.command = ack_cmd;
1442
1443#ifdef ENABLE_MVME16x_NET
1444        if (MACH_IS_MVME16x) {
1445                /* Ack the interrupt */
1446
1447                volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000;
1448
1449                pcc2[0x2a] |= 0x08;
1450        }
1451#endif
1452#ifdef ENABLE_BVME6000_NET
1453        if (MACH_IS_BVME6000) {
1454                volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG;
1455
1456                *ethirq = 1;
1457                *ethirq = 3;
1458        }
1459#endif
1460#ifdef ENABLE_APRICOT
1461        (void) inb(ioaddr + 0x10);
1462        outb(4, ioaddr + 0xf);
1463#endif
1464        CA(dev);
1465
1466        DEB(DEB_INTS,printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name));
1467
1468        spin_unlock (&lp->lock);
1469        return IRQ_RETVAL(handled);
1470}
1471
1472static int i596_close(struct net_device *dev)
1473{
1474        struct i596_private *lp = dev->ml_priv;
1475        unsigned long flags;
1476
1477        netif_stop_queue(dev);
1478
1479        DEB(DEB_INIT,printk(KERN_DEBUG "%s: Shutting down ethercard, status was %4.4x.\n",
1480                       dev->name, lp->scb.status));
1481
1482        spin_lock_irqsave(&lp->lock, flags);
1483
1484        wait_cmd(dev,lp,100,"close1 timed out");
1485        lp->scb.command = CUC_ABORT | RX_ABORT;
1486        CA(dev);
1487
1488        wait_cmd(dev,lp,100,"close2 timed out");
1489
1490        spin_unlock_irqrestore(&lp->lock, flags);
1491        DEB(DEB_STRUCT,i596_display_data(dev));
1492        i596_cleanup_cmd(dev,lp);
1493
1494#ifdef ENABLE_MVME16x_NET
1495        if (MACH_IS_MVME16x) {
1496                volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000;
1497
1498                /* Disable all ints */
1499                pcc2[0x28] = 1;
1500                pcc2[0x2a] = 0x40;
1501                pcc2[0x2b] = 0x40;      /* Set snooping bits now! */
1502        }
1503#endif
1504#ifdef ENABLE_BVME6000_NET
1505        if (MACH_IS_BVME6000) {
1506                volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG;
1507
1508                *ethirq = 1;
1509        }
1510#endif
1511
1512#ifdef ENABLE_MVME16x_NET
1513        free_irq(0x56, dev);
1514#endif
1515        free_irq(dev->irq, dev);
1516        remove_rx_bufs(dev);
1517
1518        return 0;
1519}
1520
1521/*
1522 *    Set or clear the multicast filter for this adaptor.
1523 */
1524
1525static void set_multicast_list(struct net_device *dev)
1526{
1527        struct i596_private *lp = dev->ml_priv;
1528        int config = 0, cnt;
1529
1530        DEB(DEB_MULTI,printk(KERN_DEBUG "%s: set multicast list, %d entries, promisc %s, allmulti %s\n",
1531                dev->name, netdev_mc_count(dev),
1532                dev->flags & IFF_PROMISC  ? "ON" : "OFF",
1533                dev->flags & IFF_ALLMULTI ? "ON" : "OFF"));
1534
1535        if (wait_cfg(dev, &lp->cf_cmd.cmd, 1000, "config change request timed out"))
1536                return;
1537
1538        if ((dev->flags & IFF_PROMISC) && !(lp->cf_cmd.i596_config[8] & 0x01)) {
1539                lp->cf_cmd.i596_config[8] |= 0x01;
1540                config = 1;
1541        }
1542        if (!(dev->flags & IFF_PROMISC) && (lp->cf_cmd.i596_config[8] & 0x01)) {
1543                lp->cf_cmd.i596_config[8] &= ~0x01;
1544                config = 1;
1545        }
1546        if ((dev->flags & IFF_ALLMULTI) && (lp->cf_cmd.i596_config[11] & 0x20)) {
1547                lp->cf_cmd.i596_config[11] &= ~0x20;
1548                config = 1;
1549        }
1550        if (!(dev->flags & IFF_ALLMULTI) && !(lp->cf_cmd.i596_config[11] & 0x20)) {
1551                lp->cf_cmd.i596_config[11] |= 0x20;
1552                config = 1;
1553        }
1554        if (config) {
1555                lp->cf_cmd.cmd.command = CmdConfigure;
1556                i596_add_cmd(dev, &lp->cf_cmd.cmd);
1557        }
1558
1559        cnt = netdev_mc_count(dev);
1560        if (cnt > MAX_MC_CNT)
1561        {
1562                cnt = MAX_MC_CNT;
1563                printk(KERN_ERR "%s: Only %d multicast addresses supported",
1564                        dev->name, cnt);
1565        }
1566
1567        if (!netdev_mc_empty(dev)) {
1568                struct netdev_hw_addr *ha;
1569                unsigned char *cp;
1570                struct mc_cmd *cmd;
1571
1572                if (wait_cfg(dev, &lp->mc_cmd.cmd, 1000, "multicast list change request timed out"))
1573                        return;
1574                cmd = &lp->mc_cmd;
1575                cmd->cmd.command = CmdMulticastList;
1576                cmd->mc_cnt = cnt * ETH_ALEN;
1577                cp = cmd->mc_addrs;
1578                netdev_for_each_mc_addr(ha, dev) {
1579                        if (!cnt--)
1580                                break;
1581                        memcpy(cp, ha->addr, ETH_ALEN);
1582                        if (i596_debug > 1)
1583                                DEB(DEB_MULTI,printk(KERN_INFO "%s: Adding address %pM\n",
1584                                                dev->name, cp));
1585                        cp += ETH_ALEN;
1586                }
1587                i596_add_cmd(dev, &cmd->cmd);
1588        }
1589}
1590
1591#ifdef MODULE
1592static struct net_device *dev_82596;
1593
1594#ifdef ENABLE_APRICOT
1595module_param(irq, int, 0);
1596MODULE_PARM_DESC(irq, "Apricot IRQ number");
1597#endif
1598
1599static int debug = -1;
1600module_param(debug, int, 0);
1601MODULE_PARM_DESC(debug, "i82596 debug mask");
1602
1603int __init init_module(void)
1604{
1605        if (debug >= 0)
1606                i596_debug = debug;
1607        dev_82596 = i82596_probe(-1);
1608        if (IS_ERR(dev_82596))
1609                return PTR_ERR(dev_82596);
1610        return 0;
1611}
1612
1613void __exit cleanup_module(void)
1614{
1615        unregister_netdev(dev_82596);
1616#ifdef __mc68000__
1617        /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING,
1618         * XXX which may be invalid (CONFIG_060_WRITETHROUGH)
1619         */
1620
1621        kernel_set_cachemode((void *)(dev_82596->mem_start), 4096,
1622                        IOMAP_FULL_CACHING);
1623#endif
1624        free_page ((u32)(dev_82596->mem_start));
1625#ifdef ENABLE_APRICOT
1626        /* If we don't do this, we can't re-insmod it later. */
1627        release_region(dev_82596->base_addr, I596_TOTAL_SIZE);
1628#endif
1629        free_netdev(dev_82596);
1630}
1631
1632#endif                          /* MODULE */
1633