linux/drivers/net/ethernet/hp/hp100.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3** hp100.c
   4** HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters
   5**
   6** $Id: hp100.c,v 1.58 2001/09/24 18:03:01 perex Exp perex $
   7**
   8** Based on the HP100 driver written by Jaroslav Kysela <perex@jcu.cz>
   9** Extended for new busmaster capable chipsets by
  10** Siegfried "Frieder" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>
  11**
  12** Maintained by: Jaroslav Kysela <perex@perex.cz>
  13**
  14** This driver has only been tested with
  15** -- HP J2585B 10/100 Mbit/s PCI Busmaster
  16** -- HP J2585A 10/100 Mbit/s PCI
  17** -- HP J2970A 10 Mbit/s PCI Combo 10base-T/BNC
  18** -- HP J2973A 10 Mbit/s PCI 10base-T
  19** -- HP J2573  10/100 ISA
  20** -- Compex ReadyLink ENET100-VG4  10/100 Mbit/s PCI / EISA
  21** -- Compex FreedomLine 100/VG  10/100 Mbit/s ISA / EISA / PCI
  22**
  23** but it should also work with the other CASCADE based adapters.
  24**
  25** TODO:
  26**       -  J2573 seems to hang sometimes when in shared memory mode.
  27**       -  Mode for Priority TX
  28**       -  Check PCI registers, performance might be improved?
  29**       -  To reduce interrupt load in busmaster, one could switch off
  30**          the interrupts that are used to refill the queues whenever the
  31**          queues are filled up to more than a certain threshold.
  32**       -  some updates for EISA version of card
  33**
  34**
  35**
  36** 1.57c -> 1.58
  37**   - used indent to change coding-style
  38**   - added KTI DP-200 EISA ID
  39**   - ioremap is also used for low (<1MB) memory (multi-architecture support)
  40**
  41** 1.57b -> 1.57c - Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  42**   - release resources on failure in init_module
  43**
  44** 1.57 -> 1.57b - Jean II
  45**   - fix spinlocks, SMP is now working !
  46**
  47** 1.56 -> 1.57
  48**   - updates for new PCI interface for 2.1 kernels
  49**
  50** 1.55 -> 1.56
  51**   - removed printk in misc. interrupt and update statistics to allow
  52**     monitoring of card status
  53**   - timing changes in xmit routines, relogin to 100VG hub added when
  54**     driver does reset
  55**   - included fix for Compex FreedomLine PCI adapter
  56**
  57** 1.54 -> 1.55
  58**   - fixed bad initialization in init_module
  59**   - added Compex FreedomLine adapter
  60**   - some fixes in card initialization
  61**
  62** 1.53 -> 1.54
  63**   - added hardware multicast filter support (doesn't work)
  64**   - little changes in hp100_sense_lan routine
  65**     - added support for Coax and AUI (J2970)
  66**   - fix for multiple cards and hp100_mode parameter (insmod)
  67**   - fix for shared IRQ
  68**
  69** 1.52 -> 1.53
  70**   - fixed bug in multicast support
  71**
  72*/
  73
  74#define HP100_DEFAULT_PRIORITY_TX 0
  75
  76#undef HP100_DEBUG
  77#undef HP100_DEBUG_B            /* Trace  */
  78#undef HP100_DEBUG_BM           /* Debug busmaster code (PDL stuff) */
  79
  80#undef HP100_DEBUG_TRAINING     /* Debug login-to-hub procedure */
  81#undef HP100_DEBUG_TX
  82#undef HP100_DEBUG_IRQ
  83#undef HP100_DEBUG_RX
  84
  85#undef HP100_MULTICAST_FILTER   /* Need to be debugged... */
  86
  87#include <linux/module.h>
  88#include <linux/kernel.h>
  89#include <linux/sched.h>
  90#include <linux/string.h>
  91#include <linux/errno.h>
  92#include <linux/ioport.h>
  93#include <linux/interrupt.h>
  94#include <linux/eisa.h>
  95#include <linux/pci.h>
  96#include <linux/dma-mapping.h>
  97#include <linux/spinlock.h>
  98#include <linux/netdevice.h>
  99#include <linux/etherdevice.h>
 100#include <linux/skbuff.h>
 101#include <linux/types.h>
 102#include <linux/delay.h>
 103#include <linux/init.h>
 104#include <linux/bitops.h>
 105#include <linux/jiffies.h>
 106
 107#include <asm/io.h>
 108
 109#include "hp100.h"
 110
 111/*
 112 *  defines
 113 */
 114
 115#define HP100_BUS_ISA     0
 116#define HP100_BUS_EISA    1
 117#define HP100_BUS_PCI     2
 118
 119#define HP100_REGION_SIZE       0x20    /* for ioports */
 120#define HP100_SIG_LEN           8       /* same as EISA_SIG_LEN */
 121
 122#define HP100_MAX_PACKET_SIZE   (1536+4)
 123#define HP100_MIN_PACKET_SIZE   60
 124
 125#ifndef HP100_DEFAULT_RX_RATIO
 126/* default - 75% onboard memory on the card are used for RX packets */
 127#define HP100_DEFAULT_RX_RATIO  75
 128#endif
 129
 130#ifndef HP100_DEFAULT_PRIORITY_TX
 131/* default - don't enable transmit outgoing packets as priority */
 132#define HP100_DEFAULT_PRIORITY_TX 0
 133#endif
 134
 135/*
 136 *  structures
 137 */
 138
 139struct hp100_private {
 140        spinlock_t lock;
 141        char id[HP100_SIG_LEN];
 142        u_short chip;
 143        u_short soft_model;
 144        u_int memory_size;
 145        u_int virt_memory_size;
 146        u_short rx_ratio;       /* 1 - 99 */
 147        u_short priority_tx;    /* != 0 - priority tx */
 148        u_short mode;           /* PIO, Shared Mem or Busmaster */
 149        u_char bus;
 150        struct pci_dev *pci_dev;
 151        short mem_mapped;       /* memory mapped access */
 152        void __iomem *mem_ptr_virt;     /* virtual memory mapped area, maybe NULL */
 153        unsigned long mem_ptr_phys;     /* physical memory mapped area */
 154        short lan_type;         /* 10Mb/s, 100Mb/s or -1 (error) */
 155        int hub_status;         /* was login to hub successful? */
 156        u_char mac1_mode;
 157        u_char mac2_mode;
 158        u_char hash_bytes[8];
 159
 160        /* Rings for busmaster mode: */
 161        hp100_ring_t *rxrhead;  /* Head (oldest) index into rxring */
 162        hp100_ring_t *rxrtail;  /* Tail (newest) index into rxring */
 163        hp100_ring_t *txrhead;  /* Head (oldest) index into txring */
 164        hp100_ring_t *txrtail;  /* Tail (newest) index into txring */
 165
 166        hp100_ring_t rxring[MAX_RX_PDL];
 167        hp100_ring_t txring[MAX_TX_PDL];
 168
 169        u_int *page_vaddr_algn; /* Aligned virtual address of allocated page */
 170        u_long whatever_offset; /* Offset to bus/phys/dma address */
 171        int rxrcommit;          /* # Rx PDLs committed to adapter */
 172        int txrcommit;          /* # Tx PDLs committed to adapter */
 173};
 174
 175/*
 176 *  variables
 177 */
 178#ifdef CONFIG_ISA
 179static const char *hp100_isa_tbl[] = {
 180        "HWPF150", /* HP J2573 rev A */
 181        "HWP1950", /* HP J2573 */
 182};
 183#endif
 184
 185static const struct eisa_device_id hp100_eisa_tbl[] = {
 186        { "HWPF180" }, /* HP J2577 rev A */
 187        { "HWP1920" }, /* HP 27248B */
 188        { "HWP1940" }, /* HP J2577 */
 189        { "HWP1990" }, /* HP J2577 */
 190        { "CPX0301" }, /* ReadyLink ENET100-VG4 */
 191        { "CPX0401" }, /* FreedomLine 100/VG */
 192        { "" }         /* Mandatory final entry ! */
 193};
 194MODULE_DEVICE_TABLE(eisa, hp100_eisa_tbl);
 195
 196static const struct pci_device_id hp100_pci_tbl[] = {
 197        {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A, PCI_ANY_ID, PCI_ANY_ID,},
 198        {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B, PCI_ANY_ID, PCI_ANY_ID,},
 199        {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2970A, PCI_ANY_ID, PCI_ANY_ID,},
 200        {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2973A, PCI_ANY_ID, PCI_ANY_ID,},
 201        {PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4, PCI_ANY_ID, PCI_ANY_ID,},
 202        {PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG, PCI_ANY_ID, PCI_ANY_ID,},
 203/*      {PCI_VENDOR_ID_KTI, PCI_DEVICE_ID_KTI_DP200, PCI_ANY_ID, PCI_ANY_ID }, */
 204        {}                      /* Terminating entry */
 205};
 206MODULE_DEVICE_TABLE(pci, hp100_pci_tbl);
 207
 208static int hp100_rx_ratio = HP100_DEFAULT_RX_RATIO;
 209static int hp100_priority_tx = HP100_DEFAULT_PRIORITY_TX;
 210static int hp100_mode = 1;
 211
 212module_param(hp100_rx_ratio, int, 0);
 213module_param(hp100_priority_tx, int, 0);
 214module_param(hp100_mode, int, 0);
 215
 216/*
 217 *  prototypes
 218 */
 219
 220static int hp100_probe1(struct net_device *dev, int ioaddr, u_char bus,
 221                        struct pci_dev *pci_dev);
 222
 223
 224static int hp100_open(struct net_device *dev);
 225static int hp100_close(struct net_device *dev);
 226static netdev_tx_t hp100_start_xmit(struct sk_buff *skb,
 227                                    struct net_device *dev);
 228static netdev_tx_t hp100_start_xmit_bm(struct sk_buff *skb,
 229                                       struct net_device *dev);
 230static void hp100_rx(struct net_device *dev);
 231static struct net_device_stats *hp100_get_stats(struct net_device *dev);
 232static void hp100_misc_interrupt(struct net_device *dev);
 233static void hp100_update_stats(struct net_device *dev);
 234static void hp100_clear_stats(struct hp100_private *lp, int ioaddr);
 235static void hp100_set_multicast_list(struct net_device *dev);
 236static irqreturn_t hp100_interrupt(int irq, void *dev_id);
 237static void hp100_start_interface(struct net_device *dev);
 238static void hp100_stop_interface(struct net_device *dev);
 239static void hp100_load_eeprom(struct net_device *dev, u_short ioaddr);
 240static int hp100_sense_lan(struct net_device *dev);
 241static int hp100_login_to_vg_hub(struct net_device *dev,
 242                                 u_short force_relogin);
 243static int hp100_down_vg_link(struct net_device *dev);
 244static void hp100_cascade_reset(struct net_device *dev, u_short enable);
 245static void hp100_BM_shutdown(struct net_device *dev);
 246static void hp100_mmuinit(struct net_device *dev);
 247static void hp100_init_pdls(struct net_device *dev);
 248static int hp100_init_rxpdl(struct net_device *dev,
 249                            register hp100_ring_t * ringptr,
 250                            register u_int * pdlptr);
 251static int hp100_init_txpdl(struct net_device *dev,
 252                            register hp100_ring_t * ringptr,
 253                            register u_int * pdlptr);
 254static void hp100_rxfill(struct net_device *dev);
 255static void hp100_hwinit(struct net_device *dev);
 256static void hp100_clean_txring(struct net_device *dev);
 257#ifdef HP100_DEBUG
 258static void hp100_RegisterDump(struct net_device *dev);
 259#endif
 260
 261/* Conversion to new PCI API :
 262 * Convert an address in a kernel buffer to a bus/phys/dma address.
 263 * This work *only* for memory fragments part of lp->page_vaddr,
 264 * because it was properly DMA allocated via pci_alloc_consistent(),
 265 * so we just need to "retrieve" the original mapping to bus/phys/dma
 266 * address - Jean II */
 267static inline dma_addr_t virt_to_whatever(struct net_device *dev, u32 * ptr)
 268{
 269        struct hp100_private *lp = netdev_priv(dev);
 270        return ((u_long) ptr) + lp->whatever_offset;
 271}
 272
 273static inline u_int pdl_map_data(struct hp100_private *lp, void *data)
 274{
 275        return pci_map_single(lp->pci_dev, data,
 276                              MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE);
 277}
 278
 279/* TODO: This function should not really be needed in a good design... */
 280static void wait(void)
 281{
 282        mdelay(1);
 283}
 284
 285/*
 286 *  probe functions
 287 *  These functions should - if possible - avoid doing write operations
 288 *  since this could cause problems when the card is not installed.
 289 */
 290
 291/*
 292 * Read board id and convert to string.
 293 * Effectively same code as decode_eisa_sig
 294 */
 295static const char *hp100_read_id(int ioaddr)
 296{
 297        int i;
 298        static char str[HP100_SIG_LEN];
 299        unsigned char sig[4], sum;
 300        unsigned short rev;
 301
 302        hp100_page(ID_MAC_ADDR);
 303        sum = 0;
 304        for (i = 0; i < 4; i++) {
 305                sig[i] = hp100_inb(BOARD_ID + i);
 306                sum += sig[i];
 307        }
 308
 309        sum += hp100_inb(BOARD_ID + i);
 310        if (sum != 0xff)
 311                return NULL;    /* bad checksum */
 312
 313        str[0] = ((sig[0] >> 2) & 0x1f) + ('A' - 1);
 314        str[1] = (((sig[0] & 3) << 3) | (sig[1] >> 5)) + ('A' - 1);
 315        str[2] = (sig[1] & 0x1f) + ('A' - 1);
 316        rev = (sig[2] << 8) | sig[3];
 317        sprintf(str + 3, "%04X", rev);
 318
 319        return str;
 320}
 321
 322#ifdef CONFIG_ISA
 323static __init int hp100_isa_probe1(struct net_device *dev, int ioaddr)
 324{
 325        const char *sig;
 326        int i;
 327
 328        if (!request_region(ioaddr, HP100_REGION_SIZE, "hp100"))
 329                goto err;
 330
 331        if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE) {
 332                release_region(ioaddr, HP100_REGION_SIZE);
 333                goto err;
 334        }
 335
 336        sig = hp100_read_id(ioaddr);
 337        release_region(ioaddr, HP100_REGION_SIZE);
 338
 339        if (sig == NULL)
 340                goto err;
 341
 342        for (i = 0; i < ARRAY_SIZE(hp100_isa_tbl); i++) {
 343                if (!strcmp(hp100_isa_tbl[i], sig))
 344                        break;
 345
 346        }
 347
 348        if (i < ARRAY_SIZE(hp100_isa_tbl))
 349                return hp100_probe1(dev, ioaddr, HP100_BUS_ISA, NULL);
 350 err:
 351        return -ENODEV;
 352
 353}
 354/*
 355 * Probe for ISA board.
 356 * EISA and PCI are handled by device infrastructure.
 357 */
 358
 359static int  __init hp100_isa_probe(struct net_device *dev, int addr)
 360{
 361        int err = -ENODEV;
 362
 363        /* Probe for a specific ISA address */
 364        if (addr > 0xff && addr < 0x400)
 365                err = hp100_isa_probe1(dev, addr);
 366
 367        else if (addr != 0)
 368                err = -ENXIO;
 369
 370        else {
 371                /* Probe all ISA possible port regions */
 372                for (addr = 0x100; addr < 0x400; addr += 0x20) {
 373                        err = hp100_isa_probe1(dev, addr);
 374                        if (!err)
 375                                break;
 376                }
 377        }
 378        return err;
 379}
 380#endif /* CONFIG_ISA */
 381
 382#if !defined(MODULE) && defined(CONFIG_ISA)
 383struct net_device * __init hp100_probe(int unit)
 384{
 385        struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
 386        int err;
 387
 388        if (!dev)
 389                return ERR_PTR(-ENODEV);
 390
 391#ifdef HP100_DEBUG_B
 392        hp100_outw(0x4200, TRACE);
 393        printk("hp100: %s: probe\n", dev->name);
 394#endif
 395
 396        if (unit >= 0) {
 397                sprintf(dev->name, "eth%d", unit);
 398                netdev_boot_setup_check(dev);
 399        }
 400
 401        err = hp100_isa_probe(dev, dev->base_addr);
 402        if (err)
 403                goto out;
 404
 405        return dev;
 406 out:
 407        free_netdev(dev);
 408        return ERR_PTR(err);
 409}
 410#endif /* !MODULE && CONFIG_ISA */
 411
 412static const struct net_device_ops hp100_bm_netdev_ops = {
 413        .ndo_open               = hp100_open,
 414        .ndo_stop               = hp100_close,
 415        .ndo_start_xmit         = hp100_start_xmit_bm,
 416        .ndo_get_stats          = hp100_get_stats,
 417        .ndo_set_rx_mode        = hp100_set_multicast_list,
 418        .ndo_set_mac_address    = eth_mac_addr,
 419        .ndo_validate_addr      = eth_validate_addr,
 420};
 421
 422static const struct net_device_ops hp100_netdev_ops = {
 423        .ndo_open               = hp100_open,
 424        .ndo_stop               = hp100_close,
 425        .ndo_start_xmit         = hp100_start_xmit,
 426        .ndo_get_stats          = hp100_get_stats,
 427        .ndo_set_rx_mode        = hp100_set_multicast_list,
 428        .ndo_set_mac_address    = eth_mac_addr,
 429        .ndo_validate_addr      = eth_validate_addr,
 430};
 431
 432static int hp100_probe1(struct net_device *dev, int ioaddr, u_char bus,
 433                        struct pci_dev *pci_dev)
 434{
 435        int i;
 436        int err = -ENODEV;
 437        const char *eid;
 438        u_int chip;
 439        u_char uc;
 440        u_int memory_size = 0, virt_memory_size = 0;
 441        u_short local_mode, lsw;
 442        short mem_mapped;
 443        unsigned long mem_ptr_phys;
 444        void __iomem *mem_ptr_virt;
 445        struct hp100_private *lp;
 446
 447#ifdef HP100_DEBUG_B
 448        hp100_outw(0x4201, TRACE);
 449        printk("hp100: %s: probe1\n", dev->name);
 450#endif
 451
 452        /* memory region for programmed i/o */
 453        if (!request_region(ioaddr, HP100_REGION_SIZE, "hp100"))
 454                goto out1;
 455
 456        if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE)
 457                goto out2;
 458
 459        chip = hp100_inw(PAGING) & HP100_CHIPID_MASK;
 460#ifdef HP100_DEBUG
 461        if (chip == HP100_CHIPID_SHASTA)
 462                printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name);
 463        else if (chip == HP100_CHIPID_RAINIER)
 464                printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name);
 465        else if (chip == HP100_CHIPID_LASSEN)
 466                printk("hp100: %s: Lassen Chip detected.\n", dev->name);
 467        else
 468                printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n", dev->name, chip);
 469#endif
 470
 471        dev->base_addr = ioaddr;
 472
 473        eid = hp100_read_id(ioaddr);
 474        if (eid == NULL) {      /* bad checksum? */
 475                printk(KERN_WARNING "%s: bad ID checksum at base port 0x%x\n",
 476                       __func__, ioaddr);
 477                goto out2;
 478        }
 479
 480        hp100_page(ID_MAC_ADDR);
 481        for (i = uc = 0; i < 7; i++)
 482                uc += hp100_inb(LAN_ADDR + i);
 483        if (uc != 0xff) {
 484                printk(KERN_WARNING
 485                       "%s: bad lan address checksum at port 0x%x)\n",
 486                       __func__, ioaddr);
 487                err = -EIO;
 488                goto out2;
 489        }
 490
 491        /* Make sure, that all registers are correctly updated... */
 492
 493        hp100_load_eeprom(dev, ioaddr);
 494        wait();
 495
 496        /*
 497         * Determine driver operation mode
 498         *
 499         * Use the variable "hp100_mode" upon insmod or as kernel parameter to
 500         * force driver modes:
 501         * hp100_mode=1 -> default, use busmaster mode if configured.
 502         * hp100_mode=2 -> enable shared memory mode
 503         * hp100_mode=3 -> force use of i/o mapped mode.
 504         * hp100_mode=4 -> same as 1, but re-set the enable bit on the card.
 505         */
 506
 507        /*
 508         * LSW values:
 509         *   0x2278 -> J2585B, PnP shared memory mode
 510         *   0x2270 -> J2585B, shared memory mode, 0xdc000
 511         *   0xa23c -> J2585B, I/O mapped mode
 512         *   0x2240 -> EISA COMPEX, BusMaster (Shasta Chip)
 513         *   0x2220 -> EISA HP, I/O (Shasta Chip)
 514         *   0x2260 -> EISA HP, BusMaster (Shasta Chip)
 515         */
 516
 517#if 0
 518        local_mode = 0x2270;
 519        hp100_outw(0xfefe, OPTION_LSW);
 520        hp100_outw(local_mode | HP100_SET_LB | HP100_SET_HB, OPTION_LSW);
 521#endif
 522
 523        /* hp100_mode value maybe used in future by another card */
 524        local_mode = hp100_mode;
 525        if (local_mode < 1 || local_mode > 4)
 526                local_mode = 1; /* default */
 527#ifdef HP100_DEBUG
 528        printk("hp100: %s: original LSW = 0x%x\n", dev->name,
 529               hp100_inw(OPTION_LSW));
 530#endif
 531
 532        if (local_mode == 3) {
 533                hp100_outw(HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW);
 534                hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
 535                hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
 536                printk("hp100: IO mapped mode forced.\n");
 537        } else if (local_mode == 2) {
 538                hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
 539                hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
 540                hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
 541                printk("hp100: Shared memory mode requested.\n");
 542        } else if (local_mode == 4) {
 543                if (chip == HP100_CHIPID_LASSEN) {
 544                        hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_SET_HB, OPTION_LSW);
 545                        hp100_outw(HP100_IO_EN | HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW);
 546                        printk("hp100: Busmaster mode requested.\n");
 547                }
 548                local_mode = 1;
 549        }
 550
 551        if (local_mode == 1) {  /* default behaviour */
 552                lsw = hp100_inw(OPTION_LSW);
 553
 554                if ((lsw & HP100_IO_EN) && (~lsw & HP100_MEM_EN) &&
 555                    (~lsw & (HP100_BM_WRITE | HP100_BM_READ))) {
 556#ifdef HP100_DEBUG
 557                        printk("hp100: %s: IO_EN bit is set on card.\n", dev->name);
 558#endif
 559                        local_mode = 3;
 560                } else if (chip == HP100_CHIPID_LASSEN &&
 561                           (lsw & (HP100_BM_WRITE | HP100_BM_READ)) == (HP100_BM_WRITE | HP100_BM_READ)) {
 562                        /* Conversion to new PCI API :
 563                         * I don't have the doc, but I assume that the card
 564                         * can map the full 32bit address space.
 565                         * Also, we can have EISA Busmaster cards (not tested),
 566                         * so beware !!! - Jean II */
 567                        if((bus == HP100_BUS_PCI) &&
 568                           (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32)))) {
 569                                /* Gracefully fallback to shared memory */
 570                                goto busmasterfail;
 571                        }
 572                        printk("hp100: Busmaster mode enabled.\n");
 573                        hp100_outw(HP100_MEM_EN | HP100_IO_EN | HP100_RESET_LB, OPTION_LSW);
 574                } else {
 575                busmasterfail:
 576#ifdef HP100_DEBUG
 577                        printk("hp100: %s: Card not configured for BM or BM not supported with this card.\n", dev->name);
 578                        printk("hp100: %s: Trying shared memory mode.\n", dev->name);
 579#endif
 580                        /* In this case, try shared memory mode */
 581                        local_mode = 2;
 582                        hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
 583                        /* hp100_outw(HP100_IO_EN|HP100_RESET_LB, OPTION_LSW); */
 584                }
 585        }
 586#ifdef HP100_DEBUG
 587        printk("hp100: %s: new LSW = 0x%x\n", dev->name, hp100_inw(OPTION_LSW));
 588#endif
 589
 590        /* Check for shared memory on the card, eventually remap it */
 591        hp100_page(HW_MAP);
 592        mem_mapped = ((hp100_inw(OPTION_LSW) & (HP100_MEM_EN)) != 0);
 593        mem_ptr_phys = 0UL;
 594        mem_ptr_virt = NULL;
 595        memory_size = (8192 << ((hp100_inb(SRAM) >> 5) & 0x07));
 596        virt_memory_size = 0;
 597
 598        /* For memory mapped or busmaster mode, we want the memory address */
 599        if (mem_mapped || (local_mode == 1)) {
 600                mem_ptr_phys = (hp100_inw(MEM_MAP_LSW) | (hp100_inw(MEM_MAP_MSW) << 16));
 601                mem_ptr_phys &= ~0x1fff;        /* 8k alignment */
 602
 603                if (bus == HP100_BUS_ISA && (mem_ptr_phys & ~0xfffff) != 0) {
 604                        printk("hp100: Can only use programmed i/o mode.\n");
 605                        mem_ptr_phys = 0;
 606                        mem_mapped = 0;
 607                        local_mode = 3; /* Use programmed i/o */
 608                }
 609
 610                /* We do not need access to shared memory in busmaster mode */
 611                /* However in slave mode we need to remap high (>1GB) card memory  */
 612                if (local_mode != 1) {  /* = not busmaster */
 613                        /* We try with smaller memory sizes, if ioremap fails */
 614                        for (virt_memory_size = memory_size; virt_memory_size > 16383; virt_memory_size >>= 1) {
 615                                if ((mem_ptr_virt = ioremap((u_long) mem_ptr_phys, virt_memory_size)) == NULL) {
 616#ifdef HP100_DEBUG
 617                                        printk("hp100: %s: ioremap for 0x%x bytes high PCI memory at 0x%lx failed\n", dev->name, virt_memory_size, mem_ptr_phys);
 618#endif
 619                                } else {
 620#ifdef HP100_DEBUG
 621                                        printk("hp100: %s: remapped 0x%x bytes high PCI memory at 0x%lx to %p.\n", dev->name, virt_memory_size, mem_ptr_phys, mem_ptr_virt);
 622#endif
 623                                        break;
 624                                }
 625                        }
 626
 627                        if (mem_ptr_virt == NULL) {     /* all ioremap tries failed */
 628                                printk("hp100: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n");
 629                                local_mode = 3;
 630                                virt_memory_size = 0;
 631                        }
 632                }
 633        }
 634
 635        if (local_mode == 3) {  /* io mapped forced */
 636                mem_mapped = 0;
 637                mem_ptr_phys = 0;
 638                mem_ptr_virt = NULL;
 639                printk("hp100: Using (slow) programmed i/o mode.\n");
 640        }
 641
 642        /* Initialise the "private" data structure for this card. */
 643        lp = netdev_priv(dev);
 644
 645        spin_lock_init(&lp->lock);
 646        strlcpy(lp->id, eid, HP100_SIG_LEN);
 647        lp->chip = chip;
 648        lp->mode = local_mode;
 649        lp->bus = bus;
 650        lp->pci_dev = pci_dev;
 651        lp->priority_tx = hp100_priority_tx;
 652        lp->rx_ratio = hp100_rx_ratio;
 653        lp->mem_ptr_phys = mem_ptr_phys;
 654        lp->mem_ptr_virt = mem_ptr_virt;
 655        hp100_page(ID_MAC_ADDR);
 656        lp->soft_model = hp100_inb(SOFT_MODEL);
 657        lp->mac1_mode = HP100_MAC1MODE3;
 658        lp->mac2_mode = HP100_MAC2MODE3;
 659        memset(&lp->hash_bytes, 0x00, 8);
 660
 661        dev->base_addr = ioaddr;
 662
 663        lp->memory_size = memory_size;
 664        lp->virt_memory_size = virt_memory_size;
 665        lp->rx_ratio = hp100_rx_ratio;  /* can be conf'd with insmod */
 666
 667        if (lp->mode == 1)      /* busmaster */
 668                dev->netdev_ops = &hp100_bm_netdev_ops;
 669        else
 670                dev->netdev_ops = &hp100_netdev_ops;
 671
 672        /* Ask the card for which IRQ line it is configured */
 673        if (bus == HP100_BUS_PCI) {
 674                dev->irq = pci_dev->irq;
 675        } else {
 676                hp100_page(HW_MAP);
 677                dev->irq = hp100_inb(IRQ_CHANNEL) & HP100_IRQMASK;
 678                if (dev->irq == 2)
 679                        dev->irq = 9;
 680        }
 681
 682        if (lp->mode == 1)      /* busmaster */
 683                dev->dma = 4;
 684
 685        /* Ask the card for its MAC address and store it for later use. */
 686        hp100_page(ID_MAC_ADDR);
 687        for (i = uc = 0; i < 6; i++)
 688                dev->dev_addr[i] = hp100_inb(LAN_ADDR + i);
 689
 690        /* Reset statistics (counters) */
 691        hp100_clear_stats(lp, ioaddr);
 692
 693        /* If busmaster mode is wanted, a dma-capable memory area is needed for
 694         * the rx and tx PDLs
 695         * PCI cards can access the whole PC memory. Therefore GFP_DMA is not
 696         * needed for the allocation of the memory area.
 697         */
 698
 699        /* TODO: We do not need this with old cards, where PDLs are stored
 700         * in the cards shared memory area. But currently, busmaster has been
 701         * implemented/tested only with the lassen chip anyway... */
 702        if (lp->mode == 1) {    /* busmaster */
 703                dma_addr_t page_baddr;
 704                /* Get physically continuous memory for TX & RX PDLs    */
 705                /* Conversion to new PCI API :
 706                 * Pages are always aligned and zeroed, no need to it ourself.
 707                 * Doc says should be OK for EISA bus as well - Jean II */
 708                lp->page_vaddr_algn = pci_alloc_consistent(lp->pci_dev, MAX_RINGSIZE, &page_baddr);
 709                if (!lp->page_vaddr_algn) {
 710                        err = -ENOMEM;
 711                        goto out_mem_ptr;
 712                }
 713                lp->whatever_offset = ((u_long) page_baddr) - ((u_long) lp->page_vaddr_algn);
 714
 715#ifdef HP100_DEBUG_BM
 716                printk("hp100: %s: Reserved DMA memory from 0x%x to 0x%x\n", dev->name, (u_int) lp->page_vaddr_algn, (u_int) lp->page_vaddr_algn + MAX_RINGSIZE);
 717#endif
 718                lp->rxrcommit = lp->txrcommit = 0;
 719                lp->rxrhead = lp->rxrtail = &(lp->rxring[0]);
 720                lp->txrhead = lp->txrtail = &(lp->txring[0]);
 721        }
 722
 723        /* Initialise the card. */
 724        /* (I'm not really sure if it's a good idea to do this during probing, but
 725         * like this it's assured that the lan connection type can be sensed
 726         * correctly)
 727         */
 728        hp100_hwinit(dev);
 729
 730        /* Try to find out which kind of LAN the card is connected to. */
 731        lp->lan_type = hp100_sense_lan(dev);
 732
 733        /* Print out a message what about what we think we have probed. */
 734        printk("hp100: at 0x%x, IRQ %d, ", ioaddr, dev->irq);
 735        switch (bus) {
 736        case HP100_BUS_EISA:
 737                printk("EISA");
 738                break;
 739        case HP100_BUS_PCI:
 740                printk("PCI");
 741                break;
 742        default:
 743                printk("ISA");
 744                break;
 745        }
 746        printk(" bus, %dk SRAM (rx/tx %d%%).\n", lp->memory_size >> 10, lp->rx_ratio);
 747
 748        if (lp->mode == 2) {    /* memory mapped */
 749                printk("hp100: Memory area at 0x%lx-0x%lx", mem_ptr_phys,
 750                                (mem_ptr_phys + (mem_ptr_phys > 0x100000 ? (u_long) lp->memory_size : 16 * 1024)) - 1);
 751                if (mem_ptr_virt)
 752                        printk(" (virtual base %p)", mem_ptr_virt);
 753                printk(".\n");
 754
 755                /* Set for info when doing ifconfig */
 756                dev->mem_start = mem_ptr_phys;
 757                dev->mem_end = mem_ptr_phys + lp->memory_size;
 758        }
 759
 760        printk("hp100: ");
 761        if (lp->lan_type != HP100_LAN_ERR)
 762                printk("Adapter is attached to ");
 763        switch (lp->lan_type) {
 764        case HP100_LAN_100:
 765                printk("100Mb/s Voice Grade AnyLAN network.\n");
 766                break;
 767        case HP100_LAN_10:
 768                printk("10Mb/s network (10baseT).\n");
 769                break;
 770        case HP100_LAN_COAX:
 771                printk("10Mb/s network (coax).\n");
 772                break;
 773        default:
 774                printk("Warning! Link down.\n");
 775        }
 776
 777        err = register_netdev(dev);
 778        if (err)
 779                goto out3;
 780
 781        return 0;
 782out3:
 783        if (local_mode == 1)
 784                pci_free_consistent(lp->pci_dev, MAX_RINGSIZE + 0x0f,
 785                                    lp->page_vaddr_algn,
 786                                    virt_to_whatever(dev, lp->page_vaddr_algn));
 787out_mem_ptr:
 788        if (mem_ptr_virt)
 789                iounmap(mem_ptr_virt);
 790out2:
 791        release_region(ioaddr, HP100_REGION_SIZE);
 792out1:
 793        return err;
 794}
 795
 796/* This procedure puts the card into a stable init state */
 797static void hp100_hwinit(struct net_device *dev)
 798{
 799        int ioaddr = dev->base_addr;
 800        struct hp100_private *lp = netdev_priv(dev);
 801
 802#ifdef HP100_DEBUG_B
 803        hp100_outw(0x4202, TRACE);
 804        printk("hp100: %s: hwinit\n", dev->name);
 805#endif
 806
 807        /* Initialise the card. -------------------------------------------- */
 808
 809        /* Clear all pending Ints and disable Ints */
 810        hp100_page(PERFORMANCE);
 811        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all ints */
 812        hp100_outw(0xffff, IRQ_STATUS); /* clear all pending ints */
 813
 814        hp100_outw(HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
 815        hp100_outw(HP100_TRI_INT | HP100_SET_HB, OPTION_LSW);
 816
 817        if (lp->mode == 1) {
 818                hp100_BM_shutdown(dev); /* disables BM, puts cascade in reset */
 819                wait();
 820        } else {
 821                hp100_outw(HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
 822                hp100_cascade_reset(dev, 1);
 823                hp100_page(MAC_CTRL);
 824                hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);
 825        }
 826
 827        /* Initiate EEPROM reload */
 828        hp100_load_eeprom(dev, 0);
 829
 830        wait();
 831
 832        /* Go into reset again. */
 833        hp100_cascade_reset(dev, 1);
 834
 835        /* Set Option Registers to a safe state  */
 836        hp100_outw(HP100_DEBUG_EN |
 837                   HP100_RX_HDR |
 838                   HP100_EE_EN |
 839                   HP100_BM_WRITE |
 840                   HP100_BM_READ | HP100_RESET_HB |
 841                   HP100_FAKE_INT |
 842                   HP100_INT_EN |
 843                   HP100_MEM_EN |
 844                   HP100_IO_EN | HP100_RESET_LB, OPTION_LSW);
 845
 846        hp100_outw(HP100_TRI_INT |
 847                   HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW);
 848
 849        hp100_outb(HP100_PRIORITY_TX |
 850                   HP100_ADV_NXT_PKT |
 851                   HP100_TX_CMD | HP100_RESET_LB, OPTION_MSW);
 852
 853        /* TODO: Configure MMU for Ram Test. */
 854        /* TODO: Ram Test. */
 855
 856        /* Re-check if adapter is still at same i/o location      */
 857        /* (If the base i/o in eeprom has been changed but the    */
 858        /* registers had not been changed, a reload of the eeprom */
 859        /* would move the adapter to the address stored in eeprom */
 860
 861        /* TODO: Code to implement. */
 862
 863        /* Until here it was code from HWdiscover procedure. */
 864        /* Next comes code from mmuinit procedure of SCO BM driver which is
 865         * called from HWconfigure in the SCO driver.  */
 866
 867        /* Initialise MMU, eventually switch on Busmaster Mode, initialise
 868         * multicast filter...
 869         */
 870        hp100_mmuinit(dev);
 871
 872        /* We don't turn the interrupts on here - this is done by start_interface. */
 873        wait();                 /* TODO: Do we really need this? */
 874
 875        /* Enable Hardware (e.g. unreset) */
 876        hp100_cascade_reset(dev, 0);
 877
 878        /* ------- initialisation complete ----------- */
 879
 880        /* Finally try to log in the Hub if there may be a VG connection. */
 881        if ((lp->lan_type == HP100_LAN_100) || (lp->lan_type == HP100_LAN_ERR))
 882                hp100_login_to_vg_hub(dev, 0);  /* relogin */
 883
 884}
 885
 886
 887/*
 888 * mmuinit - Reinitialise Cascade MMU and MAC settings.
 889 * Note: Must already be in reset and leaves card in reset.
 890 */
 891static void hp100_mmuinit(struct net_device *dev)
 892{
 893        int ioaddr = dev->base_addr;
 894        struct hp100_private *lp = netdev_priv(dev);
 895        int i;
 896
 897#ifdef HP100_DEBUG_B
 898        hp100_outw(0x4203, TRACE);
 899        printk("hp100: %s: mmuinit\n", dev->name);
 900#endif
 901
 902#ifdef HP100_DEBUG
 903        if (0 != (hp100_inw(OPTION_LSW) & HP100_HW_RST)) {
 904                printk("hp100: %s: Not in reset when entering mmuinit. Fix me.\n", dev->name);
 905                return;
 906        }
 907#endif
 908
 909        /* Make sure IRQs are masked off and ack'ed. */
 910        hp100_page(PERFORMANCE);
 911        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all ints */
 912        hp100_outw(0xffff, IRQ_STATUS); /* ack IRQ */
 913
 914        /*
 915         * Enable Hardware
 916         * - Clear Debug En, Rx Hdr Pipe, EE En, I/O En, Fake Int and Intr En
 917         * - Set Tri-State Int, Bus Master Rd/Wr, and Mem Map Disable
 918         * - Clear Priority, Advance Pkt and Xmit Cmd
 919         */
 920
 921        hp100_outw(HP100_DEBUG_EN |
 922                   HP100_RX_HDR |
 923                   HP100_EE_EN | HP100_RESET_HB |
 924                   HP100_IO_EN |
 925                   HP100_FAKE_INT |
 926                   HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
 927
 928        hp100_outw(HP100_TRI_INT | HP100_SET_HB, OPTION_LSW);
 929
 930        if (lp->mode == 1) {    /* busmaster */
 931                hp100_outw(HP100_BM_WRITE |
 932                           HP100_BM_READ |
 933                           HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW);
 934        } else if (lp->mode == 2) {     /* memory mapped */
 935                hp100_outw(HP100_BM_WRITE |
 936                           HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
 937                hp100_outw(HP100_MMAP_DIS | HP100_RESET_HB, OPTION_LSW);
 938                hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
 939                hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
 940        } else if (lp->mode == 3) {     /* i/o mapped mode */
 941                hp100_outw(HP100_MMAP_DIS | HP100_SET_HB |
 942                           HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
 943        }
 944
 945        hp100_page(HW_MAP);
 946        hp100_outb(0, EARLYRXCFG);
 947        hp100_outw(0, EARLYTXCFG);
 948
 949        /*
 950         * Enable Bus Master mode
 951         */
 952        if (lp->mode == 1) {    /* busmaster */
 953                /* Experimental: Set some PCI configuration bits */
 954                hp100_page(HW_MAP);
 955                hp100_andb(~HP100_PDL_USE3, MODECTRL1); /* BM engine read maximum */
 956                hp100_andb(~HP100_TX_DUALQ, MODECTRL1); /* No Queue for Priority TX */
 957
 958                /* PCI Bus failures should result in a Misc. Interrupt */
 959                hp100_orb(HP100_EN_BUS_FAIL, MODECTRL2);
 960
 961                hp100_outw(HP100_BM_READ | HP100_BM_WRITE | HP100_SET_HB, OPTION_LSW);
 962                hp100_page(HW_MAP);
 963                /* Use Burst Mode and switch on PAGE_CK */
 964                hp100_orb(HP100_BM_BURST_RD | HP100_BM_BURST_WR, BM);
 965                if ((lp->chip == HP100_CHIPID_RAINIER) || (lp->chip == HP100_CHIPID_SHASTA))
 966                        hp100_orb(HP100_BM_PAGE_CK, BM);
 967                hp100_orb(HP100_BM_MASTER, BM);
 968        } else {                /* not busmaster */
 969
 970                hp100_page(HW_MAP);
 971                hp100_andb(~HP100_BM_MASTER, BM);
 972        }
 973
 974        /*
 975         * Divide card memory into regions for Rx, Tx and, if non-ETR chip, PDLs
 976         */
 977        hp100_page(MMU_CFG);
 978        if (lp->mode == 1) {    /* only needed for Busmaster */
 979                int xmit_stop, recv_stop;
 980
 981                if ((lp->chip == HP100_CHIPID_RAINIER) ||
 982                    (lp->chip == HP100_CHIPID_SHASTA)) {
 983                        int pdl_stop;
 984
 985                        /*
 986                         * Each pdl is 508 bytes long. (63 frags * 4 bytes for address and
 987                         * 4 bytes for header). We will leave NUM_RXPDLS * 508 (rounded
 988                         * to the next higher 1k boundary) bytes for the rx-pdl's
 989                         * Note: For non-etr chips the transmit stop register must be
 990                         * programmed on a 1k boundary, i.e. bits 9:0 must be zero.
 991                         */
 992                        pdl_stop = lp->memory_size;
 993                        xmit_stop = (pdl_stop - 508 * (MAX_RX_PDL) - 16) & ~(0x03ff);
 994                        recv_stop = (xmit_stop * (lp->rx_ratio) / 100) & ~(0x03ff);
 995                        hp100_outw((pdl_stop >> 4) - 1, PDL_MEM_STOP);
 996#ifdef HP100_DEBUG_BM
 997                        printk("hp100: %s: PDL_STOP = 0x%x\n", dev->name, pdl_stop);
 998#endif
 999                } else {
1000                        /* ETR chip (Lassen) in busmaster mode */
1001                        xmit_stop = (lp->memory_size) - 1;
1002                        recv_stop = ((lp->memory_size * lp->rx_ratio) / 100) & ~(0x03ff);
1003                }
1004
1005                hp100_outw(xmit_stop >> 4, TX_MEM_STOP);
1006                hp100_outw(recv_stop >> 4, RX_MEM_STOP);
1007#ifdef HP100_DEBUG_BM
1008                printk("hp100: %s: TX_STOP  = 0x%x\n", dev->name, xmit_stop >> 4);
1009                printk("hp100: %s: RX_STOP  = 0x%x\n", dev->name, recv_stop >> 4);
1010#endif
1011        } else {
1012                /* Slave modes (memory mapped and programmed io)  */
1013                hp100_outw((((lp->memory_size * lp->rx_ratio) / 100) >> 4), RX_MEM_STOP);
1014                hp100_outw(((lp->memory_size - 1) >> 4), TX_MEM_STOP);
1015#ifdef HP100_DEBUG
1016                printk("hp100: %s: TX_MEM_STOP: 0x%x\n", dev->name, hp100_inw(TX_MEM_STOP));
1017                printk("hp100: %s: RX_MEM_STOP: 0x%x\n", dev->name, hp100_inw(RX_MEM_STOP));
1018#endif
1019        }
1020
1021        /* Write MAC address into page 1 */
1022        hp100_page(MAC_ADDRESS);
1023        for (i = 0; i < 6; i++)
1024                hp100_outb(dev->dev_addr[i], MAC_ADDR + i);
1025
1026        /* Zero the multicast hash registers */
1027        for (i = 0; i < 8; i++)
1028                hp100_outb(0x0, HASH_BYTE0 + i);
1029
1030        /* Set up MAC defaults */
1031        hp100_page(MAC_CTRL);
1032
1033        /* Go to LAN Page and zero all filter bits */
1034        /* Zero accept error, accept multicast, accept broadcast and accept */
1035        /* all directed packet bits */
1036        hp100_andb(~(HP100_RX_EN |
1037                     HP100_TX_EN |
1038                     HP100_ACC_ERRORED |
1039                     HP100_ACC_MC |
1040                     HP100_ACC_BC | HP100_ACC_PHY), MAC_CFG_1);
1041
1042        hp100_outb(0x00, MAC_CFG_2);
1043
1044        /* Zero the frame format bit. This works around a training bug in the */
1045        /* new hubs. */
1046        hp100_outb(0x00, VG_LAN_CFG_2); /* (use 802.3) */
1047
1048        if (lp->priority_tx)
1049                hp100_outb(HP100_PRIORITY_TX | HP100_SET_LB, OPTION_MSW);
1050        else
1051                hp100_outb(HP100_PRIORITY_TX | HP100_RESET_LB, OPTION_MSW);
1052
1053        hp100_outb(HP100_ADV_NXT_PKT |
1054                   HP100_TX_CMD | HP100_RESET_LB, OPTION_MSW);
1055
1056        /* If busmaster, initialize the PDLs */
1057        if (lp->mode == 1)
1058                hp100_init_pdls(dev);
1059
1060        /* Go to performance page and initialize isr and imr registers */
1061        hp100_page(PERFORMANCE);
1062        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all ints */
1063        hp100_outw(0xffff, IRQ_STATUS); /* ack IRQ */
1064}
1065
1066/*
1067 *  open/close functions
1068 */
1069
1070static int hp100_open(struct net_device *dev)
1071{
1072        struct hp100_private *lp = netdev_priv(dev);
1073#ifdef HP100_DEBUG_B
1074        int ioaddr = dev->base_addr;
1075#endif
1076
1077#ifdef HP100_DEBUG_B
1078        hp100_outw(0x4204, TRACE);
1079        printk("hp100: %s: open\n", dev->name);
1080#endif
1081
1082        /* New: if bus is PCI or EISA, interrupts might be shared interrupts */
1083        if (request_irq(dev->irq, hp100_interrupt,
1084                        lp->bus == HP100_BUS_PCI || lp->bus ==
1085                        HP100_BUS_EISA ? IRQF_SHARED : 0,
1086                        dev->name, dev)) {
1087                printk("hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq);
1088                return -EAGAIN;
1089        }
1090
1091        netif_trans_update(dev); /* prevent tx timeout */
1092        netif_start_queue(dev);
1093
1094        lp->lan_type = hp100_sense_lan(dev);
1095        lp->mac1_mode = HP100_MAC1MODE3;
1096        lp->mac2_mode = HP100_MAC2MODE3;
1097        memset(&lp->hash_bytes, 0x00, 8);
1098
1099        hp100_stop_interface(dev);
1100
1101        hp100_hwinit(dev);
1102
1103        hp100_start_interface(dev);     /* sets mac modes, enables interrupts */
1104
1105        return 0;
1106}
1107
1108/* The close function is called when the interface is to be brought down */
1109static int hp100_close(struct net_device *dev)
1110{
1111        int ioaddr = dev->base_addr;
1112        struct hp100_private *lp = netdev_priv(dev);
1113
1114#ifdef HP100_DEBUG_B
1115        hp100_outw(0x4205, TRACE);
1116        printk("hp100: %s: close\n", dev->name);
1117#endif
1118
1119        hp100_page(PERFORMANCE);
1120        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all IRQs */
1121
1122        hp100_stop_interface(dev);
1123
1124        if (lp->lan_type == HP100_LAN_100)
1125                lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1126
1127        netif_stop_queue(dev);
1128
1129        free_irq(dev->irq, dev);
1130
1131#ifdef HP100_DEBUG
1132        printk("hp100: %s: close LSW = 0x%x\n", dev->name,
1133               hp100_inw(OPTION_LSW));
1134#endif
1135
1136        return 0;
1137}
1138
1139
1140/*
1141 * Configure the PDL Rx rings and LAN
1142 */
1143static void hp100_init_pdls(struct net_device *dev)
1144{
1145        struct hp100_private *lp = netdev_priv(dev);
1146        hp100_ring_t *ringptr;
1147        u_int *pageptr;         /* Warning : increment by 4 - Jean II */
1148        int i;
1149
1150#ifdef HP100_DEBUG_B
1151        int ioaddr = dev->base_addr;
1152#endif
1153
1154#ifdef HP100_DEBUG_B
1155        hp100_outw(0x4206, TRACE);
1156        printk("hp100: %s: init pdls\n", dev->name);
1157#endif
1158
1159        if (!lp->page_vaddr_algn)
1160                printk("hp100: %s: Warning: lp->page_vaddr_algn not initialised!\n", dev->name);
1161        else {
1162                /* pageptr shall point into the DMA accessible memory region  */
1163                /* we use this pointer to status the upper limit of allocated */
1164                /* memory in the allocated page. */
1165                /* note: align the pointers to the pci cache line size */
1166                memset(lp->page_vaddr_algn, 0, MAX_RINGSIZE);   /* Zero  Rx/Tx ring page */
1167                pageptr = lp->page_vaddr_algn;
1168
1169                lp->rxrcommit = 0;
1170                ringptr = lp->rxrhead = lp->rxrtail = &(lp->rxring[0]);
1171
1172                /* Initialise Rx Ring */
1173                for (i = MAX_RX_PDL - 1; i >= 0; i--) {
1174                        lp->rxring[i].next = ringptr;
1175                        ringptr = &(lp->rxring[i]);
1176                        pageptr += hp100_init_rxpdl(dev, ringptr, pageptr);
1177                }
1178
1179                /* Initialise Tx Ring */
1180                lp->txrcommit = 0;
1181                ringptr = lp->txrhead = lp->txrtail = &(lp->txring[0]);
1182                for (i = MAX_TX_PDL - 1; i >= 0; i--) {
1183                        lp->txring[i].next = ringptr;
1184                        ringptr = &(lp->txring[i]);
1185                        pageptr += hp100_init_txpdl(dev, ringptr, pageptr);
1186                }
1187        }
1188}
1189
1190
1191/* These functions "format" the entries in the pdl structure   */
1192/* They return how much memory the fragments need.            */
1193static int hp100_init_rxpdl(struct net_device *dev,
1194                            register hp100_ring_t * ringptr,
1195                            register u32 * pdlptr)
1196{
1197        /* pdlptr is starting address for this pdl */
1198
1199        if (0 != (((unsigned long) pdlptr) & 0xf))
1200                printk("hp100: %s: Init rxpdl: Unaligned pdlptr 0x%lx.\n",
1201                       dev->name, (unsigned long) pdlptr);
1202
1203        ringptr->pdl = pdlptr + 1;
1204        ringptr->pdl_paddr = virt_to_whatever(dev, pdlptr + 1);
1205        ringptr->skb = NULL;
1206
1207        /*
1208         * Write address and length of first PDL Fragment (which is used for
1209         * storing the RX-Header
1210         * We use the 4 bytes _before_ the PDH in the pdl memory area to
1211         * store this information. (PDH is at offset 0x04)
1212         */
1213        /* Note that pdlptr+1 and not pdlptr is the pointer to the PDH */
1214
1215        *(pdlptr + 2) = (u_int) virt_to_whatever(dev, pdlptr);  /* Address Frag 1 */
1216        *(pdlptr + 3) = 4;      /* Length  Frag 1 */
1217
1218        return roundup(MAX_RX_FRAG * 2 + 2, 4);
1219}
1220
1221
1222static int hp100_init_txpdl(struct net_device *dev,
1223                            register hp100_ring_t * ringptr,
1224                            register u32 * pdlptr)
1225{
1226        if (0 != (((unsigned long) pdlptr) & 0xf))
1227                printk("hp100: %s: Init txpdl: Unaligned pdlptr 0x%lx.\n", dev->name, (unsigned long) pdlptr);
1228
1229        ringptr->pdl = pdlptr;  /* +1; */
1230        ringptr->pdl_paddr = virt_to_whatever(dev, pdlptr);     /* +1 */
1231        ringptr->skb = NULL;
1232
1233        return roundup(MAX_TX_FRAG * 2 + 2, 4);
1234}
1235
1236/*
1237 * hp100_build_rx_pdl allocates an skb_buff of maximum size plus two bytes
1238 * for possible odd word alignment rounding up to next dword and set PDL
1239 * address for fragment#2
1240 * Returns: 0 if unable to allocate skb_buff
1241 *          1 if successful
1242 */
1243static int hp100_build_rx_pdl(hp100_ring_t * ringptr,
1244                              struct net_device *dev)
1245{
1246#ifdef HP100_DEBUG_B
1247        int ioaddr = dev->base_addr;
1248#endif
1249#ifdef HP100_DEBUG_BM
1250        u_int *p;
1251#endif
1252
1253#ifdef HP100_DEBUG_B
1254        hp100_outw(0x4207, TRACE);
1255        printk("hp100: %s: build rx pdl\n", dev->name);
1256#endif
1257
1258        /* Allocate skb buffer of maximum size */
1259        /* Note: This depends on the alloc_skb functions allocating more
1260         * space than requested, i.e. aligning to 16bytes */
1261
1262        ringptr->skb = netdev_alloc_skb(dev, roundup(MAX_ETHER_SIZE + 2, 4));
1263
1264        if (NULL != ringptr->skb) {
1265                /*
1266                 * Reserve 2 bytes at the head of the buffer to land the IP header
1267                 * on a long word boundary (According to the Network Driver section
1268                 * in the Linux KHG, this should help to increase performance.)
1269                 */
1270                skb_reserve(ringptr->skb, 2);
1271
1272                ringptr->skb->data = skb_put(ringptr->skb, MAX_ETHER_SIZE);
1273
1274                /* ringptr->pdl points to the beginning of the PDL, i.e. the PDH */
1275                /* Note: 1st Fragment is used for the 4 byte packet status
1276                 * (receive header). Its PDL entries are set up by init_rxpdl. So
1277                 * here we only have to set up the PDL fragment entries for the data
1278                 * part. Those 4 bytes will be stored in the DMA memory region
1279                 * directly before the PDL.
1280                 */
1281#ifdef HP100_DEBUG_BM
1282                printk("hp100: %s: build_rx_pdl: PDH@0x%x, skb->data (len %d) at 0x%x\n",
1283                                     dev->name, (u_int) ringptr->pdl,
1284                                     roundup(MAX_ETHER_SIZE + 2, 4),
1285                                     (unsigned int) ringptr->skb->data);
1286#endif
1287
1288                /* Conversion to new PCI API : map skbuf data to PCI bus.
1289                 * Doc says it's OK for EISA as well - Jean II */
1290                ringptr->pdl[0] = 0x00020000;   /* Write PDH */
1291                ringptr->pdl[3] = pdl_map_data(netdev_priv(dev),
1292                                               ringptr->skb->data);
1293                ringptr->pdl[4] = MAX_ETHER_SIZE;       /* Length of Data */
1294
1295#ifdef HP100_DEBUG_BM
1296                for (p = (ringptr->pdl); p < (ringptr->pdl + 5); p++)
1297                        printk("hp100: %s: Adr 0x%.8x = 0x%.8x\n", dev->name, (u_int) p, (u_int) * p);
1298#endif
1299                return 1;
1300        }
1301        /* else: */
1302        /* alloc_skb failed (no memory) -> still can receive the header
1303         * fragment into PDL memory. make PDL safe by clearing msgptr and
1304         * making the PDL only 1 fragment (i.e. the 4 byte packet status)
1305         */
1306#ifdef HP100_DEBUG_BM
1307        printk("hp100: %s: build_rx_pdl: PDH@0x%x, No space for skb.\n", dev->name, (u_int) ringptr->pdl);
1308#endif
1309
1310        ringptr->pdl[0] = 0x00010000;   /* PDH: Count=1 Fragment */
1311
1312        return 0;
1313}
1314
1315/*
1316 *  hp100_rxfill - attempt to fill the Rx Ring will empty skb's
1317 *
1318 * Makes assumption that skb's are always contiguous memory areas and
1319 * therefore PDLs contain only 2 physical fragments.
1320 * -  While the number of Rx PDLs with buffers is less than maximum
1321 *      a.  Get a maximum packet size skb
1322 *      b.  Put the physical address of the buffer into the PDL.
1323 *      c.  Output physical address of PDL to adapter.
1324 */
1325static void hp100_rxfill(struct net_device *dev)
1326{
1327        int ioaddr = dev->base_addr;
1328
1329        struct hp100_private *lp = netdev_priv(dev);
1330        hp100_ring_t *ringptr;
1331
1332#ifdef HP100_DEBUG_B
1333        hp100_outw(0x4208, TRACE);
1334        printk("hp100: %s: rxfill\n", dev->name);
1335#endif
1336
1337        hp100_page(PERFORMANCE);
1338
1339        while (lp->rxrcommit < MAX_RX_PDL) {
1340                /*
1341                   ** Attempt to get a buffer and build a Rx PDL.
1342                 */
1343                ringptr = lp->rxrtail;
1344                if (0 == hp100_build_rx_pdl(ringptr, dev)) {
1345                        return; /* None available, return */
1346                }
1347
1348                /* Hand this PDL over to the card */
1349                /* Note: This needs performance page selected! */
1350#ifdef HP100_DEBUG_BM
1351                printk("hp100: %s: rxfill: Hand to card: pdl #%d @0x%x phys:0x%x, buffer: 0x%x\n",
1352                                     dev->name, lp->rxrcommit, (u_int) ringptr->pdl,
1353                                     (u_int) ringptr->pdl_paddr, (u_int) ringptr->pdl[3]);
1354#endif
1355
1356                hp100_outl((u32) ringptr->pdl_paddr, RX_PDA);
1357
1358                lp->rxrcommit += 1;
1359                lp->rxrtail = ringptr->next;
1360        }
1361}
1362
1363/*
1364 * BM_shutdown - shutdown bus mastering and leave chip in reset state
1365 */
1366
1367static void hp100_BM_shutdown(struct net_device *dev)
1368{
1369        int ioaddr = dev->base_addr;
1370        struct hp100_private *lp = netdev_priv(dev);
1371        unsigned long time;
1372
1373#ifdef HP100_DEBUG_B
1374        hp100_outw(0x4209, TRACE);
1375        printk("hp100: %s: bm shutdown\n", dev->name);
1376#endif
1377
1378        hp100_page(PERFORMANCE);
1379        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all ints */
1380        hp100_outw(0xffff, IRQ_STATUS); /* Ack all ints */
1381
1382        /* Ensure Interrupts are off */
1383        hp100_outw(HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
1384
1385        /* Disable all MAC activity */
1386        hp100_page(MAC_CTRL);
1387        hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);    /* stop rx/tx */
1388
1389        /* If cascade MMU is not already in reset */
1390        if (0 != (hp100_inw(OPTION_LSW) & HP100_HW_RST)) {
1391                /* Wait 1.3ms (10Mb max packet time) to ensure MAC is idle so
1392                 * MMU pointers will not be reset out from underneath
1393                 */
1394                hp100_page(MAC_CTRL);
1395                for (time = 0; time < 5000; time++) {
1396                        if ((hp100_inb(MAC_CFG_1) & (HP100_TX_IDLE | HP100_RX_IDLE)) == (HP100_TX_IDLE | HP100_RX_IDLE))
1397                                break;
1398                }
1399
1400                /* Shutdown algorithm depends on the generation of Cascade */
1401                if (lp->chip == HP100_CHIPID_LASSEN) {  /* ETR shutdown/reset */
1402                        /* Disable Busmaster mode and wait for bit to go to zero. */
1403                        hp100_page(HW_MAP);
1404                        hp100_andb(~HP100_BM_MASTER, BM);
1405                        /* 100 ms timeout */
1406                        for (time = 0; time < 32000; time++) {
1407                                if (0 == (hp100_inb(BM) & HP100_BM_MASTER))
1408                                        break;
1409                        }
1410                } else {        /* Shasta or Rainier Shutdown/Reset */
1411                        /* To ensure all bus master inloading activity has ceased,
1412                         * wait for no Rx PDAs or no Rx packets on card.
1413                         */
1414                        hp100_page(PERFORMANCE);
1415                        /* 100 ms timeout */
1416                        for (time = 0; time < 10000; time++) {
1417                                /* RX_PDL: PDLs not executed. */
1418                                /* RX_PKT_CNT: RX'd packets on card. */
1419                                if ((hp100_inb(RX_PDL) == 0) && (hp100_inb(RX_PKT_CNT) == 0))
1420                                        break;
1421                        }
1422
1423                        if (time >= 10000)
1424                                printk("hp100: %s: BM shutdown error.\n", dev->name);
1425
1426                        /* To ensure all bus master outloading activity has ceased,
1427                         * wait until the Tx PDA count goes to zero or no more Tx space
1428                         * available in the Tx region of the card.
1429                         */
1430                        /* 100 ms timeout */
1431                        for (time = 0; time < 10000; time++) {
1432                                if ((0 == hp100_inb(TX_PKT_CNT)) &&
1433                                    (0 != (hp100_inb(TX_MEM_FREE) & HP100_AUTO_COMPARE)))
1434                                        break;
1435                        }
1436
1437                        /* Disable Busmaster mode */
1438                        hp100_page(HW_MAP);
1439                        hp100_andb(~HP100_BM_MASTER, BM);
1440                }       /* end of shutdown procedure for non-etr parts */
1441
1442                hp100_cascade_reset(dev, 1);
1443        }
1444        hp100_page(PERFORMANCE);
1445        /* hp100_outw( HP100_BM_READ | HP100_BM_WRITE | HP100_RESET_HB, OPTION_LSW ); */
1446        /* Busmaster mode should be shut down now. */
1447}
1448
1449static int hp100_check_lan(struct net_device *dev)
1450{
1451        struct hp100_private *lp = netdev_priv(dev);
1452
1453        if (lp->lan_type < 0) { /* no LAN type detected yet? */
1454                hp100_stop_interface(dev);
1455                if ((lp->lan_type = hp100_sense_lan(dev)) < 0) {
1456                        printk("hp100: %s: no connection found - check wire\n", dev->name);
1457                        hp100_start_interface(dev);     /* 10Mb/s RX packets maybe handled */
1458                        return -EIO;
1459                }
1460                if (lp->lan_type == HP100_LAN_100)
1461                        lp->hub_status = hp100_login_to_vg_hub(dev, 0); /* relogin */
1462                hp100_start_interface(dev);
1463        }
1464        return 0;
1465}
1466
1467/*
1468 *  transmit functions
1469 */
1470
1471/* tx function for busmaster mode */
1472static netdev_tx_t hp100_start_xmit_bm(struct sk_buff *skb,
1473                                       struct net_device *dev)
1474{
1475        unsigned long flags;
1476        int i, ok_flag;
1477        int ioaddr = dev->base_addr;
1478        struct hp100_private *lp = netdev_priv(dev);
1479        hp100_ring_t *ringptr;
1480
1481#ifdef HP100_DEBUG_B
1482        hp100_outw(0x4210, TRACE);
1483        printk("hp100: %s: start_xmit_bm\n", dev->name);
1484#endif
1485        if (skb->len <= 0)
1486                goto drop;
1487
1488        if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN))
1489                return NETDEV_TX_OK;
1490
1491        /* Get Tx ring tail pointer */
1492        if (lp->txrtail->next == lp->txrhead) {
1493                /* No memory. */
1494#ifdef HP100_DEBUG
1495                printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name);
1496#endif
1497                /* not waited long enough since last tx? */
1498                if (time_before(jiffies, dev_trans_start(dev) + HZ))
1499                        goto drop;
1500
1501                if (hp100_check_lan(dev))
1502                        goto drop;
1503
1504                if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) {
1505                        /* we have a 100Mb/s adapter but it isn't connected to hub */
1506                        printk("hp100: %s: login to 100Mb/s hub retry\n", dev->name);
1507                        hp100_stop_interface(dev);
1508                        lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1509                        hp100_start_interface(dev);
1510                } else {
1511                        spin_lock_irqsave(&lp->lock, flags);
1512                        hp100_ints_off();       /* Useful ? Jean II */
1513                        i = hp100_sense_lan(dev);
1514                        hp100_ints_on();
1515                        spin_unlock_irqrestore(&lp->lock, flags);
1516                        if (i == HP100_LAN_ERR)
1517                                printk("hp100: %s: link down detected\n", dev->name);
1518                        else if (lp->lan_type != i) {   /* cable change! */
1519                                /* it's very hard - all network settings must be changed!!! */
1520                                printk("hp100: %s: cable change 10Mb/s <-> 100Mb/s detected\n", dev->name);
1521                                lp->lan_type = i;
1522                                hp100_stop_interface(dev);
1523                                if (lp->lan_type == HP100_LAN_100)
1524                                        lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1525                                hp100_start_interface(dev);
1526                        } else {
1527                                printk("hp100: %s: interface reset\n", dev->name);
1528                                hp100_stop_interface(dev);
1529                                if (lp->lan_type == HP100_LAN_100)
1530                                        lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1531                                hp100_start_interface(dev);
1532                        }
1533                }
1534
1535                goto drop;
1536        }
1537
1538        /*
1539         * we have to turn int's off before modifying this, otherwise
1540         * a tx_pdl_cleanup could occur at the same time
1541         */
1542        spin_lock_irqsave(&lp->lock, flags);
1543        ringptr = lp->txrtail;
1544        lp->txrtail = ringptr->next;
1545
1546        /* Check whether packet has minimal packet size */
1547        ok_flag = skb->len >= HP100_MIN_PACKET_SIZE;
1548        i = ok_flag ? skb->len : HP100_MIN_PACKET_SIZE;
1549
1550        ringptr->skb = skb;
1551        ringptr->pdl[0] = ((1 << 16) | i);      /* PDH: 1 Fragment & length */
1552        if (lp->chip == HP100_CHIPID_SHASTA) {
1553                /* TODO:Could someone who has the EISA card please check if this works? */
1554                ringptr->pdl[2] = i;
1555        } else {                /* Lassen */
1556                /* In the PDL, don't use the padded size but the real packet size: */
1557                ringptr->pdl[2] = skb->len;     /* 1st Frag: Length of frag */
1558        }
1559        /* Conversion to new PCI API : map skbuf data to PCI bus.
1560         * Doc says it's OK for EISA as well - Jean II */
1561        ringptr->pdl[1] = ((u32) pci_map_single(lp->pci_dev, skb->data, ringptr->pdl[2], PCI_DMA_TODEVICE));    /* 1st Frag: Adr. of data */
1562
1563        /* Hand this PDL to the card. */
1564        hp100_outl(ringptr->pdl_paddr, TX_PDA_L);       /* Low Prio. Queue */
1565
1566        lp->txrcommit++;
1567
1568        dev->stats.tx_packets++;
1569        dev->stats.tx_bytes += skb->len;
1570
1571        spin_unlock_irqrestore(&lp->lock, flags);
1572
1573        return NETDEV_TX_OK;
1574
1575drop:
1576        dev_kfree_skb(skb);
1577        return NETDEV_TX_OK;
1578}
1579
1580
1581/* clean_txring checks if packets have been sent by the card by reading
1582 * the TX_PDL register from the performance page and comparing it to the
1583 * number of committed packets. It then frees the skb's of the packets that
1584 * obviously have been sent to the network.
1585 *
1586 * Needs the PERFORMANCE page selected.
1587 */
1588static void hp100_clean_txring(struct net_device *dev)
1589{
1590        struct hp100_private *lp = netdev_priv(dev);
1591        int ioaddr = dev->base_addr;
1592        int donecount;
1593
1594#ifdef HP100_DEBUG_B
1595        hp100_outw(0x4211, TRACE);
1596        printk("hp100: %s: clean txring\n", dev->name);
1597#endif
1598
1599        /* How many PDLs have been transmitted? */
1600        donecount = (lp->txrcommit) - hp100_inb(TX_PDL);
1601
1602#ifdef HP100_DEBUG
1603        if (donecount > MAX_TX_PDL)
1604                printk("hp100: %s: Warning: More PDLs transmitted than committed to card???\n", dev->name);
1605#endif
1606
1607        for (; 0 != donecount; donecount--) {
1608#ifdef HP100_DEBUG_BM
1609                printk("hp100: %s: Free skb: data @0x%.8x txrcommit=0x%x TXPDL=0x%x, done=0x%x\n",
1610                                dev->name, (u_int) lp->txrhead->skb->data,
1611                                lp->txrcommit, hp100_inb(TX_PDL), donecount);
1612#endif
1613                /* Conversion to new PCI API : NOP */
1614                pci_unmap_single(lp->pci_dev, (dma_addr_t) lp->txrhead->pdl[1], lp->txrhead->pdl[2], PCI_DMA_TODEVICE);
1615                dev_consume_skb_any(lp->txrhead->skb);
1616                lp->txrhead->skb = NULL;
1617                lp->txrhead = lp->txrhead->next;
1618                lp->txrcommit--;
1619        }
1620}
1621
1622/* tx function for slave modes */
1623static netdev_tx_t hp100_start_xmit(struct sk_buff *skb,
1624                                    struct net_device *dev)
1625{
1626        unsigned long flags;
1627        int i, ok_flag;
1628        int ioaddr = dev->base_addr;
1629        u_short val;
1630        struct hp100_private *lp = netdev_priv(dev);
1631
1632#ifdef HP100_DEBUG_B
1633        hp100_outw(0x4212, TRACE);
1634        printk("hp100: %s: start_xmit\n", dev->name);
1635#endif
1636        if (skb->len <= 0)
1637                goto drop;
1638
1639        if (hp100_check_lan(dev))
1640                goto drop;
1641
1642        /* If there is not enough free memory on the card... */
1643        i = hp100_inl(TX_MEM_FREE) & 0x7fffffff;
1644        if (!(((i / 2) - 539) > (skb->len + 16) && (hp100_inb(TX_PKT_CNT) < 255))) {
1645#ifdef HP100_DEBUG
1646                printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i);
1647#endif
1648                /* not waited long enough since last failed tx try? */
1649                if (time_before(jiffies, dev_trans_start(dev) + HZ)) {
1650#ifdef HP100_DEBUG
1651                        printk("hp100: %s: trans_start timing problem\n",
1652                               dev->name);
1653#endif
1654                        goto drop;
1655                }
1656                if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) {
1657                        /* we have a 100Mb/s adapter but it isn't connected to hub */
1658                        printk("hp100: %s: login to 100Mb/s hub retry\n", dev->name);
1659                        hp100_stop_interface(dev);
1660                        lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1661                        hp100_start_interface(dev);
1662                } else {
1663                        spin_lock_irqsave(&lp->lock, flags);
1664                        hp100_ints_off();       /* Useful ? Jean II */
1665                        i = hp100_sense_lan(dev);
1666                        hp100_ints_on();
1667                        spin_unlock_irqrestore(&lp->lock, flags);
1668                        if (i == HP100_LAN_ERR)
1669                                printk("hp100: %s: link down detected\n", dev->name);
1670                        else if (lp->lan_type != i) {   /* cable change! */
1671                                /* it's very hard - all network setting must be changed!!! */
1672                                printk("hp100: %s: cable change 10Mb/s <-> 100Mb/s detected\n", dev->name);
1673                                lp->lan_type = i;
1674                                hp100_stop_interface(dev);
1675                                if (lp->lan_type == HP100_LAN_100)
1676                                        lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1677                                hp100_start_interface(dev);
1678                        } else {
1679                                printk("hp100: %s: interface reset\n", dev->name);
1680                                hp100_stop_interface(dev);
1681                                if (lp->lan_type == HP100_LAN_100)
1682                                        lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1683                                hp100_start_interface(dev);
1684                                mdelay(1);
1685                        }
1686                }
1687                goto drop;
1688        }
1689
1690        for (i = 0; i < 6000 && (hp100_inb(OPTION_MSW) & HP100_TX_CMD); i++) {
1691#ifdef HP100_DEBUG_TX
1692                printk("hp100: %s: start_xmit: busy\n", dev->name);
1693#endif
1694        }
1695
1696        spin_lock_irqsave(&lp->lock, flags);
1697        hp100_ints_off();
1698        val = hp100_inw(IRQ_STATUS);
1699        /* Ack / clear the interrupt TX_COMPLETE interrupt - this interrupt is set
1700         * when the current packet being transmitted on the wire is completed. */
1701        hp100_outw(HP100_TX_COMPLETE, IRQ_STATUS);
1702#ifdef HP100_DEBUG_TX
1703        printk("hp100: %s: start_xmit: irq_status=0x%.4x, irqmask=0x%.4x, len=%d\n",
1704                        dev->name, val, hp100_inw(IRQ_MASK), (int) skb->len);
1705#endif
1706
1707        ok_flag = skb->len >= HP100_MIN_PACKET_SIZE;
1708        i = ok_flag ? skb->len : HP100_MIN_PACKET_SIZE;
1709
1710        hp100_outw(i, DATA32);  /* tell card the total packet length */
1711        hp100_outw(i, FRAGMENT_LEN);    /* and first/only fragment length    */
1712
1713        if (lp->mode == 2) {    /* memory mapped */
1714                /* Note: The J2585B needs alignment to 32bits here!  */
1715                memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
1716                if (!ok_flag)
1717                        memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
1718        } else {                /* programmed i/o */
1719                outsl(ioaddr + HP100_REG_DATA32, skb->data,
1720                      (skb->len + 3) >> 2);
1721                if (!ok_flag)
1722                        for (i = (skb->len + 3) & ~3; i < HP100_MIN_PACKET_SIZE; i += 4)
1723                                hp100_outl(0, DATA32);
1724        }
1725
1726        hp100_outb(HP100_TX_CMD | HP100_SET_LB, OPTION_MSW);    /* send packet */
1727
1728        dev->stats.tx_packets++;
1729        dev->stats.tx_bytes += skb->len;
1730        hp100_ints_on();
1731        spin_unlock_irqrestore(&lp->lock, flags);
1732
1733        dev_consume_skb_any(skb);
1734
1735#ifdef HP100_DEBUG_TX
1736        printk("hp100: %s: start_xmit: end\n", dev->name);
1737#endif
1738
1739        return NETDEV_TX_OK;
1740
1741drop:
1742        dev_kfree_skb(skb);
1743        return NETDEV_TX_OK;
1744
1745}
1746
1747
1748/*
1749 * Receive Function (Non-Busmaster mode)
1750 * Called when an "Receive Packet" interrupt occurs, i.e. the receive
1751 * packet counter is non-zero.
1752 * For non-busmaster, this function does the whole work of transferring
1753 * the packet to the host memory and then up to higher layers via skb
1754 * and netif_rx.
1755 */
1756
1757static void hp100_rx(struct net_device *dev)
1758{
1759        int packets, pkt_len;
1760        int ioaddr = dev->base_addr;
1761        struct hp100_private *lp = netdev_priv(dev);
1762        u_int header;
1763        struct sk_buff *skb;
1764
1765#ifdef DEBUG_B
1766        hp100_outw(0x4213, TRACE);
1767        printk("hp100: %s: rx\n", dev->name);
1768#endif
1769
1770        /* First get indication of received lan packet */
1771        /* RX_PKT_CND indicates the number of packets which have been fully */
1772        /* received onto the card but have not been fully transferred of the card */
1773        packets = hp100_inb(RX_PKT_CNT);
1774#ifdef HP100_DEBUG_RX
1775        if (packets > 1)
1776                printk("hp100: %s: rx: waiting packets = %d\n", dev->name, packets);
1777#endif
1778
1779        while (packets-- > 0) {
1780                /* If ADV_NXT_PKT is still set, we have to wait until the card has */
1781                /* really advanced to the next packet. */
1782                for (pkt_len = 0; pkt_len < 6000 && (hp100_inb(OPTION_MSW) & HP100_ADV_NXT_PKT); pkt_len++) {
1783#ifdef HP100_DEBUG_RX
1784                        printk ("hp100: %s: rx: busy, remaining packets = %d\n", dev->name, packets);
1785#endif
1786                }
1787
1788                /* First we get the header, which contains information about the */
1789                /* actual length of the received packet. */
1790                if (lp->mode == 2) {    /* memory mapped mode */
1791                        header = readl(lp->mem_ptr_virt);
1792                } else          /* programmed i/o */
1793                        header = hp100_inl(DATA32);
1794
1795                pkt_len = ((header & HP100_PKT_LEN_MASK) + 3) & ~3;
1796
1797#ifdef HP100_DEBUG_RX
1798                printk("hp100: %s: rx: new packet - length=%d, errors=0x%x, dest=0x%x\n",
1799                                     dev->name, header & HP100_PKT_LEN_MASK,
1800                                     (header >> 16) & 0xfff8, (header >> 16) & 7);
1801#endif
1802
1803                /* Now we allocate the skb and transfer the data into it. */
1804                skb = netdev_alloc_skb(dev, pkt_len + 2);
1805                if (skb == NULL) {      /* Not enough memory->drop packet */
1806#ifdef HP100_DEBUG
1807                        printk("hp100: %s: rx: couldn't allocate a sk_buff of size %d\n",
1808                                             dev->name, pkt_len);
1809#endif
1810                        dev->stats.rx_dropped++;
1811                } else {        /* skb successfully allocated */
1812
1813                        u_char *ptr;
1814
1815                        skb_reserve(skb,2);
1816
1817                        /* ptr to start of the sk_buff data area */
1818                        skb_put(skb, pkt_len);
1819                        ptr = skb->data;
1820
1821                        /* Now transfer the data from the card into that area */
1822                        if (lp->mode == 2)
1823                                memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
1824                        else    /* io mapped */
1825                                insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2);
1826
1827                        skb->protocol = eth_type_trans(skb, dev);
1828
1829#ifdef HP100_DEBUG_RX
1830                        printk("hp100: %s: rx: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
1831                                        dev->name, ptr[0], ptr[1], ptr[2], ptr[3],
1832                                        ptr[4], ptr[5], ptr[6], ptr[7], ptr[8],
1833                                        ptr[9], ptr[10], ptr[11]);
1834#endif
1835                        netif_rx(skb);
1836                        dev->stats.rx_packets++;
1837                        dev->stats.rx_bytes += pkt_len;
1838                }
1839
1840                /* Indicate the card that we have got the packet */
1841                hp100_outb(HP100_ADV_NXT_PKT | HP100_SET_LB, OPTION_MSW);
1842
1843                switch (header & 0x00070000) {
1844                case (HP100_MULTI_ADDR_HASH << 16):
1845                case (HP100_MULTI_ADDR_NO_HASH << 16):
1846                        dev->stats.multicast++;
1847                        break;
1848                }
1849        }                       /* end of while(there are packets) loop */
1850#ifdef HP100_DEBUG_RX
1851        printk("hp100_rx: %s: end\n", dev->name);
1852#endif
1853}
1854
1855/*
1856 * Receive Function for Busmaster Mode
1857 */
1858static void hp100_rx_bm(struct net_device *dev)
1859{
1860        int ioaddr = dev->base_addr;
1861        struct hp100_private *lp = netdev_priv(dev);
1862        hp100_ring_t *ptr;
1863        u_int header;
1864        int pkt_len;
1865
1866#ifdef HP100_DEBUG_B
1867        hp100_outw(0x4214, TRACE);
1868        printk("hp100: %s: rx_bm\n", dev->name);
1869#endif
1870
1871#ifdef HP100_DEBUG
1872        if (0 == lp->rxrcommit) {
1873                printk("hp100: %s: rx_bm called although no PDLs were committed to adapter?\n", dev->name);
1874                return;
1875        } else
1876                /* RX_PKT_CNT states how many PDLs are currently formatted and available to
1877                 * the cards BM engine */
1878        if ((hp100_inw(RX_PKT_CNT) & 0x00ff) >= lp->rxrcommit) {
1879                printk("hp100: %s: More packets received than committed? RX_PKT_CNT=0x%x, commit=0x%x\n",
1880                                     dev->name, hp100_inw(RX_PKT_CNT) & 0x00ff,
1881                                     lp->rxrcommit);
1882                return;
1883        }
1884#endif
1885
1886        while ((lp->rxrcommit > hp100_inb(RX_PDL))) {
1887                /*
1888                 * The packet was received into the pdl pointed to by lp->rxrhead (
1889                 * the oldest pdl in the ring
1890                 */
1891
1892                /* First we get the header, which contains information about the */
1893                /* actual length of the received packet. */
1894
1895                ptr = lp->rxrhead;
1896
1897                header = *(ptr->pdl - 1);
1898                pkt_len = (header & HP100_PKT_LEN_MASK);
1899
1900                /* Conversion to new PCI API : NOP */
1901                pci_unmap_single(lp->pci_dev, (dma_addr_t) ptr->pdl[3], MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE);
1902
1903#ifdef HP100_DEBUG_BM
1904                printk("hp100: %s: rx_bm: header@0x%x=0x%x length=%d, errors=0x%x, dest=0x%x\n",
1905                                dev->name, (u_int) (ptr->pdl - 1), (u_int) header,
1906                                pkt_len, (header >> 16) & 0xfff8, (header >> 16) & 7);
1907                printk("hp100: %s: RX_PDL_COUNT:0x%x TX_PDL_COUNT:0x%x, RX_PKT_CNT=0x%x PDH=0x%x, Data@0x%x len=0x%x\n",
1908                                dev->name, hp100_inb(RX_PDL), hp100_inb(TX_PDL),
1909                                hp100_inb(RX_PKT_CNT), (u_int) * (ptr->pdl),
1910                                (u_int) * (ptr->pdl + 3), (u_int) * (ptr->pdl + 4));
1911#endif
1912
1913                if ((pkt_len >= MIN_ETHER_SIZE) &&
1914                    (pkt_len <= MAX_ETHER_SIZE)) {
1915                        if (ptr->skb == NULL) {
1916                                printk("hp100: %s: rx_bm: skb null\n", dev->name);
1917                                /* can happen if we only allocated room for the pdh due to memory shortage. */
1918                                dev->stats.rx_dropped++;
1919                        } else {
1920                                skb_trim(ptr->skb, pkt_len);    /* Shorten it */
1921                                ptr->skb->protocol =
1922                                    eth_type_trans(ptr->skb, dev);
1923
1924                                netif_rx(ptr->skb);     /* Up and away... */
1925
1926                                dev->stats.rx_packets++;
1927                                dev->stats.rx_bytes += pkt_len;
1928                        }
1929
1930                        switch (header & 0x00070000) {
1931                        case (HP100_MULTI_ADDR_HASH << 16):
1932                        case (HP100_MULTI_ADDR_NO_HASH << 16):
1933                                dev->stats.multicast++;
1934                                break;
1935                        }
1936                } else {
1937#ifdef HP100_DEBUG
1938                        printk("hp100: %s: rx_bm: Received bad packet (length=%d)\n", dev->name, pkt_len);
1939#endif
1940                        if (ptr->skb != NULL)
1941                                dev_kfree_skb_any(ptr->skb);
1942                        dev->stats.rx_errors++;
1943                }
1944
1945                lp->rxrhead = lp->rxrhead->next;
1946
1947                /* Allocate a new rx PDL (so lp->rxrcommit stays the same) */
1948                if (0 == hp100_build_rx_pdl(lp->rxrtail, dev)) {
1949                        /* No space for skb, header can still be received. */
1950#ifdef HP100_DEBUG
1951                        printk("hp100: %s: rx_bm: No space for new PDL.\n", dev->name);
1952#endif
1953                        return;
1954                } else {        /* successfully allocated new PDL - put it in ringlist at tail. */
1955                        hp100_outl((u32) lp->rxrtail->pdl_paddr, RX_PDA);
1956                        lp->rxrtail = lp->rxrtail->next;
1957                }
1958
1959        }
1960}
1961
1962/*
1963 *  statistics
1964 */
1965static struct net_device_stats *hp100_get_stats(struct net_device *dev)
1966{
1967        unsigned long flags;
1968        int ioaddr = dev->base_addr;
1969        struct hp100_private *lp = netdev_priv(dev);
1970
1971#ifdef HP100_DEBUG_B
1972        hp100_outw(0x4215, TRACE);
1973#endif
1974
1975        spin_lock_irqsave(&lp->lock, flags);
1976        hp100_ints_off();       /* Useful ? Jean II */
1977        hp100_update_stats(dev);
1978        hp100_ints_on();
1979        spin_unlock_irqrestore(&lp->lock, flags);
1980        return &(dev->stats);
1981}
1982
1983static void hp100_update_stats(struct net_device *dev)
1984{
1985        int ioaddr = dev->base_addr;
1986        u_short val;
1987
1988#ifdef HP100_DEBUG_B
1989        hp100_outw(0x4216, TRACE);
1990        printk("hp100: %s: update-stats\n", dev->name);
1991#endif
1992
1993        /* Note: Statistics counters clear when read. */
1994        hp100_page(MAC_CTRL);
1995        val = hp100_inw(DROPPED) & 0x0fff;
1996        dev->stats.rx_errors += val;
1997        dev->stats.rx_over_errors += val;
1998        val = hp100_inb(CRC);
1999        dev->stats.rx_errors += val;
2000        dev->stats.rx_crc_errors += val;
2001        val = hp100_inb(ABORT);
2002        dev->stats.tx_errors += val;
2003        dev->stats.tx_aborted_errors += val;
2004        hp100_page(PERFORMANCE);
2005}
2006
2007static void hp100_misc_interrupt(struct net_device *dev)
2008{
2009#ifdef HP100_DEBUG_B
2010        int ioaddr = dev->base_addr;
2011#endif
2012
2013#ifdef HP100_DEBUG_B
2014        int ioaddr = dev->base_addr;
2015        hp100_outw(0x4216, TRACE);
2016        printk("hp100: %s: misc_interrupt\n", dev->name);
2017#endif
2018
2019        /* Note: Statistics counters clear when read. */
2020        dev->stats.rx_errors++;
2021        dev->stats.tx_errors++;
2022}
2023
2024static void hp100_clear_stats(struct hp100_private *lp, int ioaddr)
2025{
2026        unsigned long flags;
2027
2028#ifdef HP100_DEBUG_B
2029        hp100_outw(0x4217, TRACE);
2030        printk("hp100: %s: clear_stats\n", dev->name);
2031#endif
2032
2033        spin_lock_irqsave(&lp->lock, flags);
2034        hp100_page(MAC_CTRL);   /* get all statistics bytes */
2035        hp100_inw(DROPPED);
2036        hp100_inb(CRC);
2037        hp100_inb(ABORT);
2038        hp100_page(PERFORMANCE);
2039        spin_unlock_irqrestore(&lp->lock, flags);
2040}
2041
2042
2043/*
2044 *  multicast setup
2045 */
2046
2047/*
2048 *  Set or clear the multicast filter for this adapter.
2049 */
2050
2051static void hp100_set_multicast_list(struct net_device *dev)
2052{
2053        unsigned long flags;
2054        int ioaddr = dev->base_addr;
2055        struct hp100_private *lp = netdev_priv(dev);
2056
2057#ifdef HP100_DEBUG_B
2058        hp100_outw(0x4218, TRACE);
2059        printk("hp100: %s: set_mc_list\n", dev->name);
2060#endif
2061
2062        spin_lock_irqsave(&lp->lock, flags);
2063        hp100_ints_off();
2064        hp100_page(MAC_CTRL);
2065        hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);    /* stop rx/tx */
2066
2067        if (dev->flags & IFF_PROMISC) {
2068                lp->mac2_mode = HP100_MAC2MODE6;        /* promiscuous mode = get all good */
2069                lp->mac1_mode = HP100_MAC1MODE6;        /* packets on the net */
2070                memset(&lp->hash_bytes, 0xff, 8);
2071        } else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI)) {
2072                lp->mac2_mode = HP100_MAC2MODE5;        /* multicast mode = get packets for */
2073                lp->mac1_mode = HP100_MAC1MODE5;        /* me, broadcasts and all multicasts */
2074#ifdef HP100_MULTICAST_FILTER   /* doesn't work!!! */
2075                if (dev->flags & IFF_ALLMULTI) {
2076                        /* set hash filter to receive all multicast packets */
2077                        memset(&lp->hash_bytes, 0xff, 8);
2078                } else {
2079                        int i, idx;
2080                        u_char *addrs;
2081                        struct netdev_hw_addr *ha;
2082
2083                        memset(&lp->hash_bytes, 0x00, 8);
2084#ifdef HP100_DEBUG
2085                        printk("hp100: %s: computing hash filter - mc_count = %i\n",
2086                               dev->name, netdev_mc_count(dev));
2087#endif
2088                        netdev_for_each_mc_addr(ha, dev) {
2089                                addrs = ha->addr;
2090#ifdef HP100_DEBUG
2091                                printk("hp100: %s: multicast = %pM, ",
2092                                             dev->name, addrs);
2093#endif
2094                                for (i = idx = 0; i < 6; i++) {
2095                                        idx ^= *addrs++ & 0x3f;
2096                                        printk(":%02x:", idx);
2097                                }
2098#ifdef HP100_DEBUG
2099                                printk("idx = %i\n", idx);
2100#endif
2101                                lp->hash_bytes[idx >> 3] |= (1 << (idx & 7));
2102                        }
2103                }
2104#else
2105                memset(&lp->hash_bytes, 0xff, 8);
2106#endif
2107        } else {
2108                lp->mac2_mode = HP100_MAC2MODE3;        /* normal mode = get packets for me */
2109                lp->mac1_mode = HP100_MAC1MODE3;        /* and broadcasts */
2110                memset(&lp->hash_bytes, 0x00, 8);
2111        }
2112
2113        if (((hp100_inb(MAC_CFG_1) & 0x0f) != lp->mac1_mode) ||
2114            (hp100_inb(MAC_CFG_2) != lp->mac2_mode)) {
2115                int i;
2116
2117                hp100_outb(lp->mac2_mode, MAC_CFG_2);
2118                hp100_andb(HP100_MAC1MODEMASK, MAC_CFG_1);      /* clear mac1 mode bits */
2119                hp100_orb(lp->mac1_mode, MAC_CFG_1);    /* and set the new mode */
2120
2121                hp100_page(MAC_ADDRESS);
2122                for (i = 0; i < 8; i++)
2123                        hp100_outb(lp->hash_bytes[i], HASH_BYTE0 + i);
2124#ifdef HP100_DEBUG
2125                printk("hp100: %s: mac1 = 0x%x, mac2 = 0x%x, multicast hash = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
2126                                     dev->name, lp->mac1_mode, lp->mac2_mode,
2127                                     lp->hash_bytes[0], lp->hash_bytes[1],
2128                                     lp->hash_bytes[2], lp->hash_bytes[3],
2129                                     lp->hash_bytes[4], lp->hash_bytes[5],
2130                                     lp->hash_bytes[6], lp->hash_bytes[7]);
2131#endif
2132
2133                if (lp->lan_type == HP100_LAN_100) {
2134#ifdef HP100_DEBUG
2135                        printk("hp100: %s: 100VG MAC settings have changed - relogin.\n", dev->name);
2136#endif
2137                        lp->hub_status = hp100_login_to_vg_hub(dev, 1); /* force a relogin to the hub */
2138                }
2139        } else {
2140                int i;
2141                u_char old_hash_bytes[8];
2142
2143                hp100_page(MAC_ADDRESS);
2144                for (i = 0; i < 8; i++)
2145                        old_hash_bytes[i] = hp100_inb(HASH_BYTE0 + i);
2146                if (memcmp(old_hash_bytes, &lp->hash_bytes, 8)) {
2147                        for (i = 0; i < 8; i++)
2148                                hp100_outb(lp->hash_bytes[i], HASH_BYTE0 + i);
2149#ifdef HP100_DEBUG
2150                        printk("hp100: %s: multicast hash = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
2151                                        dev->name, lp->hash_bytes[0],
2152                                        lp->hash_bytes[1], lp->hash_bytes[2],
2153                                        lp->hash_bytes[3], lp->hash_bytes[4],
2154                                        lp->hash_bytes[5], lp->hash_bytes[6],
2155                                        lp->hash_bytes[7]);
2156#endif
2157
2158                        if (lp->lan_type == HP100_LAN_100) {
2159#ifdef HP100_DEBUG
2160                                printk("hp100: %s: 100VG MAC settings have changed - relogin.\n", dev->name);
2161#endif
2162                                lp->hub_status = hp100_login_to_vg_hub(dev, 1); /* force a relogin to the hub */
2163                        }
2164                }
2165        }
2166
2167        hp100_page(MAC_CTRL);
2168        hp100_orb(HP100_RX_EN | HP100_RX_IDLE | /* enable rx */
2169                  HP100_TX_EN | HP100_TX_IDLE, MAC_CFG_1);      /* enable tx */
2170
2171        hp100_page(PERFORMANCE);
2172        hp100_ints_on();
2173        spin_unlock_irqrestore(&lp->lock, flags);
2174}
2175
2176/*
2177 *  hardware interrupt handling
2178 */
2179
2180static irqreturn_t hp100_interrupt(int irq, void *dev_id)
2181{
2182        struct net_device *dev = (struct net_device *) dev_id;
2183        struct hp100_private *lp = netdev_priv(dev);
2184
2185        int ioaddr;
2186        u_int val;
2187
2188        if (dev == NULL)
2189                return IRQ_NONE;
2190        ioaddr = dev->base_addr;
2191
2192        spin_lock(&lp->lock);
2193
2194        hp100_ints_off();
2195
2196#ifdef HP100_DEBUG_B
2197        hp100_outw(0x4219, TRACE);
2198#endif
2199
2200        /*  hp100_page( PERFORMANCE ); */
2201        val = hp100_inw(IRQ_STATUS);
2202#ifdef HP100_DEBUG_IRQ
2203        printk("hp100: %s: mode=%x,IRQ_STAT=0x%.4x,RXPKTCNT=0x%.2x RXPDL=0x%.2x TXPKTCNT=0x%.2x TXPDL=0x%.2x\n",
2204                             dev->name, lp->mode, (u_int) val, hp100_inb(RX_PKT_CNT),
2205                             hp100_inb(RX_PDL), hp100_inb(TX_PKT_CNT), hp100_inb(TX_PDL));
2206#endif
2207
2208        if (val == 0) {         /* might be a shared interrupt */
2209                spin_unlock(&lp->lock);
2210                hp100_ints_on();
2211                return IRQ_NONE;
2212        }
2213        /* We're only interested in those interrupts we really enabled. */
2214        /* val &= hp100_inw( IRQ_MASK ); */
2215
2216        /*
2217         * RX_PDL_FILL_COMPL is set whenever a RX_PDL has been executed. A RX_PDL
2218         * is considered executed whenever the RX_PDL data structure is no longer
2219         * needed.
2220         */
2221        if (val & HP100_RX_PDL_FILL_COMPL) {
2222                if (lp->mode == 1)
2223                        hp100_rx_bm(dev);
2224                else {
2225                        printk("hp100: %s: rx_pdl_fill_compl interrupt although not busmaster?\n", dev->name);
2226                }
2227        }
2228
2229        /*
2230         * The RX_PACKET interrupt is set, when the receive packet counter is
2231         * non zero. We use this interrupt for receiving in slave mode. In
2232         * busmaster mode, we use it to make sure we did not miss any rx_pdl_fill
2233         * interrupts. If rx_pdl_fill_compl is not set and rx_packet is set, then
2234         * we somehow have missed a rx_pdl_fill_compl interrupt.
2235         */
2236
2237        if (val & HP100_RX_PACKET) {    /* Receive Packet Counter is non zero */
2238                if (lp->mode != 1)      /* non busmaster */
2239                        hp100_rx(dev);
2240                else if (!(val & HP100_RX_PDL_FILL_COMPL)) {
2241                        /* Shouldn't happen - maybe we missed a RX_PDL_FILL Interrupt?  */
2242                        hp100_rx_bm(dev);
2243                }
2244        }
2245
2246        /*
2247         * Ack. that we have noticed the interrupt and thereby allow next one.
2248         * Note that this is now done after the slave rx function, since first
2249         * acknowledging and then setting ADV_NXT_PKT caused an extra interrupt
2250         * on the J2573.
2251         */
2252        hp100_outw(val, IRQ_STATUS);
2253
2254        /*
2255         * RX_ERROR is set when a packet is dropped due to no memory resources on
2256         * the card or when a RCV_ERR occurs.
2257         * TX_ERROR is set when a TX_ABORT condition occurs in the MAC->exists
2258         * only in the 802.3 MAC and happens when 16 collisions occur during a TX
2259         */
2260        if (val & (HP100_TX_ERROR | HP100_RX_ERROR)) {
2261#ifdef HP100_DEBUG_IRQ
2262                printk("hp100: %s: TX/RX Error IRQ\n", dev->name);
2263#endif
2264                hp100_update_stats(dev);
2265                if (lp->mode == 1) {
2266                        hp100_rxfill(dev);
2267                        hp100_clean_txring(dev);
2268                }
2269        }
2270
2271        /*
2272         * RX_PDA_ZERO is set when the PDA count goes from non-zero to zero.
2273         */
2274        if ((lp->mode == 1) && (val & (HP100_RX_PDA_ZERO)))
2275                hp100_rxfill(dev);
2276
2277        /*
2278         * HP100_TX_COMPLETE interrupt occurs when packet transmitted on wire
2279         * is completed
2280         */
2281        if ((lp->mode == 1) && (val & (HP100_TX_COMPLETE)))
2282                hp100_clean_txring(dev);
2283
2284        /*
2285         * MISC_ERROR is set when either the LAN link goes down or a detected
2286         * bus error occurs.
2287         */
2288        if (val & HP100_MISC_ERROR) {   /* New for J2585B */
2289#ifdef HP100_DEBUG_IRQ
2290                printk
2291                    ("hp100: %s: Misc. Error Interrupt - Check cabling.\n",
2292                     dev->name);
2293#endif
2294                if (lp->mode == 1) {
2295                        hp100_clean_txring(dev);
2296                        hp100_rxfill(dev);
2297                }
2298                hp100_misc_interrupt(dev);
2299        }
2300
2301        spin_unlock(&lp->lock);
2302        hp100_ints_on();
2303        return IRQ_HANDLED;
2304}
2305
2306/*
2307 *  some misc functions
2308 */
2309
2310static void hp100_start_interface(struct net_device *dev)
2311{
2312        unsigned long flags;
2313        int ioaddr = dev->base_addr;
2314        struct hp100_private *lp = netdev_priv(dev);
2315
2316#ifdef HP100_DEBUG_B
2317        hp100_outw(0x4220, TRACE);
2318        printk("hp100: %s: hp100_start_interface\n", dev->name);
2319#endif
2320
2321        spin_lock_irqsave(&lp->lock, flags);
2322
2323        /* Ensure the adapter does not want to request an interrupt when */
2324        /* enabling the IRQ line to be active on the bus (i.e. not tri-stated) */
2325        hp100_page(PERFORMANCE);
2326        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all ints */
2327        hp100_outw(0xffff, IRQ_STATUS); /* ack all IRQs */
2328        hp100_outw(HP100_FAKE_INT | HP100_INT_EN | HP100_RESET_LB,
2329                   OPTION_LSW);
2330        /* Un Tri-state int. TODO: Check if shared interrupts can be realised? */
2331        hp100_outw(HP100_TRI_INT | HP100_RESET_HB, OPTION_LSW);
2332
2333        if (lp->mode == 1) {
2334                /* Make sure BM bit is set... */
2335                hp100_page(HW_MAP);
2336                hp100_orb(HP100_BM_MASTER, BM);
2337                hp100_rxfill(dev);
2338        } else if (lp->mode == 2) {
2339                /* Enable memory mapping. Note: Don't do this when busmaster. */
2340                hp100_outw(HP100_MMAP_DIS | HP100_RESET_HB, OPTION_LSW);
2341        }
2342
2343        hp100_page(PERFORMANCE);
2344        hp100_outw(0xfefe, IRQ_MASK);   /* mask off all ints */
2345        hp100_outw(0xffff, IRQ_STATUS); /* ack IRQ */
2346
2347        /* enable a few interrupts: */
2348        if (lp->mode == 1) {    /* busmaster mode */
2349                hp100_outw(HP100_RX_PDL_FILL_COMPL |
2350                           HP100_RX_PDA_ZERO | HP100_RX_ERROR |
2351                           /* HP100_RX_PACKET    | */
2352                           /* HP100_RX_EARLY_INT |  */ HP100_SET_HB |
2353                           /* HP100_TX_PDA_ZERO  |  */
2354                           HP100_TX_COMPLETE |
2355                           /* HP100_MISC_ERROR   |  */
2356                           HP100_TX_ERROR | HP100_SET_LB, IRQ_MASK);
2357        } else {
2358                hp100_outw(HP100_RX_PACKET |
2359                           HP100_RX_ERROR | HP100_SET_HB |
2360                           HP100_TX_ERROR | HP100_SET_LB, IRQ_MASK);
2361        }
2362
2363        /* Note : before hp100_set_multicast_list(), because it will play with
2364         * spinlock itself... Jean II */
2365        spin_unlock_irqrestore(&lp->lock, flags);
2366
2367        /* Enable MAC Tx and RX, set MAC modes, ... */
2368        hp100_set_multicast_list(dev);
2369}
2370
2371static void hp100_stop_interface(struct net_device *dev)
2372{
2373        struct hp100_private *lp = netdev_priv(dev);
2374        int ioaddr = dev->base_addr;
2375        u_int val;
2376
2377#ifdef HP100_DEBUG_B
2378        printk("hp100: %s: hp100_stop_interface\n", dev->name);
2379        hp100_outw(0x4221, TRACE);
2380#endif
2381
2382        if (lp->mode == 1)
2383                hp100_BM_shutdown(dev);
2384        else {
2385                /* Note: MMAP_DIS will be reenabled by start_interface */
2386                hp100_outw(HP100_INT_EN | HP100_RESET_LB |
2387                           HP100_TRI_INT | HP100_MMAP_DIS | HP100_SET_HB,
2388                           OPTION_LSW);
2389                val = hp100_inw(OPTION_LSW);
2390
2391                hp100_page(MAC_CTRL);
2392                hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);
2393
2394                if (!(val & HP100_HW_RST))
2395                        return; /* If reset, imm. return ... */
2396                /* ... else: busy wait until idle */
2397                for (val = 0; val < 6000; val++)
2398                        if ((hp100_inb(MAC_CFG_1) & (HP100_TX_IDLE | HP100_RX_IDLE)) == (HP100_TX_IDLE | HP100_RX_IDLE)) {
2399                                hp100_page(PERFORMANCE);
2400                                return;
2401                        }
2402                printk("hp100: %s: hp100_stop_interface - timeout\n", dev->name);
2403                hp100_page(PERFORMANCE);
2404        }
2405}
2406
2407static void hp100_load_eeprom(struct net_device *dev, u_short probe_ioaddr)
2408{
2409        int i;
2410        int ioaddr = probe_ioaddr > 0 ? probe_ioaddr : dev->base_addr;
2411
2412#ifdef HP100_DEBUG_B
2413        hp100_outw(0x4222, TRACE);
2414#endif
2415
2416        hp100_page(EEPROM_CTRL);
2417        hp100_andw(~HP100_EEPROM_LOAD, EEPROM_CTRL);
2418        hp100_orw(HP100_EEPROM_LOAD, EEPROM_CTRL);
2419        for (i = 0; i < 10000; i++)
2420                if (!(hp100_inb(OPTION_MSW) & HP100_EE_LOAD))
2421                        return;
2422        printk("hp100: %s: hp100_load_eeprom - timeout\n", dev->name);
2423}
2424
2425/*  Sense connection status.
2426 *  return values: LAN_10  - Connected to 10Mbit/s network
2427 *                 LAN_100 - Connected to 100Mbit/s network
2428 *                 LAN_ERR - not connected or 100Mbit/s Hub down
2429 */
2430static int hp100_sense_lan(struct net_device *dev)
2431{
2432        int ioaddr = dev->base_addr;
2433        u_short val_VG, val_10;
2434        struct hp100_private *lp = netdev_priv(dev);
2435
2436#ifdef HP100_DEBUG_B
2437        hp100_outw(0x4223, TRACE);
2438#endif
2439
2440        hp100_page(MAC_CTRL);
2441        val_10 = hp100_inb(10_LAN_CFG_1);
2442        val_VG = hp100_inb(VG_LAN_CFG_1);
2443        hp100_page(PERFORMANCE);
2444#ifdef HP100_DEBUG
2445        printk("hp100: %s: sense_lan: val_VG = 0x%04x, val_10 = 0x%04x\n",
2446               dev->name, val_VG, val_10);
2447#endif
2448
2449        if (val_10 & HP100_LINK_BEAT_ST)        /* 10Mb connection is active */
2450                return HP100_LAN_10;
2451
2452        if (val_10 & HP100_AUI_ST) {    /* have we BNC or AUI onboard? */
2453                /*
2454                 * This can be overriden by dos utility, so if this has no effect,
2455                 * perhaps you need to download that utility from HP and set card
2456                 * back to "auto detect".
2457                 */
2458                val_10 |= HP100_AUI_SEL | HP100_LOW_TH;
2459                hp100_page(MAC_CTRL);
2460                hp100_outb(val_10, 10_LAN_CFG_1);
2461                hp100_page(PERFORMANCE);
2462                return HP100_LAN_COAX;
2463        }
2464
2465        /* Those cards don't have a 100 Mbit connector */
2466        if ( !strcmp(lp->id, "HWP1920")  ||
2467             (lp->pci_dev &&
2468              lp->pci_dev->vendor == PCI_VENDOR_ID &&
2469              (lp->pci_dev->device == PCI_DEVICE_ID_HP_J2970A ||
2470               lp->pci_dev->device == PCI_DEVICE_ID_HP_J2973A)))
2471                return HP100_LAN_ERR;
2472
2473        if (val_VG & HP100_LINK_CABLE_ST)       /* Can hear the HUBs tone. */
2474                return HP100_LAN_100;
2475        return HP100_LAN_ERR;
2476}
2477
2478static int hp100_down_vg_link(struct net_device *dev)
2479{
2480        struct hp100_private *lp = netdev_priv(dev);
2481        int ioaddr = dev->base_addr;
2482        unsigned long time;
2483        long savelan, newlan;
2484
2485#ifdef HP100_DEBUG_B
2486        hp100_outw(0x4224, TRACE);
2487        printk("hp100: %s: down_vg_link\n", dev->name);
2488#endif
2489
2490        hp100_page(MAC_CTRL);
2491        time = jiffies + (HZ / 4);
2492        do {
2493                if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST)
2494                        break;
2495                if (!in_interrupt())
2496                        schedule_timeout_interruptible(1);
2497        } while (time_after(time, jiffies));
2498
2499        if (time_after_eq(jiffies, time))       /* no signal->no logout */
2500                return 0;
2501
2502        /* Drop the VG Link by clearing the link up cmd and load addr. */
2503
2504        hp100_andb(~(HP100_LOAD_ADDR | HP100_LINK_CMD), VG_LAN_CFG_1);
2505        hp100_orb(HP100_VG_SEL, VG_LAN_CFG_1);
2506
2507        /* Conditionally stall for >250ms on Link-Up Status (to go down) */
2508        time = jiffies + (HZ / 2);
2509        do {
2510                if (!(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST))
2511                        break;
2512                if (!in_interrupt())
2513                        schedule_timeout_interruptible(1);
2514        } while (time_after(time, jiffies));
2515
2516#ifdef HP100_DEBUG
2517        if (time_after_eq(jiffies, time))
2518                printk("hp100: %s: down_vg_link: Link does not go down?\n", dev->name);
2519#endif
2520
2521        /* To prevent condition where Rev 1 VG MAC and old hubs do not complete */
2522        /* logout under traffic (even though all the status bits are cleared),  */
2523        /* do this workaround to get the Rev 1 MAC in its idle state */
2524        if (lp->chip == HP100_CHIPID_LASSEN) {
2525                /* Reset VG MAC to insure it leaves the logoff state even if */
2526                /* the Hub is still emitting tones */
2527                hp100_andb(~HP100_VG_RESET, VG_LAN_CFG_1);
2528                udelay(1500);   /* wait for >1ms */
2529                hp100_orb(HP100_VG_RESET, VG_LAN_CFG_1);        /* Release Reset */
2530                udelay(1500);
2531        }
2532
2533        /* New: For lassen, switch to 10 Mbps mac briefly to clear training ACK */
2534        /* to get the VG mac to full reset. This is not req.d with later chips */
2535        /* Note: It will take the between 1 and 2 seconds for the VG mac to be */
2536        /* selected again! This will be left to the connect hub function to */
2537        /* perform if desired.  */
2538        if (lp->chip == HP100_CHIPID_LASSEN) {
2539                /* Have to write to 10 and 100VG control registers simultaneously */
2540                savelan = newlan = hp100_inl(10_LAN_CFG_1);     /* read 10+100 LAN_CFG regs */
2541                newlan &= ~(HP100_VG_SEL << 16);
2542                newlan |= (HP100_DOT3_MAC) << 8;
2543                hp100_andb(~HP100_AUTO_MODE, MAC_CFG_3);        /* Autosel off */
2544                hp100_outl(newlan, 10_LAN_CFG_1);
2545
2546                /* Conditionally stall for 5sec on VG selected. */
2547                time = jiffies + (HZ * 5);
2548                do {
2549                        if (!(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST))
2550                                break;
2551                        if (!in_interrupt())
2552                                schedule_timeout_interruptible(1);
2553                } while (time_after(time, jiffies));
2554
2555                hp100_orb(HP100_AUTO_MODE, MAC_CFG_3);  /* Autosel back on */
2556                hp100_outl(savelan, 10_LAN_CFG_1);
2557        }
2558
2559        time = jiffies + (3 * HZ);      /* Timeout 3s */
2560        do {
2561                if ((hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) == 0)
2562                        break;
2563                if (!in_interrupt())
2564                        schedule_timeout_interruptible(1);
2565        } while (time_after(time, jiffies));
2566
2567        if (time_before_eq(time, jiffies)) {
2568#ifdef HP100_DEBUG
2569                printk("hp100: %s: down_vg_link: timeout\n", dev->name);
2570#endif
2571                return -EIO;
2572        }
2573
2574        time = jiffies + (2 * HZ);      /* This seems to take a while.... */
2575        do {
2576                if (!in_interrupt())
2577                        schedule_timeout_interruptible(1);
2578        } while (time_after(time, jiffies));
2579
2580        return 0;
2581}
2582
2583static int hp100_login_to_vg_hub(struct net_device *dev, u_short force_relogin)
2584{
2585        int ioaddr = dev->base_addr;
2586        struct hp100_private *lp = netdev_priv(dev);
2587        u_short val = 0;
2588        unsigned long time;
2589        int startst;
2590
2591#ifdef HP100_DEBUG_B
2592        hp100_outw(0x4225, TRACE);
2593        printk("hp100: %s: login_to_vg_hub\n", dev->name);
2594#endif
2595
2596        /* Initiate a login sequence iff VG MAC is enabled and either Load Address
2597         * bit is zero or the force relogin flag is set (e.g. due to MAC address or
2598         * promiscuous mode change)
2599         */
2600        hp100_page(MAC_CTRL);
2601        startst = hp100_inb(VG_LAN_CFG_1);
2602        if ((force_relogin == 1) || (hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST)) {
2603#ifdef HP100_DEBUG_TRAINING
2604                printk("hp100: %s: Start training\n", dev->name);
2605#endif
2606
2607                /* Ensure VG Reset bit is 1 (i.e., do not reset) */
2608                hp100_orb(HP100_VG_RESET, VG_LAN_CFG_1);
2609
2610                /* If Lassen AND auto-select-mode AND VG tones were sensed on */
2611                /* entry then temporarily put them into force 100Mbit mode */
2612                if ((lp->chip == HP100_CHIPID_LASSEN) && (startst & HP100_LINK_CABLE_ST))
2613                        hp100_andb(~HP100_DOT3_MAC, 10_LAN_CFG_2);
2614
2615                /* Drop the VG link by zeroing Link Up Command and Load Address  */
2616                hp100_andb(~(HP100_LINK_CMD /* |HP100_LOAD_ADDR */ ), VG_LAN_CFG_1);
2617
2618#ifdef HP100_DEBUG_TRAINING
2619                printk("hp100: %s: Bring down the link\n", dev->name);
2620#endif
2621
2622                /* Wait for link to drop */
2623                time = jiffies + (HZ / 10);
2624                do {
2625                        if (!(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST))
2626                                break;
2627                        if (!in_interrupt())
2628                                schedule_timeout_interruptible(1);
2629                } while (time_after(time, jiffies));
2630
2631                /* Start an addressed training and optionally request promiscuous port */
2632                if ((dev->flags) & IFF_PROMISC) {
2633                        hp100_orb(HP100_PROM_MODE, VG_LAN_CFG_2);
2634                        if (lp->chip == HP100_CHIPID_LASSEN)
2635                                hp100_orw(HP100_MACRQ_PROMSC, TRAIN_REQUEST);
2636                } else {
2637                        hp100_andb(~HP100_PROM_MODE, VG_LAN_CFG_2);
2638                        /* For ETR parts we need to reset the prom. bit in the training
2639                         * register, otherwise promiscious mode won't be disabled.
2640                         */
2641                        if (lp->chip == HP100_CHIPID_LASSEN) {
2642                                hp100_andw(~HP100_MACRQ_PROMSC, TRAIN_REQUEST);
2643                        }
2644                }
2645
2646                /* With ETR parts, frame format request bits can be set. */
2647                if (lp->chip == HP100_CHIPID_LASSEN)
2648                        hp100_orb(HP100_MACRQ_FRAMEFMT_EITHER, TRAIN_REQUEST);
2649
2650                hp100_orb(HP100_LINK_CMD | HP100_LOAD_ADDR | HP100_VG_RESET, VG_LAN_CFG_1);
2651
2652                /* Note: Next wait could be omitted for Hood and earlier chips under */
2653                /* certain circumstances */
2654                /* TODO: check if hood/earlier and skip wait. */
2655
2656                /* Wait for either short timeout for VG tones or long for login    */
2657                /* Wait for the card hardware to signalise link cable status ok... */
2658                hp100_page(MAC_CTRL);
2659                time = jiffies + (1 * HZ);      /* 1 sec timeout for cable st */
2660                do {
2661                        if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST)
2662                                break;
2663                        if (!in_interrupt())
2664                                schedule_timeout_interruptible(1);
2665                } while (time_before(jiffies, time));
2666
2667                if (time_after_eq(jiffies, time)) {
2668#ifdef HP100_DEBUG_TRAINING
2669                        printk("hp100: %s: Link cable status not ok? Training aborted.\n", dev->name);
2670#endif
2671                } else {
2672#ifdef HP100_DEBUG_TRAINING
2673                        printk
2674                            ("hp100: %s: HUB tones detected. Trying to train.\n",
2675                             dev->name);
2676#endif
2677
2678                        time = jiffies + (2 * HZ);      /* again a timeout */
2679                        do {
2680                                val = hp100_inb(VG_LAN_CFG_1);
2681                                if ((val & (HP100_LINK_UP_ST))) {
2682#ifdef HP100_DEBUG_TRAINING
2683                                        printk("hp100: %s: Passed training.\n", dev->name);
2684#endif
2685                                        break;
2686                                }
2687                                if (!in_interrupt())
2688                                        schedule_timeout_interruptible(1);
2689                        } while (time_after(time, jiffies));
2690                }
2691
2692                /* If LINK_UP_ST is set, then we are logged into the hub. */
2693                if (time_before_eq(jiffies, time) && (val & HP100_LINK_UP_ST)) {
2694#ifdef HP100_DEBUG_TRAINING
2695                        printk("hp100: %s: Successfully logged into the HUB.\n", dev->name);
2696                        if (lp->chip == HP100_CHIPID_LASSEN) {
2697                                val = hp100_inw(TRAIN_ALLOW);
2698                                printk("hp100: %s: Card supports 100VG MAC Version \"%s\" ",
2699                                             dev->name, (hp100_inw(TRAIN_REQUEST) & HP100_CARD_MACVER) ? "802.12" : "Pre");
2700                                printk("Driver will use MAC Version \"%s\"\n", (val & HP100_HUB_MACVER) ? "802.12" : "Pre");
2701                                printk("hp100: %s: Frame format is %s.\n", dev->name, (val & HP100_MALLOW_FRAMEFMT) ? "802.5" : "802.3");
2702                        }
2703#endif
2704                } else {
2705                        /* If LINK_UP_ST is not set, login was not successful */
2706                        printk("hp100: %s: Problem logging into the HUB.\n", dev->name);
2707                        if (lp->chip == HP100_CHIPID_LASSEN) {
2708                                /* Check allowed Register to find out why there is a problem. */
2709                                val = hp100_inw(TRAIN_ALLOW);   /* won't work on non-ETR card */
2710#ifdef HP100_DEBUG_TRAINING
2711                                printk("hp100: %s: MAC Configuration requested: 0x%04x, HUB allowed: 0x%04x\n", dev->name, hp100_inw(TRAIN_REQUEST), val);
2712#endif
2713                                if (val & HP100_MALLOW_ACCDENIED)
2714                                        printk("hp100: %s: HUB access denied.\n", dev->name);
2715                                if (val & HP100_MALLOW_CONFIGURE)
2716                                        printk("hp100: %s: MAC Configuration is incompatible with the Network.\n", dev->name);
2717                                if (val & HP100_MALLOW_DUPADDR)
2718                                        printk("hp100: %s: Duplicate MAC Address on the Network.\n", dev->name);
2719                        }
2720                }
2721
2722                /* If we have put the chip into forced 100 Mbit mode earlier, go back */
2723                /* to auto-select mode */
2724
2725                if ((lp->chip == HP100_CHIPID_LASSEN) && (startst & HP100_LINK_CABLE_ST)) {
2726                        hp100_page(MAC_CTRL);
2727                        hp100_orb(HP100_DOT3_MAC, 10_LAN_CFG_2);
2728                }
2729
2730                val = hp100_inb(VG_LAN_CFG_1);
2731
2732                /* Clear the MISC_ERROR Interrupt, which might be generated when doing the relogin */
2733                hp100_page(PERFORMANCE);
2734                hp100_outw(HP100_MISC_ERROR, IRQ_STATUS);
2735
2736                if (val & HP100_LINK_UP_ST)
2737                        return 0;       /* login was ok */
2738                else {
2739                        printk("hp100: %s: Training failed.\n", dev->name);
2740                        hp100_down_vg_link(dev);
2741                        return -EIO;
2742                }
2743        }
2744        /* no forced relogin & already link there->no training. */
2745        return -EIO;
2746}
2747
2748static void hp100_cascade_reset(struct net_device *dev, u_short enable)
2749{
2750        int ioaddr = dev->base_addr;
2751        struct hp100_private *lp = netdev_priv(dev);
2752
2753#ifdef HP100_DEBUG_B
2754        hp100_outw(0x4226, TRACE);
2755        printk("hp100: %s: cascade_reset\n", dev->name);
2756#endif
2757
2758        if (enable) {
2759                hp100_outw(HP100_HW_RST | HP100_RESET_LB, OPTION_LSW);
2760                if (lp->chip == HP100_CHIPID_LASSEN) {
2761                        /* Lassen requires a PCI transmit fifo reset */
2762                        hp100_page(HW_MAP);
2763                        hp100_andb(~HP100_PCI_RESET, PCICTRL2);
2764                        hp100_orb(HP100_PCI_RESET, PCICTRL2);
2765                        /* Wait for min. 300 ns */
2766                        /* we can't use jiffies here, because it may be */
2767                        /* that we have disabled the timer... */
2768                        udelay(400);
2769                        hp100_andb(~HP100_PCI_RESET, PCICTRL2);
2770                        hp100_page(PERFORMANCE);
2771                }
2772        } else {                /* bring out of reset */
2773                hp100_outw(HP100_HW_RST | HP100_SET_LB, OPTION_LSW);
2774                udelay(400);
2775                hp100_page(PERFORMANCE);
2776        }
2777}
2778
2779#ifdef HP100_DEBUG
2780void hp100_RegisterDump(struct net_device *dev)
2781{
2782        int ioaddr = dev->base_addr;
2783        int Page;
2784        int Register;
2785
2786        /* Dump common registers */
2787        printk("hp100: %s: Cascade Register Dump\n", dev->name);
2788        printk("hardware id #1: 0x%.2x\n", hp100_inb(HW_ID));
2789        printk("hardware id #2/paging: 0x%.2x\n", hp100_inb(PAGING));
2790        printk("option #1: 0x%.4x\n", hp100_inw(OPTION_LSW));
2791        printk("option #2: 0x%.4x\n", hp100_inw(OPTION_MSW));
2792
2793        /* Dump paged registers */
2794        for (Page = 0; Page < 8; Page++) {
2795                /* Dump registers */
2796                printk("page: 0x%.2x\n", Page);
2797                outw(Page, ioaddr + 0x02);
2798                for (Register = 0x8; Register < 0x22; Register += 2) {
2799                        /* Display Register contents except data port */
2800                        if (((Register != 0x10) && (Register != 0x12)) || (Page > 0)) {
2801                                printk("0x%.2x = 0x%.4x\n", Register, inw(ioaddr + Register));
2802                        }
2803                }
2804        }
2805        hp100_page(PERFORMANCE);
2806}
2807#endif
2808
2809
2810static void cleanup_dev(struct net_device *d)
2811{
2812        struct hp100_private *p = netdev_priv(d);
2813
2814        unregister_netdev(d);
2815        release_region(d->base_addr, HP100_REGION_SIZE);
2816
2817        if (p->mode == 1)       /* busmaster */
2818                pci_free_consistent(p->pci_dev, MAX_RINGSIZE + 0x0f,
2819                                    p->page_vaddr_algn,
2820                                    virt_to_whatever(d, p->page_vaddr_algn));
2821        if (p->mem_ptr_virt)
2822                iounmap(p->mem_ptr_virt);
2823
2824        free_netdev(d);
2825}
2826
2827static int hp100_eisa_probe(struct device *gendev)
2828{
2829        struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
2830        struct eisa_device *edev = to_eisa_device(gendev);
2831        int err;
2832
2833        if (!dev)
2834                return -ENOMEM;
2835
2836        SET_NETDEV_DEV(dev, &edev->dev);
2837
2838        err = hp100_probe1(dev, edev->base_addr + 0xC38, HP100_BUS_EISA, NULL);
2839        if (err)
2840                goto out1;
2841
2842#ifdef HP100_DEBUG
2843        printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name,
2844               dev->base_addr);
2845#endif
2846        dev_set_drvdata(gendev, dev);
2847        return 0;
2848 out1:
2849        free_netdev(dev);
2850        return err;
2851}
2852
2853static int hp100_eisa_remove(struct device *gendev)
2854{
2855        struct net_device *dev = dev_get_drvdata(gendev);
2856        cleanup_dev(dev);
2857        return 0;
2858}
2859
2860static struct eisa_driver hp100_eisa_driver = {
2861        .id_table = hp100_eisa_tbl,
2862        .driver   = {
2863                .name    = "hp100",
2864                .probe   = hp100_eisa_probe,
2865                .remove  = hp100_eisa_remove,
2866        }
2867};
2868
2869static int hp100_pci_probe(struct pci_dev *pdev,
2870                           const struct pci_device_id *ent)
2871{
2872        struct net_device *dev;
2873        int ioaddr;
2874        u_short pci_command;
2875        int err;
2876
2877        if (pci_enable_device(pdev))
2878                return -ENODEV;
2879
2880        dev = alloc_etherdev(sizeof(struct hp100_private));
2881        if (!dev) {
2882                err = -ENOMEM;
2883                goto out0;
2884        }
2885
2886        SET_NETDEV_DEV(dev, &pdev->dev);
2887
2888        pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
2889        if (!(pci_command & PCI_COMMAND_IO)) {
2890#ifdef HP100_DEBUG
2891                printk("hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name);
2892#endif
2893                pci_command |= PCI_COMMAND_IO;
2894                pci_write_config_word(pdev, PCI_COMMAND, pci_command);
2895        }
2896
2897        if (!(pci_command & PCI_COMMAND_MASTER)) {
2898#ifdef HP100_DEBUG
2899                printk("hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name);
2900#endif
2901                pci_command |= PCI_COMMAND_MASTER;
2902                pci_write_config_word(pdev, PCI_COMMAND, pci_command);
2903        }
2904
2905        ioaddr = pci_resource_start(pdev, 0);
2906        err = hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pdev);
2907        if (err)
2908                goto out1;
2909
2910#ifdef HP100_DEBUG
2911        printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr);
2912#endif
2913        pci_set_drvdata(pdev, dev);
2914        return 0;
2915 out1:
2916        free_netdev(dev);
2917 out0:
2918        pci_disable_device(pdev);
2919        return err;
2920}
2921
2922static void hp100_pci_remove(struct pci_dev *pdev)
2923{
2924        struct net_device *dev = pci_get_drvdata(pdev);
2925
2926        cleanup_dev(dev);
2927        pci_disable_device(pdev);
2928}
2929
2930
2931static struct pci_driver hp100_pci_driver = {
2932        .name           = "hp100",
2933        .id_table       = hp100_pci_tbl,
2934        .probe          = hp100_pci_probe,
2935        .remove         = hp100_pci_remove,
2936};
2937
2938/*
2939 *  module section
2940 */
2941
2942MODULE_LICENSE("GPL");
2943MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, "
2944              "Siegfried \"Frieder\" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>");
2945MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters");
2946
2947/*
2948 * Note: to register three isa devices, use:
2949 * option hp100 hp100_port=0,0,0
2950 *        to register one card at io 0x280 as eth239, use:
2951 * option hp100 hp100_port=0x280
2952 */
2953#if defined(MODULE) && defined(CONFIG_ISA)
2954#define HP100_DEVICES 5
2955/* Parameters set by insmod */
2956static int hp100_port[HP100_DEVICES] = { 0, [1 ... (HP100_DEVICES-1)] = -1 };
2957module_param_hw_array(hp100_port, int, ioport, NULL, 0);
2958
2959/* List of devices */
2960static struct net_device *hp100_devlist[HP100_DEVICES];
2961
2962static int __init hp100_isa_init(void)
2963{
2964        struct net_device *dev;
2965        int i, err, cards = 0;
2966
2967        /* Don't autoprobe ISA bus */
2968        if (hp100_port[0] == 0)
2969                return -ENODEV;
2970
2971        /* Loop on all possible base addresses */
2972        for (i = 0; i < HP100_DEVICES && hp100_port[i] != -1; ++i) {
2973                dev = alloc_etherdev(sizeof(struct hp100_private));
2974                if (!dev) {
2975                        while (cards > 0)
2976                                cleanup_dev(hp100_devlist[--cards]);
2977
2978                        return -ENOMEM;
2979                }
2980
2981                err = hp100_isa_probe(dev, hp100_port[i]);
2982                if (!err)
2983                        hp100_devlist[cards++] = dev;
2984                else
2985                        free_netdev(dev);
2986        }
2987
2988        return cards > 0 ? 0 : -ENODEV;
2989}
2990
2991static void hp100_isa_cleanup(void)
2992{
2993        int i;
2994
2995        for (i = 0; i < HP100_DEVICES; i++) {
2996                struct net_device *dev = hp100_devlist[i];
2997                if (dev)
2998                        cleanup_dev(dev);
2999        }
3000}
3001#else
3002#define hp100_isa_init()        (0)
3003#define hp100_isa_cleanup()     do { } while(0)
3004#endif
3005
3006static int __init hp100_module_init(void)
3007{
3008        int err;
3009
3010        err = hp100_isa_init();
3011        if (err && err != -ENODEV)
3012                goto out;
3013        err = eisa_driver_register(&hp100_eisa_driver);
3014        if (err && err != -ENODEV)
3015                goto out2;
3016        err = pci_register_driver(&hp100_pci_driver);
3017        if (err && err != -ENODEV)
3018                goto out3;
3019 out:
3020        return err;
3021 out3:
3022        eisa_driver_unregister (&hp100_eisa_driver);
3023 out2:
3024        hp100_isa_cleanup();
3025        goto out;
3026}
3027
3028
3029static void __exit hp100_module_exit(void)
3030{
3031        hp100_isa_cleanup();
3032        eisa_driver_unregister (&hp100_eisa_driver);
3033        pci_unregister_driver (&hp100_pci_driver);
3034}
3035
3036module_init(hp100_module_init)
3037module_exit(hp100_module_exit)
3038