linux/drivers/staging/slicoss/slicoss.c
<<
>>
Prefs
   1/**************************************************************************
   2 *
   3 * Copyright  2000-2006 Alacritech, Inc.  All rights reserved.
   4 *
   5 * Redistribution and use in source and binary forms, with or without
   6 * modification, are permitted provided that the following conditions
   7 * are met:
   8 *
   9 * 1. Redistributions of source code must retain the above copyright
  10 *    notice, this list of conditions and the following disclaimer.
  11 * 2. Redistributions in binary form must reproduce the above
  12 *    copyright notice, this list of conditions and the following
  13 *    disclaimer in the documentation and/or other materials provided
  14 *    with the distribution.
  15 *
  16 * Alternatively, this software may be distributed under the terms of the
  17 * GNU General Public License ("GPL") version 2 as published by the Free
  18 * Software Foundation.
  19 *
  20 * THIS SOFTWARE IS PROVIDED BY ALACRITECH, INC. ``AS IS'' AND ANY
  21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ALACRITECH, INC. OR
  24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  27 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  30 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31 * SUCH DAMAGE.
  32 *
  33 * The views and conclusions contained in the software and documentation
  34 * are those of the authors and should not be interpreted as representing
  35 * official policies, either expressed or implied, of Alacritech, Inc.
  36 *
  37 **************************************************************************/
  38
  39/*
  40 * FILENAME: slicoss.c
  41 *
  42 * The SLICOSS driver for Alacritech's IS-NIC products.
  43 *
  44 * This driver is supposed to support:
  45 *
  46 *      Mojave cards (single port PCI Gigabit) both copper and fiber
  47 *      Oasis cards (single and dual port PCI-x Gigabit) copper and fiber
  48 *      Kalahari cards (dual and quad port PCI-e Gigabit) copper and fiber
  49 *
  50 * The driver was acutally tested on Oasis and Kalahari cards.
  51 *
  52 *
  53 * NOTE: This is the standard, non-accelerated version of Alacritech's
  54 *       IS-NIC driver.
  55 */
  56
  57
  58#define KLUDGE_FOR_4GB_BOUNDARY         1
  59#define DEBUG_MICROCODE                 1
  60#define DBG                             1
  61#define SLIC_INTERRUPT_PROCESS_LIMIT    1
  62#define SLIC_OFFLOAD_IP_CHECKSUM                1
  63#define STATS_TIMER_INTERVAL                    2
  64#define PING_TIMER_INTERVAL                         1
  65
  66#include <linux/kernel.h>
  67#include <linux/string.h>
  68#include <linux/errno.h>
  69#include <linux/ioport.h>
  70#include <linux/slab.h>
  71#include <linux/interrupt.h>
  72#include <linux/timer.h>
  73#include <linux/pci.h>
  74#include <linux/spinlock.h>
  75#include <linux/init.h>
  76#include <linux/bitops.h>
  77#include <linux/io.h>
  78#include <linux/netdevice.h>
  79#include <linux/etherdevice.h>
  80#include <linux/skbuff.h>
  81#include <linux/delay.h>
  82#include <linux/debugfs.h>
  83#include <linux/seq_file.h>
  84#include <linux/kthread.h>
  85#include <linux/module.h>
  86#include <linux/moduleparam.h>
  87
  88#include <linux/firmware.h>
  89#include <linux/types.h>
  90#include <linux/dma-mapping.h>
  91#include <linux/mii.h>
  92#include <linux/if_vlan.h>
  93#include <asm/unaligned.h>
  94
  95#include <linux/ethtool.h>
  96#include <linux/uaccess.h>
  97#include "slichw.h"
  98#include "slic.h"
  99
 100static uint slic_first_init = 1;
 101static char *slic_banner = "Alacritech SLIC Technology(tm) Server "\
 102                "and Storage Accelerator (Non-Accelerated)";
 103
 104static char *slic_proc_version = "2.0.351  2006/07/14 12:26:00";
 105static char *slic_product_name = "SLIC Technology(tm) Server "\
 106                "and Storage Accelerator (Non-Accelerated)";
 107static char *slic_vendor = "Alacritech, Inc.";
 108
 109static int slic_debug = 1;
 110static int debug = -1;
 111static struct net_device *head_netdevice;
 112
 113static struct base_driver slic_global = { {}, 0, 0, 0, 1, NULL, NULL };
 114static int intagg_delay = 100;
 115static u32 dynamic_intagg;
 116static unsigned int rcv_count;
 117static struct dentry *slic_debugfs;
 118
 119#define DRV_NAME          "slicoss"
 120#define DRV_VERSION       "2.0.1"
 121#define DRV_AUTHOR        "Alacritech, Inc. Engineering"
 122#define DRV_DESCRIPTION   "Alacritech SLIC Techonology(tm) "\
 123                "Non-Accelerated Driver"
 124#define DRV_COPYRIGHT     "Copyright  2000-2006 Alacritech, Inc. "\
 125                "All rights reserved."
 126#define PFX                DRV_NAME " "
 127
 128MODULE_AUTHOR(DRV_AUTHOR);
 129MODULE_DESCRIPTION(DRV_DESCRIPTION);
 130MODULE_LICENSE("Dual BSD/GPL");
 131
 132module_param(dynamic_intagg, int, 0);
 133MODULE_PARM_DESC(dynamic_intagg, "Dynamic Interrupt Aggregation Setting");
 134module_param(intagg_delay, int, 0);
 135MODULE_PARM_DESC(intagg_delay, "uSec Interrupt Aggregation Delay");
 136
 137static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = {
 138        { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_1GB_DEVICE_ID) },
 139        { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_2GB_DEVICE_ID) },
 140        { 0 }
 141};
 142
 143MODULE_DEVICE_TABLE(pci, slic_pci_tbl);
 144
 145#ifdef ASSERT
 146#undef ASSERT
 147#endif
 148
 149static void slic_assert_fail(void)
 150{
 151        u32 cpuid;
 152        u32 curr_pid;
 153        cpuid = smp_processor_id();
 154        curr_pid = current->pid;
 155
 156        printk(KERN_ERR "%s CPU # %d ---- PID # %d\n",
 157               __func__, cpuid, curr_pid);
 158}
 159
 160#ifndef ASSERT
 161#define ASSERT(a) do {                                                  \
 162        if (!(a)) {                                                     \
 163                printk(KERN_ERR "slicoss ASSERT() Failure: function %s" \
 164                        "line %d\n", __func__, __LINE__);               \
 165                slic_assert_fail();                                     \
 166        }                                                               \
 167} while (0)
 168#endif
 169
 170
 171#define SLIC_GET_SLIC_HANDLE(_adapter, _pslic_handle)                   \
 172{                                                                       \
 173    spin_lock_irqsave(&_adapter->handle_lock.lock,                      \
 174                        _adapter->handle_lock.flags);                   \
 175    _pslic_handle  =  _adapter->pfree_slic_handles;                     \
 176    if (_pslic_handle) {                                                \
 177        ASSERT(_pslic_handle->type == SLIC_HANDLE_FREE);                \
 178        _adapter->pfree_slic_handles = _pslic_handle->next;             \
 179    }                                                                   \
 180    spin_unlock_irqrestore(&_adapter->handle_lock.lock,                 \
 181                        _adapter->handle_lock.flags);                   \
 182}
 183
 184#define SLIC_FREE_SLIC_HANDLE(_adapter, _pslic_handle)                  \
 185{                                                                       \
 186    _pslic_handle->type = SLIC_HANDLE_FREE;                             \
 187    spin_lock_irqsave(&_adapter->handle_lock.lock,                      \
 188                        _adapter->handle_lock.flags);                   \
 189    _pslic_handle->next = _adapter->pfree_slic_handles;                 \
 190    _adapter->pfree_slic_handles = _pslic_handle;                       \
 191    spin_unlock_irqrestore(&_adapter->handle_lock.lock,                 \
 192                        _adapter->handle_lock.flags);                   \
 193}
 194
 195static inline void slic_reg32_write(void __iomem *reg, u32 value, bool flush)
 196{
 197        writel(value, reg);
 198        if (flush)
 199                mb();
 200}
 201
 202static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg,
 203                                    u32 value, void __iomem *regh, u32 paddrh,
 204                                    bool flush)
 205{
 206        spin_lock_irqsave(&adapter->bit64reglock.lock,
 207                                adapter->bit64reglock.flags);
 208        if (paddrh != adapter->curaddrupper) {
 209                adapter->curaddrupper = paddrh;
 210                writel(paddrh, regh);
 211        }
 212        writel(value, reg);
 213        if (flush)
 214                mb();
 215        spin_unlock_irqrestore(&adapter->bit64reglock.lock,
 216                                adapter->bit64reglock.flags);
 217}
 218
 219/*
 220 * Functions to obtain the CRC corresponding to the destination mac address.
 221 * This is a standard ethernet CRC in that it is a 32-bit, reflected CRC using
 222 * the polynomial:
 223 *   x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 +
 224 *   x^4 + x^2 + x^1.
 225 *
 226 * After the CRC for the 6 bytes is generated (but before the value is
 227 * complemented),
 228 * we must then transpose the value and return bits 30-23.
 229 *
 230 */
 231static u32 slic_crc_table[256]; /* Table of CRCs for all possible byte values */
 232static u32 slic_crc_init;       /* Is table initialized */
 233
 234/*
 235 *  Contruct the CRC32 table
 236 */
 237static void slic_mcast_init_crc32(void)
 238{
 239        u32 c;          /*  CRC shit reg                 */
 240        u32 e = 0;              /*  Poly X-or pattern            */
 241        int i;                  /*  counter                      */
 242        int k;                  /*  byte being shifted into crc  */
 243
 244        static int p[] = { 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26 };
 245
 246        for (i = 0; i < ARRAY_SIZE(p); i++)
 247                e |= 1L << (31 - p[i]);
 248
 249        for (i = 1; i < 256; i++) {
 250                c = i;
 251                for (k = 8; k; k--)
 252                        c = c & 1 ? (c >> 1) ^ e : c >> 1;
 253                slic_crc_table[i] = c;
 254        }
 255}
 256
 257/*
 258 *  Return the MAC hast as described above.
 259 */
 260static unsigned char slic_mcast_get_mac_hash(char *macaddr)
 261{
 262        u32 crc;
 263        char *p;
 264        int i;
 265        unsigned char machash = 0;
 266
 267        if (!slic_crc_init) {
 268                slic_mcast_init_crc32();
 269                slic_crc_init = 1;
 270        }
 271
 272        crc = 0xFFFFFFFF;       /* Preload shift register, per crc-32 spec */
 273        for (i = 0, p = macaddr; i < 6; ++p, ++i)
 274                crc = (crc >> 8) ^ slic_crc_table[(crc ^ *p) & 0xFF];
 275
 276        /* Return bits 1-8, transposed */
 277        for (i = 1; i < 9; i++)
 278                machash |= (((crc >> i) & 1) << (8 - i));
 279
 280        return machash;
 281}
 282
 283static void slic_mcast_set_bit(struct adapter *adapter, char *address)
 284{
 285        unsigned char crcpoly;
 286
 287        /* Get the CRC polynomial for the mac address */
 288        crcpoly = slic_mcast_get_mac_hash(address);
 289
 290        /* We only have space on the SLIC for 64 entries.  Lop
 291         * off the top two bits. (2^6 = 64)
 292         */
 293        crcpoly &= 0x3F;
 294
 295        /* OR in the new bit into our 64 bit mask. */
 296        adapter->mcastmask |= (u64) 1 << crcpoly;
 297}
 298
 299static void slic_mcast_set_mask(struct adapter *adapter)
 300{
 301        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 302
 303        if (adapter->macopts & (MAC_ALLMCAST | MAC_PROMISC)) {
 304                /* Turn on all multicast addresses. We have to do this for
 305                 * promiscuous mode as well as ALLMCAST mode.  It saves the
 306                 * Microcode from having to keep state about the MAC
 307                 * configuration.
 308                 */
 309                slic_reg32_write(&slic_regs->slic_mcastlow, 0xFFFFFFFF, FLUSH);
 310                slic_reg32_write(&slic_regs->slic_mcasthigh, 0xFFFFFFFF,
 311                                 FLUSH);
 312        } else {
 313                /* Commit our multicast mast to the SLIC by writing to the
 314                 * multicast address mask registers
 315                 */
 316                slic_reg32_write(&slic_regs->slic_mcastlow,
 317                        (u32)(adapter->mcastmask & 0xFFFFFFFF), FLUSH);
 318                slic_reg32_write(&slic_regs->slic_mcasthigh,
 319                        (u32)((adapter->mcastmask >> 32) & 0xFFFFFFFF), FLUSH);
 320        }
 321}
 322
 323static void slic_timer_ping(ulong dev)
 324{
 325        struct adapter *adapter;
 326        struct sliccard *card;
 327
 328        ASSERT(dev);
 329        adapter = netdev_priv((struct net_device *)dev);
 330        ASSERT(adapter);
 331        card = adapter->card;
 332        ASSERT(card);
 333
 334        adapter->pingtimer.expires = jiffies + (PING_TIMER_INTERVAL * HZ);
 335        add_timer(&adapter->pingtimer);
 336}
 337
 338static void slic_unmap_mmio_space(struct adapter *adapter)
 339{
 340        if (adapter->slic_regs)
 341                iounmap(adapter->slic_regs);
 342        adapter->slic_regs = NULL;
 343}
 344
 345/*
 346 *  slic_link_config
 347 *
 348 *  Write phy control to configure link duplex/speed
 349 *
 350 */
 351static void slic_link_config(struct adapter *adapter,
 352                      u32 linkspeed, u32 linkduplex)
 353{
 354        u32 __iomem *wphy;
 355        u32 speed;
 356        u32 duplex;
 357        u32 phy_config;
 358        u32 phy_advreg;
 359        u32 phy_gctlreg;
 360
 361        if (adapter->state != ADAPT_UP)
 362                return;
 363
 364        ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID)
 365               || (adapter->devid == SLIC_2GB_DEVICE_ID));
 366
 367        if (linkspeed > LINK_1000MB)
 368                linkspeed = LINK_AUTOSPEED;
 369        if (linkduplex > LINK_AUTOD)
 370                linkduplex = LINK_AUTOD;
 371
 372        wphy = &adapter->slic_regs->slic_wphy;
 373
 374        if ((linkspeed == LINK_AUTOSPEED) || (linkspeed == LINK_1000MB)) {
 375                if (adapter->flags & ADAPT_FLAGS_FIBERMEDIA) {
 376                        /*  We've got a fiber gigabit interface, and register
 377                         *  4 is different in fiber mode than in copper mode
 378                         */
 379
 380                        /* advertise FD only @1000 Mb */
 381                        phy_advreg = (MIICR_REG_4 | (PAR_ADV1000XFD));
 382                        /* enable PAUSE frames        */
 383                        phy_advreg |= PAR_ASYMPAUSE_FIBER;
 384                        slic_reg32_write(wphy, phy_advreg, FLUSH);
 385
 386                        if (linkspeed == LINK_AUTOSPEED) {
 387                                /* reset phy, enable auto-neg  */
 388                                phy_config =
 389                                    (MIICR_REG_PCR |
 390                                     (PCR_RESET | PCR_AUTONEG |
 391                                      PCR_AUTONEG_RST));
 392                                slic_reg32_write(wphy, phy_config, FLUSH);
 393                        } else {        /* forced 1000 Mb FD*/
 394                                /* power down phy to break link
 395                                   this may not work) */
 396                                phy_config = (MIICR_REG_PCR | PCR_POWERDOWN);
 397                                slic_reg32_write(wphy, phy_config, FLUSH);
 398                                /* wait, Marvell says 1 sec,
 399                                   try to get away with 10 ms  */
 400                                mdelay(10);
 401
 402                                /* disable auto-neg, set speed/duplex,
 403                                   soft reset phy, powerup */
 404                                phy_config =
 405                                    (MIICR_REG_PCR |
 406                                     (PCR_RESET | PCR_SPEED_1000 |
 407                                      PCR_DUPLEX_FULL));
 408                                slic_reg32_write(wphy, phy_config, FLUSH);
 409                        }
 410                } else {        /* copper gigabit */
 411
 412                        /* Auto-Negotiate or 1000 Mb must be auto negotiated
 413                         * We've got a copper gigabit interface, and
 414                         * register 4 is different in copper mode than
 415                         * in fiber mode
 416                         */
 417                        if (linkspeed == LINK_AUTOSPEED) {
 418                                /* advertise 10/100 Mb modes   */
 419                                phy_advreg =
 420                                    (MIICR_REG_4 |
 421                                     (PAR_ADV100FD | PAR_ADV100HD | PAR_ADV10FD
 422                                      | PAR_ADV10HD));
 423                        } else {
 424                        /* linkspeed == LINK_1000MB -
 425                           don't advertise 10/100 Mb modes  */
 426                                phy_advreg = MIICR_REG_4;
 427                        }
 428                        /* enable PAUSE frames  */
 429                        phy_advreg |= PAR_ASYMPAUSE;
 430                        /* required by the Cicada PHY  */
 431                        phy_advreg |= PAR_802_3;
 432                        slic_reg32_write(wphy, phy_advreg, FLUSH);
 433                        /* advertise FD only @1000 Mb  */
 434                        phy_gctlreg = (MIICR_REG_9 | (PGC_ADV1000FD));
 435                        slic_reg32_write(wphy, phy_gctlreg, FLUSH);
 436
 437                        if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
 438                                /* if a Marvell PHY
 439                                   enable auto crossover */
 440                                phy_config =
 441                                    (MIICR_REG_16 | (MRV_REG16_XOVERON));
 442                                slic_reg32_write(wphy, phy_config, FLUSH);
 443
 444                                /* reset phy, enable auto-neg  */
 445                                phy_config =
 446                                    (MIICR_REG_PCR |
 447                                     (PCR_RESET | PCR_AUTONEG |
 448                                      PCR_AUTONEG_RST));
 449                                slic_reg32_write(wphy, phy_config, FLUSH);
 450                        } else {        /* it's a Cicada PHY  */
 451                                /* enable and restart auto-neg (don't reset)  */
 452                                phy_config =
 453                                    (MIICR_REG_PCR |
 454                                     (PCR_AUTONEG | PCR_AUTONEG_RST));
 455                                slic_reg32_write(wphy, phy_config, FLUSH);
 456                        }
 457                }
 458        } else {
 459                /* Forced 10/100  */
 460                if (linkspeed == LINK_10MB)
 461                        speed = 0;
 462                else
 463                        speed = PCR_SPEED_100;
 464                if (linkduplex == LINK_HALFD)
 465                        duplex = 0;
 466                else
 467                        duplex = PCR_DUPLEX_FULL;
 468
 469                if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
 470                        /* if a Marvell PHY
 471                           disable auto crossover  */
 472                        phy_config = (MIICR_REG_16 | (MRV_REG16_XOVEROFF));
 473                        slic_reg32_write(wphy, phy_config, FLUSH);
 474                }
 475
 476                /* power down phy to break link (this may not work)  */
 477                phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN | speed | duplex));
 478                slic_reg32_write(wphy, phy_config, FLUSH);
 479
 480                /* wait, Marvell says 1 sec, try to get away with 10 ms */
 481                mdelay(10);
 482
 483                if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
 484                        /* if a Marvell PHY
 485                           disable auto-neg, set speed,
 486                           soft reset phy, powerup */
 487                        phy_config =
 488                            (MIICR_REG_PCR | (PCR_RESET | speed | duplex));
 489                        slic_reg32_write(wphy, phy_config, FLUSH);
 490                } else {        /* it's a Cicada PHY  */
 491                        /* disable auto-neg, set speed, powerup  */
 492                        phy_config = (MIICR_REG_PCR | (speed | duplex));
 493                        slic_reg32_write(wphy, phy_config, FLUSH);
 494                }
 495        }
 496}
 497
 498static int slic_card_download_gbrcv(struct adapter *adapter)
 499{
 500        const struct firmware *fw;
 501        const char *file = "";
 502        int ret;
 503        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 504        u32 codeaddr;
 505        u32 instruction;
 506        int index = 0;
 507        u32 rcvucodelen = 0;
 508
 509        switch (adapter->devid) {
 510        case SLIC_2GB_DEVICE_ID:
 511                file = "slicoss/oasisrcvucode.sys";
 512                break;
 513        case SLIC_1GB_DEVICE_ID:
 514                file = "slicoss/gbrcvucode.sys";
 515                break;
 516        default:
 517                ASSERT(0);
 518                break;
 519        }
 520
 521        ret = request_firmware(&fw, file, &adapter->pcidev->dev);
 522        if (ret) {
 523                dev_err(&adapter->pcidev->dev,
 524                        "SLICOSS: Failed to load firmware %s\n", file);
 525                return ret;
 526        }
 527
 528        rcvucodelen = *(u32 *)(fw->data + index);
 529        index += 4;
 530        switch (adapter->devid) {
 531        case SLIC_2GB_DEVICE_ID:
 532                if (rcvucodelen != OasisRcvUCodeLen)
 533                        return -EINVAL;
 534                break;
 535        case SLIC_1GB_DEVICE_ID:
 536                if (rcvucodelen != GBRcvUCodeLen)
 537                        return -EINVAL;
 538                break;
 539        default:
 540                ASSERT(0);
 541                break;
 542        }
 543        /* start download */
 544        slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_BEGIN, FLUSH);
 545        /* download the rcv sequencer ucode */
 546        for (codeaddr = 0; codeaddr < rcvucodelen; codeaddr++) {
 547                /* write out instruction address */
 548                slic_reg32_write(&slic_regs->slic_rcv_wcs, codeaddr, FLUSH);
 549
 550                instruction = *(u32 *)(fw->data + index);
 551                index += 4;
 552                /* write out the instruction data low addr */
 553                slic_reg32_write(&slic_regs->slic_rcv_wcs, instruction, FLUSH);
 554
 555                instruction = *(u8 *)(fw->data + index);
 556                index++;
 557                /* write out the instruction data high addr */
 558                slic_reg32_write(&slic_regs->slic_rcv_wcs, (u8)instruction,
 559                                 FLUSH);
 560        }
 561
 562        /* download finished */
 563        release_firmware(fw);
 564        slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_FINISH, FLUSH);
 565        return 0;
 566}
 567
 568MODULE_FIRMWARE("slicoss/oasisrcvucode.sys");
 569MODULE_FIRMWARE("slicoss/gbrcvucode.sys");
 570
 571static int slic_card_download(struct adapter *adapter)
 572{
 573        const struct firmware *fw;
 574        const char *file = "";
 575        int ret;
 576        u32 section;
 577        int thissectionsize;
 578        int codeaddr;
 579        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 580        u32 instruction;
 581        u32 baseaddress;
 582        u32 i;
 583        u32 numsects = 0;
 584        u32 sectsize[3];
 585        u32 sectstart[3];
 586        int ucode_start, index = 0;
 587
 588        switch (adapter->devid) {
 589        case SLIC_2GB_DEVICE_ID:
 590                file = "slicoss/oasisdownload.sys";
 591                break;
 592        case SLIC_1GB_DEVICE_ID:
 593                file = "slicoss/gbdownload.sys";
 594                break;
 595        default:
 596                ASSERT(0);
 597                break;
 598        }
 599        ret = request_firmware(&fw, file, &adapter->pcidev->dev);
 600        if (ret) {
 601                dev_err(&adapter->pcidev->dev,
 602                        "SLICOSS: Failed to load firmware %s\n", file);
 603                return ret;
 604        }
 605        numsects = *(u32 *)(fw->data + index);
 606        index += 4;
 607        ASSERT(numsects <= 3);
 608        for (i = 0; i < numsects; i++) {
 609                sectsize[i] = *(u32 *)(fw->data + index);
 610                index += 4;
 611        }
 612        for (i = 0; i < numsects; i++) {
 613                sectstart[i] = *(u32 *)(fw->data + index);
 614                index += 4;
 615        }
 616        ucode_start = index;
 617        instruction = *(u32 *)(fw->data + index);
 618        index += 4;
 619        for (section = 0; section < numsects; section++) {
 620                baseaddress = sectstart[section];
 621                thissectionsize = sectsize[section] >> 3;
 622
 623                for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) {
 624                        /* Write out instruction address */
 625                        slic_reg32_write(&slic_regs->slic_wcs,
 626                                         baseaddress + codeaddr, FLUSH);
 627                        /* Write out instruction to low addr */
 628                        slic_reg32_write(&slic_regs->slic_wcs, instruction, FLUSH);
 629                        instruction = *(u32 *)(fw->data + index);
 630                        index += 4;
 631
 632                        /* Write out instruction to high addr */
 633                        slic_reg32_write(&slic_regs->slic_wcs, instruction, FLUSH);
 634                        instruction = *(u32 *)(fw->data + index);
 635                        index += 4;
 636                }
 637        }
 638        index = ucode_start;
 639        for (section = 0; section < numsects; section++) {
 640                instruction = *(u32 *)(fw->data + index);
 641                baseaddress = sectstart[section];
 642                if (baseaddress < 0x8000)
 643                        continue;
 644                thissectionsize = sectsize[section] >> 3;
 645
 646                for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) {
 647                        /* Write out instruction address */
 648                        slic_reg32_write(&slic_regs->slic_wcs,
 649                                SLIC_WCS_COMPARE | (baseaddress + codeaddr),
 650                                FLUSH);
 651                        /* Write out instruction to low addr */
 652                        slic_reg32_write(&slic_regs->slic_wcs, instruction,
 653                                         FLUSH);
 654                        instruction = *(u32 *)(fw->data + index);
 655                        index += 4;
 656                        /* Write out instruction to high addr */
 657                        slic_reg32_write(&slic_regs->slic_wcs, instruction,
 658                                         FLUSH);
 659                        instruction = *(u32 *)(fw->data + index);
 660                        index += 4;
 661
 662                        /* Check SRAM location zero. If it is non-zero. Abort.*/
 663/*                      failure = readl((u32 __iomem *)&slic_regs->slic_reset);
 664                        if (failure) {
 665                                release_firmware(fw);
 666                                return -EIO;
 667                        }*/
 668                }
 669        }
 670        release_firmware(fw);
 671        /* Everything OK, kick off the card */
 672        mdelay(10);
 673        slic_reg32_write(&slic_regs->slic_wcs, SLIC_WCS_START, FLUSH);
 674
 675        /* stall for 20 ms, long enough for ucode to init card
 676           and reach mainloop */
 677        mdelay(20);
 678
 679        return 0;
 680}
 681
 682MODULE_FIRMWARE("slicoss/oasisdownload.sys");
 683MODULE_FIRMWARE("slicoss/gbdownload.sys");
 684
 685static void slic_adapter_set_hwaddr(struct adapter *adapter)
 686{
 687        struct sliccard *card = adapter->card;
 688
 689        if ((adapter->card) && (card->config_set)) {
 690                memcpy(adapter->macaddr,
 691                       card->config.MacInfo[adapter->functionnumber].macaddrA,
 692                       sizeof(struct slic_config_mac));
 693                if (!(adapter->currmacaddr[0] || adapter->currmacaddr[1] ||
 694                      adapter->currmacaddr[2] || adapter->currmacaddr[3] ||
 695                      adapter->currmacaddr[4] || adapter->currmacaddr[5])) {
 696                        memcpy(adapter->currmacaddr, adapter->macaddr, 6);
 697                }
 698                if (adapter->netdev) {
 699                        memcpy(adapter->netdev->dev_addr, adapter->currmacaddr,
 700                               6);
 701                }
 702        }
 703}
 704
 705static void slic_intagg_set(struct adapter *adapter, u32 value)
 706{
 707        slic_reg32_write(&adapter->slic_regs->slic_intagg, value, FLUSH);
 708        adapter->card->loadlevel_current = value;
 709}
 710
 711static void slic_soft_reset(struct adapter *adapter)
 712{
 713        if (adapter->card->state == CARD_UP) {
 714                slic_reg32_write(&adapter->slic_regs->slic_quiesce, 0, FLUSH);
 715                mdelay(1);
 716        }
 717
 718        slic_reg32_write(&adapter->slic_regs->slic_reset, SLIC_RESET_MAGIC,
 719                         FLUSH);
 720        mdelay(1);
 721}
 722
 723static void slic_mac_address_config(struct adapter *adapter)
 724{
 725        u32 value;
 726        u32 value2;
 727        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 728
 729        value = *(u32 *) &adapter->currmacaddr[2];
 730        value = ntohl(value);
 731        slic_reg32_write(&slic_regs->slic_wraddral, value, FLUSH);
 732        slic_reg32_write(&slic_regs->slic_wraddrbl, value, FLUSH);
 733
 734        value2 = (u32) ((adapter->currmacaddr[0] << 8 |
 735                             adapter->currmacaddr[1]) & 0xFFFF);
 736
 737        slic_reg32_write(&slic_regs->slic_wraddrah, value2, FLUSH);
 738        slic_reg32_write(&slic_regs->slic_wraddrbh, value2, FLUSH);
 739
 740        /* Write our multicast mask out to the card.  This is done */
 741        /* here in addition to the slic_mcast_addr_set routine     */
 742        /* because ALL_MCAST may have been enabled or disabled     */
 743        slic_mcast_set_mask(adapter);
 744}
 745
 746static void slic_mac_config(struct adapter *adapter)
 747{
 748        u32 value;
 749        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 750
 751        /* Setup GMAC gaps */
 752        if (adapter->linkspeed == LINK_1000MB) {
 753                value = ((GMCR_GAPBB_1000 << GMCR_GAPBB_SHIFT) |
 754                         (GMCR_GAPR1_1000 << GMCR_GAPR1_SHIFT) |
 755                         (GMCR_GAPR2_1000 << GMCR_GAPR2_SHIFT));
 756        } else {
 757                value = ((GMCR_GAPBB_100 << GMCR_GAPBB_SHIFT) |
 758                         (GMCR_GAPR1_100 << GMCR_GAPR1_SHIFT) |
 759                         (GMCR_GAPR2_100 << GMCR_GAPR2_SHIFT));
 760        }
 761
 762        /* enable GMII */
 763        if (adapter->linkspeed == LINK_1000MB)
 764                value |= GMCR_GBIT;
 765
 766        /* enable fullduplex */
 767        if ((adapter->linkduplex == LINK_FULLD)
 768            || (adapter->macopts & MAC_LOOPBACK)) {
 769                value |= GMCR_FULLD;
 770        }
 771
 772        /* write mac config */
 773        slic_reg32_write(&slic_regs->slic_wmcfg, value, FLUSH);
 774
 775        /* setup mac addresses */
 776        slic_mac_address_config(adapter);
 777}
 778
 779static void slic_config_set(struct adapter *adapter, bool linkchange)
 780{
 781        u32 value;
 782        u32 RcrReset;
 783        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 784
 785        if (linkchange) {
 786                /* Setup MAC */
 787                slic_mac_config(adapter);
 788                RcrReset = GRCR_RESET;
 789        } else {
 790                slic_mac_address_config(adapter);
 791                RcrReset = 0;
 792        }
 793
 794        if (adapter->linkduplex == LINK_FULLD) {
 795                /* setup xmtcfg */
 796                value = (GXCR_RESET |   /* Always reset     */
 797                         GXCR_XMTEN |   /* Enable transmit  */
 798                         GXCR_PAUSEEN); /* Enable pause     */
 799
 800                slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
 801
 802                /* Setup rcvcfg last */
 803                value = (RcrReset |     /* Reset, if linkchange */
 804                         GRCR_CTLEN |   /* Enable CTL frames    */
 805                         GRCR_ADDRAEN | /* Address A enable     */
 806                         GRCR_RCVBAD |  /* Rcv bad frames       */
 807                         (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
 808        } else {
 809                /* setup xmtcfg */
 810                value = (GXCR_RESET |   /* Always reset     */
 811                         GXCR_XMTEN);   /* Enable transmit  */
 812
 813                slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
 814
 815                /* Setup rcvcfg last */
 816                value = (RcrReset |     /* Reset, if linkchange */
 817                         GRCR_ADDRAEN | /* Address A enable     */
 818                         GRCR_RCVBAD |  /* Rcv bad frames       */
 819                         (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
 820        }
 821
 822        if (adapter->state != ADAPT_DOWN) {
 823                /* Only enable receive if we are restarting or running */
 824                value |= GRCR_RCVEN;
 825        }
 826
 827        if (adapter->macopts & MAC_PROMISC)
 828                value |= GRCR_RCVALL;
 829
 830        slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH);
 831}
 832
 833/*
 834 *  Turn off RCV and XMT, power down PHY
 835 */
 836static void slic_config_clear(struct adapter *adapter)
 837{
 838        u32 value;
 839        u32 phy_config;
 840        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
 841
 842        /* Setup xmtcfg */
 843        value = (GXCR_RESET |   /* Always reset */
 844                 GXCR_PAUSEEN); /* Enable pause */
 845
 846        slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
 847
 848        value = (GRCR_RESET |   /* Always reset      */
 849                 GRCR_CTLEN |   /* Enable CTL frames */
 850                 GRCR_ADDRAEN | /* Address A enable  */
 851                 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
 852
 853        slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH);
 854
 855        /* power down phy */
 856        phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN));
 857        slic_reg32_write(&slic_regs->slic_wphy, phy_config, FLUSH);
 858}
 859
 860static bool slic_mac_filter(struct adapter *adapter,
 861                        struct ether_header *ether_frame)
 862{
 863        struct net_device *netdev = adapter->netdev;
 864        u32 opts = adapter->macopts;
 865        u32 *dhost4 = (u32 *)&ether_frame->ether_dhost[0];
 866        u16 *dhost2 = (u16 *)&ether_frame->ether_dhost[4];
 867
 868        if (opts & MAC_PROMISC)
 869                return true;
 870
 871        if ((*dhost4 == 0xFFFFFFFF) && (*dhost2 == 0xFFFF)) {
 872                if (opts & MAC_BCAST) {
 873                        adapter->rcv_broadcasts++;
 874                        return true;
 875                } else {
 876                        return false;
 877                }
 878        }
 879
 880        if (ether_frame->ether_dhost[0] & 0x01) {
 881                if (opts & MAC_ALLMCAST) {
 882                        adapter->rcv_multicasts++;
 883                        netdev->stats.multicast++;
 884                        return true;
 885                }
 886                if (opts & MAC_MCAST) {
 887                        struct mcast_address *mcaddr = adapter->mcastaddrs;
 888
 889                        while (mcaddr) {
 890                                if (!compare_ether_addr(mcaddr->address,
 891                                                        ether_frame->ether_dhost)) {
 892                                        adapter->rcv_multicasts++;
 893                                        netdev->stats.multicast++;
 894                                        return true;
 895                                }
 896                                mcaddr = mcaddr->next;
 897                        }
 898                        return false;
 899                } else {
 900                        return false;
 901                }
 902        }
 903        if (opts & MAC_DIRECTED) {
 904                adapter->rcv_unicasts++;
 905                return true;
 906        }
 907        return false;
 908
 909}
 910
 911static int slic_mac_set_address(struct net_device *dev, void *ptr)
 912{
 913        struct adapter *adapter = netdev_priv(dev);
 914        struct sockaddr *addr = ptr;
 915
 916        if (netif_running(dev))
 917                return -EBUSY;
 918        if (!adapter)
 919                return -EBUSY;
 920
 921        if (!is_valid_ether_addr(addr->sa_data))
 922                return -EINVAL;
 923
 924        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 925        memcpy(adapter->currmacaddr, addr->sa_data, dev->addr_len);
 926
 927        slic_config_set(adapter, true);
 928        return 0;
 929}
 930
 931static void slic_timer_load_check(ulong cardaddr)
 932{
 933        struct sliccard *card = (struct sliccard *)cardaddr;
 934        struct adapter *adapter = card->master;
 935        u32 __iomem *intagg;
 936        u32 load = card->events;
 937        u32 level = 0;
 938
 939        intagg = &adapter->slic_regs->slic_intagg;
 940
 941        if ((adapter) && (adapter->state == ADAPT_UP) &&
 942            (card->state == CARD_UP) && (slic_global.dynamic_intagg)) {
 943                if (adapter->devid == SLIC_1GB_DEVICE_ID) {
 944                        if (adapter->linkspeed == LINK_1000MB)
 945                                level = 100;
 946                        else {
 947                                if (load > SLIC_LOAD_5)
 948                                        level = SLIC_INTAGG_5;
 949                                else if (load > SLIC_LOAD_4)
 950                                        level = SLIC_INTAGG_4;
 951                                else if (load > SLIC_LOAD_3)
 952                                        level = SLIC_INTAGG_3;
 953                                else if (load > SLIC_LOAD_2)
 954                                        level = SLIC_INTAGG_2;
 955                                else if (load > SLIC_LOAD_1)
 956                                        level = SLIC_INTAGG_1;
 957                                else
 958                                        level = SLIC_INTAGG_0;
 959                        }
 960                        if (card->loadlevel_current != level) {
 961                                card->loadlevel_current = level;
 962                                slic_reg32_write(intagg, level, FLUSH);
 963                        }
 964                } else {
 965                        if (load > SLIC_LOAD_5)
 966                                level = SLIC_INTAGG_5;
 967                        else if (load > SLIC_LOAD_4)
 968                                level = SLIC_INTAGG_4;
 969                        else if (load > SLIC_LOAD_3)
 970                                level = SLIC_INTAGG_3;
 971                        else if (load > SLIC_LOAD_2)
 972                                level = SLIC_INTAGG_2;
 973                        else if (load > SLIC_LOAD_1)
 974                                level = SLIC_INTAGG_1;
 975                        else
 976                                level = SLIC_INTAGG_0;
 977                        if (card->loadlevel_current != level) {
 978                                card->loadlevel_current = level;
 979                                slic_reg32_write(intagg, level, FLUSH);
 980                        }
 981                }
 982        }
 983        card->events = 0;
 984        card->loadtimer.expires = jiffies + (SLIC_LOADTIMER_PERIOD * HZ);
 985        add_timer(&card->loadtimer);
 986}
 987
 988static int slic_upr_queue_request(struct adapter *adapter,
 989                           u32 upr_request,
 990                           u32 upr_data,
 991                           u32 upr_data_h,
 992                           u32 upr_buffer, u32 upr_buffer_h)
 993{
 994        struct slic_upr *upr;
 995        struct slic_upr *uprqueue;
 996
 997        upr = kmalloc(sizeof(struct slic_upr), GFP_ATOMIC);
 998        if (!upr)
 999                return -ENOMEM;
1000
1001        upr->adapter = adapter->port;
1002        upr->upr_request = upr_request;
1003        upr->upr_data = upr_data;
1004        upr->upr_buffer = upr_buffer;
1005        upr->upr_data_h = upr_data_h;
1006        upr->upr_buffer_h = upr_buffer_h;
1007        upr->next = NULL;
1008        if (adapter->upr_list) {
1009                uprqueue = adapter->upr_list;
1010
1011                while (uprqueue->next)
1012                        uprqueue = uprqueue->next;
1013                uprqueue->next = upr;
1014        } else {
1015                adapter->upr_list = upr;
1016        }
1017        return 0;
1018}
1019
1020static void slic_upr_start(struct adapter *adapter)
1021{
1022        struct slic_upr *upr;
1023        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
1024/*
1025    char * ptr1;
1026    char * ptr2;
1027    uint cmdoffset;
1028*/
1029        upr = adapter->upr_list;
1030        if (!upr)
1031                return;
1032        if (adapter->upr_busy)
1033                return;
1034        adapter->upr_busy = 1;
1035
1036        switch (upr->upr_request) {
1037        case SLIC_UPR_STATS:
1038                if (upr->upr_data_h == 0) {
1039                        slic_reg32_write(&slic_regs->slic_stats, upr->upr_data,
1040                                         FLUSH);
1041                } else {
1042                        slic_reg64_write(adapter, &slic_regs->slic_stats64,
1043                                         upr->upr_data,
1044                                         &slic_regs->slic_addr_upper,
1045                                         upr->upr_data_h, FLUSH);
1046                }
1047                break;
1048
1049        case SLIC_UPR_RLSR:
1050                slic_reg64_write(adapter, &slic_regs->slic_rlsr, upr->upr_data,
1051                                 &slic_regs->slic_addr_upper, upr->upr_data_h,
1052                                 FLUSH);
1053                break;
1054
1055        case SLIC_UPR_RCONFIG:
1056                slic_reg64_write(adapter, &slic_regs->slic_rconfig,
1057                                 upr->upr_data, &slic_regs->slic_addr_upper,
1058                                 upr->upr_data_h, FLUSH);
1059                break;
1060        case SLIC_UPR_PING:
1061                slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH);
1062                break;
1063        default:
1064                ASSERT(0);
1065        }
1066}
1067
1068static int slic_upr_request(struct adapter *adapter,
1069                     u32 upr_request,
1070                     u32 upr_data,
1071                     u32 upr_data_h,
1072                     u32 upr_buffer, u32 upr_buffer_h)
1073{
1074        int rc;
1075
1076        spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);
1077        rc = slic_upr_queue_request(adapter,
1078                                        upr_request,
1079                                        upr_data,
1080                                        upr_data_h, upr_buffer, upr_buffer_h);
1081        if (rc)
1082                goto err_unlock_irq;
1083
1084        slic_upr_start(adapter);
1085err_unlock_irq:
1086        spin_unlock_irqrestore(&adapter->upr_lock.lock,
1087                                adapter->upr_lock.flags);
1088        return rc;
1089}
1090
1091static void slic_link_upr_complete(struct adapter *adapter, u32 isr)
1092{
1093        u32 linkstatus = adapter->pshmem->linkstatus;
1094        uint linkup;
1095        unsigned char linkspeed;
1096        unsigned char linkduplex;
1097
1098        if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
1099                struct slic_shmem *pshmem;
1100
1101                pshmem = (struct slic_shmem *)adapter->phys_shmem;
1102#if BITS_PER_LONG == 64
1103                slic_upr_queue_request(adapter,
1104                                       SLIC_UPR_RLSR,
1105                                       SLIC_GET_ADDR_LOW(&pshmem->linkstatus),
1106                                       SLIC_GET_ADDR_HIGH(&pshmem->linkstatus),
1107                                       0, 0);
1108#else
1109                slic_upr_queue_request(adapter,
1110                                       SLIC_UPR_RLSR,
1111                                       (u32) &pshmem->linkstatus,
1112                                       SLIC_GET_ADDR_HIGH(pshmem), 0, 0);
1113#endif
1114                return;
1115        }
1116        if (adapter->state != ADAPT_UP)
1117                return;
1118
1119        ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID)
1120               || (adapter->devid == SLIC_2GB_DEVICE_ID));
1121
1122        linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN;
1123        if (linkstatus & GIG_SPEED_1000)
1124                linkspeed = LINK_1000MB;
1125        else if (linkstatus & GIG_SPEED_100)
1126                linkspeed = LINK_100MB;
1127        else
1128                linkspeed = LINK_10MB;
1129
1130        if (linkstatus & GIG_FULLDUPLEX)
1131                linkduplex = LINK_FULLD;
1132        else
1133                linkduplex = LINK_HALFD;
1134
1135        if ((adapter->linkstate == LINK_DOWN) && (linkup == LINK_DOWN))
1136                return;
1137
1138        /* link up event, but nothing has changed */
1139        if ((adapter->linkstate == LINK_UP) &&
1140            (linkup == LINK_UP) &&
1141            (adapter->linkspeed == linkspeed) &&
1142            (adapter->linkduplex == linkduplex))
1143                return;
1144
1145        /* link has changed at this point */
1146
1147        /* link has gone from up to down */
1148        if (linkup == LINK_DOWN) {
1149                adapter->linkstate = LINK_DOWN;
1150                return;
1151        }
1152
1153        /* link has gone from down to up */
1154        adapter->linkspeed = linkspeed;
1155        adapter->linkduplex = linkduplex;
1156
1157        if (adapter->linkstate != LINK_UP) {
1158                /* setup the mac */
1159                slic_config_set(adapter, true);
1160                adapter->linkstate = LINK_UP;
1161                netif_start_queue(adapter->netdev);
1162        }
1163}
1164
1165static void slic_upr_request_complete(struct adapter *adapter, u32 isr)
1166{
1167        struct sliccard *card = adapter->card;
1168        struct slic_upr *upr;
1169
1170        spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);
1171        upr = adapter->upr_list;
1172        if (!upr) {
1173                ASSERT(0);
1174                spin_unlock_irqrestore(&adapter->upr_lock.lock,
1175                                        adapter->upr_lock.flags);
1176                return;
1177        }
1178        adapter->upr_list = upr->next;
1179        upr->next = NULL;
1180        adapter->upr_busy = 0;
1181        ASSERT(adapter->port == upr->adapter);
1182        switch (upr->upr_request) {
1183        case SLIC_UPR_STATS:
1184                {
1185                        struct slic_stats *slicstats =
1186                            (struct slic_stats *) &adapter->pshmem->inicstats;
1187                        struct slic_stats *newstats = slicstats;
1188                        struct slic_stats  *old = &adapter->inicstats_prev;
1189                        struct slicnet_stats *stst = &adapter->slic_stats;
1190
1191                        if (isr & ISR_UPCERR) {
1192                                dev_err(&adapter->netdev->dev,
1193                                        "SLIC_UPR_STATS command failed isr[%x]\n",
1194                                        isr);
1195
1196                                break;
1197                        }
1198                        UPDATE_STATS_GB(stst->tcp.xmit_tcp_segs,
1199                                        newstats->xmit_tcp_segs_gb,
1200                                        old->xmit_tcp_segs_gb);
1201
1202                        UPDATE_STATS_GB(stst->tcp.xmit_tcp_bytes,
1203                                        newstats->xmit_tcp_bytes_gb,
1204                                        old->xmit_tcp_bytes_gb);
1205
1206                        UPDATE_STATS_GB(stst->tcp.rcv_tcp_segs,
1207                                        newstats->rcv_tcp_segs_gb,
1208                                        old->rcv_tcp_segs_gb);
1209
1210                        UPDATE_STATS_GB(stst->tcp.rcv_tcp_bytes,
1211                                        newstats->rcv_tcp_bytes_gb,
1212                                        old->rcv_tcp_bytes_gb);
1213
1214                        UPDATE_STATS_GB(stst->iface.xmt_bytes,
1215                                        newstats->xmit_bytes_gb,
1216                                        old->xmit_bytes_gb);
1217
1218                        UPDATE_STATS_GB(stst->iface.xmt_ucast,
1219                                        newstats->xmit_unicasts_gb,
1220                                        old->xmit_unicasts_gb);
1221
1222                        UPDATE_STATS_GB(stst->iface.rcv_bytes,
1223                                        newstats->rcv_bytes_gb,
1224                                        old->rcv_bytes_gb);
1225
1226                        UPDATE_STATS_GB(stst->iface.rcv_ucast,
1227                                        newstats->rcv_unicasts_gb,
1228                                        old->rcv_unicasts_gb);
1229
1230                        UPDATE_STATS_GB(stst->iface.xmt_errors,
1231                                        newstats->xmit_collisions_gb,
1232                                        old->xmit_collisions_gb);
1233
1234                        UPDATE_STATS_GB(stst->iface.xmt_errors,
1235                                        newstats->xmit_excess_collisions_gb,
1236                                        old->xmit_excess_collisions_gb);
1237
1238                        UPDATE_STATS_GB(stst->iface.xmt_errors,
1239                                        newstats->xmit_other_error_gb,
1240                                        old->xmit_other_error_gb);
1241
1242                        UPDATE_STATS_GB(stst->iface.rcv_errors,
1243                                        newstats->rcv_other_error_gb,
1244                                        old->rcv_other_error_gb);
1245
1246                        UPDATE_STATS_GB(stst->iface.rcv_discards,
1247                                        newstats->rcv_drops_gb,
1248                                        old->rcv_drops_gb);
1249
1250                        if (newstats->rcv_drops_gb > old->rcv_drops_gb) {
1251                                adapter->rcv_drops +=
1252                                    (newstats->rcv_drops_gb -
1253                                     old->rcv_drops_gb);
1254                        }
1255                        memcpy(old, newstats, sizeof(struct slic_stats));
1256                        break;
1257                }
1258        case SLIC_UPR_RLSR:
1259                slic_link_upr_complete(adapter, isr);
1260                break;
1261        case SLIC_UPR_RCONFIG:
1262                break;
1263        case SLIC_UPR_RPHY:
1264                ASSERT(0);
1265                break;
1266        case SLIC_UPR_ENLB:
1267                ASSERT(0);
1268                break;
1269        case SLIC_UPR_ENCT:
1270                ASSERT(0);
1271                break;
1272        case SLIC_UPR_PDWN:
1273                ASSERT(0);
1274                break;
1275        case SLIC_UPR_PING:
1276                card->pingstatus |= (isr & ISR_PINGDSMASK);
1277                break;
1278        default:
1279                ASSERT(0);
1280        }
1281        kfree(upr);
1282        slic_upr_start(adapter);
1283        spin_unlock_irqrestore(&adapter->upr_lock.lock,
1284                                adapter->upr_lock.flags);
1285}
1286
1287static void slic_config_get(struct adapter *adapter, u32 config,
1288                                                        u32 config_h)
1289{
1290        int status;
1291
1292        status = slic_upr_request(adapter,
1293                                  SLIC_UPR_RCONFIG,
1294                                  (u32) config, (u32) config_h, 0, 0);
1295        ASSERT(status == 0);
1296}
1297
1298/*
1299 *  this is here to checksum the eeprom, there is some ucode bug
1300 *  which prevens us from using the ucode result.
1301 *  remove this once ucode is fixed.
1302 */
1303static ushort slic_eeprom_cksum(char *m, int len)
1304{
1305#define ADDCARRY(x)  (x > 65535 ? x -= 65535 : x)
1306#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);\
1307                }
1308
1309        u16 *w;
1310        u32 sum = 0;
1311        u32 byte_swapped = 0;
1312        u32 w_int;
1313
1314        union {
1315                char c[2];
1316                ushort s;
1317        } s_util;
1318
1319        union {
1320                ushort s[2];
1321                int l;
1322        } l_util;
1323
1324        l_util.l = 0;
1325        s_util.s = 0;
1326
1327        w = (u16 *)m;
1328#if BITS_PER_LONG == 64
1329        w_int = (u32) ((ulong) w & 0x00000000FFFFFFFF);
1330#else
1331        w_int = (u32) (w);
1332#endif
1333        if ((1 & w_int) && (len > 0)) {
1334                REDUCE;
1335                sum <<= 8;
1336                s_util.c[0] = *(unsigned char *)w;
1337                w = (u16 *)((char *)w + 1);
1338                len--;
1339                byte_swapped = 1;
1340        }
1341
1342        /* Unroll the loop to make overhead from branches &c small. */
1343        while ((len -= 32) >= 0) {
1344                sum += w[0];
1345                sum += w[1];
1346                sum += w[2];
1347                sum += w[3];
1348                sum += w[4];
1349                sum += w[5];
1350                sum += w[6];
1351                sum += w[7];
1352                sum += w[8];
1353                sum += w[9];
1354                sum += w[10];
1355                sum += w[11];
1356                sum += w[12];
1357                sum += w[13];
1358                sum += w[14];
1359                sum += w[15];
1360                w = (u16 *)((ulong) w + 16);    /* verify */
1361        }
1362        len += 32;
1363        while ((len -= 8) >= 0) {
1364                sum += w[0];
1365                sum += w[1];
1366                sum += w[2];
1367                sum += w[3];
1368                w = (u16 *)((ulong) w + 4);     /* verify */
1369        }
1370        len += 8;
1371        if (len != 0 || byte_swapped != 0) {
1372                REDUCE;
1373                while ((len -= 2) >= 0)
1374                        sum += *w++;    /* verify */
1375                if (byte_swapped) {
1376                        REDUCE;
1377                        sum <<= 8;
1378                        byte_swapped = 0;
1379                        if (len == -1) {
1380                                s_util.c[1] = *(char *) w;
1381                                sum += s_util.s;
1382                                len = 0;
1383                        } else {
1384                                len = -1;
1385                        }
1386
1387                } else if (len == -1) {
1388                        s_util.c[0] = *(char *) w;
1389                }
1390
1391                if (len == -1) {
1392                        s_util.c[1] = 0;
1393                        sum += s_util.s;
1394                }
1395        }
1396        REDUCE;
1397        return (ushort) sum;
1398}
1399
1400static void slic_rspqueue_free(struct adapter *adapter)
1401{
1402        int i;
1403        struct slic_rspqueue *rspq = &adapter->rspqueue;
1404
1405        for (i = 0; i < rspq->num_pages; i++) {
1406                if (rspq->vaddr[i]) {
1407                        pci_free_consistent(adapter->pcidev, PAGE_SIZE,
1408                                            rspq->vaddr[i], rspq->paddr[i]);
1409                }
1410                rspq->vaddr[i] = NULL;
1411                rspq->paddr[i] = 0;
1412        }
1413        rspq->offset = 0;
1414        rspq->pageindex = 0;
1415        rspq->rspbuf = NULL;
1416}
1417
1418static int slic_rspqueue_init(struct adapter *adapter)
1419{
1420        int i;
1421        struct slic_rspqueue *rspq = &adapter->rspqueue;
1422        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
1423        u32 paddrh = 0;
1424
1425        ASSERT(adapter->state == ADAPT_DOWN);
1426        memset(rspq, 0, sizeof(struct slic_rspqueue));
1427
1428        rspq->num_pages = SLIC_RSPQ_PAGES_GB;
1429
1430        for (i = 0; i < rspq->num_pages; i++) {
1431                rspq->vaddr[i] = pci_alloc_consistent(adapter->pcidev,
1432                                                      PAGE_SIZE,
1433                                                      &rspq->paddr[i]);
1434                if (!rspq->vaddr[i]) {
1435                        dev_err(&adapter->pcidev->dev,
1436                                "pci_alloc_consistent failed\n");
1437                        slic_rspqueue_free(adapter);
1438                        return -ENOMEM;
1439                }
1440                /* FIXME:
1441                 * do we really need this assertions (4K PAGE_SIZE aligned addr)? */
1442#if 0
1443#ifndef CONFIG_X86_64
1444                ASSERT(((u32) rspq->vaddr[i] & 0xFFFFF000) ==
1445                       (u32) rspq->vaddr[i]);
1446                ASSERT(((u32) rspq->paddr[i] & 0xFFFFF000) ==
1447                       (u32) rspq->paddr[i]);
1448#endif
1449#endif
1450                memset(rspq->vaddr[i], 0, PAGE_SIZE);
1451
1452                if (paddrh == 0) {
1453                        slic_reg32_write(&slic_regs->slic_rbar,
1454                                (rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE),
1455                                DONT_FLUSH);
1456                } else {
1457                        slic_reg64_write(adapter, &slic_regs->slic_rbar64,
1458                                (rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE),
1459                                &slic_regs->slic_addr_upper,
1460                                paddrh, DONT_FLUSH);
1461                }
1462        }
1463        rspq->offset = 0;
1464        rspq->pageindex = 0;
1465        rspq->rspbuf = (struct slic_rspbuf *)rspq->vaddr[0];
1466        return 0;
1467}
1468
1469static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter)
1470{
1471        struct slic_rspqueue *rspq = &adapter->rspqueue;
1472        struct slic_rspbuf *buf;
1473
1474        if (!(rspq->rspbuf->status))
1475                return NULL;
1476
1477        buf = rspq->rspbuf;
1478#if BITS_PER_LONG == 32
1479        ASSERT((buf->status & 0xFFFFFFE0) == 0);
1480#endif
1481        ASSERT(buf->hosthandle);
1482        if (++rspq->offset < SLIC_RSPQ_BUFSINPAGE) {
1483                rspq->rspbuf++;
1484#if BITS_PER_LONG == 32
1485                ASSERT(((u32) rspq->rspbuf & 0xFFFFFFE0) ==
1486                       (u32) rspq->rspbuf);
1487#endif
1488        } else {
1489                ASSERT(rspq->offset == SLIC_RSPQ_BUFSINPAGE);
1490                slic_reg64_write(adapter, &adapter->slic_regs->slic_rbar64,
1491                        (rspq->paddr[rspq->pageindex] | SLIC_RSPQ_BUFSINPAGE),
1492                        &adapter->slic_regs->slic_addr_upper, 0, DONT_FLUSH);
1493                rspq->pageindex = (++rspq->pageindex) % rspq->num_pages;
1494                rspq->offset = 0;
1495                rspq->rspbuf = (struct slic_rspbuf *)
1496                                                rspq->vaddr[rspq->pageindex];
1497#if BITS_PER_LONG == 32
1498                ASSERT(((u32) rspq->rspbuf & 0xFFFFF000) ==
1499                       (u32) rspq->rspbuf);
1500#endif
1501        }
1502#if BITS_PER_LONG == 32
1503        ASSERT(((u32) buf & 0xFFFFFFE0) == (u32) buf);
1504#endif
1505        return buf;
1506}
1507
1508static void slic_cmdqmem_init(struct adapter *adapter)
1509{
1510        struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1511
1512        memset(cmdqmem, 0, sizeof(struct slic_cmdqmem));
1513}
1514
1515static void slic_cmdqmem_free(struct adapter *adapter)
1516{
1517        struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1518        int i;
1519
1520        for (i = 0; i < SLIC_CMDQ_MAXPAGES; i++) {
1521                if (cmdqmem->pages[i]) {
1522                        pci_free_consistent(adapter->pcidev,
1523                                            PAGE_SIZE,
1524                                            (void *) cmdqmem->pages[i],
1525                                            cmdqmem->dma_pages[i]);
1526                }
1527        }
1528        memset(cmdqmem, 0, sizeof(struct slic_cmdqmem));
1529}
1530
1531static u32 *slic_cmdqmem_addpage(struct adapter *adapter)
1532{
1533        struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1534        u32 *pageaddr;
1535
1536        if (cmdqmem->pagecnt >= SLIC_CMDQ_MAXPAGES)
1537                return NULL;
1538        pageaddr = pci_alloc_consistent(adapter->pcidev,
1539                                        PAGE_SIZE,
1540                                        &cmdqmem->dma_pages[cmdqmem->pagecnt]);
1541        if (!pageaddr)
1542                return NULL;
1543#if BITS_PER_LONG == 32
1544        ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr);
1545#endif
1546        cmdqmem->pages[cmdqmem->pagecnt] = pageaddr;
1547        cmdqmem->pagecnt++;
1548        return pageaddr;
1549}
1550
1551static void slic_cmdq_free(struct adapter *adapter)
1552{
1553        struct slic_hostcmd *cmd;
1554
1555        cmd = adapter->cmdq_all.head;
1556        while (cmd) {
1557                if (cmd->busy) {
1558                        struct sk_buff *tempskb;
1559
1560                        tempskb = cmd->skb;
1561                        if (tempskb) {
1562                                cmd->skb = NULL;
1563                                dev_kfree_skb_irq(tempskb);
1564                        }
1565                }
1566                cmd = cmd->next_all;
1567        }
1568        memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
1569        memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
1570        memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
1571        slic_cmdqmem_free(adapter);
1572}
1573
1574static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)
1575{
1576        struct slic_hostcmd *cmd;
1577        struct slic_hostcmd *prev;
1578        struct slic_hostcmd *tail;
1579        struct slic_cmdqueue *cmdq;
1580        int cmdcnt;
1581        void *cmdaddr;
1582        ulong phys_addr;
1583        u32 phys_addrl;
1584        u32 phys_addrh;
1585        struct slic_handle *pslic_handle;
1586
1587        cmdaddr = page;
1588        cmd = (struct slic_hostcmd *)cmdaddr;
1589        cmdcnt = 0;
1590
1591        phys_addr = virt_to_bus((void *)page);
1592        phys_addrl = SLIC_GET_ADDR_LOW(phys_addr);
1593        phys_addrh = SLIC_GET_ADDR_HIGH(phys_addr);
1594
1595        prev = NULL;
1596        tail = cmd;
1597        while ((cmdcnt < SLIC_CMDQ_CMDSINPAGE) &&
1598               (adapter->slic_handle_ix < 256)) {
1599                /* Allocate and initialize a SLIC_HANDLE for this command */
1600                SLIC_GET_SLIC_HANDLE(adapter, pslic_handle);
1601                if (pslic_handle == NULL)
1602                        ASSERT(0);
1603                ASSERT(pslic_handle ==
1604                       &adapter->slic_handles[pslic_handle->token.
1605                                              handle_index]);
1606                pslic_handle->type = SLIC_HANDLE_CMD;
1607                pslic_handle->address = (void *) cmd;
1608                pslic_handle->offset = (ushort) adapter->slic_handle_ix++;
1609                pslic_handle->other_handle = NULL;
1610                pslic_handle->next = NULL;
1611
1612                cmd->pslic_handle = pslic_handle;
1613                cmd->cmd64.hosthandle = pslic_handle->token.handle_token;
1614                cmd->busy = false;
1615                cmd->paddrl = phys_addrl;
1616                cmd->paddrh = phys_addrh;
1617                cmd->next_all = prev;
1618                cmd->next = prev;
1619                prev = cmd;
1620                phys_addrl += SLIC_HOSTCMD_SIZE;
1621                cmdaddr += SLIC_HOSTCMD_SIZE;
1622
1623                cmd = (struct slic_hostcmd *)cmdaddr;
1624                cmdcnt++;
1625        }
1626
1627        cmdq = &adapter->cmdq_all;
1628        cmdq->count += cmdcnt;  /*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
1629        tail->next_all = cmdq->head;
1630        cmdq->head = prev;
1631        cmdq = &adapter->cmdq_free;
1632        spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags);
1633        cmdq->count += cmdcnt;  /*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
1634        tail->next = cmdq->head;
1635        cmdq->head = prev;
1636        spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags);
1637}
1638
1639static int slic_cmdq_init(struct adapter *adapter)
1640{
1641        int i;
1642        u32 *pageaddr;
1643
1644        ASSERT(adapter->state == ADAPT_DOWN);
1645        memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
1646        memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
1647        memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
1648        spin_lock_init(&adapter->cmdq_all.lock.lock);
1649        spin_lock_init(&adapter->cmdq_free.lock.lock);
1650        spin_lock_init(&adapter->cmdq_done.lock.lock);
1651        slic_cmdqmem_init(adapter);
1652        adapter->slic_handle_ix = 1;
1653        for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) {
1654                pageaddr = slic_cmdqmem_addpage(adapter);
1655#if BITS_PER_LONG == 32
1656                ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr);
1657#endif
1658                if (!pageaddr) {
1659                        slic_cmdq_free(adapter);
1660                        return -ENOMEM;
1661                }
1662                slic_cmdq_addcmdpage(adapter, pageaddr);
1663        }
1664        adapter->slic_handle_ix = 1;
1665
1666        return 0;
1667}
1668
1669static void slic_cmdq_reset(struct adapter *adapter)
1670{
1671        struct slic_hostcmd *hcmd;
1672        struct sk_buff *skb;
1673        u32 outstanding;
1674
1675        spin_lock_irqsave(&adapter->cmdq_free.lock.lock,
1676                        adapter->cmdq_free.lock.flags);
1677        spin_lock_irqsave(&adapter->cmdq_done.lock.lock,
1678                        adapter->cmdq_done.lock.flags);
1679        outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count;
1680        outstanding -= adapter->cmdq_free.count;
1681        hcmd = adapter->cmdq_all.head;
1682        while (hcmd) {
1683                if (hcmd->busy) {
1684                        skb = hcmd->skb;
1685                        ASSERT(skb);
1686                        hcmd->busy = 0;
1687                        hcmd->skb = NULL;
1688                        dev_kfree_skb_irq(skb);
1689                }
1690                hcmd = hcmd->next_all;
1691        }
1692        adapter->cmdq_free.count = 0;
1693        adapter->cmdq_free.head = NULL;
1694        adapter->cmdq_free.tail = NULL;
1695        adapter->cmdq_done.count = 0;
1696        adapter->cmdq_done.head = NULL;
1697        adapter->cmdq_done.tail = NULL;
1698        adapter->cmdq_free.head = adapter->cmdq_all.head;
1699        hcmd = adapter->cmdq_all.head;
1700        while (hcmd) {
1701                adapter->cmdq_free.count++;
1702                hcmd->next = hcmd->next_all;
1703                hcmd = hcmd->next_all;
1704        }
1705        if (adapter->cmdq_free.count != adapter->cmdq_all.count) {
1706                dev_err(&adapter->netdev->dev,
1707                        "free_count %d != all count %d\n",
1708                        adapter->cmdq_free.count, adapter->cmdq_all.count);
1709        }
1710        spin_unlock_irqrestore(&adapter->cmdq_done.lock.lock,
1711                                adapter->cmdq_done.lock.flags);
1712        spin_unlock_irqrestore(&adapter->cmdq_free.lock.lock,
1713                                adapter->cmdq_free.lock.flags);
1714}
1715
1716static void slic_cmdq_getdone(struct adapter *adapter)
1717{
1718        struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done;
1719        struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free;
1720
1721        ASSERT(free_cmdq->head == NULL);
1722        spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags);
1723
1724        free_cmdq->head = done_cmdq->head;
1725        free_cmdq->count = done_cmdq->count;
1726        done_cmdq->head = NULL;
1727        done_cmdq->tail = NULL;
1728        done_cmdq->count = 0;
1729        spin_unlock_irqrestore(&done_cmdq->lock.lock, done_cmdq->lock.flags);
1730}
1731
1732static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter)
1733{
1734        struct slic_cmdqueue *cmdq = &adapter->cmdq_free;
1735        struct slic_hostcmd *cmd = NULL;
1736
1737lock_and_retry:
1738        spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags);
1739retry:
1740        cmd = cmdq->head;
1741        if (cmd) {
1742                cmdq->head = cmd->next;
1743                cmdq->count--;
1744                spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags);
1745        } else {
1746                slic_cmdq_getdone(adapter);
1747                cmd = cmdq->head;
1748                if (cmd) {
1749                        goto retry;
1750                } else {
1751                        u32 *pageaddr;
1752
1753                        spin_unlock_irqrestore(&cmdq->lock.lock,
1754                                                cmdq->lock.flags);
1755                        pageaddr = slic_cmdqmem_addpage(adapter);
1756                        if (pageaddr) {
1757                                slic_cmdq_addcmdpage(adapter, pageaddr);
1758                                goto lock_and_retry;
1759                        }
1760                }
1761        }
1762        return cmd;
1763}
1764
1765static void slic_cmdq_putdone_irq(struct adapter *adapter,
1766                                struct slic_hostcmd *cmd)
1767{
1768        struct slic_cmdqueue *cmdq = &adapter->cmdq_done;
1769
1770        spin_lock(&cmdq->lock.lock);
1771        cmd->busy = 0;
1772        cmd->next = cmdq->head;
1773        cmdq->head = cmd;
1774        cmdq->count++;
1775        if ((adapter->xmitq_full) && (cmdq->count > 10))
1776                netif_wake_queue(adapter->netdev);
1777        spin_unlock(&cmdq->lock.lock);
1778}
1779
1780static int slic_rcvqueue_fill(struct adapter *adapter)
1781{
1782        void *paddr;
1783        u32 paddrl;
1784        u32 paddrh;
1785        struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1786        int i = 0;
1787        struct device *dev = &adapter->netdev->dev;
1788
1789        while (i < SLIC_RCVQ_FILLENTRIES) {
1790                struct slic_rcvbuf *rcvbuf;
1791                struct sk_buff *skb;
1792#ifdef KLUDGE_FOR_4GB_BOUNDARY
1793retry_rcvqfill:
1794#endif
1795                skb = alloc_skb(SLIC_RCVQ_RCVBUFSIZE, GFP_ATOMIC);
1796                if (skb) {
1797                        paddr = (void *)pci_map_single(adapter->pcidev,
1798                                                          skb->data,
1799                                                          SLIC_RCVQ_RCVBUFSIZE,
1800                                                          PCI_DMA_FROMDEVICE);
1801                        paddrl = SLIC_GET_ADDR_LOW(paddr);
1802                        paddrh = SLIC_GET_ADDR_HIGH(paddr);
1803
1804                        skb->len = SLIC_RCVBUF_HEADSIZE;
1805                        rcvbuf = (struct slic_rcvbuf *)skb->head;
1806                        rcvbuf->status = 0;
1807                        skb->next = NULL;
1808#ifdef KLUDGE_FOR_4GB_BOUNDARY
1809                        if (paddrl == 0) {
1810                                dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1811                                        __func__);
1812                                dev_err(dev, "skb[%p] PROBLEM\n", skb);
1813                                dev_err(dev, "         skbdata[%p]\n", skb->data);
1814                                dev_err(dev, "         skblen[%x]\n", skb->len);
1815                                dev_err(dev, "         paddr[%p]\n", paddr);
1816                                dev_err(dev, "         paddrl[%x]\n", paddrl);
1817                                dev_err(dev, "         paddrh[%x]\n", paddrh);
1818                                dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1819                                dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1820                                dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1821                                dev_err(dev, "SKIP THIS SKB!!!!!!!!\n");
1822                                goto retry_rcvqfill;
1823                        }
1824#else
1825                        if (paddrl == 0) {
1826                                dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1827                                        __func__);
1828                                dev_err(dev, "skb[%p] PROBLEM\n", skb);
1829                                dev_err(dev, "         skbdata[%p]\n", skb->data);
1830                                dev_err(dev, "         skblen[%x]\n", skb->len);
1831                                dev_err(dev, "         paddr[%p]\n", paddr);
1832                                dev_err(dev, "         paddrl[%x]\n", paddrl);
1833                                dev_err(dev, "         paddrh[%x]\n", paddrh);
1834                                dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1835                                dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1836                                dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1837                                dev_err(dev, "GIVE TO CARD ANYWAY\n");
1838                        }
1839#endif
1840                        if (paddrh == 0) {
1841                                slic_reg32_write(&adapter->slic_regs->slic_hbar,
1842                                                 (u32)paddrl, DONT_FLUSH);
1843                        } else {
1844                                slic_reg64_write(adapter,
1845                                        &adapter->slic_regs->slic_hbar64,
1846                                        paddrl,
1847                                        &adapter->slic_regs->slic_addr_upper,
1848                                        paddrh, DONT_FLUSH);
1849                        }
1850                        if (rcvq->head)
1851                                rcvq->tail->next = skb;
1852                        else
1853                                rcvq->head = skb;
1854                        rcvq->tail = skb;
1855                        rcvq->count++;
1856                        i++;
1857                } else {
1858                        dev_err(&adapter->netdev->dev,
1859                                "slic_rcvqueue_fill could only get [%d] skbuffs\n",
1860                                i);
1861                        break;
1862                }
1863        }
1864        return i;
1865}
1866
1867static void slic_rcvqueue_free(struct adapter *adapter)
1868{
1869        struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1870        struct sk_buff *skb;
1871
1872        while (rcvq->head) {
1873                skb = rcvq->head;
1874                rcvq->head = rcvq->head->next;
1875                dev_kfree_skb(skb);
1876        }
1877        rcvq->tail = NULL;
1878        rcvq->head = NULL;
1879        rcvq->count = 0;
1880}
1881
1882static int slic_rcvqueue_init(struct adapter *adapter)
1883{
1884        int i, count;
1885        struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1886
1887        ASSERT(adapter->state == ADAPT_DOWN);
1888        rcvq->tail = NULL;
1889        rcvq->head = NULL;
1890        rcvq->size = SLIC_RCVQ_ENTRIES;
1891        rcvq->errors = 0;
1892        rcvq->count = 0;
1893        i = (SLIC_RCVQ_ENTRIES / SLIC_RCVQ_FILLENTRIES);
1894        count = 0;
1895        while (i) {
1896                count += slic_rcvqueue_fill(adapter);
1897                i--;
1898        }
1899        if (rcvq->count < SLIC_RCVQ_MINENTRIES) {
1900                slic_rcvqueue_free(adapter);
1901                return -ENOMEM;
1902        }
1903        return 0;
1904}
1905
1906static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter)
1907{
1908        struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1909        struct sk_buff *skb;
1910        struct slic_rcvbuf *rcvbuf;
1911        int count;
1912
1913        if (rcvq->count) {
1914                skb = rcvq->head;
1915                rcvbuf = (struct slic_rcvbuf *)skb->head;
1916                ASSERT(rcvbuf);
1917
1918                if (rcvbuf->status & IRHDDR_SVALID) {
1919                        rcvq->head = rcvq->head->next;
1920                        skb->next = NULL;
1921                        rcvq->count--;
1922                } else {
1923                        skb = NULL;
1924                }
1925        } else {
1926                dev_err(&adapter->netdev->dev,
1927                        "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq, rcvq->count);
1928                skb = NULL;
1929        }
1930        while (rcvq->count < SLIC_RCVQ_FILLTHRESH) {
1931                count = slic_rcvqueue_fill(adapter);
1932                if (!count)
1933                        break;
1934        }
1935        if (skb)
1936                rcvq->errors = 0;
1937        return skb;
1938}
1939
1940static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb)
1941{
1942        struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1943        void *paddr;
1944        u32 paddrl;
1945        u32 paddrh;
1946        struct slic_rcvbuf *rcvbuf = (struct slic_rcvbuf *)skb->head;
1947        struct device *dev;
1948
1949        ASSERT(skb->len == SLIC_RCVBUF_HEADSIZE);
1950
1951        paddr = (void *)pci_map_single(adapter->pcidev, skb->head,
1952                                  SLIC_RCVQ_RCVBUFSIZE, PCI_DMA_FROMDEVICE);
1953        rcvbuf->status = 0;
1954        skb->next = NULL;
1955
1956        paddrl = SLIC_GET_ADDR_LOW(paddr);
1957        paddrh = SLIC_GET_ADDR_HIGH(paddr);
1958
1959        if (paddrl == 0) {
1960                dev = &adapter->netdev->dev;
1961                dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1962                        __func__);
1963                dev_err(dev, "skb[%p] PROBLEM\n", skb);
1964                dev_err(dev, "         skbdata[%p]\n", skb->data);
1965                dev_err(dev, "         skblen[%x]\n", skb->len);
1966                dev_err(dev, "         paddr[%p]\n", paddr);
1967                dev_err(dev, "         paddrl[%x]\n", paddrl);
1968                dev_err(dev, "         paddrh[%x]\n", paddrh);
1969                dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1970                dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1971                dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1972        }
1973        if (paddrh == 0) {
1974                slic_reg32_write(&adapter->slic_regs->slic_hbar, (u32)paddrl,
1975                                 DONT_FLUSH);
1976        } else {
1977                slic_reg64_write(adapter, &adapter->slic_regs->slic_hbar64,
1978                                 paddrl, &adapter->slic_regs->slic_addr_upper,
1979                                 paddrh, DONT_FLUSH);
1980        }
1981        if (rcvq->head)
1982                rcvq->tail->next = skb;
1983        else
1984                rcvq->head = skb;
1985        rcvq->tail = skb;
1986        rcvq->count++;
1987        return rcvq->count;
1988}
1989
1990static int slic_debug_card_show(struct seq_file *seq, void *v)
1991{
1992#ifdef MOOKTODO
1993        int i;
1994        struct sliccard *card = seq->private;
1995        struct slic_config *config = &card->config;
1996        unsigned char *fru = (unsigned char *)(&card->config.atk_fru);
1997        unsigned char *oemfru = (unsigned char *)(&card->config.OemFru);
1998#endif
1999
2000        seq_printf(seq, "driver_version           : %s\n", slic_proc_version);
2001        seq_printf(seq, "Microcode versions:           \n");
2002        seq_printf(seq, "    Gigabit (gb)         : %s %s\n",
2003                    MOJAVE_UCODE_VERS_STRING, MOJAVE_UCODE_VERS_DATE);
2004        seq_printf(seq, "    Gigabit Receiver     : %s %s\n",
2005                    GB_RCVUCODE_VERS_STRING, GB_RCVUCODE_VERS_DATE);
2006        seq_printf(seq, "Vendor                   : %s\n", slic_vendor);
2007        seq_printf(seq, "Product Name             : %s\n", slic_product_name);
2008#ifdef MOOKTODO
2009        seq_printf(seq, "VendorId                 : %4.4X\n",
2010                    config->VendorId);
2011        seq_printf(seq, "DeviceId                 : %4.4X\n",
2012                    config->DeviceId);
2013        seq_printf(seq, "RevisionId               : %2.2x\n",
2014                    config->RevisionId);
2015        seq_printf(seq, "Bus    #                 : %d\n", card->busnumber);
2016        seq_printf(seq, "Device #                 : %d\n", card->slotnumber);
2017        seq_printf(seq, "Interfaces               : %d\n", card->card_size);
2018        seq_printf(seq, "     Initialized         : %d\n",
2019                    card->adapters_activated);
2020        seq_printf(seq, "     Allocated           : %d\n",
2021                    card->adapters_allocated);
2022        ASSERT(card->card_size <= SLIC_NBR_MACS);
2023        for (i = 0; i < card->card_size; i++) {
2024                seq_printf(seq,
2025                           "     MAC%d : %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
2026                           i, config->macinfo[i].macaddrA[0],
2027                           config->macinfo[i].macaddrA[1],
2028                           config->macinfo[i].macaddrA[2],
2029                           config->macinfo[i].macaddrA[3],
2030                           config->macinfo[i].macaddrA[4],
2031                           config->macinfo[i].macaddrA[5]);
2032        }
2033        seq_printf(seq, "     IF  Init State Duplex/Speed irq\n");
2034        seq_printf(seq, "     -------------------------------\n");
2035        for (i = 0; i < card->adapters_allocated; i++) {
2036                struct adapter *adapter;
2037
2038                adapter = card->adapter[i];
2039                if (adapter) {
2040                        seq_printf(seq,
2041                                    "     %d   %d   %s  %s  %s    0x%X\n",
2042                                    adapter->physport, adapter->state,
2043                                    SLIC_LINKSTATE(adapter->linkstate),
2044                                    SLIC_DUPLEX(adapter->linkduplex),
2045                                    SLIC_SPEED(adapter->linkspeed),
2046                                    (uint) adapter->irq);
2047                }
2048        }
2049        seq_printf(seq, "Generation #             : %4.4X\n", card->gennumber);
2050        seq_printf(seq, "RcvQ max entries         : %4.4X\n",
2051                    SLIC_RCVQ_ENTRIES);
2052        seq_printf(seq, "Ping Status              : %8.8X\n",
2053                    card->pingstatus);
2054        seq_printf(seq, "Minimum grant            : %2.2x\n",
2055                    config->MinGrant);
2056        seq_printf(seq, "Maximum Latency          : %2.2x\n", config->MaxLat);
2057        seq_printf(seq, "PciStatus                : %4.4x\n",
2058                    config->Pcistatus);
2059        seq_printf(seq, "Debug Device Id          : %4.4x\n",
2060                    config->DbgDevId);
2061        seq_printf(seq, "DRAM ROM Function        : %4.4x\n",
2062                    config->DramRomFn);
2063        seq_printf(seq, "Network interface Pin 1  : %2.2x\n",
2064                    config->NetIntPin1);
2065        seq_printf(seq, "Network interface Pin 2  : %2.2x\n",
2066                    config->NetIntPin1);
2067        seq_printf(seq, "Network interface Pin 3  : %2.2x\n",
2068                    config->NetIntPin1);
2069        seq_printf(seq, "PM capabilities          : %4.4X\n",
2070                    config->PMECapab);
2071        seq_printf(seq, "Network Clock Controls   : %4.4X\n",
2072                    config->NwClkCtrls);
2073
2074        switch (config->FruFormat) {
2075        case ATK_FRU_FORMAT:
2076                {
2077                        seq_printf(seq,
2078                            "Vendor                   : Alacritech, Inc.\n");
2079                        seq_printf(seq,
2080                            "Assembly #               : %c%c%c%c%c%c\n",
2081                                    fru[0], fru[1], fru[2], fru[3], fru[4],
2082                                    fru[5]);
2083                        seq_printf(seq,
2084                                    "Revision #               : %c%c\n",
2085                                    fru[6], fru[7]);
2086
2087                        if (config->OEMFruFormat == VENDOR4_FRU_FORMAT) {
2088                                seq_printf(seq,
2089                                            "Serial   #               : "
2090                                            "%c%c%c%c%c%c%c%c%c%c%c%c\n",
2091                                            fru[8], fru[9], fru[10],
2092                                            fru[11], fru[12], fru[13],
2093                                            fru[16], fru[17], fru[18],
2094                                            fru[19], fru[20], fru[21]);
2095                        } else {
2096                                seq_printf(seq,
2097                                            "Serial   #               : "
2098                                            "%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
2099                                            fru[8], fru[9], fru[10],
2100                                            fru[11], fru[12], fru[13],
2101                                            fru[14], fru[15], fru[16],
2102                                            fru[17], fru[18], fru[19],
2103                                            fru[20], fru[21]);
2104                        }
2105                        break;
2106                }
2107
2108        default:
2109                {
2110                        seq_printf(seq,
2111                            "Vendor                   : Alacritech, Inc.\n");
2112                        seq_printf(seq,
2113                            "Serial   #               : Empty FRU\n");
2114                        break;
2115                }
2116        }
2117
2118        switch (config->OEMFruFormat) {
2119        case VENDOR1_FRU_FORMAT:
2120                {
2121                        seq_printf(seq, "FRU Information:\n");
2122                        seq_printf(seq, "    Commodity #          : %c\n",
2123                                    oemfru[0]);
2124                        seq_printf(seq,
2125                                    "    Assembly #           : %c%c%c%c\n",
2126                                    oemfru[1], oemfru[2], oemfru[3], oemfru[4]);
2127                        seq_printf(seq,
2128                                    "    Revision #           : %c%c\n",
2129                                    oemfru[5], oemfru[6]);
2130                        seq_printf(seq,
2131                                    "    Supplier #           : %c%c\n",
2132                                    oemfru[7], oemfru[8]);
2133                        seq_printf(seq,
2134                                    "    Date                 : %c%c\n",
2135                                    oemfru[9], oemfru[10]);
2136                        seq_sprintf(seq,
2137                                    "    Sequence #           : %c%c%c\n",
2138                                    oemfru[11], oemfru[12], oemfru[13]);
2139                        break;
2140                }
2141
2142        case VENDOR2_FRU_FORMAT:
2143                {
2144                        seq_printf(seq, "FRU Information:\n");
2145                        seq_printf(seq,
2146                                    "    Part     #           : "
2147                                    "%c%c%c%c%c%c%c%c\n",
2148                                    oemfru[0], oemfru[1], oemfru[2],
2149                                    oemfru[3], oemfru[4], oemfru[5],
2150                                    oemfru[6], oemfru[7]);
2151                        seq_printf(seq,
2152                                    "    Supplier #           : %c%c%c%c%c\n",
2153                                    oemfru[8], oemfru[9], oemfru[10],
2154                                    oemfru[11], oemfru[12]);
2155                        seq_printf(seq,
2156                                    "    Date                 : %c%c%c\n",
2157                                    oemfru[13], oemfru[14], oemfru[15]);
2158                        seq_sprintf(seq,
2159                                    "    Sequence #           : %c%c%c%c\n",
2160                                    oemfru[16], oemfru[17], oemfru[18],
2161                                    oemfru[19]);
2162                        break;
2163                }
2164
2165        case VENDOR3_FRU_FORMAT:
2166                {
2167                        seq_printf(seq, "FRU Information:\n");
2168                }
2169
2170        case VENDOR4_FRU_FORMAT:
2171                {
2172                        seq_printf(seq, "FRU Information:\n");
2173                        seq_printf(seq,
2174                                    "    FRU Number           : "
2175                                    "%c%c%c%c%c%c%c%c\n",
2176                                    oemfru[0], oemfru[1], oemfru[2],
2177                                    oemfru[3], oemfru[4], oemfru[5],
2178                                    oemfru[6], oemfru[7]);
2179                        seq_sprintf(seq,
2180                                    "    Part Number          : "
2181                                    "%c%c%c%c%c%c%c%c\n",
2182                                    oemfru[8], oemfru[9], oemfru[10],
2183                                    oemfru[11], oemfru[12], oemfru[13],
2184                                    oemfru[14], oemfru[15]);
2185                        seq_printf(seq,
2186                                    "    EC Level             : "
2187                                    "%c%c%c%c%c%c%c%c\n",
2188                                    oemfru[16], oemfru[17], oemfru[18],
2189                                    oemfru[19], oemfru[20], oemfru[21],
2190                                    oemfru[22], oemfru[23]);
2191                        break;
2192                }
2193
2194        default:
2195                break;
2196        }
2197#endif
2198
2199        return 0;
2200}
2201
2202static int slic_debug_adapter_show(struct seq_file *seq, void *v)
2203{
2204        struct adapter *adapter = seq->private;
2205        struct net_device *netdev = adapter->netdev;
2206
2207        seq_printf(seq, "info: interface          : %s\n",
2208                            adapter->netdev->name);
2209        seq_printf(seq, "info: status             : %s\n",
2210                SLIC_LINKSTATE(adapter->linkstate));
2211        seq_printf(seq, "info: port               : %d\n",
2212                adapter->physport);
2213        seq_printf(seq, "info: speed              : %s\n",
2214                SLIC_SPEED(adapter->linkspeed));
2215        seq_printf(seq, "info: duplex             : %s\n",
2216                SLIC_DUPLEX(adapter->linkduplex));
2217        seq_printf(seq, "info: irq                : 0x%X\n",
2218                (uint) adapter->irq);
2219        seq_printf(seq, "info: Interrupt Agg Delay: %d usec\n",
2220                adapter->card->loadlevel_current);
2221        seq_printf(seq, "info: RcvQ max entries   : %4.4X\n",
2222                SLIC_RCVQ_ENTRIES);
2223        seq_printf(seq, "info: RcvQ current       : %4.4X\n",
2224                    adapter->rcvqueue.count);
2225        seq_printf(seq, "rx stats: packets                  : %8.8lX\n",
2226                    netdev->stats.rx_packets);
2227        seq_printf(seq, "rx stats: bytes                    : %8.8lX\n",
2228                    netdev->stats.rx_bytes);
2229        seq_printf(seq, "rx stats: broadcasts               : %8.8X\n",
2230                    adapter->rcv_broadcasts);
2231        seq_printf(seq, "rx stats: multicasts               : %8.8X\n",
2232                    adapter->rcv_multicasts);
2233        seq_printf(seq, "rx stats: unicasts                 : %8.8X\n",
2234                    adapter->rcv_unicasts);
2235        seq_printf(seq, "rx stats: errors                   : %8.8X\n",
2236                    (u32) adapter->slic_stats.iface.rcv_errors);
2237        seq_printf(seq, "rx stats: Missed errors            : %8.8X\n",
2238                    (u32) adapter->slic_stats.iface.rcv_discards);
2239        seq_printf(seq, "rx stats: drops                    : %8.8X\n",
2240                        (u32) adapter->rcv_drops);
2241        seq_printf(seq, "tx stats: packets                  : %8.8lX\n",
2242                        netdev->stats.tx_packets);
2243        seq_printf(seq, "tx stats: bytes                    : %8.8lX\n",
2244                        netdev->stats.tx_bytes);
2245        seq_printf(seq, "tx stats: errors                   : %8.8X\n",
2246                        (u32) adapter->slic_stats.iface.xmt_errors);
2247        seq_printf(seq, "rx stats: multicasts               : %8.8lX\n",
2248                        netdev->stats.multicast);
2249        seq_printf(seq, "tx stats: collision errors         : %8.8X\n",
2250                        (u32) adapter->slic_stats.iface.xmit_collisions);
2251        seq_printf(seq, "perf: Max rcv frames/isr           : %8.8X\n",
2252                        adapter->max_isr_rcvs);
2253        seq_printf(seq, "perf: Rcv interrupt yields         : %8.8X\n",
2254                        adapter->rcv_interrupt_yields);
2255        seq_printf(seq, "perf: Max xmit complete/isr        : %8.8X\n",
2256                        adapter->max_isr_xmits);
2257        seq_printf(seq, "perf: error interrupts             : %8.8X\n",
2258                        adapter->error_interrupts);
2259        seq_printf(seq, "perf: error rmiss interrupts       : %8.8X\n",
2260                        adapter->error_rmiss_interrupts);
2261        seq_printf(seq, "perf: rcv interrupts               : %8.8X\n",
2262                        adapter->rcv_interrupts);
2263        seq_printf(seq, "perf: xmit interrupts              : %8.8X\n",
2264                        adapter->xmit_interrupts);
2265        seq_printf(seq, "perf: link event interrupts        : %8.8X\n",
2266                        adapter->linkevent_interrupts);
2267        seq_printf(seq, "perf: UPR interrupts               : %8.8X\n",
2268                        adapter->upr_interrupts);
2269        seq_printf(seq, "perf: interrupt count              : %8.8X\n",
2270                        adapter->num_isrs);
2271        seq_printf(seq, "perf: false interrupts             : %8.8X\n",
2272                        adapter->false_interrupts);
2273        seq_printf(seq, "perf: All register writes          : %8.8X\n",
2274                        adapter->all_reg_writes);
2275        seq_printf(seq, "perf: ICR register writes          : %8.8X\n",
2276                        adapter->icr_reg_writes);
2277        seq_printf(seq, "perf: ISR register writes          : %8.8X\n",
2278                        adapter->isr_reg_writes);
2279        seq_printf(seq, "ifevents: overflow 802 errors      : %8.8X\n",
2280                        adapter->if_events.oflow802);
2281        seq_printf(seq, "ifevents: transport overflow errors: %8.8X\n",
2282                        adapter->if_events.Tprtoflow);
2283        seq_printf(seq, "ifevents: underflow errors         : %8.8X\n",
2284                        adapter->if_events.uflow802);
2285        seq_printf(seq, "ifevents: receive early            : %8.8X\n",
2286                        adapter->if_events.rcvearly);
2287        seq_printf(seq, "ifevents: buffer overflows         : %8.8X\n",
2288                        adapter->if_events.Bufov);
2289        seq_printf(seq, "ifevents: carrier errors           : %8.8X\n",
2290                        adapter->if_events.Carre);
2291        seq_printf(seq, "ifevents: Long                     : %8.8X\n",
2292                        adapter->if_events.Longe);
2293        seq_printf(seq, "ifevents: invalid preambles        : %8.8X\n",
2294                        adapter->if_events.Invp);
2295        seq_printf(seq, "ifevents: CRC errors               : %8.8X\n",
2296                        adapter->if_events.Crc);
2297        seq_printf(seq, "ifevents: dribble nibbles          : %8.8X\n",
2298                        adapter->if_events.Drbl);
2299        seq_printf(seq, "ifevents: Code violations          : %8.8X\n",
2300                        adapter->if_events.Code);
2301        seq_printf(seq, "ifevents: TCP checksum errors      : %8.8X\n",
2302                        adapter->if_events.TpCsum);
2303        seq_printf(seq, "ifevents: TCP header short errors  : %8.8X\n",
2304                        adapter->if_events.TpHlen);
2305        seq_printf(seq, "ifevents: IP checksum errors       : %8.8X\n",
2306                        adapter->if_events.IpCsum);
2307        seq_printf(seq, "ifevents: IP frame incompletes     : %8.8X\n",
2308                        adapter->if_events.IpLen);
2309        seq_printf(seq, "ifevents: IP headers shorts        : %8.8X\n",
2310                        adapter->if_events.IpHlen);
2311
2312        return 0;
2313}
2314static int slic_debug_adapter_open(struct inode *inode, struct file *file)
2315{
2316        return single_open(file, slic_debug_adapter_show, inode->i_private);
2317}
2318
2319static int slic_debug_card_open(struct inode *inode, struct file *file)
2320{
2321        return single_open(file, slic_debug_card_show, inode->i_private);
2322}
2323
2324static const struct file_operations slic_debug_adapter_fops = {
2325        .owner          = THIS_MODULE,
2326        .open           = slic_debug_adapter_open,
2327        .read           = seq_read,
2328        .llseek         = seq_lseek,
2329        .release        = single_release,
2330};
2331
2332static const struct file_operations slic_debug_card_fops = {
2333        .owner          = THIS_MODULE,
2334        .open           = slic_debug_card_open,
2335        .read           = seq_read,
2336        .llseek         = seq_lseek,
2337        .release        = single_release,
2338};
2339
2340static void slic_debug_adapter_create(struct adapter *adapter)
2341{
2342        struct dentry *d;
2343        char    name[7];
2344        struct sliccard *card = adapter->card;
2345
2346        if (!card->debugfs_dir)
2347                return;
2348
2349        sprintf(name, "port%d", adapter->port);
2350        d = debugfs_create_file(name, S_IRUGO,
2351                                card->debugfs_dir, adapter,
2352                                &slic_debug_adapter_fops);
2353        if (!d || IS_ERR(d))
2354                pr_info(PFX "%s: debugfs create failed\n", name);
2355        else
2356                adapter->debugfs_entry = d;
2357}
2358
2359static void slic_debug_adapter_destroy(struct adapter *adapter)
2360{
2361        debugfs_remove(adapter->debugfs_entry);
2362        adapter->debugfs_entry = NULL;
2363}
2364
2365static void slic_debug_card_create(struct sliccard *card)
2366{
2367        struct dentry *d;
2368        char    name[IFNAMSIZ];
2369
2370        snprintf(name, sizeof(name), "slic%d", card->cardnum);
2371        d = debugfs_create_dir(name, slic_debugfs);
2372        if (!d || IS_ERR(d))
2373                pr_info(PFX "%s: debugfs create dir failed\n",
2374                                name);
2375        else {
2376                card->debugfs_dir = d;
2377                d = debugfs_create_file("cardinfo", S_IRUGO,
2378                                slic_debugfs, card,
2379                                &slic_debug_card_fops);
2380                if (!d || IS_ERR(d))
2381                        pr_info(PFX "%s: debugfs create failed\n",
2382                                        name);
2383                else
2384                        card->debugfs_cardinfo = d;
2385        }
2386}
2387
2388static void slic_debug_card_destroy(struct sliccard *card)
2389{
2390        int i;
2391
2392        for (i = 0; i < card->card_size; i++) {
2393                struct adapter *adapter;
2394
2395                adapter = card->adapter[i];
2396                if (adapter)
2397                        slic_debug_adapter_destroy(adapter);
2398        }
2399        if (card->debugfs_cardinfo) {
2400                debugfs_remove(card->debugfs_cardinfo);
2401                card->debugfs_cardinfo = NULL;
2402        }
2403        if (card->debugfs_dir) {
2404                debugfs_remove(card->debugfs_dir);
2405                card->debugfs_dir = NULL;
2406        }
2407}
2408
2409static void slic_debug_init(void)
2410{
2411        struct dentry *ent;
2412
2413        ent = debugfs_create_dir("slic", NULL);
2414        if (!ent || IS_ERR(ent)) {
2415                pr_info(PFX "debugfs create directory failed\n");
2416                return;
2417        }
2418
2419        slic_debugfs = ent;
2420}
2421
2422static void slic_debug_cleanup(void)
2423{
2424        if (slic_debugfs) {
2425                debugfs_remove(slic_debugfs);
2426                slic_debugfs = NULL;
2427        }
2428}
2429
2430/*
2431 * slic_link_event_handler -
2432 *
2433 * Initiate a link configuration sequence.  The link configuration begins
2434 * by issuing a READ_LINK_STATUS command to the Utility Processor on the
2435 * SLIC.  Since the command finishes asynchronously, the slic_upr_comlete
2436 * routine will follow it up witha UP configuration write command, which
2437 * will also complete asynchronously.
2438 *
2439 */
2440static void slic_link_event_handler(struct adapter *adapter)
2441{
2442        int status;
2443        struct slic_shmem *pshmem;
2444
2445        if (adapter->state != ADAPT_UP) {
2446                /* Adapter is not operational.  Ignore.  */
2447                return;
2448        }
2449
2450        pshmem = (struct slic_shmem *)adapter->phys_shmem;
2451
2452#if BITS_PER_LONG == 64
2453        status = slic_upr_request(adapter,
2454                                  SLIC_UPR_RLSR,
2455                                  SLIC_GET_ADDR_LOW(&pshmem->linkstatus),
2456                                  SLIC_GET_ADDR_HIGH(&pshmem->linkstatus),
2457                                  0, 0);
2458#else
2459        status = slic_upr_request(adapter, SLIC_UPR_RLSR,
2460                (u32) &pshmem->linkstatus,      /* no 4GB wrap guaranteed */
2461                                  0, 0, 0);
2462#endif
2463        ASSERT(status == 0);
2464}
2465
2466static void slic_init_cleanup(struct adapter *adapter)
2467{
2468        if (adapter->intrregistered) {
2469                adapter->intrregistered = 0;
2470                free_irq(adapter->netdev->irq, adapter->netdev);
2471
2472        }
2473        if (adapter->pshmem) {
2474                pci_free_consistent(adapter->pcidev,
2475                                    sizeof(struct slic_shmem),
2476                                    adapter->pshmem, adapter->phys_shmem);
2477                adapter->pshmem = NULL;
2478                adapter->phys_shmem = (dma_addr_t) NULL;
2479        }
2480
2481        if (adapter->pingtimerset) {
2482                adapter->pingtimerset = 0;
2483                del_timer(&adapter->pingtimer);
2484        }
2485
2486        slic_rspqueue_free(adapter);
2487        slic_cmdq_free(adapter);
2488        slic_rcvqueue_free(adapter);
2489}
2490
2491/*
2492 *  Allocate a mcast_address structure to hold the multicast address.
2493 *  Link it in.
2494 */
2495static int slic_mcast_add_list(struct adapter *adapter, char *address)
2496{
2497        struct mcast_address *mcaddr, *mlist;
2498
2499        /* Check to see if it already exists */
2500        mlist = adapter->mcastaddrs;
2501        while (mlist) {
2502                if (!compare_ether_addr(mlist->address, address))
2503                        return 0;
2504                mlist = mlist->next;
2505        }
2506
2507        /* Doesn't already exist.  Allocate a structure to hold it */
2508        mcaddr = kmalloc(sizeof(struct mcast_address), GFP_ATOMIC);
2509        if (mcaddr == NULL)
2510                return 1;
2511
2512        memcpy(mcaddr->address, address, 6);
2513
2514        mcaddr->next = adapter->mcastaddrs;
2515        adapter->mcastaddrs = mcaddr;
2516
2517        return 0;
2518}
2519
2520static void slic_mcast_set_list(struct net_device *dev)
2521{
2522        struct adapter *adapter = netdev_priv(dev);
2523        int status = 0;
2524        char *addresses;
2525        struct netdev_hw_addr *ha;
2526
2527        ASSERT(adapter);
2528
2529        netdev_for_each_mc_addr(ha, dev) {
2530                addresses = (char *) &ha->addr;
2531                status = slic_mcast_add_list(adapter, addresses);
2532                if (status != 0)
2533                        break;
2534                slic_mcast_set_bit(adapter, addresses);
2535        }
2536
2537        if (adapter->devflags_prev != dev->flags) {
2538                adapter->macopts = MAC_DIRECTED;
2539                if (dev->flags) {
2540                        if (dev->flags & IFF_BROADCAST)
2541                                adapter->macopts |= MAC_BCAST;
2542                        if (dev->flags & IFF_PROMISC)
2543                                adapter->macopts |= MAC_PROMISC;
2544                        if (dev->flags & IFF_ALLMULTI)
2545                                adapter->macopts |= MAC_ALLMCAST;
2546                        if (dev->flags & IFF_MULTICAST)
2547                                adapter->macopts |= MAC_MCAST;
2548                }
2549                adapter->devflags_prev = dev->flags;
2550                slic_config_set(adapter, true);
2551        } else {
2552                if (status == 0)
2553                        slic_mcast_set_mask(adapter);
2554        }
2555        return;
2556}
2557
2558#define  XMIT_FAIL_LINK_STATE               1
2559#define  XMIT_FAIL_ZERO_LENGTH              2
2560#define  XMIT_FAIL_HOSTCMD_FAIL             3
2561
2562static void slic_xmit_build_request(struct adapter *adapter,
2563                             struct slic_hostcmd *hcmd, struct sk_buff *skb)
2564{
2565        struct slic_host64_cmd *ihcmd;
2566        ulong phys_addr;
2567
2568        ihcmd = &hcmd->cmd64;
2569
2570        ihcmd->flags = (adapter->port << IHFLG_IFSHFT);
2571        ihcmd->command = IHCMD_XMT_REQ;
2572        ihcmd->u.slic_buffers.totlen = skb->len;
2573        phys_addr = pci_map_single(adapter->pcidev, skb->data, skb->len,
2574                        PCI_DMA_TODEVICE);
2575        ihcmd->u.slic_buffers.bufs[0].paddrl = SLIC_GET_ADDR_LOW(phys_addr);
2576        ihcmd->u.slic_buffers.bufs[0].paddrh = SLIC_GET_ADDR_HIGH(phys_addr);
2577        ihcmd->u.slic_buffers.bufs[0].length = skb->len;
2578#if BITS_PER_LONG == 64
2579        hcmd->cmdsize = (u32) ((((u64)&ihcmd->u.slic_buffers.bufs[1] -
2580                                     (u64) hcmd) + 31) >> 5);
2581#else
2582        hcmd->cmdsize = ((((u32) &ihcmd->u.slic_buffers.bufs[1] -
2583                           (u32) hcmd) + 31) >> 5);
2584#endif
2585}
2586
2587static void slic_xmit_fail(struct adapter *adapter,
2588                    struct sk_buff *skb,
2589                    void *cmd, u32 skbtype, u32 status)
2590{
2591        if (adapter->xmitq_full)
2592                netif_stop_queue(adapter->netdev);
2593        if ((cmd == NULL) && (status <= XMIT_FAIL_HOSTCMD_FAIL)) {
2594                switch (status) {
2595                case XMIT_FAIL_LINK_STATE:
2596                        dev_err(&adapter->netdev->dev,
2597                                "reject xmit skb[%p: %x] linkstate[%s] "
2598                                "adapter[%s:%d] card[%s:%d]\n",
2599                                skb, skb->pkt_type,
2600                                SLIC_LINKSTATE(adapter->linkstate),
2601                                SLIC_ADAPTER_STATE(adapter->state),
2602                                adapter->state,
2603                                SLIC_CARD_STATE(adapter->card->state),
2604                                adapter->card->state);
2605                        break;
2606                case XMIT_FAIL_ZERO_LENGTH:
2607                        dev_err(&adapter->netdev->dev,
2608                                "xmit_start skb->len == 0 skb[%p] type[%x]\n",
2609                                skb, skb->pkt_type);
2610                        break;
2611                case XMIT_FAIL_HOSTCMD_FAIL:
2612                        dev_err(&adapter->netdev->dev,
2613                                "xmit_start skb[%p] type[%x] No host commands "
2614                                "available\n", skb, skb->pkt_type);
2615                        break;
2616                default:
2617                        ASSERT(0);
2618                }
2619        }
2620        dev_kfree_skb(skb);
2621        adapter->netdev->stats.tx_dropped++;
2622}
2623
2624static void slic_rcv_handle_error(struct adapter *adapter,
2625                                        struct slic_rcvbuf *rcvbuf)
2626{
2627        struct slic_hddr_wds *hdr = (struct slic_hddr_wds *)rcvbuf->data;
2628        struct net_device *netdev = adapter->netdev;
2629
2630        if (adapter->devid != SLIC_1GB_DEVICE_ID) {
2631                if (hdr->frame_status14 & VRHSTAT_802OE)
2632                        adapter->if_events.oflow802++;
2633                if (hdr->frame_status14 & VRHSTAT_TPOFLO)
2634                        adapter->if_events.Tprtoflow++;
2635                if (hdr->frame_status_b14 & VRHSTATB_802UE)
2636                        adapter->if_events.uflow802++;
2637                if (hdr->frame_status_b14 & VRHSTATB_RCVE) {
2638                        adapter->if_events.rcvearly++;
2639                        netdev->stats.rx_fifo_errors++;
2640                }
2641                if (hdr->frame_status_b14 & VRHSTATB_BUFF) {
2642                        adapter->if_events.Bufov++;
2643                        netdev->stats.rx_over_errors++;
2644                }
2645                if (hdr->frame_status_b14 & VRHSTATB_CARRE) {
2646                        adapter->if_events.Carre++;
2647                        netdev->stats.tx_carrier_errors++;
2648                }
2649                if (hdr->frame_status_b14 & VRHSTATB_LONGE)
2650                        adapter->if_events.Longe++;
2651                if (hdr->frame_status_b14 & VRHSTATB_PREA)
2652                        adapter->if_events.Invp++;
2653                if (hdr->frame_status_b14 & VRHSTATB_CRC) {
2654                        adapter->if_events.Crc++;
2655                        netdev->stats.rx_crc_errors++;
2656                }
2657                if (hdr->frame_status_b14 & VRHSTATB_DRBL)
2658                        adapter->if_events.Drbl++;
2659                if (hdr->frame_status_b14 & VRHSTATB_CODE)
2660                        adapter->if_events.Code++;
2661                if (hdr->frame_status_b14 & VRHSTATB_TPCSUM)
2662                        adapter->if_events.TpCsum++;
2663                if (hdr->frame_status_b14 & VRHSTATB_TPHLEN)
2664                        adapter->if_events.TpHlen++;
2665                if (hdr->frame_status_b14 & VRHSTATB_IPCSUM)
2666                        adapter->if_events.IpCsum++;
2667                if (hdr->frame_status_b14 & VRHSTATB_IPLERR)
2668                        adapter->if_events.IpLen++;
2669                if (hdr->frame_status_b14 & VRHSTATB_IPHERR)
2670                        adapter->if_events.IpHlen++;
2671        } else {
2672                if (hdr->frame_statusGB & VGBSTAT_XPERR) {
2673                        u32 xerr = hdr->frame_statusGB >> VGBSTAT_XERRSHFT;
2674
2675                        if (xerr == VGBSTAT_XCSERR)
2676                                adapter->if_events.TpCsum++;
2677                        if (xerr == VGBSTAT_XUFLOW)
2678                                adapter->if_events.Tprtoflow++;
2679                        if (xerr == VGBSTAT_XHLEN)
2680                                adapter->if_events.TpHlen++;
2681                }
2682                if (hdr->frame_statusGB & VGBSTAT_NETERR) {
2683                        u32 nerr =
2684                            (hdr->
2685                             frame_statusGB >> VGBSTAT_NERRSHFT) &
2686                            VGBSTAT_NERRMSK;
2687                        if (nerr == VGBSTAT_NCSERR)
2688                                adapter->if_events.IpCsum++;
2689                        if (nerr == VGBSTAT_NUFLOW)
2690                                adapter->if_events.IpLen++;
2691                        if (nerr == VGBSTAT_NHLEN)
2692                                adapter->if_events.IpHlen++;
2693                }
2694                if (hdr->frame_statusGB & VGBSTAT_LNKERR) {
2695                        u32 lerr = hdr->frame_statusGB & VGBSTAT_LERRMSK;
2696
2697                        if (lerr == VGBSTAT_LDEARLY)
2698                                adapter->if_events.rcvearly++;
2699                        if (lerr == VGBSTAT_LBOFLO)
2700                                adapter->if_events.Bufov++;
2701                        if (lerr == VGBSTAT_LCODERR)
2702                                adapter->if_events.Code++;
2703                        if (lerr == VGBSTAT_LDBLNBL)
2704                                adapter->if_events.Drbl++;
2705                        if (lerr == VGBSTAT_LCRCERR)
2706                                adapter->if_events.Crc++;
2707                        if (lerr == VGBSTAT_LOFLO)
2708                                adapter->if_events.oflow802++;
2709                        if (lerr == VGBSTAT_LUFLO)
2710                                adapter->if_events.uflow802++;
2711                }
2712        }
2713        return;
2714}
2715
2716#define TCP_OFFLOAD_FRAME_PUSHFLAG  0x10000000
2717#define M_FAST_PATH                 0x0040
2718
2719static void slic_rcv_handler(struct adapter *adapter)
2720{
2721        struct net_device *netdev = adapter->netdev;
2722        struct sk_buff *skb;
2723        struct slic_rcvbuf *rcvbuf;
2724        u32 frames = 0;
2725
2726        while ((skb = slic_rcvqueue_getnext(adapter))) {
2727                u32 rx_bytes;
2728
2729                ASSERT(skb->head);
2730                rcvbuf = (struct slic_rcvbuf *)skb->head;
2731                adapter->card->events++;
2732                if (rcvbuf->status & IRHDDR_ERR) {
2733                        adapter->rx_errors++;
2734                        slic_rcv_handle_error(adapter, rcvbuf);
2735                        slic_rcvqueue_reinsert(adapter, skb);
2736                        continue;
2737                }
2738
2739                if (!slic_mac_filter(adapter, (struct ether_header *)
2740                                        rcvbuf->data)) {
2741                        slic_rcvqueue_reinsert(adapter, skb);
2742                        continue;
2743                }
2744                skb_pull(skb, SLIC_RCVBUF_HEADSIZE);
2745                rx_bytes = (rcvbuf->length & IRHDDR_FLEN_MSK);
2746                skb_put(skb, rx_bytes);
2747                netdev->stats.rx_packets++;
2748                netdev->stats.rx_bytes += rx_bytes;
2749#if SLIC_OFFLOAD_IP_CHECKSUM
2750                skb->ip_summed = CHECKSUM_UNNECESSARY;
2751#endif
2752
2753                skb->dev = adapter->netdev;
2754                skb->protocol = eth_type_trans(skb, skb->dev);
2755                netif_rx(skb);
2756
2757                ++frames;
2758#if SLIC_INTERRUPT_PROCESS_LIMIT
2759                if (frames >= SLIC_RCVQ_MAX_PROCESS_ISR) {
2760                        adapter->rcv_interrupt_yields++;
2761                        break;
2762                }
2763#endif
2764        }
2765        adapter->max_isr_rcvs = max(adapter->max_isr_rcvs, frames);
2766}
2767
2768static void slic_xmit_complete(struct adapter *adapter)
2769{
2770        struct slic_hostcmd *hcmd;
2771        struct slic_rspbuf *rspbuf;
2772        u32 frames = 0;
2773        struct slic_handle_word slic_handle_word;
2774
2775        do {
2776                rspbuf = slic_rspqueue_getnext(adapter);
2777                if (!rspbuf)
2778                        break;
2779                adapter->xmit_completes++;
2780                adapter->card->events++;
2781                /*
2782                 Get the complete host command buffer
2783                */
2784                slic_handle_word.handle_token = rspbuf->hosthandle;
2785                ASSERT(slic_handle_word.handle_index);
2786                ASSERT(slic_handle_word.handle_index <= SLIC_CMDQ_MAXCMDS);
2787                hcmd =
2788                    (struct slic_hostcmd *)
2789                        adapter->slic_handles[slic_handle_word.handle_index].
2790                                                                        address;
2791/*      hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
2792                ASSERT(hcmd);
2793                ASSERT(hcmd->pslic_handle ==
2794                       &adapter->slic_handles[slic_handle_word.handle_index]);
2795                if (hcmd->type == SLIC_CMD_DUMB) {
2796                        if (hcmd->skb)
2797                                dev_kfree_skb_irq(hcmd->skb);
2798                        slic_cmdq_putdone_irq(adapter, hcmd);
2799                }
2800                rspbuf->status = 0;
2801                rspbuf->hosthandle = 0;
2802                frames++;
2803        } while (1);
2804        adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames);
2805}
2806
2807static irqreturn_t slic_interrupt(int irq, void *dev_id)
2808{
2809        struct net_device *dev = (struct net_device *)dev_id;
2810        struct adapter *adapter = netdev_priv(dev);
2811        u32 isr;
2812
2813        if ((adapter->pshmem) && (adapter->pshmem->isr)) {
2814                slic_reg32_write(&adapter->slic_regs->slic_icr,
2815                                 ICR_INT_MASK, FLUSH);
2816                isr = adapter->isrcopy = adapter->pshmem->isr;
2817                adapter->pshmem->isr = 0;
2818                adapter->num_isrs++;
2819                switch (adapter->card->state) {
2820                case CARD_UP:
2821                        if (isr & ~ISR_IO) {
2822                                if (isr & ISR_ERR) {
2823                                        adapter->error_interrupts++;
2824                                        if (isr & ISR_RMISS) {
2825                                                int count;
2826                                                int pre_count;
2827                                                int errors;
2828
2829                                                struct slic_rcvqueue *rcvq =
2830                                                    &adapter->rcvqueue;
2831
2832                                                adapter->
2833                                                    error_rmiss_interrupts++;
2834                                                if (!rcvq->errors)
2835                                                        rcv_count = rcvq->count;
2836                                                pre_count = rcvq->count;
2837                                                errors = rcvq->errors;
2838
2839                                                while (rcvq->count <
2840                                                       SLIC_RCVQ_FILLTHRESH) {
2841                                                        count =
2842                                                            slic_rcvqueue_fill
2843                                                            (adapter);
2844                                                        if (!count)
2845                                                                break;
2846                                                }
2847                                        } else if (isr & ISR_XDROP) {
2848                                                dev_err(&dev->dev,
2849                                                        "isr & ISR_ERR [%x] "
2850                                                        "ISR_XDROP \n", isr);
2851                                        } else {
2852                                                dev_err(&dev->dev,
2853                                                        "isr & ISR_ERR [%x]\n",
2854                                                        isr);
2855                                        }
2856                                }
2857
2858                                if (isr & ISR_LEVENT) {
2859                                        adapter->linkevent_interrupts++;
2860                                        slic_link_event_handler(adapter);
2861                                }
2862
2863                                if ((isr & ISR_UPC) ||
2864                                    (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
2865                                        adapter->upr_interrupts++;
2866                                        slic_upr_request_complete(adapter, isr);
2867                                }
2868                        }
2869
2870                        if (isr & ISR_RCV) {
2871                                adapter->rcv_interrupts++;
2872                                slic_rcv_handler(adapter);
2873                        }
2874
2875                        if (isr & ISR_CMD) {
2876                                adapter->xmit_interrupts++;
2877                                slic_xmit_complete(adapter);
2878                        }
2879                        break;
2880
2881                case CARD_DOWN:
2882                        if ((isr & ISR_UPC) ||
2883                            (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
2884                                adapter->upr_interrupts++;
2885                                slic_upr_request_complete(adapter, isr);
2886                        }
2887                        break;
2888
2889                default:
2890                        break;
2891                }
2892
2893                adapter->isrcopy = 0;
2894                adapter->all_reg_writes += 2;
2895                adapter->isr_reg_writes++;
2896                slic_reg32_write(&adapter->slic_regs->slic_isr, 0, FLUSH);
2897        } else {
2898                adapter->false_interrupts++;
2899        }
2900        return IRQ_HANDLED;
2901}
2902
2903#define NORMAL_ETHFRAME     0
2904
2905static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev)
2906{
2907        struct sliccard *card;
2908        struct adapter *adapter = netdev_priv(dev);
2909        struct slic_hostcmd *hcmd = NULL;
2910        u32 status = 0;
2911        u32 skbtype = NORMAL_ETHFRAME;
2912        void *offloadcmd = NULL;
2913
2914        card = adapter->card;
2915        ASSERT(card);
2916        if ((adapter->linkstate != LINK_UP) ||
2917            (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) {
2918                status = XMIT_FAIL_LINK_STATE;
2919                goto xmit_fail;
2920
2921        } else if (skb->len == 0) {
2922                status = XMIT_FAIL_ZERO_LENGTH;
2923                goto xmit_fail;
2924        }
2925
2926        if (skbtype == NORMAL_ETHFRAME) {
2927                hcmd = slic_cmdq_getfree(adapter);
2928                if (!hcmd) {
2929                        adapter->xmitq_full = 1;
2930                        status = XMIT_FAIL_HOSTCMD_FAIL;
2931                        goto xmit_fail;
2932                }
2933                ASSERT(hcmd->pslic_handle);
2934                ASSERT(hcmd->cmd64.hosthandle ==
2935                       hcmd->pslic_handle->token.handle_token);
2936                hcmd->skb = skb;
2937                hcmd->busy = 1;
2938                hcmd->type = SLIC_CMD_DUMB;
2939                if (skbtype == NORMAL_ETHFRAME)
2940                        slic_xmit_build_request(adapter, hcmd, skb);
2941        }
2942        dev->stats.tx_packets++;
2943        dev->stats.tx_bytes += skb->len;
2944
2945#ifdef DEBUG_DUMP
2946        if (adapter->kill_card) {
2947                struct slic_host64_cmd ihcmd;
2948
2949                ihcmd = &hcmd->cmd64;
2950
2951                ihcmd->flags |= 0x40;
2952                adapter->kill_card = 0; /* only do this once */
2953        }
2954#endif
2955        if (hcmd->paddrh == 0) {
2956                slic_reg32_write(&adapter->slic_regs->slic_cbar,
2957                                 (hcmd->paddrl | hcmd->cmdsize), DONT_FLUSH);
2958        } else {
2959                slic_reg64_write(adapter, &adapter->slic_regs->slic_cbar64,
2960                                 (hcmd->paddrl | hcmd->cmdsize),
2961                                 &adapter->slic_regs->slic_addr_upper,
2962                                 hcmd->paddrh, DONT_FLUSH);
2963        }
2964xmit_done:
2965        return NETDEV_TX_OK;
2966xmit_fail:
2967        slic_xmit_fail(adapter, skb, offloadcmd, skbtype, status);
2968        goto xmit_done;
2969}
2970
2971
2972static void slic_adapter_freeresources(struct adapter *adapter)
2973{
2974        slic_init_cleanup(adapter);
2975        adapter->error_interrupts = 0;
2976        adapter->rcv_interrupts = 0;
2977        adapter->xmit_interrupts = 0;
2978        adapter->linkevent_interrupts = 0;
2979        adapter->upr_interrupts = 0;
2980        adapter->num_isrs = 0;
2981        adapter->xmit_completes = 0;
2982        adapter->rcv_broadcasts = 0;
2983        adapter->rcv_multicasts = 0;
2984        adapter->rcv_unicasts = 0;
2985}
2986
2987static int slic_adapter_allocresources(struct adapter *adapter)
2988{
2989        if (!adapter->intrregistered) {
2990                int retval;
2991
2992                spin_unlock_irqrestore(&slic_global.driver_lock.lock,
2993                                        slic_global.driver_lock.flags);
2994
2995                retval = request_irq(adapter->netdev->irq,
2996                                     &slic_interrupt,
2997                                     IRQF_SHARED,
2998                                     adapter->netdev->name, adapter->netdev);
2999
3000                spin_lock_irqsave(&slic_global.driver_lock.lock,
3001                                        slic_global.driver_lock.flags);
3002
3003                if (retval) {
3004                        dev_err(&adapter->netdev->dev,
3005                                "request_irq (%s) FAILED [%x]\n",
3006                                adapter->netdev->name, retval);
3007                        return retval;
3008                }
3009                adapter->intrregistered = 1;
3010        }
3011        return 0;
3012}
3013
3014/*
3015 *  slic_if_init
3016 *
3017 *  Perform initialization of our slic interface.
3018 *
3019 */
3020static int slic_if_init(struct adapter *adapter)
3021{
3022        struct sliccard *card = adapter->card;
3023        struct net_device *dev = adapter->netdev;
3024        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
3025        struct slic_shmem *pshmem;
3026        int rc;
3027
3028        ASSERT(card);
3029
3030        /* adapter should be down at this point */
3031        if (adapter->state != ADAPT_DOWN) {
3032                dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n",
3033                        __func__);
3034                rc = -EIO;
3035                goto err;
3036        }
3037        ASSERT(adapter->linkstate == LINK_DOWN);
3038
3039        adapter->devflags_prev = dev->flags;
3040        adapter->macopts = MAC_DIRECTED;
3041        if (dev->flags) {
3042                if (dev->flags & IFF_BROADCAST)
3043                        adapter->macopts |= MAC_BCAST;
3044                if (dev->flags & IFF_PROMISC)
3045                        adapter->macopts |= MAC_PROMISC;
3046                if (dev->flags & IFF_ALLMULTI)
3047                        adapter->macopts |= MAC_ALLMCAST;
3048                if (dev->flags & IFF_MULTICAST)
3049                        adapter->macopts |= MAC_MCAST;
3050        }
3051        rc = slic_adapter_allocresources(adapter);
3052        if (rc) {
3053                dev_err(&dev->dev,
3054                        "%s: slic_adapter_allocresources FAILED %x\n",
3055                        __func__, rc);
3056                slic_adapter_freeresources(adapter);
3057                goto err;
3058        }
3059
3060        if (!adapter->queues_initialized) {
3061                if ((rc = slic_rspqueue_init(adapter)))
3062                        goto err;
3063                if ((rc = slic_cmdq_init(adapter)))
3064                        goto err;
3065                if ((rc = slic_rcvqueue_init(adapter)))
3066                        goto err;
3067                adapter->queues_initialized = 1;
3068        }
3069
3070        slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
3071        mdelay(1);
3072
3073        if (!adapter->isp_initialized) {
3074                pshmem = (struct slic_shmem *)adapter->phys_shmem;
3075
3076                spin_lock_irqsave(&adapter->bit64reglock.lock,
3077                                        adapter->bit64reglock.flags);
3078
3079#if BITS_PER_LONG == 64
3080                slic_reg32_write(&slic_regs->slic_addr_upper,
3081                                 SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH);
3082                slic_reg32_write(&slic_regs->slic_isp,
3083                                 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
3084#else
3085                slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH);
3086                slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr, FLUSH);
3087#endif
3088                spin_unlock_irqrestore(&adapter->bit64reglock.lock,
3089                                        adapter->bit64reglock.flags);
3090                adapter->isp_initialized = 1;
3091        }
3092
3093        adapter->state = ADAPT_UP;
3094        if (!card->loadtimerset) {
3095                init_timer(&card->loadtimer);
3096                card->loadtimer.expires =
3097                    jiffies + (SLIC_LOADTIMER_PERIOD * HZ);
3098                card->loadtimer.data = (ulong) card;
3099                card->loadtimer.function = &slic_timer_load_check;
3100                add_timer(&card->loadtimer);
3101
3102                card->loadtimerset = 1;
3103        }
3104
3105        if (!adapter->pingtimerset) {
3106                init_timer(&adapter->pingtimer);
3107                adapter->pingtimer.expires =
3108                    jiffies + (PING_TIMER_INTERVAL * HZ);
3109                adapter->pingtimer.data = (ulong) dev;
3110                adapter->pingtimer.function = &slic_timer_ping;
3111                add_timer(&adapter->pingtimer);
3112                adapter->pingtimerset = 1;
3113                adapter->card->pingstatus = ISR_PINGMASK;
3114        }
3115
3116        /*
3117         *    clear any pending events, then enable interrupts
3118         */
3119        adapter->isrcopy = 0;
3120        adapter->pshmem->isr = 0;
3121        slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH);
3122        slic_reg32_write(&slic_regs->slic_icr, ICR_INT_ON, FLUSH);
3123
3124        slic_link_config(adapter, LINK_AUTOSPEED, LINK_AUTOD);
3125        slic_link_event_handler(adapter);
3126
3127err:
3128        return rc;
3129}
3130
3131static int slic_entry_open(struct net_device *dev)
3132{
3133        struct adapter *adapter = netdev_priv(dev);
3134        struct sliccard *card = adapter->card;
3135        u32 locked = 0;
3136        int status;
3137
3138        ASSERT(adapter);
3139        ASSERT(card);
3140
3141        netif_stop_queue(adapter->netdev);
3142
3143        spin_lock_irqsave(&slic_global.driver_lock.lock,
3144                                slic_global.driver_lock.flags);
3145        locked = 1;
3146        if (!adapter->activated) {
3147                card->adapters_activated++;
3148                slic_global.num_slic_ports_active++;
3149                adapter->activated = 1;
3150        }
3151        status = slic_if_init(adapter);
3152
3153        if (status != 0) {
3154                if (adapter->activated) {
3155                        card->adapters_activated--;
3156                        slic_global.num_slic_ports_active--;
3157                        adapter->activated = 0;
3158                }
3159                if (locked) {
3160                        spin_unlock_irqrestore(&slic_global.driver_lock.lock,
3161                                                slic_global.driver_lock.flags);
3162                        locked = 0;
3163                }
3164                return status;
3165        }
3166        if (!card->master)
3167                card->master = adapter;
3168
3169        if (locked) {
3170                spin_unlock_irqrestore(&slic_global.driver_lock.lock,
3171                                        slic_global.driver_lock.flags);
3172                locked = 0;
3173        }
3174
3175        return 0;
3176}
3177
3178static void slic_card_cleanup(struct sliccard *card)
3179{
3180        if (card->loadtimerset) {
3181                card->loadtimerset = 0;
3182                del_timer(&card->loadtimer);
3183        }
3184
3185        slic_debug_card_destroy(card);
3186
3187        kfree(card);
3188}
3189
3190static void __devexit slic_entry_remove(struct pci_dev *pcidev)
3191{
3192        struct net_device *dev = pci_get_drvdata(pcidev);
3193        u32 mmio_start = 0;
3194        uint mmio_len = 0;
3195        struct adapter *adapter = netdev_priv(dev);
3196        struct sliccard *card;
3197        struct mcast_address *mcaddr, *mlist;
3198
3199        ASSERT(adapter);
3200        slic_adapter_freeresources(adapter);
3201        slic_unmap_mmio_space(adapter);
3202        unregister_netdev(dev);
3203
3204        mmio_start = pci_resource_start(pcidev, 0);
3205        mmio_len = pci_resource_len(pcidev, 0);
3206
3207        release_mem_region(mmio_start, mmio_len);
3208
3209        iounmap((void __iomem *)dev->base_addr);
3210        /* free multicast addresses */
3211        mlist = adapter->mcastaddrs;
3212        while (mlist) {
3213                mcaddr = mlist;
3214                mlist = mlist->next;
3215                kfree(mcaddr);
3216        }
3217        ASSERT(adapter->card);
3218        card = adapter->card;
3219        ASSERT(card->adapters_allocated);
3220        card->adapters_allocated--;
3221        adapter->allocated = 0;
3222        if (!card->adapters_allocated) {
3223                struct sliccard *curr_card = slic_global.slic_card;
3224                if (curr_card == card) {
3225                        slic_global.slic_card = card->next;
3226                } else {
3227                        while (curr_card->next != card)
3228                                curr_card = curr_card->next;
3229                        ASSERT(curr_card);
3230                        curr_card->next = card->next;
3231                }
3232                ASSERT(slic_global.num_slic_cards);
3233                slic_global.num_slic_cards--;
3234                slic_card_cleanup(card);
3235        }
3236        free_netdev(dev);
3237        pci_release_regions(pcidev);
3238}
3239
3240static int slic_entry_halt(struct net_device *dev)
3241{
3242        struct adapter *adapter = netdev_priv(dev);
3243        struct sliccard *card = adapter->card;
3244        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
3245
3246        spin_lock_irqsave(&slic_global.driver_lock.lock,
3247                                slic_global.driver_lock.flags);
3248        ASSERT(card);
3249        netif_stop_queue(adapter->netdev);
3250        adapter->state = ADAPT_DOWN;
3251        adapter->linkstate = LINK_DOWN;
3252        adapter->upr_list = NULL;
3253        adapter->upr_busy = 0;
3254        adapter->devflags_prev = 0;
3255        ASSERT(card->adapter[adapter->cardindex] == adapter);
3256        slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
3257        adapter->all_reg_writes++;
3258        adapter->icr_reg_writes++;
3259        slic_config_clear(adapter);
3260        if (adapter->activated) {
3261                card->adapters_activated--;
3262                slic_global.num_slic_ports_active--;
3263                adapter->activated = 0;
3264        }
3265#ifdef AUTOMATIC_RESET
3266        slic_reg32_write(&slic_regs->slic_reset_iface, 0, FLUSH);
3267#endif
3268        /*
3269         *  Reset the adapter's cmd queues
3270         */
3271        slic_cmdq_reset(adapter);
3272
3273#ifdef AUTOMATIC_RESET
3274        if (!card->adapters_activated)
3275                slic_card_init(card, adapter);
3276#endif
3277
3278        spin_unlock_irqrestore(&slic_global.driver_lock.lock,
3279                                slic_global.driver_lock.flags);
3280        return 0;
3281}
3282
3283static struct net_device_stats *slic_get_stats(struct net_device *dev)
3284{
3285        struct adapter *adapter = netdev_priv(dev);
3286
3287        ASSERT(adapter);
3288        dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions;
3289        dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors;
3290        dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors;
3291        dev->stats.rx_missed_errors = adapter->slic_stats.iface.rcv_discards;
3292        dev->stats.tx_heartbeat_errors = 0;
3293        dev->stats.tx_aborted_errors = 0;
3294        dev->stats.tx_window_errors = 0;
3295        dev->stats.tx_fifo_errors = 0;
3296        dev->stats.rx_frame_errors = 0;
3297        dev->stats.rx_length_errors = 0;
3298
3299        return &dev->stats;
3300}
3301
3302static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
3303{
3304        struct adapter *adapter = netdev_priv(dev);
3305        struct ethtool_cmd edata;
3306        struct ethtool_cmd ecmd;
3307        u32 data[7];
3308        u32 intagg;
3309
3310        ASSERT(rq);
3311        switch (cmd) {
3312        case SIOCSLICSETINTAGG:
3313                if (copy_from_user(data, rq->ifr_data, 28))
3314                        return -EFAULT;
3315                intagg = data[0];
3316                dev_err(&dev->dev, "%s: set interrupt aggregation to %d\n",
3317                        __func__, intagg);
3318                slic_intagg_set(adapter, intagg);
3319                return 0;
3320
3321#ifdef SLIC_TRACE_DUMP_ENABLED
3322        case SIOCSLICTRACEDUMP:
3323                {
3324                        u32 value;
3325                        DBG_IOCTL("slic_ioctl  SIOCSLIC_TRACE_DUMP\n");
3326
3327                        if (copy_from_user(data, rq->ifr_data, 28)) {
3328                                PRINT_ERROR
3329                                    ("slic: copy_from_user FAILED getting initial simba param\n");
3330                                return -EFAULT;
3331                        }
3332
3333                        value = data[0];
3334                        if (tracemon_request == SLIC_DUMP_DONE) {
3335                                PRINT_ERROR
3336                                    ("ATK Diagnostic Trace Dump Requested\n");
3337                                tracemon_request = SLIC_DUMP_REQUESTED;
3338                                tracemon_request_type = value;
3339                                tracemon_timestamp = jiffies;
3340                        } else if ((tracemon_request == SLIC_DUMP_REQUESTED) ||
3341                                   (tracemon_request ==
3342                                    SLIC_DUMP_IN_PROGRESS)) {
3343                                PRINT_ERROR
3344                                    ("ATK Diagnostic Trace Dump Requested but already in progress... ignore\n");
3345                        } else {
3346                                PRINT_ERROR
3347                                    ("ATK Diagnostic Trace Dump Requested\n");
3348                                tracemon_request = SLIC_DUMP_REQUESTED;
3349                                tracemon_request_type = value;
3350                                tracemon_timestamp = jiffies;
3351                        }
3352                        return 0;
3353                }
3354#endif
3355        case SIOCETHTOOL:
3356                ASSERT(adapter);
3357                if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd)))
3358                        return -EFAULT;
3359
3360                if (ecmd.cmd == ETHTOOL_GSET) {
3361                        edata.supported = (SUPPORTED_10baseT_Half |
3362                                           SUPPORTED_10baseT_Full |
3363                                           SUPPORTED_100baseT_Half |
3364                                           SUPPORTED_100baseT_Full |
3365                                           SUPPORTED_Autoneg | SUPPORTED_MII);
3366                        edata.port = PORT_MII;
3367                        edata.transceiver = XCVR_INTERNAL;
3368                        edata.phy_address = 0;
3369                        if (adapter->linkspeed == LINK_100MB)
3370                                edata.speed = SPEED_100;
3371                        else if (adapter->linkspeed == LINK_10MB)
3372                                edata.speed = SPEED_10;
3373                        else
3374                                edata.speed = 0;
3375
3376                        if (adapter->linkduplex == LINK_FULLD)
3377                                edata.duplex = DUPLEX_FULL;
3378                        else
3379                                edata.duplex = DUPLEX_HALF;
3380
3381                        edata.autoneg = AUTONEG_ENABLE;
3382                        edata.maxtxpkt = 1;
3383                        edata.maxrxpkt = 1;
3384                        if (copy_to_user(rq->ifr_data, &edata, sizeof(edata)))
3385                                return -EFAULT;
3386
3387                } else if (ecmd.cmd == ETHTOOL_SSET) {
3388                        if (!capable(CAP_NET_ADMIN))
3389                                return -EPERM;
3390
3391                        if (adapter->linkspeed == LINK_100MB)
3392                                edata.speed = SPEED_100;
3393                        else if (adapter->linkspeed == LINK_10MB)
3394                                edata.speed = SPEED_10;
3395                        else
3396                                edata.speed = 0;
3397
3398                        if (adapter->linkduplex == LINK_FULLD)
3399                                edata.duplex = DUPLEX_FULL;
3400                        else
3401                                edata.duplex = DUPLEX_HALF;
3402
3403                        edata.autoneg = AUTONEG_ENABLE;
3404                        edata.maxtxpkt = 1;
3405                        edata.maxrxpkt = 1;
3406                        if ((ecmd.speed != edata.speed) ||
3407                            (ecmd.duplex != edata.duplex)) {
3408                                u32 speed;
3409                                u32 duplex;
3410
3411                                if (ecmd.speed == SPEED_10)
3412                                        speed = 0;
3413                                else
3414                                        speed = PCR_SPEED_100;
3415                                if (ecmd.duplex == DUPLEX_FULL)
3416                                        duplex = PCR_DUPLEX_FULL;
3417                                else
3418                                        duplex = 0;
3419                                slic_link_config(adapter, speed, duplex);
3420                                slic_link_event_handler(adapter);
3421                        }
3422                }
3423                return 0;
3424        default:
3425                return -EOPNOTSUPP;
3426        }
3427}
3428
3429static void slic_config_pci(struct pci_dev *pcidev)
3430{
3431        u16 pci_command;
3432        u16 new_command;
3433
3434        pci_read_config_word(pcidev, PCI_COMMAND, &pci_command);
3435
3436        new_command = pci_command | PCI_COMMAND_MASTER
3437            | PCI_COMMAND_MEMORY
3438            | PCI_COMMAND_INVALIDATE
3439            | PCI_COMMAND_PARITY | PCI_COMMAND_SERR | PCI_COMMAND_FAST_BACK;
3440        if (pci_command != new_command)
3441                pci_write_config_word(pcidev, PCI_COMMAND, new_command);
3442}
3443
3444static int slic_card_init(struct sliccard *card, struct adapter *adapter)
3445{
3446        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
3447        struct slic_eeprom *peeprom;
3448        struct oslic_eeprom *pOeeprom;
3449        dma_addr_t phys_config;
3450        u32 phys_configh;
3451        u32 phys_configl;
3452        u32 i = 0;
3453        struct slic_shmem *pshmem;
3454        int status;
3455        uint macaddrs = card->card_size;
3456        ushort eecodesize;
3457        ushort dramsize;
3458        ushort ee_chksum;
3459        ushort calc_chksum;
3460        struct slic_config_mac *pmac;
3461        unsigned char fruformat;
3462        unsigned char oemfruformat;
3463        struct atk_fru *patkfru;
3464        union oemfru *poemfru;
3465
3466        /* Reset everything except PCI configuration space */
3467        slic_soft_reset(adapter);
3468
3469        /* Download the microcode */
3470        status = slic_card_download(adapter);
3471
3472        if (status != 0) {
3473                dev_err(&adapter->pcidev->dev,
3474                        "download failed bus %d slot %d\n",
3475                        adapter->busnumber, adapter->slotnumber);
3476                return status;
3477        }
3478
3479        if (!card->config_set) {
3480                peeprom = pci_alloc_consistent(adapter->pcidev,
3481                                               sizeof(struct slic_eeprom),
3482                                               &phys_config);
3483
3484                phys_configl = SLIC_GET_ADDR_LOW(phys_config);
3485                phys_configh = SLIC_GET_ADDR_HIGH(phys_config);
3486
3487                if (!peeprom) {
3488                        dev_err(&adapter->pcidev->dev,
3489                                "eeprom read failed to get memory "
3490                                "bus %d slot %d\n", adapter->busnumber,
3491                                adapter->slotnumber);
3492                        return -ENOMEM;
3493                } else {
3494                        memset(peeprom, 0, sizeof(struct slic_eeprom));
3495                }
3496                slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
3497                mdelay(1);
3498                pshmem = (struct slic_shmem *)adapter->phys_shmem;
3499
3500                spin_lock_irqsave(&adapter->bit64reglock.lock,
3501                                        adapter->bit64reglock.flags);
3502                slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH);
3503                slic_reg32_write(&slic_regs->slic_isp,
3504                                 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
3505                spin_unlock_irqrestore(&adapter->bit64reglock.lock,
3506                                        adapter->bit64reglock.flags);
3507
3508                slic_config_get(adapter, phys_configl, phys_configh);
3509
3510                for (;;) {
3511                        if (adapter->pshmem->isr) {
3512                                if (adapter->pshmem->isr & ISR_UPC) {
3513                                        adapter->pshmem->isr = 0;
3514                                        slic_reg64_write(adapter,
3515                                                &slic_regs->slic_isp, 0,
3516                                                &slic_regs->slic_addr_upper,
3517                                                0, FLUSH);
3518                                        slic_reg32_write(&slic_regs->slic_isr,
3519                                                         0, FLUSH);
3520
3521                                        slic_upr_request_complete(adapter, 0);
3522                                        break;
3523                                } else {
3524                                        adapter->pshmem->isr = 0;
3525                                        slic_reg32_write(&slic_regs->slic_isr,
3526                                                         0, FLUSH);
3527                                }
3528                        } else {
3529                                mdelay(1);
3530                                i++;
3531                                if (i > 5000) {
3532                                        dev_err(&adapter->pcidev->dev,
3533                                                "%d config data fetch timed out!\n",
3534                                                adapter->port);
3535                                        slic_reg64_write(adapter,
3536                                                &slic_regs->slic_isp, 0,
3537                                                &slic_regs->slic_addr_upper,
3538                                                0, FLUSH);
3539                                        return -EINVAL;
3540                                }
3541                        }
3542                }
3543
3544                switch (adapter->devid) {
3545                /* Oasis card */
3546                case SLIC_2GB_DEVICE_ID:
3547                        /* extract EEPROM data and pointers to EEPROM data */
3548                        pOeeprom = (struct oslic_eeprom *) peeprom;
3549                        eecodesize = pOeeprom->EecodeSize;
3550                        dramsize = pOeeprom->DramSize;
3551                        pmac = pOeeprom->MacInfo;
3552                        fruformat = pOeeprom->FruFormat;
3553                        patkfru = &pOeeprom->AtkFru;
3554                        oemfruformat = pOeeprom->OemFruFormat;
3555                        poemfru = &pOeeprom->OemFru;
3556                        macaddrs = 2;
3557                        /* Minor kludge for Oasis card
3558                             get 2 MAC addresses from the
3559                             EEPROM to ensure that function 1
3560                             gets the Port 1 MAC address */
3561                        break;
3562                default:
3563                        /* extract EEPROM data and pointers to EEPROM data */
3564                        eecodesize = peeprom->EecodeSize;
3565                        dramsize = peeprom->DramSize;
3566                        pmac = peeprom->u2.mac.MacInfo;
3567                        fruformat = peeprom->FruFormat;
3568                        patkfru = &peeprom->AtkFru;
3569                        oemfruformat = peeprom->OemFruFormat;
3570                        poemfru = &peeprom->OemFru;
3571                        break;
3572                }
3573
3574                card->config.EepromValid = false;
3575
3576                /*  see if the EEPROM is valid by checking it's checksum */
3577                if ((eecodesize <= MAX_EECODE_SIZE) &&
3578                    (eecodesize >= MIN_EECODE_SIZE)) {
3579
3580                        ee_chksum =
3581                            *(u16 *) ((char *) peeprom + (eecodesize - 2));
3582                        /*
3583                            calculate the EEPROM checksum
3584                        */
3585                        calc_chksum =
3586                            ~slic_eeprom_cksum((char *) peeprom,
3587                                               (eecodesize - 2));
3588                        /*
3589                            if the ucdoe chksum flag bit worked,
3590                            we wouldn't need this shit
3591                        */
3592                        if (ee_chksum == calc_chksum)
3593                                card->config.EepromValid = true;
3594                }
3595                /*  copy in the DRAM size */
3596                card->config.DramSize = dramsize;
3597
3598                /*  copy in the MAC address(es) */
3599                for (i = 0; i < macaddrs; i++) {
3600                        memcpy(&card->config.MacInfo[i],
3601                               &pmac[i], sizeof(struct slic_config_mac));
3602                }
3603
3604                /*  copy the Alacritech FRU information */
3605                card->config.FruFormat = fruformat;
3606                memcpy(&card->config.AtkFru, patkfru,
3607                                                sizeof(struct atk_fru));
3608
3609                pci_free_consistent(adapter->pcidev,
3610                                    sizeof(struct slic_eeprom),
3611                                    peeprom, phys_config);
3612
3613                if ((!card->config.EepromValid) &&
3614                    (adapter->reg_params.fail_on_bad_eeprom)) {
3615                        slic_reg64_write(adapter, &slic_regs->slic_isp, 0,
3616                                         &slic_regs->slic_addr_upper,
3617                                         0, FLUSH);
3618                        dev_err(&adapter->pcidev->dev,
3619                                "unsupported CONFIGURATION EEPROM invalid\n");
3620                        return -EINVAL;
3621                }
3622
3623                card->config_set = 1;
3624        }
3625
3626        if (slic_card_download_gbrcv(adapter)) {
3627                dev_err(&adapter->pcidev->dev,
3628                        "unable to download GB receive microcode\n");
3629                return -EINVAL;
3630        }
3631
3632        if (slic_global.dynamic_intagg)
3633                slic_intagg_set(adapter, 0);
3634        else
3635                slic_intagg_set(adapter, intagg_delay);
3636
3637        /*
3638         *  Initialize ping status to "ok"
3639         */
3640        card->pingstatus = ISR_PINGMASK;
3641
3642        /*
3643         * Lastly, mark our card state as up and return success
3644         */
3645        card->state = CARD_UP;
3646        card->reset_in_progress = 0;
3647
3648        return 0;
3649}
3650
3651static void slic_init_driver(void)
3652{
3653        if (slic_first_init) {
3654                slic_first_init = 0;
3655                spin_lock_init(&slic_global.driver_lock.lock);
3656                slic_debug_init();
3657        }
3658}
3659
3660static void slic_init_adapter(struct net_device *netdev,
3661                              struct pci_dev *pcidev,
3662                              const struct pci_device_id *pci_tbl_entry,
3663                              void __iomem *memaddr, int chip_idx)
3664{
3665        ushort index;
3666        struct slic_handle *pslic_handle;
3667        struct adapter *adapter = netdev_priv(netdev);
3668
3669/*      adapter->pcidev = pcidev;*/
3670        adapter->vendid = pci_tbl_entry->vendor;
3671        adapter->devid = pci_tbl_entry->device;
3672        adapter->subsysid = pci_tbl_entry->subdevice;
3673        adapter->busnumber = pcidev->bus->number;
3674        adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F);
3675        adapter->functionnumber = (pcidev->devfn & 0x7);
3676        adapter->memorylength = pci_resource_len(pcidev, 0);
3677        adapter->slic_regs = (__iomem struct slic_regs *)memaddr;
3678        adapter->irq = pcidev->irq;
3679/*      adapter->netdev = netdev;*/
3680        adapter->next_netdevice = head_netdevice;
3681        head_netdevice = netdev;
3682        adapter->chipid = chip_idx;
3683        adapter->port = 0;      /*adapter->functionnumber;*/
3684        adapter->cardindex = adapter->port;
3685        adapter->memorybase = memaddr;
3686        spin_lock_init(&adapter->upr_lock.lock);
3687        spin_lock_init(&adapter->bit64reglock.lock);
3688        spin_lock_init(&adapter->adapter_lock.lock);
3689        spin_lock_init(&adapter->reset_lock.lock);
3690        spin_lock_init(&adapter->handle_lock.lock);
3691
3692        adapter->card_size = 1;
3693        /*
3694          Initialize slic_handle array
3695        */
3696        ASSERT(SLIC_CMDQ_MAXCMDS <= 0xFFFF);
3697        /*
3698         Start with 1.  0 is an invalid host handle.
3699        */
3700        for (index = 1, pslic_handle = &adapter->slic_handles[1];
3701             index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) {
3702
3703                pslic_handle->token.handle_index = index;
3704                pslic_handle->type = SLIC_HANDLE_FREE;
3705                pslic_handle->next = adapter->pfree_slic_handles;
3706                adapter->pfree_slic_handles = pslic_handle;
3707        }
3708        adapter->pshmem = (struct slic_shmem *)
3709                                        pci_alloc_consistent(adapter->pcidev,
3710                                        sizeof(struct slic_shmem),
3711                                        &adapter->
3712                                        phys_shmem);
3713        ASSERT(adapter->pshmem);
3714
3715        memset(adapter->pshmem, 0, sizeof(struct slic_shmem));
3716
3717        return;
3718}
3719
3720static const struct net_device_ops slic_netdev_ops = {
3721        .ndo_open               = slic_entry_open,
3722        .ndo_stop               = slic_entry_halt,
3723        .ndo_start_xmit         = slic_xmit_start,
3724        .ndo_do_ioctl           = slic_ioctl,
3725        .ndo_set_mac_address    = slic_mac_set_address,
3726        .ndo_get_stats          = slic_get_stats,
3727        .ndo_set_multicast_list = slic_mcast_set_list,
3728        .ndo_validate_addr      = eth_validate_addr,
3729        .ndo_change_mtu         = eth_change_mtu,
3730};
3731
3732static u32 slic_card_locate(struct adapter *adapter)
3733{
3734        struct sliccard *card = slic_global.slic_card;
3735        struct physcard *physcard = slic_global.phys_card;
3736        ushort card_hostid;
3737        u16 __iomem *hostid_reg;
3738        uint i;
3739        uint rdhostid_offset = 0;
3740
3741        switch (adapter->devid) {
3742        case SLIC_2GB_DEVICE_ID:
3743                rdhostid_offset = SLIC_RDHOSTID_2GB;
3744                break;
3745        case SLIC_1GB_DEVICE_ID:
3746                rdhostid_offset = SLIC_RDHOSTID_1GB;
3747                break;
3748        default:
3749                ASSERT(0);
3750                break;
3751        }
3752
3753        hostid_reg =
3754            (u16 __iomem *) (((u8 __iomem *) (adapter->slic_regs)) +
3755            rdhostid_offset);
3756
3757        /* read the 16 bit hostid from SRAM */
3758        card_hostid = (ushort) readw(hostid_reg);
3759
3760        /* Initialize a new card structure if need be */
3761        if (card_hostid == SLIC_HOSTID_DEFAULT) {
3762                card = kzalloc(sizeof(struct sliccard), GFP_KERNEL);
3763                if (card == NULL)
3764                        return -ENOMEM;
3765
3766                card->next = slic_global.slic_card;
3767                slic_global.slic_card = card;
3768                card->busnumber = adapter->busnumber;
3769                card->slotnumber = adapter->slotnumber;
3770
3771                /* Find an available cardnum */
3772                for (i = 0; i < SLIC_MAX_CARDS; i++) {
3773                        if (slic_global.cardnuminuse[i] == 0) {
3774                                slic_global.cardnuminuse[i] = 1;
3775                                card->cardnum = i;
3776                                break;
3777                        }
3778                }
3779                slic_global.num_slic_cards++;
3780
3781                slic_debug_card_create(card);
3782        } else {
3783                /* Card exists, find the card this adapter belongs to */
3784                while (card) {
3785                        if (card->cardnum == card_hostid)
3786                                break;
3787                        card = card->next;
3788                }
3789        }
3790
3791        ASSERT(card);
3792        if (!card)
3793                return -ENXIO;
3794        /* Put the adapter in the card's adapter list */
3795        ASSERT(card->adapter[adapter->port] == NULL);
3796        if (!card->adapter[adapter->port]) {
3797                card->adapter[adapter->port] = adapter;
3798                adapter->card = card;
3799        }
3800
3801        card->card_size = 1;    /* one port per *logical* card */
3802
3803        while (physcard) {
3804                for (i = 0; i < SLIC_MAX_PORTS; i++) {
3805                        if (!physcard->adapter[i])
3806                                continue;
3807                        else
3808                                break;
3809                }
3810                ASSERT(i != SLIC_MAX_PORTS);
3811                if (physcard->adapter[i]->slotnumber == adapter->slotnumber)
3812                        break;
3813                physcard = physcard->next;
3814        }
3815        if (!physcard) {
3816                /* no structure allocated for this physical card yet */
3817                physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC);
3818                ASSERT(physcard);
3819
3820                physcard->next = slic_global.phys_card;
3821                slic_global.phys_card = physcard;
3822                physcard->adapters_allocd = 1;
3823        } else {
3824                physcard->adapters_allocd++;
3825        }
3826        /* Note - this is ZERO relative */
3827        adapter->physport = physcard->adapters_allocd - 1;
3828
3829        ASSERT(physcard->adapter[adapter->physport] == NULL);
3830        physcard->adapter[adapter->physport] = adapter;
3831        adapter->physcard = physcard;
3832
3833        return 0;
3834}
3835
3836static int __devinit slic_entry_probe(struct pci_dev *pcidev,
3837                               const struct pci_device_id *pci_tbl_entry)
3838{
3839        static int cards_found;
3840        static int did_version;
3841        int err = -ENODEV;
3842        struct net_device *netdev;
3843        struct adapter *adapter;
3844        void __iomem *memmapped_ioaddr = NULL;
3845        u32 status = 0;
3846        ulong mmio_start = 0;
3847        ulong mmio_len = 0;
3848        struct sliccard *card = NULL;
3849        int pci_using_dac = 0;
3850
3851        slic_global.dynamic_intagg = dynamic_intagg;
3852
3853        err = pci_enable_device(pcidev);
3854
3855        if (err)
3856                return err;
3857
3858        if (slic_debug > 0 && did_version++ == 0) {
3859                printk(KERN_DEBUG "%s\n", slic_banner);
3860                printk(KERN_DEBUG "%s\n", slic_proc_version);
3861        }
3862
3863        if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) {
3864                pci_using_dac = 1;
3865                if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) {
3866                        dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for "
3867                                        "consistent allocations\n");
3868                        goto err_out_disable_pci;
3869                }
3870        } else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) {
3871                pci_using_dac = 0;
3872                pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32));
3873        } else {
3874                dev_err(&pcidev->dev, "no usable DMA configuration\n");
3875                goto err_out_disable_pci;
3876        }
3877
3878        err = pci_request_regions(pcidev, DRV_NAME);
3879        if (err) {
3880                dev_err(&pcidev->dev, "can't obtain PCI resources\n");
3881                goto err_out_disable_pci;
3882        }
3883
3884        pci_set_master(pcidev);
3885
3886        netdev = alloc_etherdev(sizeof(struct adapter));
3887        if (!netdev) {
3888                err = -ENOMEM;
3889                goto err_out_exit_slic_probe;
3890        }
3891
3892        SET_NETDEV_DEV(netdev, &pcidev->dev);
3893
3894        pci_set_drvdata(pcidev, netdev);
3895        adapter = netdev_priv(netdev);
3896        adapter->netdev = netdev;
3897        adapter->pcidev = pcidev;
3898        if (pci_using_dac)
3899                netdev->features |= NETIF_F_HIGHDMA;
3900
3901        mmio_start = pci_resource_start(pcidev, 0);
3902        mmio_len = pci_resource_len(pcidev, 0);
3903
3904
3905/*      memmapped_ioaddr =  (u32)ioremap_nocache(mmio_start, mmio_len);*/
3906        memmapped_ioaddr = ioremap(mmio_start, mmio_len);
3907        if (!memmapped_ioaddr) {
3908                dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n",
3909                        mmio_len, mmio_start);
3910                goto err_out_free_netdev;
3911        }
3912
3913        slic_config_pci(pcidev);
3914
3915        slic_init_driver();
3916
3917        slic_init_adapter(netdev,
3918                          pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found);
3919
3920        status = slic_card_locate(adapter);
3921        if (status) {
3922                dev_err(&pcidev->dev, "cannot locate card\n");
3923                goto err_out_free_mmio_region;
3924        }
3925
3926        card = adapter->card;
3927
3928        if (!adapter->allocated) {
3929                card->adapters_allocated++;
3930                adapter->allocated = 1;
3931        }
3932
3933        status = slic_card_init(card, adapter);
3934
3935        if (status != 0) {
3936                card->state = CARD_FAIL;
3937                adapter->state = ADAPT_FAIL;
3938                adapter->linkstate = LINK_DOWN;
3939                dev_err(&pcidev->dev, "FAILED status[%x]\n", status);
3940        } else {
3941                slic_adapter_set_hwaddr(adapter);
3942        }
3943
3944        netdev->base_addr = (unsigned long)adapter->memorybase;
3945        netdev->irq = adapter->irq;
3946        netdev->netdev_ops = &slic_netdev_ops;
3947
3948        slic_debug_adapter_create(adapter);
3949
3950        strcpy(netdev->name, "eth%d");
3951        err = register_netdev(netdev);
3952        if (err) {
3953                dev_err(&pcidev->dev, "Cannot register net device, aborting.\n");
3954                goto err_out_unmap;
3955        }
3956
3957        cards_found++;
3958
3959        return status;
3960
3961err_out_unmap:
3962        iounmap(memmapped_ioaddr);
3963err_out_free_mmio_region:
3964        release_mem_region(mmio_start, mmio_len);
3965err_out_free_netdev:
3966        free_netdev(netdev);
3967err_out_exit_slic_probe:
3968        pci_release_regions(pcidev);
3969err_out_disable_pci:
3970        pci_disable_device(pcidev);
3971        return err;
3972}
3973
3974static struct pci_driver slic_driver = {
3975        .name = DRV_NAME,
3976        .id_table = slic_pci_tbl,
3977        .probe = slic_entry_probe,
3978        .remove = __devexit_p(slic_entry_remove),
3979};
3980
3981static int __init slic_module_init(void)
3982{
3983        slic_init_driver();
3984
3985        if (debug >= 0 && slic_debug != debug)
3986                printk(KERN_DEBUG KBUILD_MODNAME ": debug level is %d.\n",
3987                       debug);
3988        if (debug >= 0)
3989                slic_debug = debug;
3990
3991        return pci_register_driver(&slic_driver);
3992}
3993
3994static void __exit slic_module_cleanup(void)
3995{
3996        pci_unregister_driver(&slic_driver);
3997        slic_debug_cleanup();
3998}
3999
4000module_init(slic_module_init);
4001module_exit(slic_module_cleanup);
4002