linux/drivers/net/ethernet/broadcom/bnx2.c
<<
>>
Prefs
   1/* bnx2.c: QLogic bnx2 network driver.
   2 *
   3 * Copyright (c) 2004-2014 Broadcom Corporation
   4 * Copyright (c) 2014-2015 QLogic Corporation
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation.
   9 *
  10 * Written by: Michael Chan  (mchan@broadcom.com)
  11 */
  12
  13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  14
  15#include <linux/module.h>
  16#include <linux/moduleparam.h>
  17
  18#include <linux/stringify.h>
  19#include <linux/kernel.h>
  20#include <linux/timer.h>
  21#include <linux/errno.h>
  22#include <linux/ioport.h>
  23#include <linux/slab.h>
  24#include <linux/vmalloc.h>
  25#include <linux/interrupt.h>
  26#include <linux/pci.h>
  27#include <linux/netdevice.h>
  28#include <linux/etherdevice.h>
  29#include <linux/skbuff.h>
  30#include <linux/dma-mapping.h>
  31#include <linux/bitops.h>
  32#include <asm/io.h>
  33#include <asm/irq.h>
  34#include <linux/delay.h>
  35#include <asm/byteorder.h>
  36#include <asm/page.h>
  37#include <linux/time.h>
  38#include <linux/ethtool.h>
  39#include <linux/mii.h>
  40#include <linux/if.h>
  41#include <linux/if_vlan.h>
  42#include <net/ip.h>
  43#include <net/tcp.h>
  44#include <net/checksum.h>
  45#include <linux/workqueue.h>
  46#include <linux/crc32.h>
  47#include <linux/prefetch.h>
  48#include <linux/cache.h>
  49#include <linux/firmware.h>
  50#include <linux/log2.h>
  51#include <linux/aer.h>
  52#include <linux/crash_dump.h>
  53
  54#if IS_ENABLED(CONFIG_CNIC)
  55#define BCM_CNIC 1
  56#include "cnic_if.h"
  57#endif
  58#include "bnx2.h"
  59#include "bnx2_fw.h"
  60
  61#define DRV_MODULE_NAME         "bnx2"
  62#define DRV_MODULE_VERSION      "2.2.6"
  63#define DRV_MODULE_RELDATE      "January 29, 2014"
  64#define FW_MIPS_FILE_06         "bnx2/bnx2-mips-06-6.2.3.fw"
  65#define FW_RV2P_FILE_06         "bnx2/bnx2-rv2p-06-6.0.15.fw"
  66#define FW_MIPS_FILE_09         "bnx2/bnx2-mips-09-6.2.1b.fw"
  67#define FW_RV2P_FILE_09_Ax      "bnx2/bnx2-rv2p-09ax-6.0.17.fw"
  68#define FW_RV2P_FILE_09         "bnx2/bnx2-rv2p-09-6.0.17.fw"
  69
  70#define RUN_AT(x) (jiffies + (x))
  71
  72/* Time in jiffies before concluding the transmitter is hung. */
  73#define TX_TIMEOUT  (5*HZ)
  74
  75static char version[] =
  76        "QLogic " DRV_MODULE_NAME " Gigabit Ethernet Driver v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
  77
  78MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>");
  79MODULE_DESCRIPTION("QLogic BCM5706/5708/5709/5716 Driver");
  80MODULE_LICENSE("GPL");
  81MODULE_VERSION(DRV_MODULE_VERSION);
  82MODULE_FIRMWARE(FW_MIPS_FILE_06);
  83MODULE_FIRMWARE(FW_RV2P_FILE_06);
  84MODULE_FIRMWARE(FW_MIPS_FILE_09);
  85MODULE_FIRMWARE(FW_RV2P_FILE_09);
  86MODULE_FIRMWARE(FW_RV2P_FILE_09_Ax);
  87
  88static int disable_msi = 0;
  89
  90module_param(disable_msi, int, 0444);
  91MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
  92
  93typedef enum {
  94        BCM5706 = 0,
  95        NC370T,
  96        NC370I,
  97        BCM5706S,
  98        NC370F,
  99        BCM5708,
 100        BCM5708S,
 101        BCM5709,
 102        BCM5709S,
 103        BCM5716,
 104        BCM5716S,
 105} board_t;
 106
 107/* indexed by board_t, above */
 108static struct {
 109        char *name;
 110} board_info[] = {
 111        { "Broadcom NetXtreme II BCM5706 1000Base-T" },
 112        { "HP NC370T Multifunction Gigabit Server Adapter" },
 113        { "HP NC370i Multifunction Gigabit Server Adapter" },
 114        { "Broadcom NetXtreme II BCM5706 1000Base-SX" },
 115        { "HP NC370F Multifunction Gigabit Server Adapter" },
 116        { "Broadcom NetXtreme II BCM5708 1000Base-T" },
 117        { "Broadcom NetXtreme II BCM5708 1000Base-SX" },
 118        { "Broadcom NetXtreme II BCM5709 1000Base-T" },
 119        { "Broadcom NetXtreme II BCM5709 1000Base-SX" },
 120        { "Broadcom NetXtreme II BCM5716 1000Base-T" },
 121        { "Broadcom NetXtreme II BCM5716 1000Base-SX" },
 122        };
 123
 124static const struct pci_device_id bnx2_pci_tbl[] = {
 125        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
 126          PCI_VENDOR_ID_HP, 0x3101, 0, 0, NC370T },
 127        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
 128          PCI_VENDOR_ID_HP, 0x3106, 0, 0, NC370I },
 129        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
 130          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706 },
 131        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708,
 132          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708 },
 133        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
 134          PCI_VENDOR_ID_HP, 0x3102, 0, 0, NC370F },
 135        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
 136          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706S },
 137        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S,
 138          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708S },
 139        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709,
 140          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709 },
 141        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709S,
 142          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709S },
 143        { PCI_VENDOR_ID_BROADCOM, 0x163b,
 144          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716 },
 145        { PCI_VENDOR_ID_BROADCOM, 0x163c,
 146          PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716S },
 147        { 0, }
 148};
 149
 150static const struct flash_spec flash_table[] =
 151{
 152#define BUFFERED_FLAGS          (BNX2_NV_BUFFERED | BNX2_NV_TRANSLATE)
 153#define NONBUFFERED_FLAGS       (BNX2_NV_WREN)
 154        /* Slow EEPROM */
 155        {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400,
 156         BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
 157         SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
 158         "EEPROM - slow"},
 159        /* Expansion entry 0001 */
 160        {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406,
 161         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 162         SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
 163         "Entry 0001"},
 164        /* Saifun SA25F010 (non-buffered flash) */
 165        /* strap, cfg1, & write1 need updates */
 166        {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406,
 167         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 168         SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
 169         "Non-buffered flash (128kB)"},
 170        /* Saifun SA25F020 (non-buffered flash) */
 171        /* strap, cfg1, & write1 need updates */
 172        {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406,
 173         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 174         SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
 175         "Non-buffered flash (256kB)"},
 176        /* Expansion entry 0100 */
 177        {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406,
 178         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 179         SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
 180         "Entry 0100"},
 181        /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */
 182        {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406,
 183         NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
 184         ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2,
 185         "Entry 0101: ST M45PE10 (128kB non-bufferred)"},
 186        /* Entry 0110: ST M45PE20 (non-buffered flash)*/
 187        {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406,
 188         NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
 189         ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4,
 190         "Entry 0110: ST M45PE20 (256kB non-bufferred)"},
 191        /* Saifun SA25F005 (non-buffered flash) */
 192        /* strap, cfg1, & write1 need updates */
 193        {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406,
 194         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 195         SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
 196         "Non-buffered flash (64kB)"},
 197        /* Fast EEPROM */
 198        {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400,
 199         BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
 200         SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
 201         "EEPROM - fast"},
 202        /* Expansion entry 1001 */
 203        {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406,
 204         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 205         SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
 206         "Entry 1001"},
 207        /* Expansion entry 1010 */
 208        {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406,
 209         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 210         SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
 211         "Entry 1010"},
 212        /* ATMEL AT45DB011B (buffered flash) */
 213        {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400,
 214         BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
 215         BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
 216         "Buffered flash (128kB)"},
 217        /* Expansion entry 1100 */
 218        {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406,
 219         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 220         SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
 221         "Entry 1100"},
 222        /* Expansion entry 1101 */
 223        {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406,
 224         NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
 225         SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
 226         "Entry 1101"},
 227        /* Ateml Expansion entry 1110 */
 228        {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400,
 229         BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
 230         BUFFERED_FLASH_BYTE_ADDR_MASK, 0,
 231         "Entry 1110 (Atmel)"},
 232        /* ATMEL AT45DB021B (buffered flash) */
 233        {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400,
 234         BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
 235         BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2,
 236         "Buffered flash (256kB)"},
 237};
 238
 239static const struct flash_spec flash_5709 = {
 240        .flags          = BNX2_NV_BUFFERED,
 241        .page_bits      = BCM5709_FLASH_PAGE_BITS,
 242        .page_size      = BCM5709_FLASH_PAGE_SIZE,
 243        .addr_mask      = BCM5709_FLASH_BYTE_ADDR_MASK,
 244        .total_size     = BUFFERED_FLASH_TOTAL_SIZE*2,
 245        .name           = "5709 Buffered flash (256kB)",
 246};
 247
 248MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
 249
 250static void bnx2_init_napi(struct bnx2 *bp);
 251static void bnx2_del_napi(struct bnx2 *bp);
 252
 253static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)
 254{
 255        u32 diff;
 256
 257        /* The ring uses 256 indices for 255 entries, one of them
 258         * needs to be skipped.
 259         */
 260        diff = READ_ONCE(txr->tx_prod) - READ_ONCE(txr->tx_cons);
 261        if (unlikely(diff >= BNX2_TX_DESC_CNT)) {
 262                diff &= 0xffff;
 263                if (diff == BNX2_TX_DESC_CNT)
 264                        diff = BNX2_MAX_TX_DESC_CNT;
 265        }
 266        return bp->tx_ring_size - diff;
 267}
 268
 269static u32
 270bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
 271{
 272        unsigned long flags;
 273        u32 val;
 274
 275        spin_lock_irqsave(&bp->indirect_lock, flags);
 276        BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
 277        val = BNX2_RD(bp, BNX2_PCICFG_REG_WINDOW);
 278        spin_unlock_irqrestore(&bp->indirect_lock, flags);
 279        return val;
 280}
 281
 282static void
 283bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
 284{
 285        unsigned long flags;
 286
 287        spin_lock_irqsave(&bp->indirect_lock, flags);
 288        BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
 289        BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
 290        spin_unlock_irqrestore(&bp->indirect_lock, flags);
 291}
 292
 293static void
 294bnx2_shmem_wr(struct bnx2 *bp, u32 offset, u32 val)
 295{
 296        bnx2_reg_wr_ind(bp, bp->shmem_base + offset, val);
 297}
 298
 299static u32
 300bnx2_shmem_rd(struct bnx2 *bp, u32 offset)
 301{
 302        return bnx2_reg_rd_ind(bp, bp->shmem_base + offset);
 303}
 304
 305static void
 306bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
 307{
 308        unsigned long flags;
 309
 310        offset += cid_addr;
 311        spin_lock_irqsave(&bp->indirect_lock, flags);
 312        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
 313                int i;
 314
 315                BNX2_WR(bp, BNX2_CTX_CTX_DATA, val);
 316                BNX2_WR(bp, BNX2_CTX_CTX_CTRL,
 317                        offset | BNX2_CTX_CTX_CTRL_WRITE_REQ);
 318                for (i = 0; i < 5; i++) {
 319                        val = BNX2_RD(bp, BNX2_CTX_CTX_CTRL);
 320                        if ((val & BNX2_CTX_CTX_CTRL_WRITE_REQ) == 0)
 321                                break;
 322                        udelay(5);
 323                }
 324        } else {
 325                BNX2_WR(bp, BNX2_CTX_DATA_ADR, offset);
 326                BNX2_WR(bp, BNX2_CTX_DATA, val);
 327        }
 328        spin_unlock_irqrestore(&bp->indirect_lock, flags);
 329}
 330
 331#ifdef BCM_CNIC
 332static int
 333bnx2_drv_ctl(struct net_device *dev, struct drv_ctl_info *info)
 334{
 335        struct bnx2 *bp = netdev_priv(dev);
 336        struct drv_ctl_io *io = &info->data.io;
 337
 338        switch (info->cmd) {
 339        case DRV_CTL_IO_WR_CMD:
 340                bnx2_reg_wr_ind(bp, io->offset, io->data);
 341                break;
 342        case DRV_CTL_IO_RD_CMD:
 343                io->data = bnx2_reg_rd_ind(bp, io->offset);
 344                break;
 345        case DRV_CTL_CTX_WR_CMD:
 346                bnx2_ctx_wr(bp, io->cid_addr, io->offset, io->data);
 347                break;
 348        default:
 349                return -EINVAL;
 350        }
 351        return 0;
 352}
 353
 354static void bnx2_setup_cnic_irq_info(struct bnx2 *bp)
 355{
 356        struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
 357        struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
 358        int sb_id;
 359
 360        if (bp->flags & BNX2_FLAG_USING_MSIX) {
 361                cp->drv_state |= CNIC_DRV_STATE_USING_MSIX;
 362                bnapi->cnic_present = 0;
 363                sb_id = bp->irq_nvecs;
 364                cp->irq_arr[0].irq_flags |= CNIC_IRQ_FL_MSIX;
 365        } else {
 366                cp->drv_state &= ~CNIC_DRV_STATE_USING_MSIX;
 367                bnapi->cnic_tag = bnapi->last_status_idx;
 368                bnapi->cnic_present = 1;
 369                sb_id = 0;
 370                cp->irq_arr[0].irq_flags &= ~CNIC_IRQ_FL_MSIX;
 371        }
 372
 373        cp->irq_arr[0].vector = bp->irq_tbl[sb_id].vector;
 374        cp->irq_arr[0].status_blk = (void *)
 375                ((unsigned long) bnapi->status_blk.msi +
 376                (BNX2_SBLK_MSIX_ALIGN_SIZE * sb_id));
 377        cp->irq_arr[0].status_blk_num = sb_id;
 378        cp->num_irq = 1;
 379}
 380
 381static int bnx2_register_cnic(struct net_device *dev, struct cnic_ops *ops,
 382                              void *data)
 383{
 384        struct bnx2 *bp = netdev_priv(dev);
 385        struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
 386
 387        if (!ops)
 388                return -EINVAL;
 389
 390        if (cp->drv_state & CNIC_DRV_STATE_REGD)
 391                return -EBUSY;
 392
 393        if (!bnx2_reg_rd_ind(bp, BNX2_FW_MAX_ISCSI_CONN))
 394                return -ENODEV;
 395
 396        bp->cnic_data = data;
 397        rcu_assign_pointer(bp->cnic_ops, ops);
 398
 399        cp->num_irq = 0;
 400        cp->drv_state = CNIC_DRV_STATE_REGD;
 401
 402        bnx2_setup_cnic_irq_info(bp);
 403
 404        return 0;
 405}
 406
 407static int bnx2_unregister_cnic(struct net_device *dev)
 408{
 409        struct bnx2 *bp = netdev_priv(dev);
 410        struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
 411        struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
 412
 413        mutex_lock(&bp->cnic_lock);
 414        cp->drv_state = 0;
 415        bnapi->cnic_present = 0;
 416        RCU_INIT_POINTER(bp->cnic_ops, NULL);
 417        mutex_unlock(&bp->cnic_lock);
 418        synchronize_rcu();
 419        return 0;
 420}
 421
 422static struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev)
 423{
 424        struct bnx2 *bp = netdev_priv(dev);
 425        struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
 426
 427        if (!cp->max_iscsi_conn)
 428                return NULL;
 429
 430        cp->drv_owner = THIS_MODULE;
 431        cp->chip_id = bp->chip_id;
 432        cp->pdev = bp->pdev;
 433        cp->io_base = bp->regview;
 434        cp->drv_ctl = bnx2_drv_ctl;
 435        cp->drv_register_cnic = bnx2_register_cnic;
 436        cp->drv_unregister_cnic = bnx2_unregister_cnic;
 437
 438        return cp;
 439}
 440
 441static void
 442bnx2_cnic_stop(struct bnx2 *bp)
 443{
 444        struct cnic_ops *c_ops;
 445        struct cnic_ctl_info info;
 446
 447        mutex_lock(&bp->cnic_lock);
 448        c_ops = rcu_dereference_protected(bp->cnic_ops,
 449                                          lockdep_is_held(&bp->cnic_lock));
 450        if (c_ops) {
 451                info.cmd = CNIC_CTL_STOP_CMD;
 452                c_ops->cnic_ctl(bp->cnic_data, &info);
 453        }
 454        mutex_unlock(&bp->cnic_lock);
 455}
 456
 457static void
 458bnx2_cnic_start(struct bnx2 *bp)
 459{
 460        struct cnic_ops *c_ops;
 461        struct cnic_ctl_info info;
 462
 463        mutex_lock(&bp->cnic_lock);
 464        c_ops = rcu_dereference_protected(bp->cnic_ops,
 465                                          lockdep_is_held(&bp->cnic_lock));
 466        if (c_ops) {
 467                if (!(bp->flags & BNX2_FLAG_USING_MSIX)) {
 468                        struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
 469
 470                        bnapi->cnic_tag = bnapi->last_status_idx;
 471                }
 472                info.cmd = CNIC_CTL_START_CMD;
 473                c_ops->cnic_ctl(bp->cnic_data, &info);
 474        }
 475        mutex_unlock(&bp->cnic_lock);
 476}
 477
 478#else
 479
 480static void
 481bnx2_cnic_stop(struct bnx2 *bp)
 482{
 483}
 484
 485static void
 486bnx2_cnic_start(struct bnx2 *bp)
 487{
 488}
 489
 490#endif
 491
 492static int
 493bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
 494{
 495        u32 val1;
 496        int i, ret;
 497
 498        if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
 499                val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 500                val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
 501
 502                BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
 503                BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 504
 505                udelay(40);
 506        }
 507
 508        val1 = (bp->phy_addr << 21) | (reg << 16) |
 509                BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
 510                BNX2_EMAC_MDIO_COMM_START_BUSY;
 511        BNX2_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
 512
 513        for (i = 0; i < 50; i++) {
 514                udelay(10);
 515
 516                val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_COMM);
 517                if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
 518                        udelay(5);
 519
 520                        val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_COMM);
 521                        val1 &= BNX2_EMAC_MDIO_COMM_DATA;
 522
 523                        break;
 524                }
 525        }
 526
 527        if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
 528                *val = 0x0;
 529                ret = -EBUSY;
 530        }
 531        else {
 532                *val = val1;
 533                ret = 0;
 534        }
 535
 536        if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
 537                val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 538                val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
 539
 540                BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
 541                BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 542
 543                udelay(40);
 544        }
 545
 546        return ret;
 547}
 548
 549static int
 550bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
 551{
 552        u32 val1;
 553        int i, ret;
 554
 555        if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
 556                val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 557                val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
 558
 559                BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
 560                BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 561
 562                udelay(40);
 563        }
 564
 565        val1 = (bp->phy_addr << 21) | (reg << 16) | val |
 566                BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
 567                BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
 568        BNX2_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
 569
 570        for (i = 0; i < 50; i++) {
 571                udelay(10);
 572
 573                val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_COMM);
 574                if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
 575                        udelay(5);
 576                        break;
 577                }
 578        }
 579
 580        if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
 581                ret = -EBUSY;
 582        else
 583                ret = 0;
 584
 585        if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
 586                val1 = BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 587                val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
 588
 589                BNX2_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
 590                BNX2_RD(bp, BNX2_EMAC_MDIO_MODE);
 591
 592                udelay(40);
 593        }
 594
 595        return ret;
 596}
 597
 598static void
 599bnx2_disable_int(struct bnx2 *bp)
 600{
 601        int i;
 602        struct bnx2_napi *bnapi;
 603
 604        for (i = 0; i < bp->irq_nvecs; i++) {
 605                bnapi = &bp->bnx2_napi[i];
 606                BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
 607                       BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
 608        }
 609        BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
 610}
 611
 612static void
 613bnx2_enable_int(struct bnx2 *bp)
 614{
 615        int i;
 616        struct bnx2_napi *bnapi;
 617
 618        for (i = 0; i < bp->irq_nvecs; i++) {
 619                bnapi = &bp->bnx2_napi[i];
 620
 621                BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
 622                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
 623                        BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
 624                        bnapi->last_status_idx);
 625
 626                BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
 627                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
 628                        bnapi->last_status_idx);
 629        }
 630        BNX2_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
 631}
 632
 633static void
 634bnx2_disable_int_sync(struct bnx2 *bp)
 635{
 636        int i;
 637
 638        atomic_inc(&bp->intr_sem);
 639        if (!netif_running(bp->dev))
 640                return;
 641
 642        bnx2_disable_int(bp);
 643        for (i = 0; i < bp->irq_nvecs; i++)
 644                synchronize_irq(bp->irq_tbl[i].vector);
 645}
 646
 647static void
 648bnx2_napi_disable(struct bnx2 *bp)
 649{
 650        int i;
 651
 652        for (i = 0; i < bp->irq_nvecs; i++)
 653                napi_disable(&bp->bnx2_napi[i].napi);
 654}
 655
 656static void
 657bnx2_napi_enable(struct bnx2 *bp)
 658{
 659        int i;
 660
 661        for (i = 0; i < bp->irq_nvecs; i++)
 662                napi_enable(&bp->bnx2_napi[i].napi);
 663}
 664
 665static void
 666bnx2_netif_stop(struct bnx2 *bp, bool stop_cnic)
 667{
 668        if (stop_cnic)
 669                bnx2_cnic_stop(bp);
 670        if (netif_running(bp->dev)) {
 671                bnx2_napi_disable(bp);
 672                netif_tx_disable(bp->dev);
 673        }
 674        bnx2_disable_int_sync(bp);
 675        netif_carrier_off(bp->dev);     /* prevent tx timeout */
 676}
 677
 678static void
 679bnx2_netif_start(struct bnx2 *bp, bool start_cnic)
 680{
 681        if (atomic_dec_and_test(&bp->intr_sem)) {
 682                if (netif_running(bp->dev)) {
 683                        netif_tx_wake_all_queues(bp->dev);
 684                        spin_lock_bh(&bp->phy_lock);
 685                        if (bp->link_up)
 686                                netif_carrier_on(bp->dev);
 687                        spin_unlock_bh(&bp->phy_lock);
 688                        bnx2_napi_enable(bp);
 689                        bnx2_enable_int(bp);
 690                        if (start_cnic)
 691                                bnx2_cnic_start(bp);
 692                }
 693        }
 694}
 695
 696static void
 697bnx2_free_tx_mem(struct bnx2 *bp)
 698{
 699        int i;
 700
 701        for (i = 0; i < bp->num_tx_rings; i++) {
 702                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
 703                struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
 704
 705                if (txr->tx_desc_ring) {
 706                        dma_free_coherent(&bp->pdev->dev, TXBD_RING_SIZE,
 707                                          txr->tx_desc_ring,
 708                                          txr->tx_desc_mapping);
 709                        txr->tx_desc_ring = NULL;
 710                }
 711                kfree(txr->tx_buf_ring);
 712                txr->tx_buf_ring = NULL;
 713        }
 714}
 715
 716static void
 717bnx2_free_rx_mem(struct bnx2 *bp)
 718{
 719        int i;
 720
 721        for (i = 0; i < bp->num_rx_rings; i++) {
 722                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
 723                struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
 724                int j;
 725
 726                for (j = 0; j < bp->rx_max_ring; j++) {
 727                        if (rxr->rx_desc_ring[j])
 728                                dma_free_coherent(&bp->pdev->dev, RXBD_RING_SIZE,
 729                                                  rxr->rx_desc_ring[j],
 730                                                  rxr->rx_desc_mapping[j]);
 731                        rxr->rx_desc_ring[j] = NULL;
 732                }
 733                vfree(rxr->rx_buf_ring);
 734                rxr->rx_buf_ring = NULL;
 735
 736                for (j = 0; j < bp->rx_max_pg_ring; j++) {
 737                        if (rxr->rx_pg_desc_ring[j])
 738                                dma_free_coherent(&bp->pdev->dev, RXBD_RING_SIZE,
 739                                                  rxr->rx_pg_desc_ring[j],
 740                                                  rxr->rx_pg_desc_mapping[j]);
 741                        rxr->rx_pg_desc_ring[j] = NULL;
 742                }
 743                vfree(rxr->rx_pg_ring);
 744                rxr->rx_pg_ring = NULL;
 745        }
 746}
 747
 748static int
 749bnx2_alloc_tx_mem(struct bnx2 *bp)
 750{
 751        int i;
 752
 753        for (i = 0; i < bp->num_tx_rings; i++) {
 754                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
 755                struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
 756
 757                txr->tx_buf_ring = kzalloc(SW_TXBD_RING_SIZE, GFP_KERNEL);
 758                if (!txr->tx_buf_ring)
 759                        return -ENOMEM;
 760
 761                txr->tx_desc_ring =
 762                        dma_alloc_coherent(&bp->pdev->dev, TXBD_RING_SIZE,
 763                                           &txr->tx_desc_mapping, GFP_KERNEL);
 764                if (!txr->tx_desc_ring)
 765                        return -ENOMEM;
 766        }
 767        return 0;
 768}
 769
 770static int
 771bnx2_alloc_rx_mem(struct bnx2 *bp)
 772{
 773        int i;
 774
 775        for (i = 0; i < bp->num_rx_rings; i++) {
 776                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
 777                struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
 778                int j;
 779
 780                rxr->rx_buf_ring =
 781                        vzalloc(array_size(SW_RXBD_RING_SIZE, bp->rx_max_ring));
 782                if (!rxr->rx_buf_ring)
 783                        return -ENOMEM;
 784
 785                for (j = 0; j < bp->rx_max_ring; j++) {
 786                        rxr->rx_desc_ring[j] =
 787                                dma_alloc_coherent(&bp->pdev->dev,
 788                                                   RXBD_RING_SIZE,
 789                                                   &rxr->rx_desc_mapping[j],
 790                                                   GFP_KERNEL);
 791                        if (!rxr->rx_desc_ring[j])
 792                                return -ENOMEM;
 793
 794                }
 795
 796                if (bp->rx_pg_ring_size) {
 797                        rxr->rx_pg_ring =
 798                                vzalloc(array_size(SW_RXPG_RING_SIZE,
 799                                                   bp->rx_max_pg_ring));
 800                        if (!rxr->rx_pg_ring)
 801                                return -ENOMEM;
 802
 803                }
 804
 805                for (j = 0; j < bp->rx_max_pg_ring; j++) {
 806                        rxr->rx_pg_desc_ring[j] =
 807                                dma_alloc_coherent(&bp->pdev->dev,
 808                                                   RXBD_RING_SIZE,
 809                                                   &rxr->rx_pg_desc_mapping[j],
 810                                                   GFP_KERNEL);
 811                        if (!rxr->rx_pg_desc_ring[j])
 812                                return -ENOMEM;
 813
 814                }
 815        }
 816        return 0;
 817}
 818
 819static void
 820bnx2_free_stats_blk(struct net_device *dev)
 821{
 822        struct bnx2 *bp = netdev_priv(dev);
 823
 824        if (bp->status_blk) {
 825                dma_free_coherent(&bp->pdev->dev, bp->status_stats_size,
 826                                  bp->status_blk,
 827                                  bp->status_blk_mapping);
 828                bp->status_blk = NULL;
 829                bp->stats_blk = NULL;
 830        }
 831}
 832
 833static int
 834bnx2_alloc_stats_blk(struct net_device *dev)
 835{
 836        int status_blk_size;
 837        void *status_blk;
 838        struct bnx2 *bp = netdev_priv(dev);
 839
 840        /* Combine status and statistics blocks into one allocation. */
 841        status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block));
 842        if (bp->flags & BNX2_FLAG_MSIX_CAP)
 843                status_blk_size = L1_CACHE_ALIGN(BNX2_MAX_MSIX_HW_VEC *
 844                                                 BNX2_SBLK_MSIX_ALIGN_SIZE);
 845        bp->status_stats_size = status_blk_size +
 846                                sizeof(struct statistics_block);
 847        status_blk = dma_zalloc_coherent(&bp->pdev->dev, bp->status_stats_size,
 848                                         &bp->status_blk_mapping, GFP_KERNEL);
 849        if (!status_blk)
 850                return -ENOMEM;
 851
 852        bp->status_blk = status_blk;
 853        bp->stats_blk = status_blk + status_blk_size;
 854        bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size;
 855
 856        return 0;
 857}
 858
 859static void
 860bnx2_free_mem(struct bnx2 *bp)
 861{
 862        int i;
 863        struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
 864
 865        bnx2_free_tx_mem(bp);
 866        bnx2_free_rx_mem(bp);
 867
 868        for (i = 0; i < bp->ctx_pages; i++) {
 869                if (bp->ctx_blk[i]) {
 870                        dma_free_coherent(&bp->pdev->dev, BNX2_PAGE_SIZE,
 871                                          bp->ctx_blk[i],
 872                                          bp->ctx_blk_mapping[i]);
 873                        bp->ctx_blk[i] = NULL;
 874                }
 875        }
 876
 877        if (bnapi->status_blk.msi)
 878                bnapi->status_blk.msi = NULL;
 879}
 880
 881static int
 882bnx2_alloc_mem(struct bnx2 *bp)
 883{
 884        int i, err;
 885        struct bnx2_napi *bnapi;
 886
 887        bnapi = &bp->bnx2_napi[0];
 888        bnapi->status_blk.msi = bp->status_blk;
 889        bnapi->hw_tx_cons_ptr =
 890                &bnapi->status_blk.msi->status_tx_quick_consumer_index0;
 891        bnapi->hw_rx_cons_ptr =
 892                &bnapi->status_blk.msi->status_rx_quick_consumer_index0;
 893        if (bp->flags & BNX2_FLAG_MSIX_CAP) {
 894                for (i = 1; i < bp->irq_nvecs; i++) {
 895                        struct status_block_msix *sblk;
 896
 897                        bnapi = &bp->bnx2_napi[i];
 898
 899                        sblk = (bp->status_blk + BNX2_SBLK_MSIX_ALIGN_SIZE * i);
 900                        bnapi->status_blk.msix = sblk;
 901                        bnapi->hw_tx_cons_ptr =
 902                                &sblk->status_tx_quick_consumer_index;
 903                        bnapi->hw_rx_cons_ptr =
 904                                &sblk->status_rx_quick_consumer_index;
 905                        bnapi->int_num = i << 24;
 906                }
 907        }
 908
 909        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
 910                bp->ctx_pages = 0x2000 / BNX2_PAGE_SIZE;
 911                if (bp->ctx_pages == 0)
 912                        bp->ctx_pages = 1;
 913                for (i = 0; i < bp->ctx_pages; i++) {
 914                        bp->ctx_blk[i] = dma_alloc_coherent(&bp->pdev->dev,
 915                                                BNX2_PAGE_SIZE,
 916                                                &bp->ctx_blk_mapping[i],
 917                                                GFP_KERNEL);
 918                        if (!bp->ctx_blk[i])
 919                                goto alloc_mem_err;
 920                }
 921        }
 922
 923        err = bnx2_alloc_rx_mem(bp);
 924        if (err)
 925                goto alloc_mem_err;
 926
 927        err = bnx2_alloc_tx_mem(bp);
 928        if (err)
 929                goto alloc_mem_err;
 930
 931        return 0;
 932
 933alloc_mem_err:
 934        bnx2_free_mem(bp);
 935        return -ENOMEM;
 936}
 937
 938static void
 939bnx2_report_fw_link(struct bnx2 *bp)
 940{
 941        u32 fw_link_status = 0;
 942
 943        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
 944                return;
 945
 946        if (bp->link_up) {
 947                u32 bmsr;
 948
 949                switch (bp->line_speed) {
 950                case SPEED_10:
 951                        if (bp->duplex == DUPLEX_HALF)
 952                                fw_link_status = BNX2_LINK_STATUS_10HALF;
 953                        else
 954                                fw_link_status = BNX2_LINK_STATUS_10FULL;
 955                        break;
 956                case SPEED_100:
 957                        if (bp->duplex == DUPLEX_HALF)
 958                                fw_link_status = BNX2_LINK_STATUS_100HALF;
 959                        else
 960                                fw_link_status = BNX2_LINK_STATUS_100FULL;
 961                        break;
 962                case SPEED_1000:
 963                        if (bp->duplex == DUPLEX_HALF)
 964                                fw_link_status = BNX2_LINK_STATUS_1000HALF;
 965                        else
 966                                fw_link_status = BNX2_LINK_STATUS_1000FULL;
 967                        break;
 968                case SPEED_2500:
 969                        if (bp->duplex == DUPLEX_HALF)
 970                                fw_link_status = BNX2_LINK_STATUS_2500HALF;
 971                        else
 972                                fw_link_status = BNX2_LINK_STATUS_2500FULL;
 973                        break;
 974                }
 975
 976                fw_link_status |= BNX2_LINK_STATUS_LINK_UP;
 977
 978                if (bp->autoneg) {
 979                        fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED;
 980
 981                        bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
 982                        bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
 983
 984                        if (!(bmsr & BMSR_ANEGCOMPLETE) ||
 985                            bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT)
 986                                fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET;
 987                        else
 988                                fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE;
 989                }
 990        }
 991        else
 992                fw_link_status = BNX2_LINK_STATUS_LINK_DOWN;
 993
 994        bnx2_shmem_wr(bp, BNX2_LINK_STATUS, fw_link_status);
 995}
 996
 997static char *
 998bnx2_xceiver_str(struct bnx2 *bp)
 999{
1000        return (bp->phy_port == PORT_FIBRE) ? "SerDes" :
1001                ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) ? "Remote Copper" :
1002                 "Copper");
1003}
1004
1005static void
1006bnx2_report_link(struct bnx2 *bp)
1007{
1008        if (bp->link_up) {
1009                netif_carrier_on(bp->dev);
1010                netdev_info(bp->dev, "NIC %s Link is Up, %d Mbps %s duplex",
1011                            bnx2_xceiver_str(bp),
1012                            bp->line_speed,
1013                            bp->duplex == DUPLEX_FULL ? "full" : "half");
1014
1015                if (bp->flow_ctrl) {
1016                        if (bp->flow_ctrl & FLOW_CTRL_RX) {
1017                                pr_cont(", receive ");
1018                                if (bp->flow_ctrl & FLOW_CTRL_TX)
1019                                        pr_cont("& transmit ");
1020                        }
1021                        else {
1022                                pr_cont(", transmit ");
1023                        }
1024                        pr_cont("flow control ON");
1025                }
1026                pr_cont("\n");
1027        } else {
1028                netif_carrier_off(bp->dev);
1029                netdev_err(bp->dev, "NIC %s Link is Down\n",
1030                           bnx2_xceiver_str(bp));
1031        }
1032
1033        bnx2_report_fw_link(bp);
1034}
1035
1036static void
1037bnx2_resolve_flow_ctrl(struct bnx2 *bp)
1038{
1039        u32 local_adv, remote_adv;
1040
1041        bp->flow_ctrl = 0;
1042        if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
1043                (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
1044
1045                if (bp->duplex == DUPLEX_FULL) {
1046                        bp->flow_ctrl = bp->req_flow_ctrl;
1047                }
1048                return;
1049        }
1050
1051        if (bp->duplex != DUPLEX_FULL) {
1052                return;
1053        }
1054
1055        if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1056            (BNX2_CHIP(bp) == BNX2_CHIP_5708)) {
1057                u32 val;
1058
1059                bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
1060                if (val & BCM5708S_1000X_STAT1_TX_PAUSE)
1061                        bp->flow_ctrl |= FLOW_CTRL_TX;
1062                if (val & BCM5708S_1000X_STAT1_RX_PAUSE)
1063                        bp->flow_ctrl |= FLOW_CTRL_RX;
1064                return;
1065        }
1066
1067        bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1068        bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1069
1070        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1071                u32 new_local_adv = 0;
1072                u32 new_remote_adv = 0;
1073
1074                if (local_adv & ADVERTISE_1000XPAUSE)
1075                        new_local_adv |= ADVERTISE_PAUSE_CAP;
1076                if (local_adv & ADVERTISE_1000XPSE_ASYM)
1077                        new_local_adv |= ADVERTISE_PAUSE_ASYM;
1078                if (remote_adv & ADVERTISE_1000XPAUSE)
1079                        new_remote_adv |= ADVERTISE_PAUSE_CAP;
1080                if (remote_adv & ADVERTISE_1000XPSE_ASYM)
1081                        new_remote_adv |= ADVERTISE_PAUSE_ASYM;
1082
1083                local_adv = new_local_adv;
1084                remote_adv = new_remote_adv;
1085        }
1086
1087        /* See Table 28B-3 of 802.3ab-1999 spec. */
1088        if (local_adv & ADVERTISE_PAUSE_CAP) {
1089                if(local_adv & ADVERTISE_PAUSE_ASYM) {
1090                        if (remote_adv & ADVERTISE_PAUSE_CAP) {
1091                                bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
1092                        }
1093                        else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
1094                                bp->flow_ctrl = FLOW_CTRL_RX;
1095                        }
1096                }
1097                else {
1098                        if (remote_adv & ADVERTISE_PAUSE_CAP) {
1099                                bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
1100                        }
1101                }
1102        }
1103        else if (local_adv & ADVERTISE_PAUSE_ASYM) {
1104                if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
1105                        (remote_adv & ADVERTISE_PAUSE_ASYM)) {
1106
1107                        bp->flow_ctrl = FLOW_CTRL_TX;
1108                }
1109        }
1110}
1111
1112static int
1113bnx2_5709s_linkup(struct bnx2 *bp)
1114{
1115        u32 val, speed;
1116
1117        bp->link_up = 1;
1118
1119        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_GP_STATUS);
1120        bnx2_read_phy(bp, MII_BNX2_GP_TOP_AN_STATUS1, &val);
1121        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1122
1123        if ((bp->autoneg & AUTONEG_SPEED) == 0) {
1124                bp->line_speed = bp->req_line_speed;
1125                bp->duplex = bp->req_duplex;
1126                return 0;
1127        }
1128        speed = val & MII_BNX2_GP_TOP_AN_SPEED_MSK;
1129        switch (speed) {
1130                case MII_BNX2_GP_TOP_AN_SPEED_10:
1131                        bp->line_speed = SPEED_10;
1132                        break;
1133                case MII_BNX2_GP_TOP_AN_SPEED_100:
1134                        bp->line_speed = SPEED_100;
1135                        break;
1136                case MII_BNX2_GP_TOP_AN_SPEED_1G:
1137                case MII_BNX2_GP_TOP_AN_SPEED_1GKV:
1138                        bp->line_speed = SPEED_1000;
1139                        break;
1140                case MII_BNX2_GP_TOP_AN_SPEED_2_5G:
1141                        bp->line_speed = SPEED_2500;
1142                        break;
1143        }
1144        if (val & MII_BNX2_GP_TOP_AN_FD)
1145                bp->duplex = DUPLEX_FULL;
1146        else
1147                bp->duplex = DUPLEX_HALF;
1148        return 0;
1149}
1150
1151static int
1152bnx2_5708s_linkup(struct bnx2 *bp)
1153{
1154        u32 val;
1155
1156        bp->link_up = 1;
1157        bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
1158        switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) {
1159                case BCM5708S_1000X_STAT1_SPEED_10:
1160                        bp->line_speed = SPEED_10;
1161                        break;
1162                case BCM5708S_1000X_STAT1_SPEED_100:
1163                        bp->line_speed = SPEED_100;
1164                        break;
1165                case BCM5708S_1000X_STAT1_SPEED_1G:
1166                        bp->line_speed = SPEED_1000;
1167                        break;
1168                case BCM5708S_1000X_STAT1_SPEED_2G5:
1169                        bp->line_speed = SPEED_2500;
1170                        break;
1171        }
1172        if (val & BCM5708S_1000X_STAT1_FD)
1173                bp->duplex = DUPLEX_FULL;
1174        else
1175                bp->duplex = DUPLEX_HALF;
1176
1177        return 0;
1178}
1179
1180static int
1181bnx2_5706s_linkup(struct bnx2 *bp)
1182{
1183        u32 bmcr, local_adv, remote_adv, common;
1184
1185        bp->link_up = 1;
1186        bp->line_speed = SPEED_1000;
1187
1188        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1189        if (bmcr & BMCR_FULLDPLX) {
1190                bp->duplex = DUPLEX_FULL;
1191        }
1192        else {
1193                bp->duplex = DUPLEX_HALF;
1194        }
1195
1196        if (!(bmcr & BMCR_ANENABLE)) {
1197                return 0;
1198        }
1199
1200        bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1201        bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1202
1203        common = local_adv & remote_adv;
1204        if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
1205
1206                if (common & ADVERTISE_1000XFULL) {
1207                        bp->duplex = DUPLEX_FULL;
1208                }
1209                else {
1210                        bp->duplex = DUPLEX_HALF;
1211                }
1212        }
1213
1214        return 0;
1215}
1216
1217static int
1218bnx2_copper_linkup(struct bnx2 *bp)
1219{
1220        u32 bmcr;
1221
1222        bp->phy_flags &= ~BNX2_PHY_FLAG_MDIX;
1223
1224        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1225        if (bmcr & BMCR_ANENABLE) {
1226                u32 local_adv, remote_adv, common;
1227
1228                bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
1229                bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
1230
1231                common = local_adv & (remote_adv >> 2);
1232                if (common & ADVERTISE_1000FULL) {
1233                        bp->line_speed = SPEED_1000;
1234                        bp->duplex = DUPLEX_FULL;
1235                }
1236                else if (common & ADVERTISE_1000HALF) {
1237                        bp->line_speed = SPEED_1000;
1238                        bp->duplex = DUPLEX_HALF;
1239                }
1240                else {
1241                        bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1242                        bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1243
1244                        common = local_adv & remote_adv;
1245                        if (common & ADVERTISE_100FULL) {
1246                                bp->line_speed = SPEED_100;
1247                                bp->duplex = DUPLEX_FULL;
1248                        }
1249                        else if (common & ADVERTISE_100HALF) {
1250                                bp->line_speed = SPEED_100;
1251                                bp->duplex = DUPLEX_HALF;
1252                        }
1253                        else if (common & ADVERTISE_10FULL) {
1254                                bp->line_speed = SPEED_10;
1255                                bp->duplex = DUPLEX_FULL;
1256                        }
1257                        else if (common & ADVERTISE_10HALF) {
1258                                bp->line_speed = SPEED_10;
1259                                bp->duplex = DUPLEX_HALF;
1260                        }
1261                        else {
1262                                bp->line_speed = 0;
1263                                bp->link_up = 0;
1264                        }
1265                }
1266        }
1267        else {
1268                if (bmcr & BMCR_SPEED100) {
1269                        bp->line_speed = SPEED_100;
1270                }
1271                else {
1272                        bp->line_speed = SPEED_10;
1273                }
1274                if (bmcr & BMCR_FULLDPLX) {
1275                        bp->duplex = DUPLEX_FULL;
1276                }
1277                else {
1278                        bp->duplex = DUPLEX_HALF;
1279                }
1280        }
1281
1282        if (bp->link_up) {
1283                u32 ext_status;
1284
1285                bnx2_read_phy(bp, MII_BNX2_EXT_STATUS, &ext_status);
1286                if (ext_status & EXT_STATUS_MDIX)
1287                        bp->phy_flags |= BNX2_PHY_FLAG_MDIX;
1288        }
1289
1290        return 0;
1291}
1292
1293static void
1294bnx2_init_rx_context(struct bnx2 *bp, u32 cid)
1295{
1296        u32 val, rx_cid_addr = GET_CID_ADDR(cid);
1297
1298        val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
1299        val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
1300        val |= 0x02 << 8;
1301
1302        if (bp->flow_ctrl & FLOW_CTRL_TX)
1303                val |= BNX2_L2CTX_FLOW_CTRL_ENABLE;
1304
1305        bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val);
1306}
1307
1308static void
1309bnx2_init_all_rx_contexts(struct bnx2 *bp)
1310{
1311        int i;
1312        u32 cid;
1313
1314        for (i = 0, cid = RX_CID; i < bp->num_rx_rings; i++, cid++) {
1315                if (i == 1)
1316                        cid = RX_RSS_CID;
1317                bnx2_init_rx_context(bp, cid);
1318        }
1319}
1320
1321static void
1322bnx2_set_mac_link(struct bnx2 *bp)
1323{
1324        u32 val;
1325
1326        BNX2_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
1327        if (bp->link_up && (bp->line_speed == SPEED_1000) &&
1328                (bp->duplex == DUPLEX_HALF)) {
1329                BNX2_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
1330        }
1331
1332        /* Configure the EMAC mode register. */
1333        val = BNX2_RD(bp, BNX2_EMAC_MODE);
1334
1335        val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
1336                BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
1337                BNX2_EMAC_MODE_25G_MODE);
1338
1339        if (bp->link_up) {
1340                switch (bp->line_speed) {
1341                        case SPEED_10:
1342                                if (BNX2_CHIP(bp) != BNX2_CHIP_5706) {
1343                                        val |= BNX2_EMAC_MODE_PORT_MII_10M;
1344                                        break;
1345                                }
1346                                /* fall through */
1347                        case SPEED_100:
1348                                val |= BNX2_EMAC_MODE_PORT_MII;
1349                                break;
1350                        case SPEED_2500:
1351                                val |= BNX2_EMAC_MODE_25G_MODE;
1352                                /* fall through */
1353                        case SPEED_1000:
1354                                val |= BNX2_EMAC_MODE_PORT_GMII;
1355                                break;
1356                }
1357        }
1358        else {
1359                val |= BNX2_EMAC_MODE_PORT_GMII;
1360        }
1361
1362        /* Set the MAC to operate in the appropriate duplex mode. */
1363        if (bp->duplex == DUPLEX_HALF)
1364                val |= BNX2_EMAC_MODE_HALF_DUPLEX;
1365        BNX2_WR(bp, BNX2_EMAC_MODE, val);
1366
1367        /* Enable/disable rx PAUSE. */
1368        bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
1369
1370        if (bp->flow_ctrl & FLOW_CTRL_RX)
1371                bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
1372        BNX2_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
1373
1374        /* Enable/disable tx PAUSE. */
1375        val = BNX2_RD(bp, BNX2_EMAC_TX_MODE);
1376        val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
1377
1378        if (bp->flow_ctrl & FLOW_CTRL_TX)
1379                val |= BNX2_EMAC_TX_MODE_FLOW_EN;
1380        BNX2_WR(bp, BNX2_EMAC_TX_MODE, val);
1381
1382        /* Acknowledge the interrupt. */
1383        BNX2_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
1384
1385        bnx2_init_all_rx_contexts(bp);
1386}
1387
1388static void
1389bnx2_enable_bmsr1(struct bnx2 *bp)
1390{
1391        if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1392            (BNX2_CHIP(bp) == BNX2_CHIP_5709))
1393                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1394                               MII_BNX2_BLK_ADDR_GP_STATUS);
1395}
1396
1397static void
1398bnx2_disable_bmsr1(struct bnx2 *bp)
1399{
1400        if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1401            (BNX2_CHIP(bp) == BNX2_CHIP_5709))
1402                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1403                               MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1404}
1405
1406static int
1407bnx2_test_and_enable_2g5(struct bnx2 *bp)
1408{
1409        u32 up1;
1410        int ret = 1;
1411
1412        if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1413                return 0;
1414
1415        if (bp->autoneg & AUTONEG_SPEED)
1416                bp->advertising |= ADVERTISED_2500baseX_Full;
1417
1418        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
1419                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
1420
1421        bnx2_read_phy(bp, bp->mii_up1, &up1);
1422        if (!(up1 & BCM5708S_UP1_2G5)) {
1423                up1 |= BCM5708S_UP1_2G5;
1424                bnx2_write_phy(bp, bp->mii_up1, up1);
1425                ret = 0;
1426        }
1427
1428        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
1429                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1430                               MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1431
1432        return ret;
1433}
1434
1435static int
1436bnx2_test_and_disable_2g5(struct bnx2 *bp)
1437{
1438        u32 up1;
1439        int ret = 0;
1440
1441        if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1442                return 0;
1443
1444        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
1445                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
1446
1447        bnx2_read_phy(bp, bp->mii_up1, &up1);
1448        if (up1 & BCM5708S_UP1_2G5) {
1449                up1 &= ~BCM5708S_UP1_2G5;
1450                bnx2_write_phy(bp, bp->mii_up1, up1);
1451                ret = 1;
1452        }
1453
1454        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
1455                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1456                               MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1457
1458        return ret;
1459}
1460
1461static void
1462bnx2_enable_forced_2g5(struct bnx2 *bp)
1463{
1464        u32 uninitialized_var(bmcr);
1465        int err;
1466
1467        if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1468                return;
1469
1470        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
1471                u32 val;
1472
1473                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1474                               MII_BNX2_BLK_ADDR_SERDES_DIG);
1475                if (!bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val)) {
1476                        val &= ~MII_BNX2_SD_MISC1_FORCE_MSK;
1477                        val |= MII_BNX2_SD_MISC1_FORCE |
1478                                MII_BNX2_SD_MISC1_FORCE_2_5G;
1479                        bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val);
1480                }
1481
1482                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1483                               MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1484                err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1485
1486        } else if (BNX2_CHIP(bp) == BNX2_CHIP_5708) {
1487                err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1488                if (!err)
1489                        bmcr |= BCM5708S_BMCR_FORCE_2500;
1490        } else {
1491                return;
1492        }
1493
1494        if (err)
1495                return;
1496
1497        if (bp->autoneg & AUTONEG_SPEED) {
1498                bmcr &= ~BMCR_ANENABLE;
1499                if (bp->req_duplex == DUPLEX_FULL)
1500                        bmcr |= BMCR_FULLDPLX;
1501        }
1502        bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1503}
1504
1505static void
1506bnx2_disable_forced_2g5(struct bnx2 *bp)
1507{
1508        u32 uninitialized_var(bmcr);
1509        int err;
1510
1511        if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1512                return;
1513
1514        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
1515                u32 val;
1516
1517                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1518                               MII_BNX2_BLK_ADDR_SERDES_DIG);
1519                if (!bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val)) {
1520                        val &= ~MII_BNX2_SD_MISC1_FORCE;
1521                        bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val);
1522                }
1523
1524                bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1525                               MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1526                err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1527
1528        } else if (BNX2_CHIP(bp) == BNX2_CHIP_5708) {
1529                err = bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1530                if (!err)
1531                        bmcr &= ~BCM5708S_BMCR_FORCE_2500;
1532        } else {
1533                return;
1534        }
1535
1536        if (err)
1537                return;
1538
1539        if (bp->autoneg & AUTONEG_SPEED)
1540                bmcr |= BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_ANRESTART;
1541        bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1542}
1543
1544static void
1545bnx2_5706s_force_link_dn(struct bnx2 *bp, int start)
1546{
1547        u32 val;
1548
1549        bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_SERDES_CTL);
1550        bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val);
1551        if (start)
1552                bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val & 0xff0f);
1553        else
1554                bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val | 0xc0);
1555}
1556
1557static int
1558bnx2_set_link(struct bnx2 *bp)
1559{
1560        u32 bmsr;
1561        u8 link_up;
1562
1563        if (bp->loopback == MAC_LOOPBACK || bp->loopback == PHY_LOOPBACK) {
1564                bp->link_up = 1;
1565                return 0;
1566        }
1567
1568        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
1569                return 0;
1570
1571        link_up = bp->link_up;
1572
1573        bnx2_enable_bmsr1(bp);
1574        bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
1575        bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
1576        bnx2_disable_bmsr1(bp);
1577
1578        if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1579            (BNX2_CHIP(bp) == BNX2_CHIP_5706)) {
1580                u32 val, an_dbg;
1581
1582                if (bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN) {
1583                        bnx2_5706s_force_link_dn(bp, 0);
1584                        bp->phy_flags &= ~BNX2_PHY_FLAG_FORCED_DOWN;
1585                }
1586                val = BNX2_RD(bp, BNX2_EMAC_STATUS);
1587
1588                bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
1589                bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
1590                bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
1591
1592                if ((val & BNX2_EMAC_STATUS_LINK) &&
1593                    !(an_dbg & MISC_SHDW_AN_DBG_NOSYNC))
1594                        bmsr |= BMSR_LSTATUS;
1595                else
1596                        bmsr &= ~BMSR_LSTATUS;
1597        }
1598
1599        if (bmsr & BMSR_LSTATUS) {
1600                bp->link_up = 1;
1601
1602                if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1603                        if (BNX2_CHIP(bp) == BNX2_CHIP_5706)
1604                                bnx2_5706s_linkup(bp);
1605                        else if (BNX2_CHIP(bp) == BNX2_CHIP_5708)
1606                                bnx2_5708s_linkup(bp);
1607                        else if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
1608                                bnx2_5709s_linkup(bp);
1609                }
1610                else {
1611                        bnx2_copper_linkup(bp);
1612                }
1613                bnx2_resolve_flow_ctrl(bp);
1614        }
1615        else {
1616                if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1617                    (bp->autoneg & AUTONEG_SPEED))
1618                        bnx2_disable_forced_2g5(bp);
1619
1620                if (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT) {
1621                        u32 bmcr;
1622
1623                        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1624                        bmcr |= BMCR_ANENABLE;
1625                        bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1626
1627                        bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
1628                }
1629                bp->link_up = 0;
1630        }
1631
1632        if (bp->link_up != link_up) {
1633                bnx2_report_link(bp);
1634        }
1635
1636        bnx2_set_mac_link(bp);
1637
1638        return 0;
1639}
1640
1641static int
1642bnx2_reset_phy(struct bnx2 *bp)
1643{
1644        int i;
1645        u32 reg;
1646
1647        bnx2_write_phy(bp, bp->mii_bmcr, BMCR_RESET);
1648
1649#define PHY_RESET_MAX_WAIT 100
1650        for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
1651                udelay(10);
1652
1653                bnx2_read_phy(bp, bp->mii_bmcr, &reg);
1654                if (!(reg & BMCR_RESET)) {
1655                        udelay(20);
1656                        break;
1657                }
1658        }
1659        if (i == PHY_RESET_MAX_WAIT) {
1660                return -EBUSY;
1661        }
1662        return 0;
1663}
1664
1665static u32
1666bnx2_phy_get_pause_adv(struct bnx2 *bp)
1667{
1668        u32 adv = 0;
1669
1670        if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
1671                (FLOW_CTRL_RX | FLOW_CTRL_TX)) {
1672
1673                if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1674                        adv = ADVERTISE_1000XPAUSE;
1675                }
1676                else {
1677                        adv = ADVERTISE_PAUSE_CAP;
1678                }
1679        }
1680        else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
1681                if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1682                        adv = ADVERTISE_1000XPSE_ASYM;
1683                }
1684                else {
1685                        adv = ADVERTISE_PAUSE_ASYM;
1686                }
1687        }
1688        else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
1689                if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1690                        adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
1691                }
1692                else {
1693                        adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
1694                }
1695        }
1696        return adv;
1697}
1698
1699static int bnx2_fw_sync(struct bnx2 *, u32, int, int);
1700
1701static int
1702bnx2_setup_remote_phy(struct bnx2 *bp, u8 port)
1703__releases(&bp->phy_lock)
1704__acquires(&bp->phy_lock)
1705{
1706        u32 speed_arg = 0, pause_adv;
1707
1708        pause_adv = bnx2_phy_get_pause_adv(bp);
1709
1710        if (bp->autoneg & AUTONEG_SPEED) {
1711                speed_arg |= BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG;
1712                if (bp->advertising & ADVERTISED_10baseT_Half)
1713                        speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10HALF;
1714                if (bp->advertising & ADVERTISED_10baseT_Full)
1715                        speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10FULL;
1716                if (bp->advertising & ADVERTISED_100baseT_Half)
1717                        speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100HALF;
1718                if (bp->advertising & ADVERTISED_100baseT_Full)
1719                        speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100FULL;
1720                if (bp->advertising & ADVERTISED_1000baseT_Full)
1721                        speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_1GFULL;
1722                if (bp->advertising & ADVERTISED_2500baseX_Full)
1723                        speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_2G5FULL;
1724        } else {
1725                if (bp->req_line_speed == SPEED_2500)
1726                        speed_arg = BNX2_NETLINK_SET_LINK_SPEED_2G5FULL;
1727                else if (bp->req_line_speed == SPEED_1000)
1728                        speed_arg = BNX2_NETLINK_SET_LINK_SPEED_1GFULL;
1729                else if (bp->req_line_speed == SPEED_100) {
1730                        if (bp->req_duplex == DUPLEX_FULL)
1731                                speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100FULL;
1732                        else
1733                                speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100HALF;
1734                } else if (bp->req_line_speed == SPEED_10) {
1735                        if (bp->req_duplex == DUPLEX_FULL)
1736                                speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10FULL;
1737                        else
1738                                speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10HALF;
1739                }
1740        }
1741
1742        if (pause_adv & (ADVERTISE_1000XPAUSE | ADVERTISE_PAUSE_CAP))
1743                speed_arg |= BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE;
1744        if (pause_adv & (ADVERTISE_1000XPSE_ASYM | ADVERTISE_PAUSE_ASYM))
1745                speed_arg |= BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE;
1746
1747        if (port == PORT_TP)
1748                speed_arg |= BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE |
1749                             BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED;
1750
1751        bnx2_shmem_wr(bp, BNX2_DRV_MB_ARG0, speed_arg);
1752
1753        spin_unlock_bh(&bp->phy_lock);
1754        bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_CMD_SET_LINK, 1, 0);
1755        spin_lock_bh(&bp->phy_lock);
1756
1757        return 0;
1758}
1759
1760static int
1761bnx2_setup_serdes_phy(struct bnx2 *bp, u8 port)
1762__releases(&bp->phy_lock)
1763__acquires(&bp->phy_lock)
1764{
1765        u32 adv, bmcr;
1766        u32 new_adv = 0;
1767
1768        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
1769                return bnx2_setup_remote_phy(bp, port);
1770
1771        if (!(bp->autoneg & AUTONEG_SPEED)) {
1772                u32 new_bmcr;
1773                int force_link_down = 0;
1774
1775                if (bp->req_line_speed == SPEED_2500) {
1776                        if (!bnx2_test_and_enable_2g5(bp))
1777                                force_link_down = 1;
1778                } else if (bp->req_line_speed == SPEED_1000) {
1779                        if (bnx2_test_and_disable_2g5(bp))
1780                                force_link_down = 1;
1781                }
1782                bnx2_read_phy(bp, bp->mii_adv, &adv);
1783                adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF);
1784
1785                bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1786                new_bmcr = bmcr & ~BMCR_ANENABLE;
1787                new_bmcr |= BMCR_SPEED1000;
1788
1789                if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
1790                        if (bp->req_line_speed == SPEED_2500)
1791                                bnx2_enable_forced_2g5(bp);
1792                        else if (bp->req_line_speed == SPEED_1000) {
1793                                bnx2_disable_forced_2g5(bp);
1794                                new_bmcr &= ~0x2000;
1795                        }
1796
1797                } else if (BNX2_CHIP(bp) == BNX2_CHIP_5708) {
1798                        if (bp->req_line_speed == SPEED_2500)
1799                                new_bmcr |= BCM5708S_BMCR_FORCE_2500;
1800                        else
1801                                new_bmcr = bmcr & ~BCM5708S_BMCR_FORCE_2500;
1802                }
1803
1804                if (bp->req_duplex == DUPLEX_FULL) {
1805                        adv |= ADVERTISE_1000XFULL;
1806                        new_bmcr |= BMCR_FULLDPLX;
1807                }
1808                else {
1809                        adv |= ADVERTISE_1000XHALF;
1810                        new_bmcr &= ~BMCR_FULLDPLX;
1811                }
1812                if ((new_bmcr != bmcr) || (force_link_down)) {
1813                        /* Force a link down visible on the other side */
1814                        if (bp->link_up) {
1815                                bnx2_write_phy(bp, bp->mii_adv, adv &
1816                                               ~(ADVERTISE_1000XFULL |
1817                                                 ADVERTISE_1000XHALF));
1818                                bnx2_write_phy(bp, bp->mii_bmcr, bmcr |
1819                                        BMCR_ANRESTART | BMCR_ANENABLE);
1820
1821                                bp->link_up = 0;
1822                                netif_carrier_off(bp->dev);
1823                                bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
1824                                bnx2_report_link(bp);
1825                        }
1826                        bnx2_write_phy(bp, bp->mii_adv, adv);
1827                        bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
1828                } else {
1829                        bnx2_resolve_flow_ctrl(bp);
1830                        bnx2_set_mac_link(bp);
1831                }
1832                return 0;
1833        }
1834
1835        bnx2_test_and_enable_2g5(bp);
1836
1837        if (bp->advertising & ADVERTISED_1000baseT_Full)
1838                new_adv |= ADVERTISE_1000XFULL;
1839
1840        new_adv |= bnx2_phy_get_pause_adv(bp);
1841
1842        bnx2_read_phy(bp, bp->mii_adv, &adv);
1843        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1844
1845        bp->serdes_an_pending = 0;
1846        if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
1847                /* Force a link down visible on the other side */
1848                if (bp->link_up) {
1849                        bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
1850                        spin_unlock_bh(&bp->phy_lock);
1851                        msleep(20);
1852                        spin_lock_bh(&bp->phy_lock);
1853                }
1854
1855                bnx2_write_phy(bp, bp->mii_adv, new_adv);
1856                bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART |
1857                        BMCR_ANENABLE);
1858                /* Speed up link-up time when the link partner
1859                 * does not autonegotiate which is very common
1860                 * in blade servers. Some blade servers use
1861                 * IPMI for kerboard input and it's important
1862                 * to minimize link disruptions. Autoneg. involves
1863                 * exchanging base pages plus 3 next pages and
1864                 * normally completes in about 120 msec.
1865                 */
1866                bp->current_interval = BNX2_SERDES_AN_TIMEOUT;
1867                bp->serdes_an_pending = 1;
1868                mod_timer(&bp->timer, jiffies + bp->current_interval);
1869        } else {
1870                bnx2_resolve_flow_ctrl(bp);
1871                bnx2_set_mac_link(bp);
1872        }
1873
1874        return 0;
1875}
1876
1877#define ETHTOOL_ALL_FIBRE_SPEED                                         \
1878        (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) ?                  \
1879                (ADVERTISED_2500baseX_Full | ADVERTISED_1000baseT_Full) :\
1880                (ADVERTISED_1000baseT_Full)
1881
1882#define ETHTOOL_ALL_COPPER_SPEED                                        \
1883        (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |            \
1884        ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |           \
1885        ADVERTISED_1000baseT_Full)
1886
1887#define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
1888        ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
1889
1890#define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
1891
1892static void
1893bnx2_set_default_remote_link(struct bnx2 *bp)
1894{
1895        u32 link;
1896
1897        if (bp->phy_port == PORT_TP)
1898                link = bnx2_shmem_rd(bp, BNX2_RPHY_COPPER_LINK);
1899        else
1900                link = bnx2_shmem_rd(bp, BNX2_RPHY_SERDES_LINK);
1901
1902        if (link & BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG) {
1903                bp->req_line_speed = 0;
1904                bp->autoneg |= AUTONEG_SPEED;
1905                bp->advertising = ADVERTISED_Autoneg;
1906                if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF)
1907                        bp->advertising |= ADVERTISED_10baseT_Half;
1908                if (link & BNX2_NETLINK_SET_LINK_SPEED_10FULL)
1909                        bp->advertising |= ADVERTISED_10baseT_Full;
1910                if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF)
1911                        bp->advertising |= ADVERTISED_100baseT_Half;
1912                if (link & BNX2_NETLINK_SET_LINK_SPEED_100FULL)
1913                        bp->advertising |= ADVERTISED_100baseT_Full;
1914                if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL)
1915                        bp->advertising |= ADVERTISED_1000baseT_Full;
1916                if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL)
1917                        bp->advertising |= ADVERTISED_2500baseX_Full;
1918        } else {
1919                bp->autoneg = 0;
1920                bp->advertising = 0;
1921                bp->req_duplex = DUPLEX_FULL;
1922                if (link & BNX2_NETLINK_SET_LINK_SPEED_10) {
1923                        bp->req_line_speed = SPEED_10;
1924                        if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF)
1925                                bp->req_duplex = DUPLEX_HALF;
1926                }
1927                if (link & BNX2_NETLINK_SET_LINK_SPEED_100) {
1928                        bp->req_line_speed = SPEED_100;
1929                        if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF)
1930                                bp->req_duplex = DUPLEX_HALF;
1931                }
1932                if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL)
1933                        bp->req_line_speed = SPEED_1000;
1934                if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL)
1935                        bp->req_line_speed = SPEED_2500;
1936        }
1937}
1938
1939static void
1940bnx2_set_default_link(struct bnx2 *bp)
1941{
1942        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
1943                bnx2_set_default_remote_link(bp);
1944                return;
1945        }
1946
1947        bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
1948        bp->req_line_speed = 0;
1949        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1950                u32 reg;
1951
1952                bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
1953
1954                reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG);
1955                reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK;
1956                if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) {
1957                        bp->autoneg = 0;
1958                        bp->req_line_speed = bp->line_speed = SPEED_1000;
1959                        bp->req_duplex = DUPLEX_FULL;
1960                }
1961        } else
1962                bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
1963}
1964
1965static void
1966bnx2_send_heart_beat(struct bnx2 *bp)
1967{
1968        u32 msg;
1969        u32 addr;
1970
1971        spin_lock(&bp->indirect_lock);
1972        msg = (u32) (++bp->fw_drv_pulse_wr_seq & BNX2_DRV_PULSE_SEQ_MASK);
1973        addr = bp->shmem_base + BNX2_DRV_PULSE_MB;
1974        BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr);
1975        BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW, msg);
1976        spin_unlock(&bp->indirect_lock);
1977}
1978
1979static void
1980bnx2_remote_phy_event(struct bnx2 *bp)
1981{
1982        u32 msg;
1983        u8 link_up = bp->link_up;
1984        u8 old_port;
1985
1986        msg = bnx2_shmem_rd(bp, BNX2_LINK_STATUS);
1987
1988        if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED)
1989                bnx2_send_heart_beat(bp);
1990
1991        msg &= ~BNX2_LINK_STATUS_HEART_BEAT_EXPIRED;
1992
1993        if ((msg & BNX2_LINK_STATUS_LINK_UP) == BNX2_LINK_STATUS_LINK_DOWN)
1994                bp->link_up = 0;
1995        else {
1996                u32 speed;
1997
1998                bp->link_up = 1;
1999                speed = msg & BNX2_LINK_STATUS_SPEED_MASK;
2000                bp->duplex = DUPLEX_FULL;
2001                switch (speed) {
2002                        case BNX2_LINK_STATUS_10HALF:
2003                                bp->duplex = DUPLEX_HALF;
2004                                /* fall through */
2005                        case BNX2_LINK_STATUS_10FULL:
2006                                bp->line_speed = SPEED_10;
2007                                break;
2008                        case BNX2_LINK_STATUS_100HALF:
2009                                bp->duplex = DUPLEX_HALF;
2010                                /* fall through */
2011                        case BNX2_LINK_STATUS_100BASE_T4:
2012                        case BNX2_LINK_STATUS_100FULL:
2013                                bp->line_speed = SPEED_100;
2014                                break;
2015                        case BNX2_LINK_STATUS_1000HALF:
2016                                bp->duplex = DUPLEX_HALF;
2017                                /* fall through */
2018                        case BNX2_LINK_STATUS_1000FULL:
2019                                bp->line_speed = SPEED_1000;
2020                                break;
2021                        case BNX2_LINK_STATUS_2500HALF:
2022                                bp->duplex = DUPLEX_HALF;
2023                                /* fall through */
2024                        case BNX2_LINK_STATUS_2500FULL:
2025                                bp->line_speed = SPEED_2500;
2026                                break;
2027                        default:
2028                                bp->line_speed = 0;
2029                                break;
2030                }
2031
2032                bp->flow_ctrl = 0;
2033                if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
2034                    (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
2035                        if (bp->duplex == DUPLEX_FULL)
2036                                bp->flow_ctrl = bp->req_flow_ctrl;
2037                } else {
2038                        if (msg & BNX2_LINK_STATUS_TX_FC_ENABLED)
2039                                bp->flow_ctrl |= FLOW_CTRL_TX;
2040                        if (msg & BNX2_LINK_STATUS_RX_FC_ENABLED)
2041                                bp->flow_ctrl |= FLOW_CTRL_RX;
2042                }
2043
2044                old_port = bp->phy_port;
2045                if (msg & BNX2_LINK_STATUS_SERDES_LINK)
2046                        bp->phy_port = PORT_FIBRE;
2047                else
2048                        bp->phy_port = PORT_TP;
2049
2050                if (old_port != bp->phy_port)
2051                        bnx2_set_default_link(bp);
2052
2053        }
2054        if (bp->link_up != link_up)
2055                bnx2_report_link(bp);
2056
2057        bnx2_set_mac_link(bp);
2058}
2059
2060static int
2061bnx2_set_remote_link(struct bnx2 *bp)
2062{
2063        u32 evt_code;
2064
2065        evt_code = bnx2_shmem_rd(bp, BNX2_FW_EVT_CODE_MB);
2066        switch (evt_code) {
2067                case BNX2_FW_EVT_CODE_LINK_EVENT:
2068                        bnx2_remote_phy_event(bp);
2069                        break;
2070                case BNX2_FW_EVT_CODE_SW_TIMER_EXPIRATION_EVENT:
2071                default:
2072                        bnx2_send_heart_beat(bp);
2073                        break;
2074        }
2075        return 0;
2076}
2077
2078static int
2079bnx2_setup_copper_phy(struct bnx2 *bp)
2080__releases(&bp->phy_lock)
2081__acquires(&bp->phy_lock)
2082{
2083        u32 bmcr, adv_reg, new_adv = 0;
2084        u32 new_bmcr;
2085
2086        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
2087
2088        bnx2_read_phy(bp, bp->mii_adv, &adv_reg);
2089        adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
2090                    ADVERTISE_PAUSE_ASYM);
2091
2092        new_adv = ADVERTISE_CSMA | ethtool_adv_to_mii_adv_t(bp->advertising);
2093
2094        if (bp->autoneg & AUTONEG_SPEED) {
2095                u32 adv1000_reg;
2096                u32 new_adv1000 = 0;
2097
2098                new_adv |= bnx2_phy_get_pause_adv(bp);
2099
2100                bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
2101                adv1000_reg &= PHY_ALL_1000_SPEED;
2102
2103                new_adv1000 |= ethtool_adv_to_mii_ctrl1000_t(bp->advertising);
2104                if ((adv1000_reg != new_adv1000) ||
2105                        (adv_reg != new_adv) ||
2106                        ((bmcr & BMCR_ANENABLE) == 0)) {
2107
2108                        bnx2_write_phy(bp, bp->mii_adv, new_adv);
2109                        bnx2_write_phy(bp, MII_CTRL1000, new_adv1000);
2110                        bnx2_write_phy(bp, bp->mii_bmcr, BMCR_ANRESTART |
2111                                BMCR_ANENABLE);
2112                }
2113                else if (bp->link_up) {
2114                        /* Flow ctrl may have changed from auto to forced */
2115                        /* or vice-versa. */
2116
2117                        bnx2_resolve_flow_ctrl(bp);
2118                        bnx2_set_mac_link(bp);
2119                }
2120                return 0;
2121        }
2122
2123        /* advertise nothing when forcing speed */
2124        if (adv_reg != new_adv)
2125                bnx2_write_phy(bp, bp->mii_adv, new_adv);
2126
2127        new_bmcr = 0;
2128        if (bp->req_line_speed == SPEED_100) {
2129                new_bmcr |= BMCR_SPEED100;
2130        }
2131        if (bp->req_duplex == DUPLEX_FULL) {
2132                new_bmcr |= BMCR_FULLDPLX;
2133        }
2134        if (new_bmcr != bmcr) {
2135                u32 bmsr;
2136
2137                bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2138                bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2139
2140                if (bmsr & BMSR_LSTATUS) {
2141                        /* Force link down */
2142                        bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
2143                        spin_unlock_bh(&bp->phy_lock);
2144                        msleep(50);
2145                        spin_lock_bh(&bp->phy_lock);
2146
2147                        bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2148                        bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2149                }
2150
2151                bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
2152
2153                /* Normally, the new speed is setup after the link has
2154                 * gone down and up again. In some cases, link will not go
2155                 * down so we need to set up the new speed here.
2156                 */
2157                if (bmsr & BMSR_LSTATUS) {
2158                        bp->line_speed = bp->req_line_speed;
2159                        bp->duplex = bp->req_duplex;
2160                        bnx2_resolve_flow_ctrl(bp);
2161                        bnx2_set_mac_link(bp);
2162                }
2163        } else {
2164                bnx2_resolve_flow_ctrl(bp);
2165                bnx2_set_mac_link(bp);
2166        }
2167        return 0;
2168}
2169
2170static int
2171bnx2_setup_phy(struct bnx2 *bp, u8 port)
2172__releases(&bp->phy_lock)
2173__acquires(&bp->phy_lock)
2174{
2175        if (bp->loopback == MAC_LOOPBACK)
2176                return 0;
2177
2178        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
2179                return bnx2_setup_serdes_phy(bp, port);
2180        }
2181        else {
2182                return bnx2_setup_copper_phy(bp);
2183        }
2184}
2185
2186static int
2187bnx2_init_5709s_phy(struct bnx2 *bp, int reset_phy)
2188{
2189        u32 val;
2190
2191        bp->mii_bmcr = MII_BMCR + 0x10;
2192        bp->mii_bmsr = MII_BMSR + 0x10;
2193        bp->mii_bmsr1 = MII_BNX2_GP_TOP_AN_STATUS1;
2194        bp->mii_adv = MII_ADVERTISE + 0x10;
2195        bp->mii_lpa = MII_LPA + 0x10;
2196        bp->mii_up1 = MII_BNX2_OVER1G_UP1;
2197
2198        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_AER);
2199        bnx2_write_phy(bp, MII_BNX2_AER_AER, MII_BNX2_AER_AER_AN_MMD);
2200
2201        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
2202        if (reset_phy)
2203                bnx2_reset_phy(bp);
2204
2205        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_SERDES_DIG);
2206
2207        bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, &val);
2208        val &= ~MII_BNX2_SD_1000XCTL1_AUTODET;
2209        val |= MII_BNX2_SD_1000XCTL1_FIBER;
2210        bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, val);
2211
2212        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
2213        bnx2_read_phy(bp, MII_BNX2_OVER1G_UP1, &val);
2214        if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)
2215                val |= BCM5708S_UP1_2G5;
2216        else
2217                val &= ~BCM5708S_UP1_2G5;
2218        bnx2_write_phy(bp, MII_BNX2_OVER1G_UP1, val);
2219
2220        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_BAM_NXTPG);
2221        bnx2_read_phy(bp, MII_BNX2_BAM_NXTPG_CTL, &val);
2222        val |= MII_BNX2_NXTPG_CTL_T2 | MII_BNX2_NXTPG_CTL_BAM;
2223        bnx2_write_phy(bp, MII_BNX2_BAM_NXTPG_CTL, val);
2224
2225        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_CL73_USERB0);
2226
2227        val = MII_BNX2_CL73_BAM_EN | MII_BNX2_CL73_BAM_STA_MGR_EN |
2228              MII_BNX2_CL73_BAM_NP_AFT_BP_EN;
2229        bnx2_write_phy(bp, MII_BNX2_CL73_BAM_CTL1, val);
2230
2231        bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
2232
2233        return 0;
2234}
2235
2236static int
2237bnx2_init_5708s_phy(struct bnx2 *bp, int reset_phy)
2238{
2239        u32 val;
2240
2241        if (reset_phy)
2242                bnx2_reset_phy(bp);
2243
2244        bp->mii_up1 = BCM5708S_UP1;
2245
2246        bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3);
2247        bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE);
2248        bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
2249
2250        bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val);
2251        val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN;
2252        bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val);
2253
2254        bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val);
2255        val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN;
2256        bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val);
2257
2258        if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) {
2259                bnx2_read_phy(bp, BCM5708S_UP1, &val);
2260                val |= BCM5708S_UP1_2G5;
2261                bnx2_write_phy(bp, BCM5708S_UP1, val);
2262        }
2263
2264        if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0) ||
2265            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B0) ||
2266            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B1)) {
2267                /* increase tx signal amplitude */
2268                bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2269                               BCM5708S_BLK_ADDR_TX_MISC);
2270                bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val);
2271                val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM;
2272                bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val);
2273                bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
2274        }
2275
2276        val = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG) &
2277              BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK;
2278
2279        if (val) {
2280                u32 is_backplane;
2281
2282                is_backplane = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG);
2283                if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) {
2284                        bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2285                                       BCM5708S_BLK_ADDR_TX_MISC);
2286                        bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val);
2287                        bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2288                                       BCM5708S_BLK_ADDR_DIG);
2289                }
2290        }
2291        return 0;
2292}
2293
2294static int
2295bnx2_init_5706s_phy(struct bnx2 *bp, int reset_phy)
2296{
2297        if (reset_phy)
2298                bnx2_reset_phy(bp);
2299
2300        bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
2301
2302        if (BNX2_CHIP(bp) == BNX2_CHIP_5706)
2303                BNX2_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300);
2304
2305        if (bp->dev->mtu > ETH_DATA_LEN) {
2306                u32 val;
2307
2308                /* Set extended packet length bit */
2309                bnx2_write_phy(bp, 0x18, 0x7);
2310                bnx2_read_phy(bp, 0x18, &val);
2311                bnx2_write_phy(bp, 0x18, (val & 0xfff8) | 0x4000);
2312
2313                bnx2_write_phy(bp, 0x1c, 0x6c00);
2314                bnx2_read_phy(bp, 0x1c, &val);
2315                bnx2_write_phy(bp, 0x1c, (val & 0x3ff) | 0xec02);
2316        }
2317        else {
2318                u32 val;
2319
2320                bnx2_write_phy(bp, 0x18, 0x7);
2321                bnx2_read_phy(bp, 0x18, &val);
2322                bnx2_write_phy(bp, 0x18, val & ~0x4007);
2323
2324                bnx2_write_phy(bp, 0x1c, 0x6c00);
2325                bnx2_read_phy(bp, 0x1c, &val);
2326                bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
2327        }
2328
2329        return 0;
2330}
2331
2332static int
2333bnx2_init_copper_phy(struct bnx2 *bp, int reset_phy)
2334{
2335        u32 val;
2336
2337        if (reset_phy)
2338                bnx2_reset_phy(bp);
2339
2340        if (bp->phy_flags & BNX2_PHY_FLAG_CRC_FIX) {
2341                bnx2_write_phy(bp, 0x18, 0x0c00);
2342                bnx2_write_phy(bp, 0x17, 0x000a);
2343                bnx2_write_phy(bp, 0x15, 0x310b);
2344                bnx2_write_phy(bp, 0x17, 0x201f);
2345                bnx2_write_phy(bp, 0x15, 0x9506);
2346                bnx2_write_phy(bp, 0x17, 0x401f);
2347                bnx2_write_phy(bp, 0x15, 0x14e2);
2348                bnx2_write_phy(bp, 0x18, 0x0400);
2349        }
2350
2351        if (bp->phy_flags & BNX2_PHY_FLAG_DIS_EARLY_DAC) {
2352                bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS,
2353                               MII_BNX2_DSP_EXPAND_REG | 0x8);
2354                bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val);
2355                val &= ~(1 << 8);
2356                bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val);
2357        }
2358
2359        if (bp->dev->mtu > ETH_DATA_LEN) {
2360                /* Set extended packet length bit */
2361                bnx2_write_phy(bp, 0x18, 0x7);
2362                bnx2_read_phy(bp, 0x18, &val);
2363                bnx2_write_phy(bp, 0x18, val | 0x4000);
2364
2365                bnx2_read_phy(bp, 0x10, &val);
2366                bnx2_write_phy(bp, 0x10, val | 0x1);
2367        }
2368        else {
2369                bnx2_write_phy(bp, 0x18, 0x7);
2370                bnx2_read_phy(bp, 0x18, &val);
2371                bnx2_write_phy(bp, 0x18, val & ~0x4007);
2372
2373                bnx2_read_phy(bp, 0x10, &val);
2374                bnx2_write_phy(bp, 0x10, val & ~0x1);
2375        }
2376
2377        /* ethernet@wirespeed */
2378        bnx2_write_phy(bp, MII_BNX2_AUX_CTL, AUX_CTL_MISC_CTL);
2379        bnx2_read_phy(bp, MII_BNX2_AUX_CTL, &val);
2380        val |=  AUX_CTL_MISC_CTL_WR | AUX_CTL_MISC_CTL_WIRESPEED;
2381
2382        /* auto-mdix */
2383        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
2384                val |=  AUX_CTL_MISC_CTL_AUTOMDIX;
2385
2386        bnx2_write_phy(bp, MII_BNX2_AUX_CTL, val);
2387        return 0;
2388}
2389
2390
2391static int
2392bnx2_init_phy(struct bnx2 *bp, int reset_phy)
2393__releases(&bp->phy_lock)
2394__acquires(&bp->phy_lock)
2395{
2396        u32 val;
2397        int rc = 0;
2398
2399        bp->phy_flags &= ~BNX2_PHY_FLAG_INT_MODE_MASK;
2400        bp->phy_flags |= BNX2_PHY_FLAG_INT_MODE_LINK_READY;
2401
2402        bp->mii_bmcr = MII_BMCR;
2403        bp->mii_bmsr = MII_BMSR;
2404        bp->mii_bmsr1 = MII_BMSR;
2405        bp->mii_adv = MII_ADVERTISE;
2406        bp->mii_lpa = MII_LPA;
2407
2408        BNX2_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
2409
2410        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
2411                goto setup_phy;
2412
2413        bnx2_read_phy(bp, MII_PHYSID1, &val);
2414        bp->phy_id = val << 16;
2415        bnx2_read_phy(bp, MII_PHYSID2, &val);
2416        bp->phy_id |= val & 0xffff;
2417
2418        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
2419                if (BNX2_CHIP(bp) == BNX2_CHIP_5706)
2420                        rc = bnx2_init_5706s_phy(bp, reset_phy);
2421                else if (BNX2_CHIP(bp) == BNX2_CHIP_5708)
2422                        rc = bnx2_init_5708s_phy(bp, reset_phy);
2423                else if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
2424                        rc = bnx2_init_5709s_phy(bp, reset_phy);
2425        }
2426        else {
2427                rc = bnx2_init_copper_phy(bp, reset_phy);
2428        }
2429
2430setup_phy:
2431        if (!rc)
2432                rc = bnx2_setup_phy(bp, bp->phy_port);
2433
2434        return rc;
2435}
2436
2437static int
2438bnx2_set_mac_loopback(struct bnx2 *bp)
2439{
2440        u32 mac_mode;
2441
2442        mac_mode = BNX2_RD(bp, BNX2_EMAC_MODE);
2443        mac_mode &= ~BNX2_EMAC_MODE_PORT;
2444        mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK;
2445        BNX2_WR(bp, BNX2_EMAC_MODE, mac_mode);
2446        bp->link_up = 1;
2447        return 0;
2448}
2449
2450static int bnx2_test_link(struct bnx2 *);
2451
2452static int
2453bnx2_set_phy_loopback(struct bnx2 *bp)
2454{
2455        u32 mac_mode;
2456        int rc, i;
2457
2458        spin_lock_bh(&bp->phy_lock);
2459        rc = bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK | BMCR_FULLDPLX |
2460                            BMCR_SPEED1000);
2461        spin_unlock_bh(&bp->phy_lock);
2462        if (rc)
2463                return rc;
2464
2465        for (i = 0; i < 10; i++) {
2466                if (bnx2_test_link(bp) == 0)
2467                        break;
2468                msleep(100);
2469        }
2470
2471        mac_mode = BNX2_RD(bp, BNX2_EMAC_MODE);
2472        mac_mode &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
2473                      BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
2474                      BNX2_EMAC_MODE_25G_MODE);
2475
2476        mac_mode |= BNX2_EMAC_MODE_PORT_GMII;
2477        BNX2_WR(bp, BNX2_EMAC_MODE, mac_mode);
2478        bp->link_up = 1;
2479        return 0;
2480}
2481
2482static void
2483bnx2_dump_mcp_state(struct bnx2 *bp)
2484{
2485        struct net_device *dev = bp->dev;
2486        u32 mcp_p0, mcp_p1;
2487
2488        netdev_err(dev, "<--- start MCP states dump --->\n");
2489        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
2490                mcp_p0 = BNX2_MCP_STATE_P0;
2491                mcp_p1 = BNX2_MCP_STATE_P1;
2492        } else {
2493                mcp_p0 = BNX2_MCP_STATE_P0_5708;
2494                mcp_p1 = BNX2_MCP_STATE_P1_5708;
2495        }
2496        netdev_err(dev, "DEBUG: MCP_STATE_P0[%08x] MCP_STATE_P1[%08x]\n",
2497                   bnx2_reg_rd_ind(bp, mcp_p0), bnx2_reg_rd_ind(bp, mcp_p1));
2498        netdev_err(dev, "DEBUG: MCP mode[%08x] state[%08x] evt_mask[%08x]\n",
2499                   bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_MODE),
2500                   bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_STATE),
2501                   bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_EVENT_MASK));
2502        netdev_err(dev, "DEBUG: pc[%08x] pc[%08x] instr[%08x]\n",
2503                   bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_PROGRAM_COUNTER),
2504                   bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_PROGRAM_COUNTER),
2505                   bnx2_reg_rd_ind(bp, BNX2_MCP_CPU_INSTRUCTION));
2506        netdev_err(dev, "DEBUG: shmem states:\n");
2507        netdev_err(dev, "DEBUG: drv_mb[%08x] fw_mb[%08x] link_status[%08x]",
2508                   bnx2_shmem_rd(bp, BNX2_DRV_MB),
2509                   bnx2_shmem_rd(bp, BNX2_FW_MB),
2510                   bnx2_shmem_rd(bp, BNX2_LINK_STATUS));
2511        pr_cont(" drv_pulse_mb[%08x]\n", bnx2_shmem_rd(bp, BNX2_DRV_PULSE_MB));
2512        netdev_err(dev, "DEBUG: dev_info_signature[%08x] reset_type[%08x]",
2513                   bnx2_shmem_rd(bp, BNX2_DEV_INFO_SIGNATURE),
2514                   bnx2_shmem_rd(bp, BNX2_BC_STATE_RESET_TYPE));
2515        pr_cont(" condition[%08x]\n",
2516                bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION));
2517        DP_SHMEM_LINE(bp, BNX2_BC_RESET_TYPE);
2518        DP_SHMEM_LINE(bp, 0x3cc);
2519        DP_SHMEM_LINE(bp, 0x3dc);
2520        DP_SHMEM_LINE(bp, 0x3ec);
2521        netdev_err(dev, "DEBUG: 0x3fc[%08x]\n", bnx2_shmem_rd(bp, 0x3fc));
2522        netdev_err(dev, "<--- end MCP states dump --->\n");
2523}
2524
2525static int
2526bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent)
2527{
2528        int i;
2529        u32 val;
2530
2531        bp->fw_wr_seq++;
2532        msg_data |= bp->fw_wr_seq;
2533        bp->fw_last_msg = msg_data;
2534
2535        bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
2536
2537        if (!ack)
2538                return 0;
2539
2540        /* wait for an acknowledgement. */
2541        for (i = 0; i < (BNX2_FW_ACK_TIME_OUT_MS / 10); i++) {
2542                msleep(10);
2543
2544                val = bnx2_shmem_rd(bp, BNX2_FW_MB);
2545
2546                if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
2547                        break;
2548        }
2549        if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0)
2550                return 0;
2551
2552        /* If we timed out, inform the firmware that this is the case. */
2553        if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
2554                msg_data &= ~BNX2_DRV_MSG_CODE;
2555                msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
2556
2557                bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
2558                if (!silent) {
2559                        pr_err("fw sync timeout, reset code = %x\n", msg_data);
2560                        bnx2_dump_mcp_state(bp);
2561                }
2562
2563                return -EBUSY;
2564        }
2565
2566        if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK)
2567                return -EIO;
2568
2569        return 0;
2570}
2571
2572static int
2573bnx2_init_5709_context(struct bnx2 *bp)
2574{
2575        int i, ret = 0;
2576        u32 val;
2577
2578        val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12);
2579        val |= (BNX2_PAGE_BITS - 8) << 16;
2580        BNX2_WR(bp, BNX2_CTX_COMMAND, val);
2581        for (i = 0; i < 10; i++) {
2582                val = BNX2_RD(bp, BNX2_CTX_COMMAND);
2583                if (!(val & BNX2_CTX_COMMAND_MEM_INIT))
2584                        break;
2585                udelay(2);
2586        }
2587        if (val & BNX2_CTX_COMMAND_MEM_INIT)
2588                return -EBUSY;
2589
2590        for (i = 0; i < bp->ctx_pages; i++) {
2591                int j;
2592
2593                if (bp->ctx_blk[i])
2594                        memset(bp->ctx_blk[i], 0, BNX2_PAGE_SIZE);
2595                else
2596                        return -ENOMEM;
2597
2598                BNX2_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0,
2599                        (bp->ctx_blk_mapping[i] & 0xffffffff) |
2600                        BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID);
2601                BNX2_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1,
2602                        (u64) bp->ctx_blk_mapping[i] >> 32);
2603                BNX2_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, i |
2604                        BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ);
2605                for (j = 0; j < 10; j++) {
2606
2607                        val = BNX2_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL);
2608                        if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ))
2609                                break;
2610                        udelay(5);
2611                }
2612                if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) {
2613                        ret = -EBUSY;
2614                        break;
2615                }
2616        }
2617        return ret;
2618}
2619
2620static void
2621bnx2_init_context(struct bnx2 *bp)
2622{
2623        u32 vcid;
2624
2625        vcid = 96;
2626        while (vcid) {
2627                u32 vcid_addr, pcid_addr, offset;
2628                int i;
2629
2630                vcid--;
2631
2632                if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {
2633                        u32 new_vcid;
2634
2635                        vcid_addr = GET_PCID_ADDR(vcid);
2636                        if (vcid & 0x8) {
2637                                new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
2638                        }
2639                        else {
2640                                new_vcid = vcid;
2641                        }
2642                        pcid_addr = GET_PCID_ADDR(new_vcid);
2643                }
2644                else {
2645                        vcid_addr = GET_CID_ADDR(vcid);
2646                        pcid_addr = vcid_addr;
2647                }
2648
2649                for (i = 0; i < (CTX_SIZE / PHY_CTX_SIZE); i++) {
2650                        vcid_addr += (i << PHY_CTX_SHIFT);
2651                        pcid_addr += (i << PHY_CTX_SHIFT);
2652
2653                        BNX2_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
2654                        BNX2_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
2655
2656                        /* Zero out the context. */
2657                        for (offset = 0; offset < PHY_CTX_SIZE; offset += 4)
2658                                bnx2_ctx_wr(bp, vcid_addr, offset, 0);
2659                }
2660        }
2661}
2662
2663static int
2664bnx2_alloc_bad_rbuf(struct bnx2 *bp)
2665{
2666        u16 *good_mbuf;
2667        u32 good_mbuf_cnt;
2668        u32 val;
2669
2670        good_mbuf = kmalloc_array(512, sizeof(u16), GFP_KERNEL);
2671        if (!good_mbuf)
2672                return -ENOMEM;
2673
2674        BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
2675                BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
2676
2677        good_mbuf_cnt = 0;
2678
2679        /* Allocate a bunch of mbufs and save the good ones in an array. */
2680        val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1);
2681        while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
2682                bnx2_reg_wr_ind(bp, BNX2_RBUF_COMMAND,
2683                                BNX2_RBUF_COMMAND_ALLOC_REQ);
2684
2685                val = bnx2_reg_rd_ind(bp, BNX2_RBUF_FW_BUF_ALLOC);
2686
2687                val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
2688
2689                /* The addresses with Bit 9 set are bad memory blocks. */
2690                if (!(val & (1 << 9))) {
2691                        good_mbuf[good_mbuf_cnt] = (u16) val;
2692                        good_mbuf_cnt++;
2693                }
2694
2695                val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1);
2696        }
2697
2698        /* Free the good ones back to the mbuf pool thus discarding
2699         * all the bad ones. */
2700        while (good_mbuf_cnt) {
2701                good_mbuf_cnt--;
2702
2703                val = good_mbuf[good_mbuf_cnt];
2704                val = (val << 9) | val | 1;
2705
2706                bnx2_reg_wr_ind(bp, BNX2_RBUF_FW_BUF_FREE, val);
2707        }
2708        kfree(good_mbuf);
2709        return 0;
2710}
2711
2712static void
2713bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
2714{
2715        u32 val;
2716
2717        val = (mac_addr[0] << 8) | mac_addr[1];
2718
2719        BNX2_WR(bp, BNX2_EMAC_MAC_MATCH0 + (pos * 8), val);
2720
2721        val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
2722                (mac_addr[4] << 8) | mac_addr[5];
2723
2724        BNX2_WR(bp, BNX2_EMAC_MAC_MATCH1 + (pos * 8), val);
2725}
2726
2727static inline int
2728bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
2729{
2730        dma_addr_t mapping;
2731        struct bnx2_sw_pg *rx_pg = &rxr->rx_pg_ring[index];
2732        struct bnx2_rx_bd *rxbd =
2733                &rxr->rx_pg_desc_ring[BNX2_RX_RING(index)][BNX2_RX_IDX(index)];
2734        struct page *page = alloc_page(gfp);
2735
2736        if (!page)
2737                return -ENOMEM;
2738        mapping = dma_map_page(&bp->pdev->dev, page, 0, PAGE_SIZE,
2739                               PCI_DMA_FROMDEVICE);
2740        if (dma_mapping_error(&bp->pdev->dev, mapping)) {
2741                __free_page(page);
2742                return -EIO;
2743        }
2744
2745        rx_pg->page = page;
2746        dma_unmap_addr_set(rx_pg, mapping, mapping);
2747        rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
2748        rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
2749        return 0;
2750}
2751
2752static void
2753bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2754{
2755        struct bnx2_sw_pg *rx_pg = &rxr->rx_pg_ring[index];
2756        struct page *page = rx_pg->page;
2757
2758        if (!page)
2759                return;
2760
2761        dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(rx_pg, mapping),
2762                       PAGE_SIZE, PCI_DMA_FROMDEVICE);
2763
2764        __free_page(page);
2765        rx_pg->page = NULL;
2766}
2767
2768static inline int
2769bnx2_alloc_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp)
2770{
2771        u8 *data;
2772        struct bnx2_sw_bd *rx_buf = &rxr->rx_buf_ring[index];
2773        dma_addr_t mapping;
2774        struct bnx2_rx_bd *rxbd =
2775                &rxr->rx_desc_ring[BNX2_RX_RING(index)][BNX2_RX_IDX(index)];
2776
2777        data = kmalloc(bp->rx_buf_size, gfp);
2778        if (!data)
2779                return -ENOMEM;
2780
2781        mapping = dma_map_single(&bp->pdev->dev,
2782                                 get_l2_fhdr(data),
2783                                 bp->rx_buf_use_size,
2784                                 PCI_DMA_FROMDEVICE);
2785        if (dma_mapping_error(&bp->pdev->dev, mapping)) {
2786                kfree(data);
2787                return -EIO;
2788        }
2789
2790        rx_buf->data = data;
2791        dma_unmap_addr_set(rx_buf, mapping, mapping);
2792
2793        rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
2794        rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
2795
2796        rxr->rx_prod_bseq += bp->rx_buf_use_size;
2797
2798        return 0;
2799}
2800
2801static int
2802bnx2_phy_event_is_set(struct bnx2 *bp, struct bnx2_napi *bnapi, u32 event)
2803{
2804        struct status_block *sblk = bnapi->status_blk.msi;
2805        u32 new_link_state, old_link_state;
2806        int is_set = 1;
2807
2808        new_link_state = sblk->status_attn_bits & event;
2809        old_link_state = sblk->status_attn_bits_ack & event;
2810        if (new_link_state != old_link_state) {
2811                if (new_link_state)
2812                        BNX2_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD, event);
2813                else
2814                        BNX2_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD, event);
2815        } else
2816                is_set = 0;
2817
2818        return is_set;
2819}
2820
2821static void
2822bnx2_phy_int(struct bnx2 *bp, struct bnx2_napi *bnapi)
2823{
2824        spin_lock(&bp->phy_lock);
2825
2826        if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_LINK_STATE))
2827                bnx2_set_link(bp);
2828        if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_TIMER_ABORT))
2829                bnx2_set_remote_link(bp);
2830
2831        spin_unlock(&bp->phy_lock);
2832
2833}
2834
2835static inline u16
2836bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)
2837{
2838        u16 cons;
2839
2840        cons = READ_ONCE(*bnapi->hw_tx_cons_ptr);
2841
2842        if (unlikely((cons & BNX2_MAX_TX_DESC_CNT) == BNX2_MAX_TX_DESC_CNT))
2843                cons++;
2844        return cons;
2845}
2846
2847static int
2848bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
2849{
2850        struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
2851        u16 hw_cons, sw_cons, sw_ring_cons;
2852        int tx_pkt = 0, index;
2853        unsigned int tx_bytes = 0;
2854        struct netdev_queue *txq;
2855
2856        index = (bnapi - bp->bnx2_napi);
2857        txq = netdev_get_tx_queue(bp->dev, index);
2858
2859        hw_cons = bnx2_get_hw_tx_cons(bnapi);
2860        sw_cons = txr->tx_cons;
2861
2862        while (sw_cons != hw_cons) {
2863                struct bnx2_sw_tx_bd *tx_buf;
2864                struct sk_buff *skb;
2865                int i, last;
2866
2867                sw_ring_cons = BNX2_TX_RING_IDX(sw_cons);
2868
2869                tx_buf = &txr->tx_buf_ring[sw_ring_cons];
2870                skb = tx_buf->skb;
2871
2872                /* prefetch skb_end_pointer() to speedup skb_shinfo(skb) */
2873                prefetch(&skb->end);
2874
2875                /* partial BD completions possible with TSO packets */
2876                if (tx_buf->is_gso) {
2877                        u16 last_idx, last_ring_idx;
2878
2879                        last_idx = sw_cons + tx_buf->nr_frags + 1;
2880                        last_ring_idx = sw_ring_cons + tx_buf->nr_frags + 1;
2881                        if (unlikely(last_ring_idx >= BNX2_MAX_TX_DESC_CNT)) {
2882                                last_idx++;
2883                        }
2884                        if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) {
2885                                break;
2886                        }
2887                }
2888
2889                dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
2890                        skb_headlen(skb), PCI_DMA_TODEVICE);
2891
2892                tx_buf->skb = NULL;
2893                last = tx_buf->nr_frags;
2894
2895                for (i = 0; i < last; i++) {
2896                        struct bnx2_sw_tx_bd *tx_buf;
2897
2898                        sw_cons = BNX2_NEXT_TX_BD(sw_cons);
2899
2900                        tx_buf = &txr->tx_buf_ring[BNX2_TX_RING_IDX(sw_cons)];
2901                        dma_unmap_page(&bp->pdev->dev,
2902                                dma_unmap_addr(tx_buf, mapping),
2903                                skb_frag_size(&skb_shinfo(skb)->frags[i]),
2904                                PCI_DMA_TODEVICE);
2905                }
2906
2907                sw_cons = BNX2_NEXT_TX_BD(sw_cons);
2908
2909                tx_bytes += skb->len;
2910                dev_kfree_skb_any(skb);
2911                tx_pkt++;
2912                if (tx_pkt == budget)
2913                        break;
2914
2915                if (hw_cons == sw_cons)
2916                        hw_cons = bnx2_get_hw_tx_cons(bnapi);
2917        }
2918
2919        netdev_tx_completed_queue(txq, tx_pkt, tx_bytes);
2920        txr->hw_tx_cons = hw_cons;
2921        txr->tx_cons = sw_cons;
2922
2923        /* Need to make the tx_cons update visible to bnx2_start_xmit()
2924         * before checking for netif_tx_queue_stopped().  Without the
2925         * memory barrier, there is a small possibility that bnx2_start_xmit()
2926         * will miss it and cause the queue to be stopped forever.
2927         */
2928        smp_mb();
2929
2930        if (unlikely(netif_tx_queue_stopped(txq)) &&
2931                     (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) {
2932                __netif_tx_lock(txq, smp_processor_id());
2933                if ((netif_tx_queue_stopped(txq)) &&
2934                    (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh))
2935                        netif_tx_wake_queue(txq);
2936                __netif_tx_unlock(txq);
2937        }
2938
2939        return tx_pkt;
2940}
2941
2942static void
2943bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
2944                        struct sk_buff *skb, int count)
2945{
2946        struct bnx2_sw_pg *cons_rx_pg, *prod_rx_pg;
2947        struct bnx2_rx_bd *cons_bd, *prod_bd;
2948        int i;
2949        u16 hw_prod, prod;
2950        u16 cons = rxr->rx_pg_cons;
2951
2952        cons_rx_pg = &rxr->rx_pg_ring[cons];
2953
2954        /* The caller was unable to allocate a new page to replace the
2955         * last one in the frags array, so we need to recycle that page
2956         * and then free the skb.
2957         */
2958        if (skb) {
2959                struct page *page;
2960                struct skb_shared_info *shinfo;
2961
2962                shinfo = skb_shinfo(skb);
2963                shinfo->nr_frags--;
2964                page = skb_frag_page(&shinfo->frags[shinfo->nr_frags]);
2965                __skb_frag_set_page(&shinfo->frags[shinfo->nr_frags], NULL);
2966
2967                cons_rx_pg->page = page;
2968                dev_kfree_skb(skb);
2969        }
2970
2971        hw_prod = rxr->rx_pg_prod;
2972
2973        for (i = 0; i < count; i++) {
2974                prod = BNX2_RX_PG_RING_IDX(hw_prod);
2975
2976                prod_rx_pg = &rxr->rx_pg_ring[prod];
2977                cons_rx_pg = &rxr->rx_pg_ring[cons];
2978                cons_bd = &rxr->rx_pg_desc_ring[BNX2_RX_RING(cons)]
2979                                                [BNX2_RX_IDX(cons)];
2980                prod_bd = &rxr->rx_pg_desc_ring[BNX2_RX_RING(prod)]
2981                                                [BNX2_RX_IDX(prod)];
2982
2983                if (prod != cons) {
2984                        prod_rx_pg->page = cons_rx_pg->page;
2985                        cons_rx_pg->page = NULL;
2986                        dma_unmap_addr_set(prod_rx_pg, mapping,
2987                                dma_unmap_addr(cons_rx_pg, mapping));
2988
2989                        prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
2990                        prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
2991
2992                }
2993                cons = BNX2_RX_PG_RING_IDX(BNX2_NEXT_RX_BD(cons));
2994                hw_prod = BNX2_NEXT_RX_BD(hw_prod);
2995        }
2996        rxr->rx_pg_prod = hw_prod;
2997        rxr->rx_pg_cons = cons;
2998}
2999
3000static inline void
3001bnx2_reuse_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
3002                   u8 *data, u16 cons, u16 prod)
3003{
3004        struct bnx2_sw_bd *cons_rx_buf, *prod_rx_buf;
3005        struct bnx2_rx_bd *cons_bd, *prod_bd;
3006
3007        cons_rx_buf = &rxr->rx_buf_ring[cons];
3008        prod_rx_buf = &rxr->rx_buf_ring[prod];
3009
3010        dma_sync_single_for_device(&bp->pdev->dev,
3011                dma_unmap_addr(cons_rx_buf, mapping),
3012                BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
3013
3014        rxr->rx_prod_bseq += bp->rx_buf_use_size;
3015
3016        prod_rx_buf->data = data;
3017
3018        if (cons == prod)
3019                return;
3020
3021        dma_unmap_addr_set(prod_rx_buf, mapping,
3022                        dma_unmap_addr(cons_rx_buf, mapping));
3023
3024        cons_bd = &rxr->rx_desc_ring[BNX2_RX_RING(cons)][BNX2_RX_IDX(cons)];
3025        prod_bd = &rxr->rx_desc_ring[BNX2_RX_RING(prod)][BNX2_RX_IDX(prod)];
3026        prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
3027        prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
3028}
3029
3030static struct sk_buff *
3031bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u8 *data,
3032            unsigned int len, unsigned int hdr_len, dma_addr_t dma_addr,
3033            u32 ring_idx)
3034{
3035        int err;
3036        u16 prod = ring_idx & 0xffff;
3037        struct sk_buff *skb;
3038
3039        err = bnx2_alloc_rx_data(bp, rxr, prod, GFP_ATOMIC);
3040        if (unlikely(err)) {
3041                bnx2_reuse_rx_data(bp, rxr, data, (u16) (ring_idx >> 16), prod);
3042error:
3043                if (hdr_len) {
3044                        unsigned int raw_len = len + 4;
3045                        int pages = PAGE_ALIGN(raw_len - hdr_len) >> PAGE_SHIFT;
3046
3047                        bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
3048                }
3049                return NULL;
3050        }
3051
3052        dma_unmap_single(&bp->pdev->dev, dma_addr, bp->rx_buf_use_size,
3053                         PCI_DMA_FROMDEVICE);
3054        skb = build_skb(data, 0);
3055        if (!skb) {
3056                kfree(data);
3057                goto error;
3058        }
3059        skb_reserve(skb, ((u8 *)get_l2_fhdr(data) - data) + BNX2_RX_OFFSET);
3060        if (hdr_len == 0) {
3061                skb_put(skb, len);
3062                return skb;
3063        } else {
3064                unsigned int i, frag_len, frag_size, pages;
3065                struct bnx2_sw_pg *rx_pg;
3066                u16 pg_cons = rxr->rx_pg_cons;
3067                u16 pg_prod = rxr->rx_pg_prod;
3068
3069                frag_size = len + 4 - hdr_len;
3070                pages = PAGE_ALIGN(frag_size) >> PAGE_SHIFT;
3071                skb_put(skb, hdr_len);
3072
3073                for (i = 0; i < pages; i++) {
3074                        dma_addr_t mapping_old;
3075
3076                        frag_len = min(frag_size, (unsigned int) PAGE_SIZE);
3077                        if (unlikely(frag_len <= 4)) {
3078                                unsigned int tail = 4 - frag_len;
3079
3080                                rxr->rx_pg_cons = pg_cons;
3081                                rxr->rx_pg_prod = pg_prod;
3082                                bnx2_reuse_rx_skb_pages(bp, rxr, NULL,
3083                                                        pages - i);
3084                                skb->len -= tail;
3085                                if (i == 0) {
3086                                        skb->tail -= tail;
3087                                } else {
3088                                        skb_frag_t *frag =
3089                                                &skb_shinfo(skb)->frags[i - 1];
3090                                        skb_frag_size_sub(frag, tail);
3091                                        skb->data_len -= tail;
3092                                }
3093                                return skb;
3094                        }
3095                        rx_pg = &rxr->rx_pg_ring[pg_cons];
3096
3097                        /* Don't unmap yet.  If we're unable to allocate a new
3098                         * page, we need to recycle the page and the DMA addr.
3099                         */
3100                        mapping_old = dma_unmap_addr(rx_pg, mapping);
3101                        if (i == pages - 1)
3102                                frag_len -= 4;
3103
3104                        skb_fill_page_desc(skb, i, rx_pg->page, 0, frag_len);
3105                        rx_pg->page = NULL;
3106
3107                        err = bnx2_alloc_rx_page(bp, rxr,
3108                                                 BNX2_RX_PG_RING_IDX(pg_prod),
3109                                                 GFP_ATOMIC);
3110                        if (unlikely(err)) {
3111                                rxr->rx_pg_cons = pg_cons;
3112                                rxr->rx_pg_prod = pg_prod;
3113                                bnx2_reuse_rx_skb_pages(bp, rxr, skb,
3114                                                        pages - i);
3115                                return NULL;
3116                        }
3117
3118                        dma_unmap_page(&bp->pdev->dev, mapping_old,
3119                                       PAGE_SIZE, PCI_DMA_FROMDEVICE);
3120
3121                        frag_size -= frag_len;
3122                        skb->data_len += frag_len;
3123                        skb->truesize += PAGE_SIZE;
3124                        skb->len += frag_len;
3125
3126                        pg_prod = BNX2_NEXT_RX_BD(pg_prod);
3127                        pg_cons = BNX2_RX_PG_RING_IDX(BNX2_NEXT_RX_BD(pg_cons));
3128                }
3129                rxr->rx_pg_prod = pg_prod;
3130                rxr->rx_pg_cons = pg_cons;
3131        }
3132        return skb;
3133}
3134
3135static inline u16
3136bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)
3137{
3138        u16 cons;
3139
3140        cons = READ_ONCE(*bnapi->hw_rx_cons_ptr);
3141
3142        if (unlikely((cons & BNX2_MAX_RX_DESC_CNT) == BNX2_MAX_RX_DESC_CNT))
3143                cons++;
3144        return cons;
3145}
3146
3147static int
3148bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
3149{
3150        struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3151        u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
3152        struct l2_fhdr *rx_hdr;
3153        int rx_pkt = 0, pg_ring_used = 0;
3154
3155        if (budget <= 0)
3156                return rx_pkt;
3157
3158        hw_cons = bnx2_get_hw_rx_cons(bnapi);
3159        sw_cons = rxr->rx_cons;
3160        sw_prod = rxr->rx_prod;
3161
3162        /* Memory barrier necessary as speculative reads of the rx
3163         * buffer can be ahead of the index in the status block
3164         */
3165        rmb();
3166        while (sw_cons != hw_cons) {
3167                unsigned int len, hdr_len;
3168                u32 status;
3169                struct bnx2_sw_bd *rx_buf, *next_rx_buf;
3170                struct sk_buff *skb;
3171                dma_addr_t dma_addr;
3172                u8 *data;
3173                u16 next_ring_idx;
3174
3175                sw_ring_cons = BNX2_RX_RING_IDX(sw_cons);
3176                sw_ring_prod = BNX2_RX_RING_IDX(sw_prod);
3177
3178                rx_buf = &rxr->rx_buf_ring[sw_ring_cons];
3179                data = rx_buf->data;
3180                rx_buf->data = NULL;
3181
3182                rx_hdr = get_l2_fhdr(data);
3183                prefetch(rx_hdr);
3184
3185                dma_addr = dma_unmap_addr(rx_buf, mapping);
3186
3187                dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr,
3188                        BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,
3189                        PCI_DMA_FROMDEVICE);
3190
3191                next_ring_idx = BNX2_RX_RING_IDX(BNX2_NEXT_RX_BD(sw_cons));
3192                next_rx_buf = &rxr->rx_buf_ring[next_ring_idx];
3193                prefetch(get_l2_fhdr(next_rx_buf->data));
3194
3195                len = rx_hdr->l2_fhdr_pkt_len;
3196                status = rx_hdr->l2_fhdr_status;
3197
3198                hdr_len = 0;
3199                if (status & L2_FHDR_STATUS_SPLIT) {
3200                        hdr_len = rx_hdr->l2_fhdr_ip_xsum;
3201                        pg_ring_used = 1;
3202                } else if (len > bp->rx_jumbo_thresh) {
3203                        hdr_len = bp->rx_jumbo_thresh;
3204                        pg_ring_used = 1;
3205                }
3206
3207                if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
3208                                       L2_FHDR_ERRORS_PHY_DECODE |
3209                                       L2_FHDR_ERRORS_ALIGNMENT |
3210                                       L2_FHDR_ERRORS_TOO_SHORT |
3211                                       L2_FHDR_ERRORS_GIANT_FRAME))) {
3212
3213                        bnx2_reuse_rx_data(bp, rxr, data, sw_ring_cons,
3214                                          sw_ring_prod);
3215                        if (pg_ring_used) {
3216                                int pages;
3217
3218                                pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
3219
3220                                bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
3221                        }
3222                        goto next_rx;
3223                }
3224
3225                len -= 4;
3226
3227                if (len <= bp->rx_copy_thresh) {
3228                        skb = netdev_alloc_skb(bp->dev, len + 6);
3229                        if (!skb) {
3230                                bnx2_reuse_rx_data(bp, rxr, data, sw_ring_cons,
3231                                                  sw_ring_prod);
3232                                goto next_rx;
3233                        }
3234
3235                        /* aligned copy */
3236                        memcpy(skb->data,
3237                               (u8 *)rx_hdr + BNX2_RX_OFFSET - 6,
3238                               len + 6);
3239                        skb_reserve(skb, 6);
3240                        skb_put(skb, len);
3241
3242                        bnx2_reuse_rx_data(bp, rxr, data,
3243                                sw_ring_cons, sw_ring_prod);
3244
3245                } else {
3246                        skb = bnx2_rx_skb(bp, rxr, data, len, hdr_len, dma_addr,
3247                                          (sw_ring_cons << 16) | sw_ring_prod);
3248                        if (!skb)
3249                                goto next_rx;
3250                }
3251                if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) &&
3252                    !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG))
3253                        __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rx_hdr->l2_fhdr_vlan_tag);
3254
3255                skb->protocol = eth_type_trans(skb, bp->dev);
3256
3257                if (len > (bp->dev->mtu + ETH_HLEN) &&
3258                    skb->protocol != htons(0x8100) &&
3259                    skb->protocol != htons(ETH_P_8021AD)) {
3260
3261                        dev_kfree_skb(skb);
3262                        goto next_rx;
3263
3264                }
3265
3266                skb_checksum_none_assert(skb);
3267                if ((bp->dev->features & NETIF_F_RXCSUM) &&
3268                        (status & (L2_FHDR_STATUS_TCP_SEGMENT |
3269                        L2_FHDR_STATUS_UDP_DATAGRAM))) {
3270
3271                        if (likely((status & (L2_FHDR_ERRORS_TCP_XSUM |
3272                                              L2_FHDR_ERRORS_UDP_XSUM)) == 0))
3273                                skb->ip_summed = CHECKSUM_UNNECESSARY;
3274                }
3275                if ((bp->dev->features & NETIF_F_RXHASH) &&
3276                    ((status & L2_FHDR_STATUS_USE_RXHASH) ==
3277                     L2_FHDR_STATUS_USE_RXHASH))
3278                        skb_set_hash(skb, rx_hdr->l2_fhdr_hash,
3279                                     PKT_HASH_TYPE_L3);
3280
3281                skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]);
3282                napi_gro_receive(&bnapi->napi, skb);
3283                rx_pkt++;
3284
3285next_rx:
3286                sw_cons = BNX2_NEXT_RX_BD(sw_cons);
3287                sw_prod = BNX2_NEXT_RX_BD(sw_prod);
3288
3289                if (rx_pkt == budget)
3290                        break;
3291
3292                /* Refresh hw_cons to see if there is new work */
3293                if (sw_cons == hw_cons) {
3294                        hw_cons = bnx2_get_hw_rx_cons(bnapi);
3295                        rmb();
3296                }
3297        }
3298        rxr->rx_cons = sw_cons;
3299        rxr->rx_prod = sw_prod;
3300
3301        if (pg_ring_used)
3302                BNX2_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod);
3303
3304        BNX2_WR16(bp, rxr->rx_bidx_addr, sw_prod);
3305
3306        BNX2_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);
3307
3308        return rx_pkt;
3309
3310}
3311
3312/* MSI ISR - The only difference between this and the INTx ISR
3313 * is that the MSI interrupt is always serviced.
3314 */
3315static irqreturn_t
3316bnx2_msi(int irq, void *dev_instance)
3317{
3318        struct bnx2_napi *bnapi = dev_instance;
3319        struct bnx2 *bp = bnapi->bp;
3320
3321        prefetch(bnapi->status_blk.msi);
3322        BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3323                BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
3324                BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3325
3326        /* Return here if interrupt is disabled. */
3327        if (unlikely(atomic_read(&bp->intr_sem) != 0))
3328                return IRQ_HANDLED;
3329
3330        napi_schedule(&bnapi->napi);
3331
3332        return IRQ_HANDLED;
3333}
3334
3335static irqreturn_t
3336bnx2_msi_1shot(int irq, void *dev_instance)
3337{
3338        struct bnx2_napi *bnapi = dev_instance;
3339        struct bnx2 *bp = bnapi->bp;
3340
3341        prefetch(bnapi->status_blk.msi);
3342
3343        /* Return here if interrupt is disabled. */
3344        if (unlikely(atomic_read(&bp->intr_sem) != 0))
3345                return IRQ_HANDLED;
3346
3347        napi_schedule(&bnapi->napi);
3348
3349        return IRQ_HANDLED;
3350}
3351
3352static irqreturn_t
3353bnx2_interrupt(int irq, void *dev_instance)
3354{
3355        struct bnx2_napi *bnapi = dev_instance;
3356        struct bnx2 *bp = bnapi->bp;
3357        struct status_block *sblk = bnapi->status_blk.msi;
3358
3359        /* When using INTx, it is possible for the interrupt to arrive
3360         * at the CPU before the status block posted prior to the
3361         * interrupt. Reading a register will flush the status block.
3362         * When using MSI, the MSI message will always complete after
3363         * the status block write.
3364         */
3365        if ((sblk->status_idx == bnapi->last_status_idx) &&
3366            (BNX2_RD(bp, BNX2_PCICFG_MISC_STATUS) &
3367             BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
3368                return IRQ_NONE;
3369
3370        BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3371                BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
3372                BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3373
3374        /* Read back to deassert IRQ immediately to avoid too many
3375         * spurious interrupts.
3376         */
3377        BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
3378
3379        /* Return here if interrupt is shared and is disabled. */
3380        if (unlikely(atomic_read(&bp->intr_sem) != 0))
3381                return IRQ_HANDLED;
3382
3383        if (napi_schedule_prep(&bnapi->napi)) {
3384                bnapi->last_status_idx = sblk->status_idx;
3385                __napi_schedule(&bnapi->napi);
3386        }
3387
3388        return IRQ_HANDLED;
3389}
3390
3391static inline int
3392bnx2_has_fast_work(struct bnx2_napi *bnapi)
3393{
3394        struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
3395        struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3396
3397        if ((bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) ||
3398            (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons))
3399                return 1;
3400        return 0;
3401}
3402
3403#define STATUS_ATTN_EVENTS      (STATUS_ATTN_BITS_LINK_STATE | \
3404                                 STATUS_ATTN_BITS_TIMER_ABORT)
3405
3406static inline int
3407bnx2_has_work(struct bnx2_napi *bnapi)
3408{
3409        struct status_block *sblk = bnapi->status_blk.msi;
3410
3411        if (bnx2_has_fast_work(bnapi))
3412                return 1;
3413
3414#ifdef BCM_CNIC
3415        if (bnapi->cnic_present && (bnapi->cnic_tag != sblk->status_idx))
3416                return 1;
3417#endif
3418
3419        if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) !=
3420            (sblk->status_attn_bits_ack & STATUS_ATTN_EVENTS))
3421                return 1;
3422
3423        return 0;
3424}
3425
3426static void
3427bnx2_chk_missed_msi(struct bnx2 *bp)
3428{
3429        struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
3430        u32 msi_ctrl;
3431
3432        if (bnx2_has_work(bnapi)) {
3433                msi_ctrl = BNX2_RD(bp, BNX2_PCICFG_MSI_CONTROL);
3434                if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE))
3435                        return;
3436
3437                if (bnapi->last_status_idx == bp->idle_chk_status_idx) {
3438                        BNX2_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl &
3439                                ~BNX2_PCICFG_MSI_CONTROL_ENABLE);
3440                        BNX2_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl);
3441                        bnx2_msi(bp->irq_tbl[0].vector, bnapi);
3442                }
3443        }
3444
3445        bp->idle_chk_status_idx = bnapi->last_status_idx;
3446}
3447
3448#ifdef BCM_CNIC
3449static void bnx2_poll_cnic(struct bnx2 *bp, struct bnx2_napi *bnapi)
3450{
3451        struct cnic_ops *c_ops;
3452
3453        if (!bnapi->cnic_present)
3454                return;
3455
3456        rcu_read_lock();
3457        c_ops = rcu_dereference(bp->cnic_ops);
3458        if (c_ops)
3459                bnapi->cnic_tag = c_ops->cnic_handler(bp->cnic_data,
3460                                                      bnapi->status_blk.msi);
3461        rcu_read_unlock();
3462}
3463#endif
3464
3465static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi)
3466{
3467        struct status_block *sblk = bnapi->status_blk.msi;
3468        u32 status_attn_bits = sblk->status_attn_bits;
3469        u32 status_attn_bits_ack = sblk->status_attn_bits_ack;
3470
3471        if ((status_attn_bits & STATUS_ATTN_EVENTS) !=
3472            (status_attn_bits_ack & STATUS_ATTN_EVENTS)) {
3473
3474                bnx2_phy_int(bp, bnapi);
3475
3476                /* This is needed to take care of transient status
3477                 * during link changes.
3478                 */
3479                BNX2_WR(bp, BNX2_HC_COMMAND,
3480                        bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
3481                BNX2_RD(bp, BNX2_HC_COMMAND);
3482        }
3483}
3484
3485static int bnx2_poll_work(struct bnx2 *bp, struct bnx2_napi *bnapi,
3486                          int work_done, int budget)
3487{
3488        struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
3489        struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3490
3491        if (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons)
3492                bnx2_tx_int(bp, bnapi, 0);
3493
3494        if (bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons)
3495                work_done += bnx2_rx_int(bp, bnapi, budget - work_done);
3496
3497        return work_done;
3498}
3499
3500static int bnx2_poll_msix(struct napi_struct *napi, int budget)
3501{
3502        struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi);
3503        struct bnx2 *bp = bnapi->bp;
3504        int work_done = 0;
3505        struct status_block_msix *sblk = bnapi->status_blk.msix;
3506
3507        while (1) {
3508                work_done = bnx2_poll_work(bp, bnapi, work_done, budget);
3509                if (unlikely(work_done >= budget))
3510                        break;
3511
3512                bnapi->last_status_idx = sblk->status_idx;
3513                /* status idx must be read before checking for more work. */
3514                rmb();
3515                if (likely(!bnx2_has_fast_work(bnapi))) {
3516
3517                        napi_complete_done(napi, work_done);
3518                        BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
3519                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3520                                bnapi->last_status_idx);
3521                        break;
3522                }
3523        }
3524        return work_done;
3525}
3526
3527static int bnx2_poll(struct napi_struct *napi, int budget)
3528{
3529        struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi);
3530        struct bnx2 *bp = bnapi->bp;
3531        int work_done = 0;
3532        struct status_block *sblk = bnapi->status_blk.msi;
3533
3534        while (1) {
3535                bnx2_poll_link(bp, bnapi);
3536
3537                work_done = bnx2_poll_work(bp, bnapi, work_done, budget);
3538
3539#ifdef BCM_CNIC
3540                bnx2_poll_cnic(bp, bnapi);
3541#endif
3542
3543                /* bnapi->last_status_idx is used below to tell the hw how
3544                 * much work has been processed, so we must read it before
3545                 * checking for more work.
3546                 */
3547                bnapi->last_status_idx = sblk->status_idx;
3548
3549                if (unlikely(work_done >= budget))
3550                        break;
3551
3552                rmb();
3553                if (likely(!bnx2_has_work(bnapi))) {
3554                        napi_complete_done(napi, work_done);
3555                        if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) {
3556                                BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3557                                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3558                                        bnapi->last_status_idx);
3559                                break;
3560                        }
3561                        BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3562                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3563                                BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
3564                                bnapi->last_status_idx);
3565
3566                        BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3567                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3568                                bnapi->last_status_idx);
3569                        break;
3570                }
3571        }
3572
3573        return work_done;
3574}
3575
3576/* Called with rtnl_lock from vlan functions and also netif_tx_lock
3577 * from set_multicast.
3578 */
3579static void
3580bnx2_set_rx_mode(struct net_device *dev)
3581{
3582        struct bnx2 *bp = netdev_priv(dev);
3583        u32 rx_mode, sort_mode;
3584        struct netdev_hw_addr *ha;
3585        int i;
3586
3587        if (!netif_running(dev))
3588                return;
3589
3590        spin_lock_bh(&bp->phy_lock);
3591
3592        rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
3593                                  BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
3594        sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
3595        if (!(dev->features & NETIF_F_HW_VLAN_CTAG_RX) &&
3596             (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN))
3597                rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
3598        if (dev->flags & IFF_PROMISC) {
3599                /* Promiscuous mode. */
3600                rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
3601                sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
3602                             BNX2_RPM_SORT_USER0_PROM_VLAN;
3603        }
3604        else if (dev->flags & IFF_ALLMULTI) {
3605                for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3606                        BNX2_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3607                                0xffffffff);
3608                }
3609                sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
3610        }
3611        else {
3612                /* Accept one or more multicast(s). */
3613                u32 mc_filter[NUM_MC_HASH_REGISTERS];
3614                u32 regidx;
3615                u32 bit;
3616                u32 crc;
3617
3618                memset(mc_filter, 0, 4 * NUM_MC_HASH_REGISTERS);
3619
3620                netdev_for_each_mc_addr(ha, dev) {
3621                        crc = ether_crc_le(ETH_ALEN, ha->addr);
3622                        bit = crc & 0xff;
3623                        regidx = (bit & 0xe0) >> 5;
3624                        bit &= 0x1f;
3625                        mc_filter[regidx] |= (1 << bit);
3626                }
3627
3628                for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3629                        BNX2_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3630                                mc_filter[i]);
3631                }
3632
3633                sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN;
3634        }
3635
3636        if (netdev_uc_count(dev) > BNX2_MAX_UNICAST_ADDRESSES) {
3637                rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
3638                sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
3639                             BNX2_RPM_SORT_USER0_PROM_VLAN;
3640        } else if (!(dev->flags & IFF_PROMISC)) {
3641                /* Add all entries into to the match filter list */
3642                i = 0;
3643                netdev_for_each_uc_addr(ha, dev) {
3644                        bnx2_set_mac_addr(bp, ha->addr,
3645                                          i + BNX2_START_UNICAST_ADDRESS_INDEX);
3646                        sort_mode |= (1 <<
3647                                      (i + BNX2_START_UNICAST_ADDRESS_INDEX));
3648                        i++;
3649                }
3650
3651        }
3652
3653        if (rx_mode != bp->rx_mode) {
3654                bp->rx_mode = rx_mode;
3655                BNX2_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
3656        }
3657
3658        BNX2_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
3659        BNX2_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
3660        BNX2_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
3661
3662        spin_unlock_bh(&bp->phy_lock);
3663}
3664
3665static int
3666check_fw_section(const struct firmware *fw,
3667                 const struct bnx2_fw_file_section *section,
3668                 u32 alignment, bool non_empty)
3669{
3670        u32 offset = be32_to_cpu(section->offset);
3671        u32 len = be32_to_cpu(section->len);
3672
3673        if ((offset == 0 && len != 0) || offset >= fw->size || offset & 3)
3674                return -EINVAL;
3675        if ((non_empty && len == 0) || len > fw->size - offset ||
3676            len & (alignment - 1))
3677                return -EINVAL;
3678        return 0;
3679}
3680
3681static int
3682check_mips_fw_entry(const struct firmware *fw,
3683                    const struct bnx2_mips_fw_file_entry *entry)
3684{
3685        if (check_fw_section(fw, &entry->text, 4, true) ||
3686            check_fw_section(fw, &entry->data, 4, false) ||
3687            check_fw_section(fw, &entry->rodata, 4, false))
3688                return -EINVAL;
3689        return 0;
3690}
3691
3692static void bnx2_release_firmware(struct bnx2 *bp)
3693{
3694        if (bp->rv2p_firmware) {
3695                release_firmware(bp->mips_firmware);
3696                release_firmware(bp->rv2p_firmware);
3697                bp->rv2p_firmware = NULL;
3698        }
3699}
3700
3701static int bnx2_request_uncached_firmware(struct bnx2 *bp)
3702{
3703        const char *mips_fw_file, *rv2p_fw_file;
3704        const struct bnx2_mips_fw_file *mips_fw;
3705        const struct bnx2_rv2p_fw_file *rv2p_fw;
3706        int rc;
3707
3708        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
3709                mips_fw_file = FW_MIPS_FILE_09;
3710                if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5709_A0) ||
3711                    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5709_A1))
3712                        rv2p_fw_file = FW_RV2P_FILE_09_Ax;
3713                else
3714                        rv2p_fw_file = FW_RV2P_FILE_09;
3715        } else {
3716                mips_fw_file = FW_MIPS_FILE_06;
3717                rv2p_fw_file = FW_RV2P_FILE_06;
3718        }
3719
3720        rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev);
3721        if (rc) {
3722                pr_err("Can't load firmware file \"%s\"\n", mips_fw_file);
3723                goto out;
3724        }
3725
3726        rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev);
3727        if (rc) {
3728                pr_err("Can't load firmware file \"%s\"\n", rv2p_fw_file);
3729                goto err_release_mips_firmware;
3730        }
3731        mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3732        rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
3733        if (bp->mips_firmware->size < sizeof(*mips_fw) ||
3734            check_mips_fw_entry(bp->mips_firmware, &mips_fw->com) ||
3735            check_mips_fw_entry(bp->mips_firmware, &mips_fw->cp) ||
3736            check_mips_fw_entry(bp->mips_firmware, &mips_fw->rxp) ||
3737            check_mips_fw_entry(bp->mips_firmware, &mips_fw->tpat) ||
3738            check_mips_fw_entry(bp->mips_firmware, &mips_fw->txp)) {
3739                pr_err("Firmware file \"%s\" is invalid\n", mips_fw_file);
3740                rc = -EINVAL;
3741                goto err_release_firmware;
3742        }
3743        if (bp->rv2p_firmware->size < sizeof(*rv2p_fw) ||
3744            check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc1.rv2p, 8, true) ||
3745            check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc2.rv2p, 8, true)) {
3746                pr_err("Firmware file \"%s\" is invalid\n", rv2p_fw_file);
3747                rc = -EINVAL;
3748                goto err_release_firmware;
3749        }
3750out:
3751        return rc;
3752
3753err_release_firmware:
3754        release_firmware(bp->rv2p_firmware);
3755        bp->rv2p_firmware = NULL;
3756err_release_mips_firmware:
3757        release_firmware(bp->mips_firmware);
3758        goto out;
3759}
3760
3761static int bnx2_request_firmware(struct bnx2 *bp)
3762{
3763        return bp->rv2p_firmware ? 0 : bnx2_request_uncached_firmware(bp);
3764}
3765
3766static u32
3767rv2p_fw_fixup(u32 rv2p_proc, int idx, u32 loc, u32 rv2p_code)
3768{
3769        switch (idx) {
3770        case RV2P_P1_FIXUP_PAGE_SIZE_IDX:
3771                rv2p_code &= ~RV2P_BD_PAGE_SIZE_MSK;
3772                rv2p_code |= RV2P_BD_PAGE_SIZE;
3773                break;
3774        }
3775        return rv2p_code;
3776}
3777
3778static int
3779load_rv2p_fw(struct bnx2 *bp, u32 rv2p_proc,
3780             const struct bnx2_rv2p_fw_file_entry *fw_entry)
3781{
3782        u32 rv2p_code_len, file_offset;
3783        __be32 *rv2p_code;
3784        int i;
3785        u32 val, cmd, addr;
3786
3787        rv2p_code_len = be32_to_cpu(fw_entry->rv2p.len);
3788        file_offset = be32_to_cpu(fw_entry->rv2p.offset);
3789
3790        rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
3791
3792        if (rv2p_proc == RV2P_PROC1) {
3793                cmd = BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
3794                addr = BNX2_RV2P_PROC1_ADDR_CMD;
3795        } else {
3796                cmd = BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
3797                addr = BNX2_RV2P_PROC2_ADDR_CMD;
3798        }
3799
3800        for (i = 0; i < rv2p_code_len; i += 8) {
3801                BNX2_WR(bp, BNX2_RV2P_INSTR_HIGH, be32_to_cpu(*rv2p_code));
3802                rv2p_code++;
3803                BNX2_WR(bp, BNX2_RV2P_INSTR_LOW, be32_to_cpu(*rv2p_code));
3804                rv2p_code++;
3805
3806                val = (i / 8) | cmd;
3807                BNX2_WR(bp, addr, val);
3808        }
3809
3810        rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
3811        for (i = 0; i < 8; i++) {
3812                u32 loc, code;
3813
3814                loc = be32_to_cpu(fw_entry->fixup[i]);
3815                if (loc && ((loc * 4) < rv2p_code_len)) {
3816                        code = be32_to_cpu(*(rv2p_code + loc - 1));
3817                        BNX2_WR(bp, BNX2_RV2P_INSTR_HIGH, code);
3818                        code = be32_to_cpu(*(rv2p_code + loc));
3819                        code = rv2p_fw_fixup(rv2p_proc, i, loc, code);
3820                        BNX2_WR(bp, BNX2_RV2P_INSTR_LOW, code);
3821
3822                        val = (loc / 2) | cmd;
3823                        BNX2_WR(bp, addr, val);
3824                }
3825        }
3826
3827        /* Reset the processor, un-stall is done later. */
3828        if (rv2p_proc == RV2P_PROC1) {
3829                BNX2_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
3830        }
3831        else {
3832                BNX2_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
3833        }
3834
3835        return 0;
3836}
3837
3838static int
3839load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg,
3840            const struct bnx2_mips_fw_file_entry *fw_entry)
3841{
3842        u32 addr, len, file_offset;
3843        __be32 *data;
3844        u32 offset;
3845        u32 val;
3846
3847        /* Halt the CPU. */
3848        val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
3849        val |= cpu_reg->mode_value_halt;
3850        bnx2_reg_wr_ind(bp, cpu_reg->mode, val);
3851        bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
3852
3853        /* Load the Text area. */
3854        addr = be32_to_cpu(fw_entry->text.addr);
3855        len = be32_to_cpu(fw_entry->text.len);
3856        file_offset = be32_to_cpu(fw_entry->text.offset);
3857        data = (__be32 *)(bp->mips_firmware->data + file_offset);
3858
3859        offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3860        if (len) {
3861                int j;
3862
3863                for (j = 0; j < (len / 4); j++, offset += 4)
3864                        bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3865        }
3866
3867        /* Load the Data area. */
3868        addr = be32_to_cpu(fw_entry->data.addr);
3869        len = be32_to_cpu(fw_entry->data.len);
3870        file_offset = be32_to_cpu(fw_entry->data.offset);
3871        data = (__be32 *)(bp->mips_firmware->data + file_offset);
3872
3873        offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3874        if (len) {
3875                int j;
3876
3877                for (j = 0; j < (len / 4); j++, offset += 4)
3878                        bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3879        }
3880
3881        /* Load the Read-Only area. */
3882        addr = be32_to_cpu(fw_entry->rodata.addr);
3883        len = be32_to_cpu(fw_entry->rodata.len);
3884        file_offset = be32_to_cpu(fw_entry->rodata.offset);
3885        data = (__be32 *)(bp->mips_firmware->data + file_offset);
3886
3887        offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3888        if (len) {
3889                int j;
3890
3891                for (j = 0; j < (len / 4); j++, offset += 4)
3892                        bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3893        }
3894
3895        /* Clear the pre-fetch instruction. */
3896        bnx2_reg_wr_ind(bp, cpu_reg->inst, 0);
3897
3898        val = be32_to_cpu(fw_entry->start_addr);
3899        bnx2_reg_wr_ind(bp, cpu_reg->pc, val);
3900
3901        /* Start the CPU. */
3902        val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
3903        val &= ~cpu_reg->mode_value_halt;
3904        bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
3905        bnx2_reg_wr_ind(bp, cpu_reg->mode, val);
3906
3907        return 0;
3908}
3909
3910static int
3911bnx2_init_cpus(struct bnx2 *bp)
3912{
3913        const struct bnx2_mips_fw_file *mips_fw =
3914                (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3915        const struct bnx2_rv2p_fw_file *rv2p_fw =
3916                (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
3917        int rc;
3918
3919        /* Initialize the RV2P processor. */
3920        load_rv2p_fw(bp, RV2P_PROC1, &rv2p_fw->proc1);
3921        load_rv2p_fw(bp, RV2P_PROC2, &rv2p_fw->proc2);
3922
3923        /* Initialize the RX Processor. */
3924        rc = load_cpu_fw(bp, &cpu_reg_rxp, &mips_fw->rxp);
3925        if (rc)
3926                goto init_cpu_err;
3927
3928        /* Initialize the TX Processor. */
3929        rc = load_cpu_fw(bp, &cpu_reg_txp, &mips_fw->txp);
3930        if (rc)
3931                goto init_cpu_err;
3932
3933        /* Initialize the TX Patch-up Processor. */
3934        rc = load_cpu_fw(bp, &cpu_reg_tpat, &mips_fw->tpat);
3935        if (rc)
3936                goto init_cpu_err;
3937
3938        /* Initialize the Completion Processor. */
3939        rc = load_cpu_fw(bp, &cpu_reg_com, &mips_fw->com);
3940        if (rc)
3941                goto init_cpu_err;
3942
3943        /* Initialize the Command Processor. */
3944        rc = load_cpu_fw(bp, &cpu_reg_cp, &mips_fw->cp);
3945
3946init_cpu_err:
3947        return rc;
3948}
3949
3950static void
3951bnx2_setup_wol(struct bnx2 *bp)
3952{
3953        int i;
3954        u32 val, wol_msg;
3955
3956        if (bp->wol) {
3957                u32 advertising;
3958                u8 autoneg;
3959
3960                autoneg = bp->autoneg;
3961                advertising = bp->advertising;
3962
3963                if (bp->phy_port == PORT_TP) {
3964                        bp->autoneg = AUTONEG_SPEED;
3965                        bp->advertising = ADVERTISED_10baseT_Half |
3966                                ADVERTISED_10baseT_Full |
3967                                ADVERTISED_100baseT_Half |
3968                                ADVERTISED_100baseT_Full |
3969                                ADVERTISED_Autoneg;
3970                }
3971
3972                spin_lock_bh(&bp->phy_lock);
3973                bnx2_setup_phy(bp, bp->phy_port);
3974                spin_unlock_bh(&bp->phy_lock);
3975
3976                bp->autoneg = autoneg;
3977                bp->advertising = advertising;
3978
3979                bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0);
3980
3981                val = BNX2_RD(bp, BNX2_EMAC_MODE);
3982
3983                /* Enable port mode. */
3984                val &= ~BNX2_EMAC_MODE_PORT;
3985                val |= BNX2_EMAC_MODE_MPKT_RCVD |
3986                       BNX2_EMAC_MODE_ACPI_RCVD |
3987                       BNX2_EMAC_MODE_MPKT;
3988                if (bp->phy_port == PORT_TP) {
3989                        val |= BNX2_EMAC_MODE_PORT_MII;
3990                } else {
3991                        val |= BNX2_EMAC_MODE_PORT_GMII;
3992                        if (bp->line_speed == SPEED_2500)
3993                                val |= BNX2_EMAC_MODE_25G_MODE;
3994                }
3995
3996                BNX2_WR(bp, BNX2_EMAC_MODE, val);
3997
3998                /* receive all multicast */
3999                for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
4000                        BNX2_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
4001                                0xffffffff);
4002                }
4003                BNX2_WR(bp, BNX2_EMAC_RX_MODE, BNX2_EMAC_RX_MODE_SORT_MODE);
4004
4005                val = 1 | BNX2_RPM_SORT_USER0_BC_EN | BNX2_RPM_SORT_USER0_MC_EN;
4006                BNX2_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
4007                BNX2_WR(bp, BNX2_RPM_SORT_USER0, val);
4008                BNX2_WR(bp, BNX2_RPM_SORT_USER0, val | BNX2_RPM_SORT_USER0_ENA);
4009
4010                /* Need to enable EMAC and RPM for WOL. */
4011                BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
4012                        BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE |
4013                        BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE |
4014                        BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE);
4015
4016                val = BNX2_RD(bp, BNX2_RPM_CONFIG);
4017                val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
4018                BNX2_WR(bp, BNX2_RPM_CONFIG, val);
4019
4020                wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
4021        } else {
4022                        wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
4023        }
4024
4025        if (!(bp->flags & BNX2_FLAG_NO_WOL)) {
4026                u32 val;
4027
4028                wol_msg |= BNX2_DRV_MSG_DATA_WAIT3;
4029                if (bp->fw_last_msg || BNX2_CHIP(bp) != BNX2_CHIP_5709) {
4030                        bnx2_fw_sync(bp, wol_msg, 1, 0);
4031                        return;
4032                }
4033                /* Tell firmware not to power down the PHY yet, otherwise
4034                 * the chip will take a long time to respond to MMIO reads.
4035                 */
4036                val = bnx2_shmem_rd(bp, BNX2_PORT_FEATURE);
4037                bnx2_shmem_wr(bp, BNX2_PORT_FEATURE,
4038                              val | BNX2_PORT_FEATURE_ASF_ENABLED);
4039                bnx2_fw_sync(bp, wol_msg, 1, 0);
4040                bnx2_shmem_wr(bp, BNX2_PORT_FEATURE, val);
4041        }
4042
4043}
4044
4045static int
4046bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)
4047{
4048        switch (state) {
4049        case PCI_D0: {
4050                u32 val;
4051
4052                pci_enable_wake(bp->pdev, PCI_D0, false);
4053                pci_set_power_state(bp->pdev, PCI_D0);
4054
4055                val = BNX2_RD(bp, BNX2_EMAC_MODE);
4056                val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
4057                val &= ~BNX2_EMAC_MODE_MPKT;
4058                BNX2_WR(bp, BNX2_EMAC_MODE, val);
4059
4060                val = BNX2_RD(bp, BNX2_RPM_CONFIG);
4061                val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
4062                BNX2_WR(bp, BNX2_RPM_CONFIG, val);
4063                break;
4064        }
4065        case PCI_D3hot: {
4066                bnx2_setup_wol(bp);
4067                pci_wake_from_d3(bp->pdev, bp->wol);
4068                if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) ||
4069                    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1)) {
4070
4071                        if (bp->wol)
4072                                pci_set_power_state(bp->pdev, PCI_D3hot);
4073                        break;
4074
4075                }
4076                if (!bp->fw_last_msg && BNX2_CHIP(bp) == BNX2_CHIP_5709) {
4077                        u32 val;
4078
4079                        /* Tell firmware not to power down the PHY yet,
4080                         * otherwise the other port may not respond to
4081                         * MMIO reads.
4082                         */
4083                        val = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION);
4084                        val &= ~BNX2_CONDITION_PM_STATE_MASK;
4085                        val |= BNX2_CONDITION_PM_STATE_UNPREP;
4086                        bnx2_shmem_wr(bp, BNX2_BC_STATE_CONDITION, val);
4087                }
4088                pci_set_power_state(bp->pdev, PCI_D3hot);
4089
4090                /* No more memory access after this point until
4091                 * device is brought back to D0.
4092                 */
4093                break;
4094        }
4095        default:
4096                return -EINVAL;
4097        }
4098        return 0;
4099}
4100
4101static int
4102bnx2_acquire_nvram_lock(struct bnx2 *bp)
4103{
4104        u32 val;
4105        int j;
4106
4107        /* Request access to the flash interface. */
4108        BNX2_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2);
4109        for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4110                val = BNX2_RD(bp, BNX2_NVM_SW_ARB);
4111                if (val & BNX2_NVM_SW_ARB_ARB_ARB2)
4112                        break;
4113
4114                udelay(5);
4115        }
4116
4117        if (j >= NVRAM_TIMEOUT_COUNT)
4118                return -EBUSY;
4119
4120        return 0;
4121}
4122
4123static int
4124bnx2_release_nvram_lock(struct bnx2 *bp)
4125{
4126        int j;
4127        u32 val;
4128
4129        /* Relinquish nvram interface. */
4130        BNX2_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2);
4131
4132        for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4133                val = BNX2_RD(bp, BNX2_NVM_SW_ARB);
4134                if (!(val & BNX2_NVM_SW_ARB_ARB_ARB2))
4135                        break;
4136
4137                udelay(5);
4138        }
4139
4140        if (j >= NVRAM_TIMEOUT_COUNT)
4141                return -EBUSY;
4142
4143        return 0;
4144}
4145
4146
4147static int
4148bnx2_enable_nvram_write(struct bnx2 *bp)
4149{
4150        u32 val;
4151
4152        val = BNX2_RD(bp, BNX2_MISC_CFG);
4153        BNX2_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI);
4154
4155        if (bp->flash_info->flags & BNX2_NV_WREN) {
4156                int j;
4157
4158                BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4159                BNX2_WR(bp, BNX2_NVM_COMMAND,
4160                        BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT);
4161
4162                for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4163                        udelay(5);
4164
4165                        val = BNX2_RD(bp, BNX2_NVM_COMMAND);
4166                        if (val & BNX2_NVM_COMMAND_DONE)
4167                                break;
4168                }
4169
4170                if (j >= NVRAM_TIMEOUT_COUNT)
4171                        return -EBUSY;
4172        }
4173        return 0;
4174}
4175
4176static void
4177bnx2_disable_nvram_write(struct bnx2 *bp)
4178{
4179        u32 val;
4180
4181        val = BNX2_RD(bp, BNX2_MISC_CFG);
4182        BNX2_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN);
4183}
4184
4185
4186static void
4187bnx2_enable_nvram_access(struct bnx2 *bp)
4188{
4189        u32 val;
4190
4191        val = BNX2_RD(bp, BNX2_NVM_ACCESS_ENABLE);
4192        /* Enable both bits, even on read. */
4193        BNX2_WR(bp, BNX2_NVM_ACCESS_ENABLE,
4194                val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);
4195}
4196
4197static void
4198bnx2_disable_nvram_access(struct bnx2 *bp)
4199{
4200        u32 val;
4201
4202        val = BNX2_RD(bp, BNX2_NVM_ACCESS_ENABLE);
4203        /* Disable both bits, even after read. */
4204        BNX2_WR(bp, BNX2_NVM_ACCESS_ENABLE,
4205                val & ~(BNX2_NVM_ACCESS_ENABLE_EN |
4206                        BNX2_NVM_ACCESS_ENABLE_WR_EN));
4207}
4208
4209static int
4210bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset)
4211{
4212        u32 cmd;
4213        int j;
4214
4215        if (bp->flash_info->flags & BNX2_NV_BUFFERED)
4216                /* Buffered flash, no erase needed */
4217                return 0;
4218
4219        /* Build an erase command */
4220        cmd = BNX2_NVM_COMMAND_ERASE | BNX2_NVM_COMMAND_WR |
4221              BNX2_NVM_COMMAND_DOIT;
4222
4223        /* Need to clear DONE bit separately. */
4224        BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4225
4226        /* Address of the NVRAM to read from. */
4227        BNX2_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
4228
4229        /* Issue an erase command. */
4230        BNX2_WR(bp, BNX2_NVM_COMMAND, cmd);
4231
4232        /* Wait for completion. */
4233        for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4234                u32 val;
4235
4236                udelay(5);
4237
4238                val = BNX2_RD(bp, BNX2_NVM_COMMAND);
4239                if (val & BNX2_NVM_COMMAND_DONE)
4240                        break;
4241        }
4242
4243        if (j >= NVRAM_TIMEOUT_COUNT)
4244                return -EBUSY;
4245
4246        return 0;
4247}
4248
4249static int
4250bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags)
4251{
4252        u32 cmd;
4253        int j;
4254
4255        /* Build the command word. */
4256        cmd = BNX2_NVM_COMMAND_DOIT | cmd_flags;
4257
4258        /* Calculate an offset of a buffered flash, not needed for 5709. */
4259        if (bp->flash_info->flags & BNX2_NV_TRANSLATE) {
4260                offset = ((offset / bp->flash_info->page_size) <<
4261                           bp->flash_info->page_bits) +
4262                          (offset % bp->flash_info->page_size);
4263        }
4264
4265        /* Need to clear DONE bit separately. */
4266        BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4267
4268        /* Address of the NVRAM to read from. */
4269        BNX2_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
4270
4271        /* Issue a read command. */
4272        BNX2_WR(bp, BNX2_NVM_COMMAND, cmd);
4273
4274        /* Wait for completion. */
4275        for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4276                u32 val;
4277
4278                udelay(5);
4279
4280                val = BNX2_RD(bp, BNX2_NVM_COMMAND);
4281                if (val & BNX2_NVM_COMMAND_DONE) {
4282                        __be32 v = cpu_to_be32(BNX2_RD(bp, BNX2_NVM_READ));
4283                        memcpy(ret_val, &v, 4);
4284                        break;
4285                }
4286        }
4287        if (j >= NVRAM_TIMEOUT_COUNT)
4288                return -EBUSY;
4289
4290        return 0;
4291}
4292
4293
4294static int
4295bnx2_nvram_write_dword(struct bnx2 *bp, u32 offset, u8 *val, u32 cmd_flags)
4296{
4297        u32 cmd;
4298        __be32 val32;
4299        int j;
4300
4301        /* Build the command word. */
4302        cmd = BNX2_NVM_COMMAND_DOIT | BNX2_NVM_COMMAND_WR | cmd_flags;
4303
4304        /* Calculate an offset of a buffered flash, not needed for 5709. */
4305        if (bp->flash_info->flags & BNX2_NV_TRANSLATE) {
4306                offset = ((offset / bp->flash_info->page_size) <<
4307                          bp->flash_info->page_bits) +
4308                         (offset % bp->flash_info->page_size);
4309        }
4310
4311        /* Need to clear DONE bit separately. */
4312        BNX2_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4313
4314        memcpy(&val32, val, 4);
4315
4316        /* Write the data. */
4317        BNX2_WR(bp, BNX2_NVM_WRITE, be32_to_cpu(val32));
4318
4319        /* Address of the NVRAM to write to. */
4320        BNX2_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
4321
4322        /* Issue the write command. */
4323        BNX2_WR(bp, BNX2_NVM_COMMAND, cmd);
4324
4325        /* Wait for completion. */
4326        for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4327                udelay(5);
4328
4329                if (BNX2_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE)
4330                        break;
4331        }
4332        if (j >= NVRAM_TIMEOUT_COUNT)
4333                return -EBUSY;
4334
4335        return 0;
4336}
4337
4338static int
4339bnx2_init_nvram(struct bnx2 *bp)
4340{
4341        u32 val;
4342        int j, entry_count, rc = 0;
4343        const struct flash_spec *flash;
4344
4345        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
4346                bp->flash_info = &flash_5709;
4347                goto get_flash_size;
4348        }
4349
4350        /* Determine the selected interface. */
4351        val = BNX2_RD(bp, BNX2_NVM_CFG1);
4352
4353        entry_count = ARRAY_SIZE(flash_table);
4354
4355        if (val & 0x40000000) {
4356
4357                /* Flash interface has been reconfigured */
4358                for (j = 0, flash = &flash_table[0]; j < entry_count;
4359                     j++, flash++) {
4360                        if ((val & FLASH_BACKUP_STRAP_MASK) ==
4361                            (flash->config1 & FLASH_BACKUP_STRAP_MASK)) {
4362                                bp->flash_info = flash;
4363                                break;
4364                        }
4365                }
4366        }
4367        else {
4368                u32 mask;
4369                /* Not yet been reconfigured */
4370
4371                if (val & (1 << 23))
4372                        mask = FLASH_BACKUP_STRAP_MASK;
4373                else
4374                        mask = FLASH_STRAP_MASK;
4375
4376                for (j = 0, flash = &flash_table[0]; j < entry_count;
4377                        j++, flash++) {
4378
4379                        if ((val & mask) == (flash->strapping & mask)) {
4380                                bp->flash_info = flash;
4381
4382                                /* Request access to the flash interface. */
4383                                if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
4384                                        return rc;
4385
4386                                /* Enable access to flash interface */
4387                                bnx2_enable_nvram_access(bp);
4388
4389                                /* Reconfigure the flash interface */
4390                                BNX2_WR(bp, BNX2_NVM_CFG1, flash->config1);
4391                                BNX2_WR(bp, BNX2_NVM_CFG2, flash->config2);
4392                                BNX2_WR(bp, BNX2_NVM_CFG3, flash->config3);
4393                                BNX2_WR(bp, BNX2_NVM_WRITE1, flash->write1);
4394
4395                                /* Disable access to flash interface */
4396                                bnx2_disable_nvram_access(bp);
4397                                bnx2_release_nvram_lock(bp);
4398
4399                                break;
4400                        }
4401                }
4402        } /* if (val & 0x40000000) */
4403
4404        if (j == entry_count) {
4405                bp->flash_info = NULL;
4406                pr_alert("Unknown flash/EEPROM type\n");
4407                return -ENODEV;
4408        }
4409
4410get_flash_size:
4411        val = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG2);
4412        val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK;
4413        if (val)
4414                bp->flash_size = val;
4415        else
4416                bp->flash_size = bp->flash_info->total_size;
4417
4418        return rc;
4419}
4420
4421static int
4422bnx2_nvram_read(struct bnx2 *bp, u32 offset, u8 *ret_buf,
4423                int buf_size)
4424{
4425        int rc = 0;
4426        u32 cmd_flags, offset32, len32, extra;
4427
4428        if (buf_size == 0)
4429                return 0;
4430
4431        /* Request access to the flash interface. */
4432        if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
4433                return rc;
4434
4435        /* Enable access to flash interface */
4436        bnx2_enable_nvram_access(bp);
4437
4438        len32 = buf_size;
4439        offset32 = offset;
4440        extra = 0;
4441
4442        cmd_flags = 0;
4443
4444        if (offset32 & 3) {
4445                u8 buf[4];
4446                u32 pre_len;
4447
4448                offset32 &= ~3;
4449                pre_len = 4 - (offset & 3);
4450
4451                if (pre_len >= len32) {
4452                        pre_len = len32;
4453                        cmd_flags = BNX2_NVM_COMMAND_FIRST |
4454                                    BNX2_NVM_COMMAND_LAST;
4455                }
4456                else {
4457                        cmd_flags = BNX2_NVM_COMMAND_FIRST;
4458                }
4459
4460                rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
4461
4462                if (rc)
4463                        return rc;
4464
4465                memcpy(ret_buf, buf + (offset & 3), pre_len);
4466
4467                offset32 += 4;
4468                ret_buf += pre_len;
4469                len32 -= pre_len;
4470        }
4471        if (len32 & 3) {
4472                extra = 4 - (len32 & 3);
4473                len32 = (len32 + 4) & ~3;
4474        }
4475
4476        if (len32 == 4) {
4477                u8 buf[4];
4478
4479                if (cmd_flags)
4480                        cmd_flags = BNX2_NVM_COMMAND_LAST;
4481                else
4482                        cmd_flags = BNX2_NVM_COMMAND_FIRST |
4483                                    BNX2_NVM_COMMAND_LAST;
4484
4485                rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
4486
4487                memcpy(ret_buf, buf, 4 - extra);
4488        }
4489        else if (len32 > 0) {
4490                u8 buf[4];
4491
4492                /* Read the first word. */
4493                if (cmd_flags)
4494                        cmd_flags = 0;
4495                else
4496                        cmd_flags = BNX2_NVM_COMMAND_FIRST;
4497
4498                rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, cmd_flags);
4499
4500                /* Advance to the next dword. */
4501                offset32 += 4;
4502                ret_buf += 4;
4503                len32 -= 4;
4504
4505                while (len32 > 4 && rc == 0) {
4506                        rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, 0);
4507
4508                        /* Advance to the next dword. */
4509                        offset32 += 4;
4510                        ret_buf += 4;
4511                        len32 -= 4;
4512                }
4513
4514                if (rc)
4515                        return rc;
4516
4517                cmd_flags = BNX2_NVM_COMMAND_LAST;
4518                rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
4519
4520                memcpy(ret_buf, buf, 4 - extra);
4521        }
4522
4523        /* Disable access to flash interface */
4524        bnx2_disable_nvram_access(bp);
4525
4526        bnx2_release_nvram_lock(bp);
4527
4528        return rc;
4529}
4530
4531static int
4532bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf,
4533                int buf_size)
4534{
4535        u32 written, offset32, len32;
4536        u8 *buf, start[4], end[4], *align_buf = NULL, *flash_buffer = NULL;
4537        int rc = 0;
4538        int align_start, align_end;
4539
4540        buf = data_buf;
4541        offset32 = offset;
4542        len32 = buf_size;
4543        align_start = align_end = 0;
4544
4545        if ((align_start = (offset32 & 3))) {
4546                offset32 &= ~3;
4547                len32 += align_start;
4548                if (len32 < 4)
4549                        len32 = 4;
4550                if ((rc = bnx2_nvram_read(bp, offset32, start, 4)))
4551                        return rc;
4552        }
4553
4554        if (len32 & 3) {
4555                align_end = 4 - (len32 & 3);
4556                len32 += align_end;
4557                if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4, end, 4)))
4558                        return rc;
4559        }
4560
4561        if (align_start || align_end) {
4562                align_buf = kmalloc(len32, GFP_KERNEL);
4563                if (!align_buf)
4564                        return -ENOMEM;
4565                if (align_start) {
4566                        memcpy(align_buf, start, 4);
4567                }
4568                if (align_end) {
4569                        memcpy(align_buf + len32 - 4, end, 4);
4570                }
4571                memcpy(align_buf + align_start, data_buf, buf_size);
4572                buf = align_buf;
4573        }
4574
4575        if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4576                flash_buffer = kmalloc(264, GFP_KERNEL);
4577                if (!flash_buffer) {
4578                        rc = -ENOMEM;
4579                        goto nvram_write_end;
4580                }
4581        }
4582
4583        written = 0;
4584        while ((written < len32) && (rc == 0)) {
4585                u32 page_start, page_end, data_start, data_end;
4586                u32 addr, cmd_flags;
4587                int i;
4588
4589                /* Find the page_start addr */
4590                page_start = offset32 + written;
4591                page_start -= (page_start % bp->flash_info->page_size);
4592                /* Find the page_end addr */
4593                page_end = page_start + bp->flash_info->page_size;
4594                /* Find the data_start addr */
4595                data_start = (written == 0) ? offset32 : page_start;
4596                /* Find the data_end addr */
4597                data_end = (page_end > offset32 + len32) ?
4598                        (offset32 + len32) : page_end;
4599
4600                /* Request access to the flash interface. */
4601                if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
4602                        goto nvram_write_end;
4603
4604                /* Enable access to flash interface */
4605                bnx2_enable_nvram_access(bp);
4606
4607                cmd_flags = BNX2_NVM_COMMAND_FIRST;
4608                if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4609                        int j;
4610
4611                        /* Read the whole page into the buffer
4612                         * (non-buffer flash only) */
4613                        for (j = 0; j < bp->flash_info->page_size; j += 4) {
4614                                if (j == (bp->flash_info->page_size - 4)) {
4615                                        cmd_flags |= BNX2_NVM_COMMAND_LAST;
4616                                }
4617                                rc = bnx2_nvram_read_dword(bp,
4618                                        page_start + j,
4619                                        &flash_buffer[j],
4620                                        cmd_flags);
4621
4622                                if (rc)
4623                                        goto nvram_write_end;
4624
4625                                cmd_flags = 0;
4626                        }
4627                }
4628
4629                /* Enable writes to flash interface (unlock write-protect) */
4630                if ((rc = bnx2_enable_nvram_write(bp)) != 0)
4631                        goto nvram_write_end;
4632
4633                /* Loop to write back the buffer data from page_start to
4634                 * data_start */
4635                i = 0;
4636                if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4637                        /* Erase the page */
4638                        if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0)
4639                                goto nvram_write_end;
4640
4641                        /* Re-enable the write again for the actual write */
4642                        bnx2_enable_nvram_write(bp);
4643
4644                        for (addr = page_start; addr < data_start;
4645                                addr += 4, i += 4) {
4646
4647                                rc = bnx2_nvram_write_dword(bp, addr,
4648                                        &flash_buffer[i], cmd_flags);
4649
4650                                if (rc != 0)
4651                                        goto nvram_write_end;
4652
4653                                cmd_flags = 0;
4654                        }
4655                }
4656
4657                /* Loop to write the new data from data_start to data_end */
4658                for (addr = data_start; addr < data_end; addr += 4, i += 4) {
4659                        if ((addr == page_end - 4) ||
4660                                ((bp->flash_info->flags & BNX2_NV_BUFFERED) &&
4661                                 (addr == data_end - 4))) {
4662
4663                                cmd_flags |= BNX2_NVM_COMMAND_LAST;
4664                        }
4665                        rc = bnx2_nvram_write_dword(bp, addr, buf,
4666                                cmd_flags);
4667
4668                        if (rc != 0)
4669                                goto nvram_write_end;
4670
4671                        cmd_flags = 0;
4672                        buf += 4;
4673                }
4674
4675                /* Loop to write back the buffer data from data_end
4676                 * to page_end */
4677                if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4678                        for (addr = data_end; addr < page_end;
4679                                addr += 4, i += 4) {
4680
4681                                if (addr == page_end-4) {
4682                                        cmd_flags = BNX2_NVM_COMMAND_LAST;
4683                                }
4684                                rc = bnx2_nvram_write_dword(bp, addr,
4685                                        &flash_buffer[i], cmd_flags);
4686
4687                                if (rc != 0)
4688                                        goto nvram_write_end;
4689
4690                                cmd_flags = 0;
4691                        }
4692                }
4693
4694                /* Disable writes to flash interface (lock write-protect) */
4695                bnx2_disable_nvram_write(bp);
4696
4697                /* Disable access to flash interface */
4698                bnx2_disable_nvram_access(bp);
4699                bnx2_release_nvram_lock(bp);
4700
4701                /* Increment written */
4702                written += data_end - data_start;
4703        }
4704
4705nvram_write_end:
4706        kfree(flash_buffer);
4707        kfree(align_buf);
4708        return rc;
4709}
4710
4711static void
4712bnx2_init_fw_cap(struct bnx2 *bp)
4713{
4714        u32 val, sig = 0;
4715
4716        bp->phy_flags &= ~BNX2_PHY_FLAG_REMOTE_PHY_CAP;
4717        bp->flags &= ~BNX2_FLAG_CAN_KEEP_VLAN;
4718
4719        if (!(bp->flags & BNX2_FLAG_ASF_ENABLE))
4720                bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN;
4721
4722        val = bnx2_shmem_rd(bp, BNX2_FW_CAP_MB);
4723        if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE)
4724                return;
4725
4726        if ((val & BNX2_FW_CAP_CAN_KEEP_VLAN) == BNX2_FW_CAP_CAN_KEEP_VLAN) {
4727                bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN;
4728                sig |= BNX2_DRV_ACK_CAP_SIGNATURE | BNX2_FW_CAP_CAN_KEEP_VLAN;
4729        }
4730
4731        if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
4732            (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE)) {
4733                u32 link;
4734
4735                bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP;
4736
4737                link = bnx2_shmem_rd(bp, BNX2_LINK_STATUS);
4738                if (link & BNX2_LINK_STATUS_SERDES_LINK)
4739                        bp->phy_port = PORT_FIBRE;
4740                else
4741                        bp->phy_port = PORT_TP;
4742
4743                sig |= BNX2_DRV_ACK_CAP_SIGNATURE |
4744                       BNX2_FW_CAP_REMOTE_PHY_CAPABLE;
4745        }
4746
4747        if (netif_running(bp->dev) && sig)
4748                bnx2_shmem_wr(bp, BNX2_DRV_ACK_CAP_MB, sig);
4749}
4750
4751static void
4752bnx2_setup_msix_tbl(struct bnx2 *bp)
4753{
4754        BNX2_WR(bp, BNX2_PCI_GRC_WINDOW_ADDR, BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN);
4755
4756        BNX2_WR(bp, BNX2_PCI_GRC_WINDOW2_ADDR, BNX2_MSIX_TABLE_ADDR);
4757        BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR);
4758}
4759
4760static void
4761bnx2_wait_dma_complete(struct bnx2 *bp)
4762{
4763        u32 val;
4764        int i;
4765
4766        /*
4767         * Wait for the current PCI transaction to complete before
4768         * issuing a reset.
4769         */
4770        if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) ||
4771            (BNX2_CHIP(bp) == BNX2_CHIP_5708)) {
4772                BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
4773                        BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
4774                        BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
4775                        BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
4776                        BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
4777                val = BNX2_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
4778                udelay(5);
4779        } else {  /* 5709 */
4780                val = BNX2_RD(bp, BNX2_MISC_NEW_CORE_CTL);
4781                val &= ~BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE;
4782                BNX2_WR(bp, BNX2_MISC_NEW_CORE_CTL, val);
4783                val = BNX2_RD(bp, BNX2_MISC_NEW_CORE_CTL);
4784
4785                for (i = 0; i < 100; i++) {
4786                        msleep(1);
4787                        val = BNX2_RD(bp, BNX2_PCICFG_DEVICE_CONTROL);
4788                        if (!(val & BNX2_PCICFG_DEVICE_STATUS_NO_PEND))
4789                                break;
4790                }
4791        }
4792
4793        return;
4794}
4795
4796
4797static int
4798bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
4799{
4800        u32 val;
4801        int i, rc = 0;
4802        u8 old_port;
4803
4804        /* Wait for the current PCI transaction to complete before
4805         * issuing a reset. */
4806        bnx2_wait_dma_complete(bp);
4807
4808        /* Wait for the firmware to tell us it is ok to issue a reset. */
4809        bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1);
4810
4811        /* Deposit a driver reset signature so the firmware knows that
4812         * this is a soft reset. */
4813        bnx2_shmem_wr(bp, BNX2_DRV_RESET_SIGNATURE,
4814                      BNX2_DRV_RESET_SIGNATURE_MAGIC);
4815
4816        /* Do a dummy read to force the chip to complete all current transaction
4817         * before we issue a reset. */
4818        val = BNX2_RD(bp, BNX2_MISC_ID);
4819
4820        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
4821                BNX2_WR(bp, BNX2_MISC_COMMAND, BNX2_MISC_COMMAND_SW_RESET);
4822                BNX2_RD(bp, BNX2_MISC_COMMAND);
4823                udelay(5);
4824
4825                val = BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
4826                      BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
4827
4828                BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
4829
4830        } else {
4831                val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
4832                      BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
4833                      BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
4834
4835                /* Chip reset. */
4836                BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
4837
4838                /* Reading back any register after chip reset will hang the
4839                 * bus on 5706 A0 and A1.  The msleep below provides plenty
4840                 * of margin for write posting.
4841                 */
4842                if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) ||
4843                    (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1))
4844                        msleep(20);
4845
4846                /* Reset takes approximate 30 usec */
4847                for (i = 0; i < 10; i++) {
4848                        val = BNX2_RD(bp, BNX2_PCICFG_MISC_CONFIG);
4849                        if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
4850                                    BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0)
4851                                break;
4852                        udelay(10);
4853                }
4854
4855                if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
4856                           BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
4857                        pr_err("Chip reset did not complete\n");
4858                        return -EBUSY;
4859                }
4860        }
4861
4862        /* Make sure byte swapping is properly configured. */
4863        val = BNX2_RD(bp, BNX2_PCI_SWAP_DIAG0);
4864        if (val != 0x01020304) {
4865                pr_err("Chip not in correct endian mode\n");
4866                return -ENODEV;
4867        }
4868
4869        /* Wait for the firmware to finish its initialization. */
4870        rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code, 1, 0);
4871        if (rc)
4872                return rc;
4873
4874        spin_lock_bh(&bp->phy_lock);
4875        old_port = bp->phy_port;
4876        bnx2_init_fw_cap(bp);
4877        if ((bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) &&
4878            old_port != bp->phy_port)
4879                bnx2_set_default_remote_link(bp);
4880        spin_unlock_bh(&bp->phy_lock);
4881
4882        if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {
4883                /* Adjust the voltage regular to two steps lower.  The default
4884                 * of this register is 0x0000000e. */
4885                BNX2_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);
4886
4887                /* Remove bad rbuf memory from the free pool. */
4888                rc = bnx2_alloc_bad_rbuf(bp);
4889        }
4890
4891        if (bp->flags & BNX2_FLAG_USING_MSIX) {
4892                bnx2_setup_msix_tbl(bp);
4893                /* Prevent MSIX table reads and write from timing out */
4894                BNX2_WR(bp, BNX2_MISC_ECO_HW_CTL,
4895                        BNX2_MISC_ECO_HW_CTL_LARGE_GRC_TMOUT_EN);
4896        }
4897
4898        return rc;
4899}
4900
4901static int
4902bnx2_init_chip(struct bnx2 *bp)
4903{
4904        u32 val, mtu;
4905        int rc, i;
4906
4907        /* Make sure the interrupt is not active. */
4908        BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
4909
4910        val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |
4911              BNX2_DMA_CONFIG_DATA_WORD_SWAP |
4912#ifdef __BIG_ENDIAN
4913              BNX2_DMA_CONFIG_CNTL_BYTE_SWAP |
4914#endif
4915              BNX2_DMA_CONFIG_CNTL_WORD_SWAP |
4916              DMA_READ_CHANS << 12 |
4917              DMA_WRITE_CHANS << 16;
4918
4919        val |= (0x2 << 20) | (1 << 11);
4920
4921        if ((bp->flags & BNX2_FLAG_PCIX) && (bp->bus_speed_mhz == 133))
4922                val |= (1 << 23);
4923
4924        if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) &&
4925            (BNX2_CHIP_ID(bp) != BNX2_CHIP_ID_5706_A0) &&
4926            !(bp->flags & BNX2_FLAG_PCIX))
4927                val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA;
4928
4929        BNX2_WR(bp, BNX2_DMA_CONFIG, val);
4930
4931        if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {
4932                val = BNX2_RD(bp, BNX2_TDMA_CONFIG);
4933                val |= BNX2_TDMA_CONFIG_ONE_DMA;
4934                BNX2_WR(bp, BNX2_TDMA_CONFIG, val);
4935        }
4936
4937        if (bp->flags & BNX2_FLAG_PCIX) {
4938                u16 val16;
4939
4940                pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
4941                                     &val16);
4942                pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
4943                                      val16 & ~PCI_X_CMD_ERO);
4944        }
4945
4946        BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
4947                BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE |
4948                BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE |
4949                BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);
4950
4951        /* Initialize context mapping and zero out the quick contexts.  The
4952         * context block must have already been enabled. */
4953        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
4954                rc = bnx2_init_5709_context(bp);
4955                if (rc)
4956                        return rc;
4957        } else
4958                bnx2_init_context(bp);
4959
4960        if ((rc = bnx2_init_cpus(bp)) != 0)
4961                return rc;
4962
4963        bnx2_init_nvram(bp);
4964
4965        bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0);
4966
4967        val = BNX2_RD(bp, BNX2_MQ_CONFIG);
4968        val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;
4969        val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256;
4970        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
4971                val |= BNX2_MQ_CONFIG_BIN_MQ_MODE;
4972                if (BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Ax)
4973                        val |= BNX2_MQ_CONFIG_HALT_DIS;
4974        }
4975
4976        BNX2_WR(bp, BNX2_MQ_CONFIG, val);
4977
4978        val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
4979        BNX2_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val);
4980        BNX2_WR(bp, BNX2_MQ_KNL_WIND_END, val);
4981
4982        val = (BNX2_PAGE_BITS - 8) << 24;
4983        BNX2_WR(bp, BNX2_RV2P_CONFIG, val);
4984
4985        /* Configure page size. */
4986        val = BNX2_RD(bp, BNX2_TBDR_CONFIG);
4987        val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE;
4988        val |= (BNX2_PAGE_BITS - 8) << 24 | 0x40;
4989        BNX2_WR(bp, BNX2_TBDR_CONFIG, val);
4990
4991        val = bp->mac_addr[0] +
4992              (bp->mac_addr[1] << 8) +
4993              (bp->mac_addr[2] << 16) +
4994              bp->mac_addr[3] +
4995              (bp->mac_addr[4] << 8) +
4996              (bp->mac_addr[5] << 16);
4997        BNX2_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);
4998
4999        /* Program the MTU.  Also include 4 bytes for CRC32. */
5000        mtu = bp->dev->mtu;
5001        val = mtu + ETH_HLEN + ETH_FCS_LEN;
5002        if (val > (MAX_ETHERNET_PACKET_SIZE + ETH_HLEN + 4))
5003                val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA;
5004        BNX2_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);
5005
5006        if (mtu < ETH_DATA_LEN)
5007                mtu = ETH_DATA_LEN;
5008
5009        bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG, BNX2_RBUF_CONFIG_VAL(mtu));
5010        bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG2, BNX2_RBUF_CONFIG2_VAL(mtu));
5011        bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG3, BNX2_RBUF_CONFIG3_VAL(mtu));
5012
5013        memset(bp->bnx2_napi[0].status_blk.msi, 0, bp->status_stats_size);
5014        for (i = 0; i < BNX2_MAX_MSIX_VEC; i++)
5015                bp->bnx2_napi[i].last_status_idx = 0;
5016
5017        bp->idle_chk_status_idx = 0xffff;
5018
5019        /* Set up how to generate a link change interrupt. */
5020        BNX2_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
5021
5022        BNX2_WR(bp, BNX2_HC_STATUS_ADDR_L,
5023                (u64) bp->status_blk_mapping & 0xffffffff);
5024        BNX2_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32);
5025
5026        BNX2_WR(bp, BNX2_HC_STATISTICS_ADDR_L,
5027                (u64) bp->stats_blk_mapping & 0xffffffff);
5028        BNX2_WR(bp, BNX2_HC_STATISTICS_ADDR_H,
5029                (u64) bp->stats_blk_mapping >> 32);
5030
5031        BNX2_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP,
5032                (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip);
5033
5034        BNX2_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP,
5035                (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip);
5036
5037        BNX2_WR(bp, BNX2_HC_COMP_PROD_TRIP,
5038                (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip);
5039
5040        BNX2_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks);
5041
5042        BNX2_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks);
5043
5044        BNX2_WR(bp, BNX2_HC_COM_TICKS,
5045                (bp->com_ticks_int << 16) | bp->com_ticks);
5046
5047        BNX2_WR(bp, BNX2_HC_CMD_TICKS,
5048                (bp->cmd_ticks_int << 16) | bp->cmd_ticks);
5049
5050        if (bp->flags & BNX2_FLAG_BROKEN_STATS)
5051                BNX2_WR(bp, BNX2_HC_STATS_TICKS, 0);
5052        else
5053                BNX2_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks);
5054        BNX2_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */
5055
5056        if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1)
5057                val = BNX2_HC_CONFIG_COLLECT_STATS;
5058        else {
5059                val = BNX2_HC_CONFIG_RX_TMR_MODE | BNX2_HC_CONFIG_TX_TMR_MODE |
5060                      BNX2_HC_CONFIG_COLLECT_STATS;
5061        }
5062
5063        if (bp->flags & BNX2_FLAG_USING_MSIX) {
5064                BNX2_WR(bp, BNX2_HC_MSIX_BIT_VECTOR,
5065                        BNX2_HC_MSIX_BIT_VECTOR_VAL);
5066
5067                val |= BNX2_HC_CONFIG_SB_ADDR_INC_128B;
5068        }
5069
5070        if (bp->flags & BNX2_FLAG_ONE_SHOT_MSI)
5071                val |= BNX2_HC_CONFIG_ONE_SHOT | BNX2_HC_CONFIG_USE_INT_PARAM;
5072
5073        BNX2_WR(bp, BNX2_HC_CONFIG, val);
5074
5075        if (bp->rx_ticks < 25)
5076                bnx2_reg_wr_ind(bp, BNX2_FW_RX_LOW_LATENCY, 1);
5077        else
5078                bnx2_reg_wr_ind(bp, BNX2_FW_RX_LOW_LATENCY, 0);
5079
5080        for (i = 1; i < bp->irq_nvecs; i++) {
5081                u32 base = ((i - 1) * BNX2_HC_SB_CONFIG_SIZE) +
5082                           BNX2_HC_SB_CONFIG_1;
5083
5084                BNX2_WR(bp, base,
5085                        BNX2_HC_SB_CONFIG_1_TX_TMR_MODE |
5086                        BNX2_HC_SB_CONFIG_1_RX_TMR_MODE |
5087                        BNX2_HC_SB_CONFIG_1_ONE_SHOT);
5088
5089                BNX2_WR(bp, base + BNX2_HC_TX_QUICK_CONS_TRIP_OFF,
5090                        (bp->tx_quick_cons_trip_int << 16) |
5091                         bp->tx_quick_cons_trip);
5092
5093                BNX2_WR(bp, base + BNX2_HC_TX_TICKS_OFF,
5094                        (bp->tx_ticks_int << 16) | bp->tx_ticks);
5095
5096                BNX2_WR(bp, base + BNX2_HC_RX_QUICK_CONS_TRIP_OFF,
5097                        (bp->rx_quick_cons_trip_int << 16) |
5098                        bp->rx_quick_cons_trip);
5099
5100                BNX2_WR(bp, base + BNX2_HC_RX_TICKS_OFF,
5101                        (bp->rx_ticks_int << 16) | bp->rx_ticks);
5102        }
5103
5104        /* Clear internal stats counters. */
5105        BNX2_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW);
5106
5107        BNX2_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_EVENTS);
5108
5109        /* Initialize the receive filter. */
5110        bnx2_set_rx_mode(bp->dev);
5111
5112        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
5113                val = BNX2_RD(bp, BNX2_MISC_NEW_CORE_CTL);
5114                val |= BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE;
5115                BNX2_WR(bp, BNX2_MISC_NEW_CORE_CTL, val);
5116        }
5117        rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,
5118                          1, 0);
5119
5120        BNX2_WR(bp, BNX2_MISC_ENABLE_SET_BITS, BNX2_MISC_ENABLE_DEFAULT);
5121        BNX2_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
5122
5123        udelay(20);
5124
5125        bp->hc_cmd = BNX2_RD(bp, BNX2_HC_COMMAND);
5126
5127        return rc;
5128}
5129
5130static void
5131bnx2_clear_ring_states(struct bnx2 *bp)
5132{
5133        struct bnx2_napi *bnapi;
5134        struct bnx2_tx_ring_info *txr;
5135        struct bnx2_rx_ring_info *rxr;
5136        int i;
5137
5138        for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
5139                bnapi = &bp->bnx2_napi[i];
5140                txr = &bnapi->tx_ring;
5141                rxr = &bnapi->rx_ring;
5142
5143                txr->tx_cons = 0;
5144                txr->hw_tx_cons = 0;
5145                rxr->rx_prod_bseq = 0;
5146                rxr->rx_prod = 0;
5147                rxr->rx_cons = 0;
5148                rxr->rx_pg_prod = 0;
5149                rxr->rx_pg_cons = 0;
5150        }
5151}
5152
5153static void
5154bnx2_init_tx_context(struct bnx2 *bp, u32 cid, struct bnx2_tx_ring_info *txr)
5155{
5156        u32 val, offset0, offset1, offset2, offset3;
5157        u32 cid_addr = GET_CID_ADDR(cid);
5158
5159        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
5160                offset0 = BNX2_L2CTX_TYPE_XI;
5161                offset1 = BNX2_L2CTX_CMD_TYPE_XI;
5162                offset2 = BNX2_L2CTX_TBDR_BHADDR_HI_XI;
5163                offset3 = BNX2_L2CTX_TBDR_BHADDR_LO_XI;
5164        } else {
5165                offset0 = BNX2_L2CTX_TYPE;
5166                offset1 = BNX2_L2CTX_CMD_TYPE;
5167                offset2 = BNX2_L2CTX_TBDR_BHADDR_HI;
5168                offset3 = BNX2_L2CTX_TBDR_BHADDR_LO;
5169        }
5170        val = BNX2_L2CTX_TYPE_TYPE_L2 | BNX2_L2CTX_TYPE_SIZE_L2;
5171        bnx2_ctx_wr(bp, cid_addr, offset0, val);
5172
5173        val = BNX2_L2CTX_CMD_TYPE_TYPE_L2 | (8 << 16);
5174        bnx2_ctx_wr(bp, cid_addr, offset1, val);
5175
5176        val = (u64) txr->tx_desc_mapping >> 32;
5177        bnx2_ctx_wr(bp, cid_addr, offset2, val);
5178
5179        val = (u64) txr->tx_desc_mapping & 0xffffffff;
5180        bnx2_ctx_wr(bp, cid_addr, offset3, val);
5181}
5182
5183static void
5184bnx2_init_tx_ring(struct bnx2 *bp, int ring_num)
5185{
5186        struct bnx2_tx_bd *txbd;
5187        u32 cid = TX_CID;
5188        struct bnx2_napi *bnapi;
5189        struct bnx2_tx_ring_info *txr;
5190
5191        bnapi = &bp->bnx2_napi[ring_num];
5192        txr = &bnapi->tx_ring;
5193
5194        if (ring_num == 0)
5195                cid = TX_CID;
5196        else
5197                cid = TX_TSS_CID + ring_num - 1;
5198
5199        bp->tx_wake_thresh = bp->tx_ring_size / 2;
5200
5201        txbd = &txr->tx_desc_ring[BNX2_MAX_TX_DESC_CNT];
5202
5203        txbd->tx_bd_haddr_hi = (u64) txr->tx_desc_mapping >> 32;
5204        txbd->tx_bd_haddr_lo = (u64) txr->tx_desc_mapping & 0xffffffff;
5205
5206        txr->tx_prod = 0;
5207        txr->tx_prod_bseq = 0;
5208
5209        txr->tx_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_TX_HOST_BIDX;
5210        txr->tx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_TX_HOST_BSEQ;
5211
5212        bnx2_init_tx_context(bp, cid, txr);
5213}
5214
5215static void
5216bnx2_init_rxbd_rings(struct bnx2_rx_bd *rx_ring[], dma_addr_t dma[],
5217                     u32 buf_size, int num_rings)
5218{
5219        int i;
5220        struct bnx2_rx_bd *rxbd;
5221
5222        for (i = 0; i < num_rings; i++) {
5223                int j;
5224
5225                rxbd = &rx_ring[i][0];
5226                for (j = 0; j < BNX2_MAX_RX_DESC_CNT; j++, rxbd++) {
5227                        rxbd->rx_bd_len = buf_size;
5228                        rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;
5229                }
5230                if (i == (num_rings - 1))
5231                        j = 0;
5232                else
5233                        j = i + 1;
5234                rxbd->rx_bd_haddr_hi = (u64) dma[j] >> 32;
5235                rxbd->rx_bd_haddr_lo = (u64) dma[j] & 0xffffffff;
5236        }
5237}
5238
5239static void
5240bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
5241{
5242        int i;
5243        u16 prod, ring_prod;
5244        u32 cid, rx_cid_addr, val;
5245        struct bnx2_napi *bnapi = &bp->bnx2_napi[ring_num];
5246        struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
5247
5248        if (ring_num == 0)
5249                cid = RX_CID;
5250        else
5251                cid = RX_RSS_CID + ring_num - 1;
5252
5253        rx_cid_addr = GET_CID_ADDR(cid);
5254
5255        bnx2_init_rxbd_rings(rxr->rx_desc_ring, rxr->rx_desc_mapping,
5256                             bp->rx_buf_use_size, bp->rx_max_ring);
5257
5258        bnx2_init_rx_context(bp, cid);
5259
5260        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
5261                val = BNX2_RD(bp, BNX2_MQ_MAP_L2_5);
5262                BNX2_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM);
5263        }
5264
5265        bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0);
5266        if (bp->rx_pg_ring_size) {
5267                bnx2_init_rxbd_rings(rxr->rx_pg_desc_ring,
5268                                     rxr->rx_pg_desc_mapping,
5269                                     PAGE_SIZE, bp->rx_max_pg_ring);
5270                val = (bp->rx_buf_use_size << 16) | PAGE_SIZE;
5271                bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, val);
5272                bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_RBDC_KEY,
5273                       BNX2_L2CTX_RBDC_JUMBO_KEY - ring_num);
5274
5275                val = (u64) rxr->rx_pg_desc_mapping[0] >> 32;
5276                bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_HI, val);
5277
5278                val = (u64) rxr->rx_pg_desc_mapping[0] & 0xffffffff;
5279                bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_LO, val);
5280
5281                if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
5282                        BNX2_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT);
5283        }
5284
5285        val = (u64) rxr->rx_desc_mapping[0] >> 32;
5286        bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val);
5287
5288        val = (u64) rxr->rx_desc_mapping[0] & 0xffffffff;
5289        bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val);
5290
5291        ring_prod = prod = rxr->rx_pg_prod;
5292        for (i = 0; i < bp->rx_pg_ring_size; i++) {
5293                if (bnx2_alloc_rx_page(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
5294                        netdev_warn(bp->dev, "init'ed rx page ring %d with %d/%d pages only\n",
5295                                    ring_num, i, bp->rx_pg_ring_size);
5296                        break;
5297                }
5298                prod = BNX2_NEXT_RX_BD(prod);
5299                ring_prod = BNX2_RX_PG_RING_IDX(prod);
5300        }
5301        rxr->rx_pg_prod = prod;
5302
5303        ring_prod = prod = rxr->rx_prod;
5304        for (i = 0; i < bp->rx_ring_size; i++) {
5305                if (bnx2_alloc_rx_data(bp, rxr, ring_prod, GFP_KERNEL) < 0) {
5306                        netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d skbs only\n",
5307                                    ring_num, i, bp->rx_ring_size);
5308                        break;
5309                }
5310                prod = BNX2_NEXT_RX_BD(prod);
5311                ring_prod = BNX2_RX_RING_IDX(prod);
5312        }
5313        rxr->rx_prod = prod;
5314
5315        rxr->rx_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BDIDX;
5316        rxr->rx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BSEQ;
5317        rxr->rx_pg_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_PG_BDIDX;
5318
5319        BNX2_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod);
5320        BNX2_WR16(bp, rxr->rx_bidx_addr, prod);
5321
5322        BNX2_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);
5323}
5324
5325static void
5326bnx2_init_all_rings(struct bnx2 *bp)
5327{
5328        int i;
5329        u32 val;
5330
5331        bnx2_clear_ring_states(bp);
5332
5333        BNX2_WR(bp, BNX2_TSCH_TSS_CFG, 0);
5334        for (i = 0; i < bp->num_tx_rings; i++)
5335                bnx2_init_tx_ring(bp, i);
5336
5337        if (bp->num_tx_rings > 1)
5338                BNX2_WR(bp, BNX2_TSCH_TSS_CFG, ((bp->num_tx_rings - 1) << 24) |
5339                        (TX_TSS_CID << 7));
5340
5341        BNX2_WR(bp, BNX2_RLUP_RSS_CONFIG, 0);
5342        bnx2_reg_wr_ind(bp, BNX2_RXP_SCRATCH_RSS_TBL_SZ, 0);
5343
5344        for (i = 0; i < bp->num_rx_rings; i++)
5345                bnx2_init_rx_ring(bp, i);
5346
5347        if (bp->num_rx_rings > 1) {
5348                u32 tbl_32 = 0;
5349
5350                for (i = 0; i < BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES; i++) {
5351                        int shift = (i % 8) << 2;
5352
5353                        tbl_32 |= (i % (bp->num_rx_rings - 1)) << shift;
5354                        if ((i % 8) == 7) {
5355                                BNX2_WR(bp, BNX2_RLUP_RSS_DATA, tbl_32);
5356                                BNX2_WR(bp, BNX2_RLUP_RSS_COMMAND, (i >> 3) |
5357                                        BNX2_RLUP_RSS_COMMAND_RSS_WRITE_MASK |
5358                                        BNX2_RLUP_RSS_COMMAND_WRITE |
5359                                        BNX2_RLUP_RSS_COMMAND_HASH_MASK);
5360                                tbl_32 = 0;
5361                        }
5362                }
5363
5364                val = BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_ALL_XI |
5365                      BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_ALL_XI;
5366
5367                BNX2_WR(bp, BNX2_RLUP_RSS_CONFIG, val);
5368
5369        }
5370}
5371
5372static u32 bnx2_find_max_ring(u32 ring_size, u32 max_size)
5373{
5374        u32 max, num_rings = 1;
5375
5376        while (ring_size > BNX2_MAX_RX_DESC_CNT) {
5377                ring_size -= BNX2_MAX_RX_DESC_CNT;
5378                num_rings++;
5379        }
5380        /* round to next power of 2 */
5381        max = max_size;
5382        while ((max & num_rings) == 0)
5383                max >>= 1;
5384
5385        if (num_rings != max)
5386                max <<= 1;
5387
5388        return max;
5389}
5390
5391static void
5392bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size)
5393{
5394        u32 rx_size, rx_space, jumbo_size;
5395
5396        /* 8 for CRC and VLAN */
5397        rx_size = bp->dev->mtu + ETH_HLEN + BNX2_RX_OFFSET + 8;
5398
5399        rx_space = SKB_DATA_ALIGN(rx_size + BNX2_RX_ALIGN) + NET_SKB_PAD +
5400                SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
5401
5402        bp->rx_copy_thresh = BNX2_RX_COPY_THRESH;
5403        bp->rx_pg_ring_size = 0;
5404        bp->rx_max_pg_ring = 0;
5405        bp->rx_max_pg_ring_idx = 0;
5406        if ((rx_space > PAGE_SIZE) && !(bp->flags & BNX2_FLAG_JUMBO_BROKEN)) {
5407                int pages = PAGE_ALIGN(bp->dev->mtu - 40) >> PAGE_SHIFT;
5408
5409                jumbo_size = size * pages;
5410                if (jumbo_size > BNX2_MAX_TOTAL_RX_PG_DESC_CNT)
5411                        jumbo_size = BNX2_MAX_TOTAL_RX_PG_DESC_CNT;
5412
5413                bp->rx_pg_ring_size = jumbo_size;
5414                bp->rx_max_pg_ring = bnx2_find_max_ring(jumbo_size,
5415                                                        BNX2_MAX_RX_PG_RINGS);
5416                bp->rx_max_pg_ring_idx =
5417                        (bp->rx_max_pg_ring * BNX2_RX_DESC_CNT) - 1;
5418                rx_size = BNX2_RX_COPY_THRESH + BNX2_RX_OFFSET;
5419                bp->rx_copy_thresh = 0;
5420        }
5421
5422        bp->rx_buf_use_size = rx_size;
5423        /* hw alignment + build_skb() overhead*/
5424        bp->rx_buf_size = SKB_DATA_ALIGN(bp->rx_buf_use_size + BNX2_RX_ALIGN) +
5425                NET_SKB_PAD + SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
5426        bp->rx_jumbo_thresh = rx_size - BNX2_RX_OFFSET;
5427        bp->rx_ring_size = size;
5428        bp->rx_max_ring = bnx2_find_max_ring(size, BNX2_MAX_RX_RINGS);
5429        bp->rx_max_ring_idx = (bp->rx_max_ring * BNX2_RX_DESC_CNT) - 1;
5430}
5431
5432static void
5433bnx2_free_tx_skbs(struct bnx2 *bp)
5434{
5435        int i;
5436
5437        for (i = 0; i < bp->num_tx_rings; i++) {
5438                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
5439                struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
5440                int j;
5441
5442                if (!txr->tx_buf_ring)
5443                        continue;
5444
5445                for (j = 0; j < BNX2_TX_DESC_CNT; ) {
5446                        struct bnx2_sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];
5447                        struct sk_buff *skb = tx_buf->skb;
5448                        int k, last;
5449
5450                        if (!skb) {
5451                                j = BNX2_NEXT_TX_BD(j);
5452                                continue;
5453                        }
5454
5455                        dma_unmap_single(&bp->pdev->dev,
5456                                         dma_unmap_addr(tx_buf, mapping),
5457                                         skb_headlen(skb),
5458                                         PCI_DMA_TODEVICE);
5459
5460                        tx_buf->skb = NULL;
5461
5462                        last = tx_buf->nr_frags;
5463                        j = BNX2_NEXT_TX_BD(j);
5464                        for (k = 0; k < last; k++, j = BNX2_NEXT_TX_BD(j)) {
5465                                tx_buf = &txr->tx_buf_ring[BNX2_TX_RING_IDX(j)];
5466                                dma_unmap_page(&bp->pdev->dev,
5467                                        dma_unmap_addr(tx_buf, mapping),
5468                                        skb_frag_size(&skb_shinfo(skb)->frags[k]),
5469                                        PCI_DMA_TODEVICE);
5470                        }
5471                        dev_kfree_skb(skb);
5472                }
5473                netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, i));
5474        }
5475}
5476
5477static void
5478bnx2_free_rx_skbs(struct bnx2 *bp)
5479{
5480        int i;
5481
5482        for (i = 0; i < bp->num_rx_rings; i++) {
5483                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
5484                struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
5485                int j;
5486
5487                if (!rxr->rx_buf_ring)
5488                        return;
5489
5490                for (j = 0; j < bp->rx_max_ring_idx; j++) {
5491                        struct bnx2_sw_bd *rx_buf = &rxr->rx_buf_ring[j];
5492                        u8 *data = rx_buf->data;
5493
5494                        if (!data)
5495                                continue;
5496
5497                        dma_unmap_single(&bp->pdev->dev,
5498                                         dma_unmap_addr(rx_buf, mapping),
5499                                         bp->rx_buf_use_size,
5500                                         PCI_DMA_FROMDEVICE);
5501
5502                        rx_buf->data = NULL;
5503
5504                        kfree(data);
5505                }
5506                for (j = 0; j < bp->rx_max_pg_ring_idx; j++)
5507                        bnx2_free_rx_page(bp, rxr, j);
5508        }
5509}
5510
5511static void
5512bnx2_free_skbs(struct bnx2 *bp)
5513{
5514        bnx2_free_tx_skbs(bp);
5515        bnx2_free_rx_skbs(bp);
5516}
5517
5518static int
5519bnx2_reset_nic(struct bnx2 *bp, u32 reset_code)
5520{
5521        int rc;
5522
5523        rc = bnx2_reset_chip(bp, reset_code);
5524        bnx2_free_skbs(bp);
5525        if (rc)
5526                return rc;
5527
5528        if ((rc = bnx2_init_chip(bp)) != 0)
5529                return rc;
5530
5531        bnx2_init_all_rings(bp);
5532        return 0;
5533}
5534
5535static int
5536bnx2_init_nic(struct bnx2 *bp, int reset_phy)
5537{
5538        int rc;
5539
5540        if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0)
5541                return rc;
5542
5543        spin_lock_bh(&bp->phy_lock);
5544        bnx2_init_phy(bp, reset_phy);
5545        bnx2_set_link(bp);
5546        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
5547                bnx2_remote_phy_event(bp);
5548        spin_unlock_bh(&bp->phy_lock);
5549        return 0;
5550}
5551
5552static int
5553bnx2_shutdown_chip(struct bnx2 *bp)
5554{
5555        u32 reset_code;
5556
5557        if (bp->flags & BNX2_FLAG_NO_WOL)
5558                reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
5559        else if (bp->wol)
5560                reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
5561        else
5562                reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
5563
5564        return bnx2_reset_chip(bp, reset_code);
5565}
5566
5567static int
5568bnx2_test_registers(struct bnx2 *bp)
5569{
5570        int ret;
5571        int i, is_5709;
5572        static const struct {
5573                u16   offset;
5574                u16   flags;
5575#define BNX2_FL_NOT_5709        1
5576                u32   rw_mask;
5577                u32   ro_mask;
5578        } reg_tbl[] = {
5579                { 0x006c, 0, 0x00000000, 0x0000003f },
5580                { 0x0090, 0, 0xffffffff, 0x00000000 },
5581                { 0x0094, 0, 0x00000000, 0x00000000 },
5582
5583                { 0x0404, BNX2_FL_NOT_5709, 0x00003f00, 0x00000000 },
5584                { 0x0418, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5585                { 0x041c, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5586                { 0x0420, BNX2_FL_NOT_5709, 0x00000000, 0x80ffffff },
5587                { 0x0424, BNX2_FL_NOT_5709, 0x00000000, 0x00000000 },
5588                { 0x0428, BNX2_FL_NOT_5709, 0x00000000, 0x00000001 },
5589                { 0x0450, BNX2_FL_NOT_5709, 0x00000000, 0x0000ffff },
5590                { 0x0454, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5591                { 0x0458, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5592
5593                { 0x0808, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5594                { 0x0854, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5595                { 0x0868, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5596                { 0x086c, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5597                { 0x0870, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5598                { 0x0874, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5599
5600                { 0x0c00, BNX2_FL_NOT_5709, 0x00000000, 0x00000001 },
5601                { 0x0c04, BNX2_FL_NOT_5709, 0x00000000, 0x03ff0001 },
5602                { 0x0c08, BNX2_FL_NOT_5709,  0x0f0ff073, 0x00000000 },
5603
5604                { 0x1000, 0, 0x00000000, 0x00000001 },
5605                { 0x1004, BNX2_FL_NOT_5709, 0x00000000, 0x000f0001 },
5606
5607                { 0x1408, 0, 0x01c00800, 0x00000000 },
5608                { 0x149c, 0, 0x8000ffff, 0x00000000 },
5609                { 0x14a8, 0, 0x00000000, 0x000001ff },
5610                { 0x14ac, 0, 0x0fffffff, 0x10000000 },
5611                { 0x14b0, 0, 0x00000002, 0x00000001 },
5612                { 0x14b8, 0, 0x00000000, 0x00000000 },
5613                { 0x14c0, 0, 0x00000000, 0x00000009 },
5614                { 0x14c4, 0, 0x00003fff, 0x00000000 },
5615                { 0x14cc, 0, 0x00000000, 0x00000001 },
5616                { 0x14d0, 0, 0xffffffff, 0x00000000 },
5617
5618                { 0x1800, 0, 0x00000000, 0x00000001 },
5619                { 0x1804, 0, 0x00000000, 0x00000003 },
5620
5621                { 0x2800, 0, 0x00000000, 0x00000001 },
5622                { 0x2804, 0, 0x00000000, 0x00003f01 },
5623                { 0x2808, 0, 0x0f3f3f03, 0x00000000 },
5624                { 0x2810, 0, 0xffff0000, 0x00000000 },
5625                { 0x2814, 0, 0xffff0000, 0x00000000 },
5626                { 0x2818, 0, 0xffff0000, 0x00000000 },
5627                { 0x281c, 0, 0xffff0000, 0x00000000 },
5628                { 0x2834, 0, 0xffffffff, 0x00000000 },
5629                { 0x2840, 0, 0x00000000, 0xffffffff },
5630                { 0x2844, 0, 0x00000000, 0xffffffff },
5631                { 0x2848, 0, 0xffffffff, 0x00000000 },
5632                { 0x284c, 0, 0xf800f800, 0x07ff07ff },
5633
5634                { 0x2c00, 0, 0x00000000, 0x00000011 },
5635                { 0x2c04, 0, 0x00000000, 0x00030007 },
5636
5637                { 0x3c00, 0, 0x00000000, 0x00000001 },
5638                { 0x3c04, 0, 0x00000000, 0x00070000 },
5639                { 0x3c08, 0, 0x00007f71, 0x07f00000 },
5640                { 0x3c0c, 0, 0x1f3ffffc, 0x00000000 },
5641                { 0x3c10, 0, 0xffffffff, 0x00000000 },
5642                { 0x3c14, 0, 0x00000000, 0xffffffff },
5643                { 0x3c18, 0, 0x00000000, 0xffffffff },
5644                { 0x3c1c, 0, 0xfffff000, 0x00000000 },
5645                { 0x3c20, 0, 0xffffff00, 0x00000000 },
5646
5647                { 0x5004, 0, 0x00000000, 0x0000007f },
5648                { 0x5008, 0, 0x0f0007ff, 0x00000000 },
5649
5650                { 0x5c00, 0, 0x00000000, 0x00000001 },
5651                { 0x5c04, 0, 0x00000000, 0x0003000f },
5652                { 0x5c08, 0, 0x00000003, 0x00000000 },
5653                { 0x5c0c, 0, 0x0000fff8, 0x00000000 },
5654                { 0x5c10, 0, 0x00000000, 0xffffffff },
5655                { 0x5c80, 0, 0x00000000, 0x0f7113f1 },
5656                { 0x5c84, 0, 0x00000000, 0x0000f333 },
5657                { 0x5c88, 0, 0x00000000, 0x00077373 },
5658                { 0x5c8c, 0, 0x00000000, 0x0007f737 },
5659
5660                { 0x6808, 0, 0x0000ff7f, 0x00000000 },
5661                { 0x680c, 0, 0xffffffff, 0x00000000 },
5662                { 0x6810, 0, 0xffffffff, 0x00000000 },
5663                { 0x6814, 0, 0xffffffff, 0x00000000 },
5664                { 0x6818, 0, 0xffffffff, 0x00000000 },
5665                { 0x681c, 0, 0xffffffff, 0x00000000 },
5666                { 0x6820, 0, 0x00ff00ff, 0x00000000 },
5667                { 0x6824, 0, 0x00ff00ff, 0x00000000 },
5668                { 0x6828, 0, 0x00ff00ff, 0x00000000 },
5669                { 0x682c, 0, 0x03ff03ff, 0x00000000 },
5670                { 0x6830, 0, 0x03ff03ff, 0x00000000 },
5671                { 0x6834, 0, 0x03ff03ff, 0x00000000 },
5672                { 0x6838, 0, 0x03ff03ff, 0x00000000 },
5673                { 0x683c, 0, 0x0000ffff, 0x00000000 },
5674                { 0x6840, 0, 0x00000ff0, 0x00000000 },
5675                { 0x6844, 0, 0x00ffff00, 0x00000000 },
5676                { 0x684c, 0, 0xffffffff, 0x00000000 },
5677                { 0x6850, 0, 0x7f7f7f7f, 0x00000000 },
5678                { 0x6854, 0, 0x7f7f7f7f, 0x00000000 },
5679                { 0x6858, 0, 0x7f7f7f7f, 0x00000000 },
5680                { 0x685c, 0, 0x7f7f7f7f, 0x00000000 },
5681                { 0x6908, 0, 0x00000000, 0x0001ff0f },
5682                { 0x690c, 0, 0x00000000, 0x0ffe00f0 },
5683
5684                { 0xffff, 0, 0x00000000, 0x00000000 },
5685        };
5686
5687        ret = 0;
5688        is_5709 = 0;
5689        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
5690                is_5709 = 1;
5691
5692        for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
5693                u32 offset, rw_mask, ro_mask, save_val, val;
5694                u16 flags = reg_tbl[i].flags;
5695
5696                if (is_5709 && (flags & BNX2_FL_NOT_5709))
5697                        continue;
5698
5699                offset = (u32) reg_tbl[i].offset;
5700                rw_mask = reg_tbl[i].rw_mask;
5701                ro_mask = reg_tbl[i].ro_mask;
5702
5703                save_val = readl(bp->regview + offset);
5704
5705                writel(0, bp->regview + offset);
5706
5707                val = readl(bp->regview + offset);
5708                if ((val & rw_mask) != 0) {
5709                        goto reg_test_err;
5710                }
5711
5712                if ((val & ro_mask) != (save_val & ro_mask)) {
5713                        goto reg_test_err;
5714                }
5715
5716                writel(0xffffffff, bp->regview + offset);
5717
5718                val = readl(bp->regview + offset);
5719                if ((val & rw_mask) != rw_mask) {
5720                        goto reg_test_err;
5721                }
5722
5723                if ((val & ro_mask) != (save_val & ro_mask)) {
5724                        goto reg_test_err;
5725                }
5726
5727                writel(save_val, bp->regview + offset);
5728                continue;
5729
5730reg_test_err:
5731                writel(save_val, bp->regview + offset);
5732                ret = -ENODEV;
5733                break;
5734        }
5735        return ret;
5736}
5737
5738static int
5739bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size)
5740{
5741        static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555,
5742                0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa };
5743        int i;
5744
5745        for (i = 0; i < sizeof(test_pattern) / 4; i++) {
5746                u32 offset;
5747
5748                for (offset = 0; offset < size; offset += 4) {
5749
5750                        bnx2_reg_wr_ind(bp, start + offset, test_pattern[i]);
5751
5752                        if (bnx2_reg_rd_ind(bp, start + offset) !=
5753                                test_pattern[i]) {
5754                                return -ENODEV;
5755                        }
5756                }
5757        }
5758        return 0;
5759}
5760
5761static int
5762bnx2_test_memory(struct bnx2 *bp)
5763{
5764        int ret = 0;
5765        int i;
5766        static struct mem_entry {
5767                u32   offset;
5768                u32   len;
5769        } mem_tbl_5706[] = {
5770                { 0x60000,  0x4000 },
5771                { 0xa0000,  0x3000 },
5772                { 0xe0000,  0x4000 },
5773                { 0x120000, 0x4000 },
5774                { 0x1a0000, 0x4000 },
5775                { 0x160000, 0x4000 },
5776                { 0xffffffff, 0    },
5777        },
5778        mem_tbl_5709[] = {
5779                { 0x60000,  0x4000 },
5780                { 0xa0000,  0x3000 },
5781                { 0xe0000,  0x4000 },
5782                { 0x120000, 0x4000 },
5783                { 0x1a0000, 0x4000 },
5784                { 0xffffffff, 0    },
5785        };
5786        struct mem_entry *mem_tbl;
5787
5788        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
5789                mem_tbl = mem_tbl_5709;
5790        else
5791                mem_tbl = mem_tbl_5706;
5792
5793        for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
5794                if ((ret = bnx2_do_mem_test(bp, mem_tbl[i].offset,
5795                        mem_tbl[i].len)) != 0) {
5796                        return ret;
5797                }
5798        }
5799
5800        return ret;
5801}
5802
5803#define BNX2_MAC_LOOPBACK       0
5804#define BNX2_PHY_LOOPBACK       1
5805
5806static int
5807bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
5808{
5809        unsigned int pkt_size, num_pkts, i;
5810        struct sk_buff *skb;
5811        u8 *data;
5812        unsigned char *packet;
5813        u16 rx_start_idx, rx_idx;
5814        dma_addr_t map;
5815        struct bnx2_tx_bd *txbd;
5816        struct bnx2_sw_bd *rx_buf;
5817        struct l2_fhdr *rx_hdr;
5818        int ret = -ENODEV;
5819        struct bnx2_napi *bnapi = &bp->bnx2_napi[0], *tx_napi;
5820        struct bnx2_tx_ring_info *txr;
5821        struct bnx2_rx_ring_info *rxr;
5822
5823        tx_napi = bnapi;
5824
5825        txr = &tx_napi->tx_ring;
5826        rxr = &bnapi->rx_ring;
5827        if (loopback_mode == BNX2_MAC_LOOPBACK) {
5828                bp->loopback = MAC_LOOPBACK;
5829                bnx2_set_mac_loopback(bp);
5830        }
5831        else if (loopback_mode == BNX2_PHY_LOOPBACK) {
5832                if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
5833                        return 0;
5834
5835                bp->loopback = PHY_LOOPBACK;
5836                bnx2_set_phy_loopback(bp);
5837        }
5838        else
5839                return -EINVAL;
5840
5841        pkt_size = min(bp->dev->mtu + ETH_HLEN, bp->rx_jumbo_thresh - 4);
5842        skb = netdev_alloc_skb(bp->dev, pkt_size);
5843        if (!skb)
5844                return -ENOMEM;
5845        packet = skb_put(skb, pkt_size);
5846        memcpy(packet, bp->dev->dev_addr, ETH_ALEN);
5847        memset(packet + ETH_ALEN, 0x0, 8);
5848        for (i = 14; i < pkt_size; i++)
5849                packet[i] = (unsigned char) (i & 0xff);
5850
5851        map = dma_map_single(&bp->pdev->dev, skb->data, pkt_size,
5852                             PCI_DMA_TODEVICE);
5853        if (dma_mapping_error(&bp->pdev->dev, map)) {
5854                dev_kfree_skb(skb);
5855                return -EIO;
5856        }
5857
5858        BNX2_WR(bp, BNX2_HC_COMMAND,
5859                bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
5860
5861        BNX2_RD(bp, BNX2_HC_COMMAND);
5862
5863        udelay(5);
5864        rx_start_idx = bnx2_get_hw_rx_cons(bnapi);
5865
5866        num_pkts = 0;
5867
5868        txbd = &txr->tx_desc_ring[BNX2_TX_RING_IDX(txr->tx_prod)];
5869
5870        txbd->tx_bd_haddr_hi = (u64) map >> 32;
5871        txbd->tx_bd_haddr_lo = (u64) map & 0xffffffff;
5872        txbd->tx_bd_mss_nbytes = pkt_size;
5873        txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;
5874
5875        num_pkts++;
5876        txr->tx_prod = BNX2_NEXT_TX_BD(txr->tx_prod);
5877        txr->tx_prod_bseq += pkt_size;
5878
5879        BNX2_WR16(bp, txr->tx_bidx_addr, txr->tx_prod);
5880        BNX2_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq);
5881
5882        udelay(100);
5883
5884        BNX2_WR(bp, BNX2_HC_COMMAND,
5885                bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
5886
5887        BNX2_RD(bp, BNX2_HC_COMMAND);
5888
5889        udelay(5);
5890
5891        dma_unmap_single(&bp->pdev->dev, map, pkt_size, PCI_DMA_TODEVICE);
5892        dev_kfree_skb(skb);
5893
5894        if (bnx2_get_hw_tx_cons(tx_napi) != txr->tx_prod)
5895                goto loopback_test_done;
5896
5897        rx_idx = bnx2_get_hw_rx_cons(bnapi);
5898        if (rx_idx != rx_start_idx + num_pkts) {
5899                goto loopback_test_done;
5900        }
5901
5902        rx_buf = &rxr->rx_buf_ring[rx_start_idx];
5903        data = rx_buf->data;
5904
5905        rx_hdr = get_l2_fhdr(data);
5906        data = (u8 *)rx_hdr + BNX2_RX_OFFSET;
5907
5908        dma_sync_single_for_cpu(&bp->pdev->dev,
5909                dma_unmap_addr(rx_buf, mapping),
5910                bp->rx_buf_use_size, PCI_DMA_FROMDEVICE);
5911
5912        if (rx_hdr->l2_fhdr_status &
5913                (L2_FHDR_ERRORS_BAD_CRC |
5914                L2_FHDR_ERRORS_PHY_DECODE |
5915                L2_FHDR_ERRORS_ALIGNMENT |
5916                L2_FHDR_ERRORS_TOO_SHORT |
5917                L2_FHDR_ERRORS_GIANT_FRAME)) {
5918
5919                goto loopback_test_done;
5920        }
5921
5922        if ((rx_hdr->l2_fhdr_pkt_len - 4) != pkt_size) {
5923                goto loopback_test_done;
5924        }
5925
5926        for (i = 14; i < pkt_size; i++) {
5927                if (*(data + i) != (unsigned char) (i & 0xff)) {
5928                        goto loopback_test_done;
5929                }
5930        }
5931
5932        ret = 0;
5933
5934loopback_test_done:
5935        bp->loopback = 0;
5936        return ret;
5937}
5938
5939#define BNX2_MAC_LOOPBACK_FAILED        1
5940#define BNX2_PHY_LOOPBACK_FAILED        2
5941#define BNX2_LOOPBACK_FAILED            (BNX2_MAC_LOOPBACK_FAILED |     \
5942                                         BNX2_PHY_LOOPBACK_FAILED)
5943
5944static int
5945bnx2_test_loopback(struct bnx2 *bp)
5946{
5947        int rc = 0;
5948
5949        if (!netif_running(bp->dev))
5950                return BNX2_LOOPBACK_FAILED;
5951
5952        bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET);
5953        spin_lock_bh(&bp->phy_lock);
5954        bnx2_init_phy(bp, 1);
5955        spin_unlock_bh(&bp->phy_lock);
5956        if (bnx2_run_loopback(bp, BNX2_MAC_LOOPBACK))
5957                rc |= BNX2_MAC_LOOPBACK_FAILED;
5958        if (bnx2_run_loopback(bp, BNX2_PHY_LOOPBACK))
5959                rc |= BNX2_PHY_LOOPBACK_FAILED;
5960        return rc;
5961}
5962
5963#define NVRAM_SIZE 0x200
5964#define CRC32_RESIDUAL 0xdebb20e3
5965
5966static int
5967bnx2_test_nvram(struct bnx2 *bp)
5968{
5969        __be32 buf[NVRAM_SIZE / 4];
5970        u8 *data = (u8 *) buf;
5971        int rc = 0;
5972        u32 magic, csum;
5973
5974        if ((rc = bnx2_nvram_read(bp, 0, data, 4)) != 0)
5975                goto test_nvram_done;
5976
5977        magic = be32_to_cpu(buf[0]);
5978        if (magic != 0x669955aa) {
5979                rc = -ENODEV;
5980                goto test_nvram_done;
5981        }
5982
5983        if ((rc = bnx2_nvram_read(bp, 0x100, data, NVRAM_SIZE)) != 0)
5984                goto test_nvram_done;
5985
5986        csum = ether_crc_le(0x100, data);
5987        if (csum != CRC32_RESIDUAL) {
5988                rc = -ENODEV;
5989                goto test_nvram_done;
5990        }
5991
5992        csum = ether_crc_le(0x100, data + 0x100);
5993        if (csum != CRC32_RESIDUAL) {
5994                rc = -ENODEV;
5995        }
5996
5997test_nvram_done:
5998        return rc;
5999}
6000
6001static int
6002bnx2_test_link(struct bnx2 *bp)
6003{
6004        u32 bmsr;
6005
6006        if (!netif_running(bp->dev))
6007                return -ENODEV;
6008
6009        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
6010                if (bp->link_up)
6011                        return 0;
6012                return -ENODEV;
6013        }
6014        spin_lock_bh(&bp->phy_lock);
6015        bnx2_enable_bmsr1(bp);
6016        bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
6017        bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
6018        bnx2_disable_bmsr1(bp);
6019        spin_unlock_bh(&bp->phy_lock);
6020
6021        if (bmsr & BMSR_LSTATUS) {
6022                return 0;
6023        }
6024        return -ENODEV;
6025}
6026
6027static int
6028bnx2_test_intr(struct bnx2 *bp)
6029{
6030        int i;
6031        u16 status_idx;
6032
6033        if (!netif_running(bp->dev))
6034                return -ENODEV;
6035
6036        status_idx = BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff;
6037
6038        /* This register is not touched during run-time. */
6039        BNX2_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
6040        BNX2_RD(bp, BNX2_HC_COMMAND);
6041
6042        for (i = 0; i < 10; i++) {
6043                if ((BNX2_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) !=
6044                        status_idx) {
6045
6046                        break;
6047                }
6048
6049                msleep_interruptible(10);
6050        }
6051        if (i < 10)
6052                return 0;
6053
6054        return -ENODEV;
6055}
6056
6057/* Determining link for parallel detection. */
6058static int
6059bnx2_5706_serdes_has_link(struct bnx2 *bp)
6060{
6061        u32 mode_ctl, an_dbg, exp;
6062
6063        if (bp->phy_flags & BNX2_PHY_FLAG_NO_PARALLEL)
6064                return 0;
6065
6066        bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_MODE_CTL);
6067        bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &mode_ctl);
6068
6069        if (!(mode_ctl & MISC_SHDW_MODE_CTL_SIG_DET))
6070                return 0;
6071
6072        bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
6073        bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
6074        bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
6075
6076        if (an_dbg & (MISC_SHDW_AN_DBG_NOSYNC | MISC_SHDW_AN_DBG_RUDI_INVALID))
6077                return 0;
6078
6079        bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_REG1);
6080        bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &exp);
6081        bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &exp);
6082
6083        if (exp & MII_EXPAND_REG1_RUDI_C)       /* receiving CONFIG */
6084                return 0;
6085
6086        return 1;
6087}
6088
6089static void
6090bnx2_5706_serdes_timer(struct bnx2 *bp)
6091{
6092        int check_link = 1;
6093
6094        spin_lock(&bp->phy_lock);
6095        if (bp->serdes_an_pending) {
6096                bp->serdes_an_pending--;
6097                check_link = 0;
6098        } else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
6099                u32 bmcr;
6100
6101                bp->current_interval = BNX2_TIMER_INTERVAL;
6102
6103                bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
6104
6105                if (bmcr & BMCR_ANENABLE) {
6106                        if (bnx2_5706_serdes_has_link(bp)) {
6107                                bmcr &= ~BMCR_ANENABLE;
6108                                bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX;
6109                                bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
6110                                bp->phy_flags |= BNX2_PHY_FLAG_PARALLEL_DETECT;
6111                        }
6112                }
6113        }
6114        else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) &&
6115                 (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT)) {
6116                u32 phy2;
6117
6118                bnx2_write_phy(bp, 0x17, 0x0f01);
6119                bnx2_read_phy(bp, 0x15, &phy2);
6120                if (phy2 & 0x20) {
6121                        u32 bmcr;
6122
6123                        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
6124                        bmcr |= BMCR_ANENABLE;
6125                        bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
6126
6127                        bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
6128                }
6129        } else
6130                bp->current_interval = BNX2_TIMER_INTERVAL;
6131
6132        if (check_link) {
6133                u32 val;
6134
6135                bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
6136                bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &val);
6137                bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &val);
6138
6139                if (bp->link_up && (val & MISC_SHDW_AN_DBG_NOSYNC)) {
6140                        if (!(bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN)) {
6141                                bnx2_5706s_force_link_dn(bp, 1);
6142                                bp->phy_flags |= BNX2_PHY_FLAG_FORCED_DOWN;
6143                        } else
6144                                bnx2_set_link(bp);
6145                } else if (!bp->link_up && !(val & MISC_SHDW_AN_DBG_NOSYNC))
6146                        bnx2_set_link(bp);
6147        }
6148        spin_unlock(&bp->phy_lock);
6149}
6150
6151static void
6152bnx2_5708_serdes_timer(struct bnx2 *bp)
6153{
6154        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
6155                return;
6156
6157        if ((bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) == 0) {
6158                bp->serdes_an_pending = 0;
6159                return;
6160        }
6161
6162        spin_lock(&bp->phy_lock);
6163        if (bp->serdes_an_pending)
6164                bp->serdes_an_pending--;
6165        else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
6166                u32 bmcr;
6167
6168                bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
6169                if (bmcr & BMCR_ANENABLE) {
6170                        bnx2_enable_forced_2g5(bp);
6171                        bp->current_interval = BNX2_SERDES_FORCED_TIMEOUT;
6172                } else {
6173                        bnx2_disable_forced_2g5(bp);
6174                        bp->serdes_an_pending = 2;
6175                        bp->current_interval = BNX2_TIMER_INTERVAL;
6176                }
6177
6178        } else
6179                bp->current_interval = BNX2_TIMER_INTERVAL;
6180
6181        spin_unlock(&bp->phy_lock);
6182}
6183
6184static void
6185bnx2_timer(struct timer_list *t)
6186{
6187        struct bnx2 *bp = from_timer(bp, t, timer);
6188
6189        if (!netif_running(bp->dev))
6190                return;
6191
6192        if (atomic_read(&bp->intr_sem) != 0)
6193                goto bnx2_restart_timer;
6194
6195        if ((bp->flags & (BNX2_FLAG_USING_MSI | BNX2_FLAG_ONE_SHOT_MSI)) ==
6196             BNX2_FLAG_USING_MSI)
6197                bnx2_chk_missed_msi(bp);
6198
6199        bnx2_send_heart_beat(bp);
6200
6201        bp->stats_blk->stat_FwRxDrop =
6202                bnx2_reg_rd_ind(bp, BNX2_FW_RX_DROP_COUNT);
6203
6204        /* workaround occasional corrupted counters */
6205        if ((bp->flags & BNX2_FLAG_BROKEN_STATS) && bp->stats_ticks)
6206                BNX2_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd |
6207                        BNX2_HC_COMMAND_STATS_NOW);
6208
6209        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
6210                if (BNX2_CHIP(bp) == BNX2_CHIP_5706)
6211                        bnx2_5706_serdes_timer(bp);
6212                else
6213                        bnx2_5708_serdes_timer(bp);
6214        }
6215
6216bnx2_restart_timer:
6217        mod_timer(&bp->timer, jiffies + bp->current_interval);
6218}
6219
6220static int
6221bnx2_request_irq(struct bnx2 *bp)
6222{
6223        unsigned long flags;
6224        struct bnx2_irq *irq;
6225        int rc = 0, i;
6226
6227        if (bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)
6228                flags = 0;
6229        else
6230                flags = IRQF_SHARED;
6231
6232        for (i = 0; i < bp->irq_nvecs; i++) {
6233                irq = &bp->irq_tbl[i];
6234                rc = request_irq(irq->vector, irq->handler, flags, irq->name,
6235                                 &bp->bnx2_napi[i]);
6236                if (rc)
6237                        break;
6238                irq->requested = 1;
6239        }
6240        return rc;
6241}
6242
6243static void
6244__bnx2_free_irq(struct bnx2 *bp)
6245{
6246        struct bnx2_irq *irq;
6247        int i;
6248
6249        for (i = 0; i < bp->irq_nvecs; i++) {
6250                irq = &bp->irq_tbl[i];
6251                if (irq->requested)
6252                        free_irq(irq->vector, &bp->bnx2_napi[i]);
6253                irq->requested = 0;
6254        }
6255}
6256
6257static void
6258bnx2_free_irq(struct bnx2 *bp)
6259{
6260
6261        __bnx2_free_irq(bp);
6262        if (bp->flags & BNX2_FLAG_USING_MSI)
6263                pci_disable_msi(bp->pdev);
6264        else if (bp->flags & BNX2_FLAG_USING_MSIX)
6265                pci_disable_msix(bp->pdev);
6266
6267        bp->flags &= ~(BNX2_FLAG_USING_MSI_OR_MSIX | BNX2_FLAG_ONE_SHOT_MSI);
6268}
6269
6270static void
6271bnx2_enable_msix(struct bnx2 *bp, int msix_vecs)
6272{
6273        int i, total_vecs;
6274        struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC];
6275        struct net_device *dev = bp->dev;
6276        const int len = sizeof(bp->irq_tbl[0].name);
6277
6278        bnx2_setup_msix_tbl(bp);
6279        BNX2_WR(bp, BNX2_PCI_MSIX_CONTROL, BNX2_MAX_MSIX_HW_VEC - 1);
6280        BNX2_WR(bp, BNX2_PCI_MSIX_TBL_OFF_BIR, BNX2_PCI_GRC_WINDOW2_BASE);
6281        BNX2_WR(bp, BNX2_PCI_MSIX_PBA_OFF_BIT, BNX2_PCI_GRC_WINDOW3_BASE);
6282
6283        /*  Need to flush the previous three writes to ensure MSI-X
6284         *  is setup properly */
6285        BNX2_RD(bp, BNX2_PCI_MSIX_CONTROL);
6286
6287        for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
6288                msix_ent[i].entry = i;
6289                msix_ent[i].vector = 0;
6290        }
6291
6292        total_vecs = msix_vecs;
6293#ifdef BCM_CNIC
6294        total_vecs++;
6295#endif
6296        total_vecs = pci_enable_msix_range(bp->pdev, msix_ent,
6297                                           BNX2_MIN_MSIX_VEC, total_vecs);
6298        if (total_vecs < 0)
6299                return;
6300
6301        msix_vecs = total_vecs;
6302#ifdef BCM_CNIC
6303        msix_vecs--;
6304#endif
6305        bp->irq_nvecs = msix_vecs;
6306        bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI;
6307        for (i = 0; i < total_vecs; i++) {
6308                bp->irq_tbl[i].vector = msix_ent[i].vector;
6309                snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i);
6310                bp->irq_tbl[i].handler = bnx2_msi_1shot;
6311        }
6312}
6313
6314static int
6315bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi)
6316{
6317        int cpus = netif_get_num_default_rss_queues();
6318        int msix_vecs;
6319
6320        if (!bp->num_req_rx_rings)
6321                msix_vecs = max(cpus + 1, bp->num_req_tx_rings);
6322        else if (!bp->num_req_tx_rings)
6323                msix_vecs = max(cpus, bp->num_req_rx_rings);
6324        else
6325                msix_vecs = max(bp->num_req_rx_rings, bp->num_req_tx_rings);
6326
6327        msix_vecs = min(msix_vecs, RX_MAX_RINGS);
6328
6329        bp->irq_tbl[0].handler = bnx2_interrupt;
6330        strcpy(bp->irq_tbl[0].name, bp->dev->name);
6331        bp->irq_nvecs = 1;
6332        bp->irq_tbl[0].vector = bp->pdev->irq;
6333
6334        if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !dis_msi)
6335                bnx2_enable_msix(bp, msix_vecs);
6336
6337        if ((bp->flags & BNX2_FLAG_MSI_CAP) && !dis_msi &&
6338            !(bp->flags & BNX2_FLAG_USING_MSIX)) {
6339                if (pci_enable_msi(bp->pdev) == 0) {
6340                        bp->flags |= BNX2_FLAG_USING_MSI;
6341                        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
6342                                bp->flags |= BNX2_FLAG_ONE_SHOT_MSI;
6343                                bp->irq_tbl[0].handler = bnx2_msi_1shot;
6344                        } else
6345                                bp->irq_tbl[0].handler = bnx2_msi;
6346
6347                        bp->irq_tbl[0].vector = bp->pdev->irq;
6348                }
6349        }
6350
6351        if (!bp->num_req_tx_rings)
6352                bp->num_tx_rings = rounddown_pow_of_two(bp->irq_nvecs);
6353        else
6354                bp->num_tx_rings = min(bp->irq_nvecs, bp->num_req_tx_rings);
6355
6356        if (!bp->num_req_rx_rings)
6357                bp->num_rx_rings = bp->irq_nvecs;
6358        else
6359                bp->num_rx_rings = min(bp->irq_nvecs, bp->num_req_rx_rings);
6360
6361        netif_set_real_num_tx_queues(bp->dev, bp->num_tx_rings);
6362
6363        return netif_set_real_num_rx_queues(bp->dev, bp->num_rx_rings);
6364}
6365
6366/* Called with rtnl_lock */
6367static int
6368bnx2_open(struct net_device *dev)
6369{
6370        struct bnx2 *bp = netdev_priv(dev);
6371        int rc;
6372
6373        rc = bnx2_request_firmware(bp);
6374        if (rc < 0)
6375                goto out;
6376
6377        netif_carrier_off(dev);
6378
6379        bnx2_disable_int(bp);
6380
6381        rc = bnx2_setup_int_mode(bp, disable_msi);
6382        if (rc)
6383                goto open_err;
6384        bnx2_init_napi(bp);
6385        bnx2_napi_enable(bp);
6386        rc = bnx2_alloc_mem(bp);
6387        if (rc)
6388                goto open_err;
6389
6390        rc = bnx2_request_irq(bp);
6391        if (rc)
6392                goto open_err;
6393
6394        rc = bnx2_init_nic(bp, 1);
6395        if (rc)
6396                goto open_err;
6397
6398        mod_timer(&bp->timer, jiffies + bp->current_interval);
6399
6400        atomic_set(&bp->intr_sem, 0);
6401
6402        memset(bp->temp_stats_blk, 0, sizeof(struct statistics_block));
6403
6404        bnx2_enable_int(bp);
6405
6406        if (bp->flags & BNX2_FLAG_USING_MSI) {
6407                /* Test MSI to make sure it is working
6408                 * If MSI test fails, go back to INTx mode
6409                 */
6410                if (bnx2_test_intr(bp) != 0) {
6411                        netdev_warn(bp->dev, "No interrupt was generated using MSI, switching to INTx mode. Please report this failure to the PCI maintainer and include system chipset information.\n");
6412
6413                        bnx2_disable_int(bp);
6414                        bnx2_free_irq(bp);
6415
6416                        bnx2_setup_int_mode(bp, 1);
6417
6418                        rc = bnx2_init_nic(bp, 0);
6419
6420                        if (!rc)
6421                                rc = bnx2_request_irq(bp);
6422
6423                        if (rc) {
6424                                del_timer_sync(&bp->timer);
6425                                goto open_err;
6426                        }
6427                        bnx2_enable_int(bp);
6428                }
6429        }
6430        if (bp->flags & BNX2_FLAG_USING_MSI)
6431                netdev_info(dev, "using MSI\n");
6432        else if (bp->flags & BNX2_FLAG_USING_MSIX)
6433                netdev_info(dev, "using MSIX\n");
6434
6435        netif_tx_start_all_queues(dev);
6436out:
6437        return rc;
6438
6439open_err:
6440        bnx2_napi_disable(bp);
6441        bnx2_free_skbs(bp);
6442        bnx2_free_irq(bp);
6443        bnx2_free_mem(bp);
6444        bnx2_del_napi(bp);
6445        bnx2_release_firmware(bp);
6446        goto out;
6447}
6448
6449static void
6450bnx2_reset_task(struct work_struct *work)
6451{
6452        struct bnx2 *bp = container_of(work, struct bnx2, reset_task);
6453        int rc;
6454        u16 pcicmd;
6455
6456        rtnl_lock();
6457        if (!netif_running(bp->dev)) {
6458                rtnl_unlock();
6459                return;
6460        }
6461
6462        bnx2_netif_stop(bp, true);
6463
6464        pci_read_config_word(bp->pdev, PCI_COMMAND, &pcicmd);
6465        if (!(pcicmd & PCI_COMMAND_MEMORY)) {
6466                /* in case PCI block has reset */
6467                pci_restore_state(bp->pdev);
6468                pci_save_state(bp->pdev);
6469        }
6470        rc = bnx2_init_nic(bp, 1);
6471        if (rc) {
6472                netdev_err(bp->dev, "failed to reset NIC, closing\n");
6473                bnx2_napi_enable(bp);
6474                dev_close(bp->dev);
6475                rtnl_unlock();
6476                return;
6477        }
6478
6479        atomic_set(&bp->intr_sem, 1);
6480        bnx2_netif_start(bp, true);
6481        rtnl_unlock();
6482}
6483
6484#define BNX2_FTQ_ENTRY(ftq) { __stringify(ftq##FTQ_CTL), BNX2_##ftq##FTQ_CTL }
6485
6486static void
6487bnx2_dump_ftq(struct bnx2 *bp)
6488{
6489        int i;
6490        u32 reg, bdidx, cid, valid;
6491        struct net_device *dev = bp->dev;
6492        static const struct ftq_reg {
6493                char *name;
6494                u32 off;
6495        } ftq_arr[] = {
6496                BNX2_FTQ_ENTRY(RV2P_P),
6497                BNX2_FTQ_ENTRY(RV2P_T),
6498                BNX2_FTQ_ENTRY(RV2P_M),
6499                BNX2_FTQ_ENTRY(TBDR_),
6500                BNX2_FTQ_ENTRY(TDMA_),
6501                BNX2_FTQ_ENTRY(TXP_),
6502                BNX2_FTQ_ENTRY(TXP_),
6503                BNX2_FTQ_ENTRY(TPAT_),
6504                BNX2_FTQ_ENTRY(RXP_C),
6505                BNX2_FTQ_ENTRY(RXP_),
6506                BNX2_FTQ_ENTRY(COM_COMXQ_),
6507                BNX2_FTQ_ENTRY(COM_COMTQ_),
6508                BNX2_FTQ_ENTRY(COM_COMQ_),
6509                BNX2_FTQ_ENTRY(CP_CPQ_),
6510        };
6511
6512        netdev_err(dev, "<--- start FTQ dump --->\n");
6513        for (i = 0; i < ARRAY_SIZE(ftq_arr); i++)
6514                netdev_err(dev, "%s %08x\n", ftq_arr[i].name,
6515                           bnx2_reg_rd_ind(bp, ftq_arr[i].off));
6516
6517        netdev_err(dev, "CPU states:\n");
6518        for (reg = BNX2_TXP_CPU_MODE; reg <= BNX2_CP_CPU_MODE; reg += 0x40000)
6519                netdev_err(dev, "%06x mode %x state %x evt_mask %x pc %x pc %x instr %x\n",
6520                           reg, bnx2_reg_rd_ind(bp, reg),
6521                           bnx2_reg_rd_ind(bp, reg + 4),
6522                           bnx2_reg_rd_ind(bp, reg + 8),
6523                           bnx2_reg_rd_ind(bp, reg + 0x1c),
6524                           bnx2_reg_rd_ind(bp, reg + 0x1c),
6525                           bnx2_reg_rd_ind(bp, reg + 0x20));
6526
6527        netdev_err(dev, "<--- end FTQ dump --->\n");
6528        netdev_err(dev, "<--- start TBDC dump --->\n");
6529        netdev_err(dev, "TBDC free cnt: %ld\n",
6530                   BNX2_RD(bp, BNX2_TBDC_STATUS) & BNX2_TBDC_STATUS_FREE_CNT);
6531        netdev_err(dev, "LINE     CID  BIDX   CMD  VALIDS\n");
6532        for (i = 0; i < 0x20; i++) {
6533                int j = 0;
6534
6535                BNX2_WR(bp, BNX2_TBDC_BD_ADDR, i);
6536                BNX2_WR(bp, BNX2_TBDC_CAM_OPCODE,
6537                        BNX2_TBDC_CAM_OPCODE_OPCODE_CAM_READ);
6538                BNX2_WR(bp, BNX2_TBDC_COMMAND, BNX2_TBDC_COMMAND_CMD_REG_ARB);
6539                while ((BNX2_RD(bp, BNX2_TBDC_COMMAND) &
6540                        BNX2_TBDC_COMMAND_CMD_REG_ARB) && j < 100)
6541                        j++;
6542
6543                cid = BNX2_RD(bp, BNX2_TBDC_CID);
6544                bdidx = BNX2_RD(bp, BNX2_TBDC_BIDX);
6545                valid = BNX2_RD(bp, BNX2_TBDC_CAM_OPCODE);
6546                netdev_err(dev, "%02x    %06x  %04lx   %02x    [%x]\n",
6547                           i, cid, bdidx & BNX2_TBDC_BDIDX_BDIDX,
6548                           bdidx >> 24, (valid >> 8) & 0x0ff);
6549        }
6550        netdev_err(dev, "<--- end TBDC dump --->\n");
6551}
6552
6553static void
6554bnx2_dump_state(struct bnx2 *bp)
6555{
6556        struct net_device *dev = bp->dev;
6557        u32 val1, val2;
6558
6559        pci_read_config_dword(bp->pdev, PCI_COMMAND, &val1);
6560        netdev_err(dev, "DEBUG: intr_sem[%x] PCI_CMD[%08x]\n",
6561                   atomic_read(&bp->intr_sem), val1);
6562        pci_read_config_dword(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &val1);
6563        pci_read_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG, &val2);
6564        netdev_err(dev, "DEBUG: PCI_PM[%08x] PCI_MISC_CFG[%08x]\n", val1, val2);
6565        netdev_err(dev, "DEBUG: EMAC_TX_STATUS[%08x] EMAC_RX_STATUS[%08x]\n",
6566                   BNX2_RD(bp, BNX2_EMAC_TX_STATUS),
6567                   BNX2_RD(bp, BNX2_EMAC_RX_STATUS));
6568        netdev_err(dev, "DEBUG: RPM_MGMT_PKT_CTRL[%08x]\n",
6569                   BNX2_RD(bp, BNX2_RPM_MGMT_PKT_CTRL));
6570        netdev_err(dev, "DEBUG: HC_STATS_INTERRUPT_STATUS[%08x]\n",
6571                   BNX2_RD(bp, BNX2_HC_STATS_INTERRUPT_STATUS));
6572        if (bp->flags & BNX2_FLAG_USING_MSIX)
6573                netdev_err(dev, "DEBUG: PBA[%08x]\n",
6574                           BNX2_RD(bp, BNX2_PCI_GRC_WINDOW3_BASE));
6575}
6576
6577static void
6578bnx2_tx_timeout(struct net_device *dev)
6579{
6580        struct bnx2 *bp = netdev_priv(dev);
6581
6582        bnx2_dump_ftq(bp);
6583        bnx2_dump_state(bp);
6584        bnx2_dump_mcp_state(bp);
6585
6586        /* This allows the netif to be shutdown gracefully before resetting */
6587        schedule_work(&bp->reset_task);
6588}
6589
6590/* Called with netif_tx_lock.
6591 * bnx2_tx_int() runs without netif_tx_lock unless it needs to call
6592 * netif_wake_queue().
6593 */
6594static netdev_tx_t
6595bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
6596{
6597        struct bnx2 *bp = netdev_priv(dev);
6598        dma_addr_t mapping;
6599        struct bnx2_tx_bd *txbd;
6600        struct bnx2_sw_tx_bd *tx_buf;
6601        u32 len, vlan_tag_flags, last_frag, mss;
6602        u16 prod, ring_prod;
6603        int i;
6604        struct bnx2_napi *bnapi;
6605        struct bnx2_tx_ring_info *txr;
6606        struct netdev_queue *txq;
6607
6608        /*  Determine which tx ring we will be placed on */
6609        i = skb_get_queue_mapping(skb);
6610        bnapi = &bp->bnx2_napi[i];
6611        txr = &bnapi->tx_ring;
6612        txq = netdev_get_tx_queue(dev, i);
6613
6614        if (unlikely(bnx2_tx_avail(bp, txr) <
6615            (skb_shinfo(skb)->nr_frags + 1))) {
6616                netif_tx_stop_queue(txq);
6617                netdev_err(dev, "BUG! Tx ring full when queue awake!\n");
6618
6619                return NETDEV_TX_BUSY;
6620        }
6621        len = skb_headlen(skb);
6622        prod = txr->tx_prod;
6623        ring_prod = BNX2_TX_RING_IDX(prod);
6624
6625        vlan_tag_flags = 0;
6626        if (skb->ip_summed == CHECKSUM_PARTIAL) {
6627                vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM;
6628        }
6629
6630        if (skb_vlan_tag_present(skb)) {
6631                vlan_tag_flags |=
6632                        (TX_BD_FLAGS_VLAN_TAG | (skb_vlan_tag_get(skb) << 16));
6633        }
6634
6635        if ((mss = skb_shinfo(skb)->gso_size)) {
6636                u32 tcp_opt_len;
6637                struct iphdr *iph;
6638
6639                vlan_tag_flags |= TX_BD_FLAGS_SW_LSO;
6640
6641                tcp_opt_len = tcp_optlen(skb);
6642
6643                if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) {
6644                        u32 tcp_off = skb_transport_offset(skb) -
6645                                      sizeof(struct ipv6hdr) - ETH_HLEN;
6646
6647                        vlan_tag_flags |= ((tcp_opt_len >> 2) << 8) |
6648                                          TX_BD_FLAGS_SW_FLAGS;
6649                        if (likely(tcp_off == 0))
6650                                vlan_tag_flags &= ~TX_BD_FLAGS_TCP6_OFF0_MSK;
6651                        else {
6652                                tcp_off >>= 3;
6653                                vlan_tag_flags |= ((tcp_off & 0x3) <<
6654                                                   TX_BD_FLAGS_TCP6_OFF0_SHL) |
6655                                                  ((tcp_off & 0x10) <<
6656                                                   TX_BD_FLAGS_TCP6_OFF4_SHL);
6657                                mss |= (tcp_off & 0xc) << TX_BD_TCP6_OFF2_SHL;
6658                        }
6659                } else {
6660                        iph = ip_hdr(skb);
6661                        if (tcp_opt_len || (iph->ihl > 5)) {
6662                                vlan_tag_flags |= ((iph->ihl - 5) +
6663                                                   (tcp_opt_len >> 2)) << 8;
6664                        }
6665                }
6666        } else
6667                mss = 0;
6668
6669        mapping = dma_map_single(&bp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
6670        if (dma_mapping_error(&bp->pdev->dev, mapping)) {
6671                dev_kfree_skb_any(skb);
6672                return NETDEV_TX_OK;
6673        }
6674
6675        tx_buf = &txr->tx_buf_ring[ring_prod];
6676        tx_buf->skb = skb;
6677        dma_unmap_addr_set(tx_buf, mapping, mapping);
6678
6679        txbd = &txr->tx_desc_ring[ring_prod];
6680
6681        txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
6682        txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
6683        txbd->tx_bd_mss_nbytes = len | (mss << 16);
6684        txbd->tx_bd_vlan_tag_flags = vlan_tag_flags | TX_BD_FLAGS_START;
6685
6686        last_frag = skb_shinfo(skb)->nr_frags;
6687        tx_buf->nr_frags = last_frag;
6688        tx_buf->is_gso = skb_is_gso(skb);
6689
6690        for (i = 0; i < last_frag; i++) {
6691                const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
6692
6693                prod = BNX2_NEXT_TX_BD(prod);
6694                ring_prod = BNX2_TX_RING_IDX(prod);
6695                txbd = &txr->tx_desc_ring[ring_prod];
6696
6697                len = skb_frag_size(frag);
6698                mapping = skb_frag_dma_map(&bp->pdev->dev, frag, 0, len,
6699                                           DMA_TO_DEVICE);
6700                if (dma_mapping_error(&bp->pdev->dev, mapping))
6701                        goto dma_error;
6702                dma_unmap_addr_set(&txr->tx_buf_ring[ring_prod], mapping,
6703                                   mapping);
6704
6705                txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
6706                txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
6707                txbd->tx_bd_mss_nbytes = len | (mss << 16);
6708                txbd->tx_bd_vlan_tag_flags = vlan_tag_flags;
6709
6710        }
6711        txbd->tx_bd_vlan_tag_flags |= TX_BD_FLAGS_END;
6712
6713        /* Sync BD data before updating TX mailbox */
6714        wmb();
6715
6716        netdev_tx_sent_queue(txq, skb->len);
6717
6718        prod = BNX2_NEXT_TX_BD(prod);
6719        txr->tx_prod_bseq += skb->len;
6720
6721        BNX2_WR16(bp, txr->tx_bidx_addr, prod);
6722        BNX2_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq);
6723
6724        txr->tx_prod = prod;
6725
6726        if (unlikely(bnx2_tx_avail(bp, txr) <= MAX_SKB_FRAGS)) {
6727                netif_tx_stop_queue(txq);
6728
6729                /* netif_tx_stop_queue() must be done before checking
6730                 * tx index in bnx2_tx_avail() below, because in
6731                 * bnx2_tx_int(), we update tx index before checking for
6732                 * netif_tx_queue_stopped().
6733                 */
6734                smp_mb();
6735                if (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)
6736                        netif_tx_wake_queue(txq);
6737        }
6738
6739        return NETDEV_TX_OK;
6740dma_error:
6741        /* save value of frag that failed */
6742        last_frag = i;
6743
6744        /* start back at beginning and unmap skb */
6745        prod = txr->tx_prod;
6746        ring_prod = BNX2_TX_RING_IDX(prod);
6747        tx_buf = &txr->tx_buf_ring[ring_prod];
6748        tx_buf->skb = NULL;
6749        dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
6750                         skb_headlen(skb), PCI_DMA_TODEVICE);
6751
6752        /* unmap remaining mapped pages */
6753        for (i = 0; i < last_frag; i++) {
6754                prod = BNX2_NEXT_TX_BD(prod);
6755                ring_prod = BNX2_TX_RING_IDX(prod);
6756                tx_buf = &txr->tx_buf_ring[ring_prod];
6757                dma_unmap_page(&bp->pdev->dev, dma_unmap_addr(tx_buf, mapping),
6758                               skb_frag_size(&skb_shinfo(skb)->frags[i]),
6759                               PCI_DMA_TODEVICE);
6760        }
6761
6762        dev_kfree_skb_any(skb);
6763        return NETDEV_TX_OK;
6764}
6765
6766/* Called with rtnl_lock */
6767static int
6768bnx2_close(struct net_device *dev)
6769{
6770        struct bnx2 *bp = netdev_priv(dev);
6771
6772        bnx2_disable_int_sync(bp);
6773        bnx2_napi_disable(bp);
6774        netif_tx_disable(dev);
6775        del_timer_sync(&bp->timer);
6776        bnx2_shutdown_chip(bp);
6777        bnx2_free_irq(bp);
6778        bnx2_free_skbs(bp);
6779        bnx2_free_mem(bp);
6780        bnx2_del_napi(bp);
6781        bp->link_up = 0;
6782        netif_carrier_off(bp->dev);
6783        return 0;
6784}
6785
6786static void
6787bnx2_save_stats(struct bnx2 *bp)
6788{
6789        u32 *hw_stats = (u32 *) bp->stats_blk;
6790        u32 *temp_stats = (u32 *) bp->temp_stats_blk;
6791        int i;
6792
6793        /* The 1st 10 counters are 64-bit counters */
6794        for (i = 0; i < 20; i += 2) {
6795                u32 hi;
6796                u64 lo;
6797
6798                hi = temp_stats[i] + hw_stats[i];
6799                lo = (u64) temp_stats[i + 1] + (u64) hw_stats[i + 1];
6800                if (lo > 0xffffffff)
6801                        hi++;
6802                temp_stats[i] = hi;
6803                temp_stats[i + 1] = lo & 0xffffffff;
6804        }
6805
6806        for ( ; i < sizeof(struct statistics_block) / 4; i++)
6807                temp_stats[i] += hw_stats[i];
6808}
6809
6810#define GET_64BIT_NET_STATS64(ctr)              \
6811        (((u64) (ctr##_hi) << 32) + (u64) (ctr##_lo))
6812
6813#define GET_64BIT_NET_STATS(ctr)                                \
6814        GET_64BIT_NET_STATS64(bp->stats_blk->ctr) +             \
6815        GET_64BIT_NET_STATS64(bp->temp_stats_blk->ctr)
6816
6817#define GET_32BIT_NET_STATS(ctr)                                \
6818        (unsigned long) (bp->stats_blk->ctr +                   \
6819                         bp->temp_stats_blk->ctr)
6820
6821static void
6822bnx2_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *net_stats)
6823{
6824        struct bnx2 *bp = netdev_priv(dev);
6825
6826        if (!bp->stats_blk)
6827                return;
6828
6829        net_stats->rx_packets =
6830                GET_64BIT_NET_STATS(stat_IfHCInUcastPkts) +
6831                GET_64BIT_NET_STATS(stat_IfHCInMulticastPkts) +
6832                GET_64BIT_NET_STATS(stat_IfHCInBroadcastPkts);
6833
6834        net_stats->tx_packets =
6835                GET_64BIT_NET_STATS(stat_IfHCOutUcastPkts) +
6836                GET_64BIT_NET_STATS(stat_IfHCOutMulticastPkts) +
6837                GET_64BIT_NET_STATS(stat_IfHCOutBroadcastPkts);
6838
6839        net_stats->rx_bytes =
6840                GET_64BIT_NET_STATS(stat_IfHCInOctets);
6841
6842        net_stats->tx_bytes =
6843                GET_64BIT_NET_STATS(stat_IfHCOutOctets);
6844
6845        net_stats->multicast =
6846                GET_64BIT_NET_STATS(stat_IfHCInMulticastPkts);
6847
6848        net_stats->collisions =
6849                GET_32BIT_NET_STATS(stat_EtherStatsCollisions);
6850
6851        net_stats->rx_length_errors =
6852                GET_32BIT_NET_STATS(stat_EtherStatsUndersizePkts) +
6853                GET_32BIT_NET_STATS(stat_EtherStatsOverrsizePkts);
6854
6855        net_stats->rx_over_errors =
6856                GET_32BIT_NET_STATS(stat_IfInFTQDiscards) +
6857                GET_32BIT_NET_STATS(stat_IfInMBUFDiscards);
6858
6859        net_stats->rx_frame_errors =
6860                GET_32BIT_NET_STATS(stat_Dot3StatsAlignmentErrors);
6861
6862        net_stats->rx_crc_errors =
6863                GET_32BIT_NET_STATS(stat_Dot3StatsFCSErrors);
6864
6865        net_stats->rx_errors = net_stats->rx_length_errors +
6866                net_stats->rx_over_errors + net_stats->rx_frame_errors +
6867                net_stats->rx_crc_errors;
6868
6869        net_stats->tx_aborted_errors =
6870                GET_32BIT_NET_STATS(stat_Dot3StatsExcessiveCollisions) +
6871                GET_32BIT_NET_STATS(stat_Dot3StatsLateCollisions);
6872
6873        if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) ||
6874            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0))
6875                net_stats->tx_carrier_errors = 0;
6876        else {
6877                net_stats->tx_carrier_errors =
6878                        GET_32BIT_NET_STATS(stat_Dot3StatsCarrierSenseErrors);
6879        }
6880
6881        net_stats->tx_errors =
6882                GET_32BIT_NET_STATS(stat_emac_tx_stat_dot3statsinternalmactransmiterrors) +
6883                net_stats->tx_aborted_errors +
6884                net_stats->tx_carrier_errors;
6885
6886        net_stats->rx_missed_errors =
6887                GET_32BIT_NET_STATS(stat_IfInFTQDiscards) +
6888                GET_32BIT_NET_STATS(stat_IfInMBUFDiscards) +
6889                GET_32BIT_NET_STATS(stat_FwRxDrop);
6890
6891}
6892
6893/* All ethtool functions called with rtnl_lock */
6894
6895static int
6896bnx2_get_link_ksettings(struct net_device *dev,
6897                        struct ethtool_link_ksettings *cmd)
6898{
6899        struct bnx2 *bp = netdev_priv(dev);
6900        int support_serdes = 0, support_copper = 0;
6901        u32 supported, advertising;
6902
6903        supported = SUPPORTED_Autoneg;
6904        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
6905                support_serdes = 1;
6906                support_copper = 1;
6907        } else if (bp->phy_port == PORT_FIBRE)
6908                support_serdes = 1;
6909        else
6910                support_copper = 1;
6911
6912        if (support_serdes) {
6913                supported |= SUPPORTED_1000baseT_Full |
6914                        SUPPORTED_FIBRE;
6915                if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)
6916                        supported |= SUPPORTED_2500baseX_Full;
6917        }
6918        if (support_copper) {
6919                supported |= SUPPORTED_10baseT_Half |
6920                        SUPPORTED_10baseT_Full |
6921                        SUPPORTED_100baseT_Half |
6922                        SUPPORTED_100baseT_Full |
6923                        SUPPORTED_1000baseT_Full |
6924                        SUPPORTED_TP;
6925        }
6926
6927        spin_lock_bh(&bp->phy_lock);
6928        cmd->base.port = bp->phy_port;
6929        advertising = bp->advertising;
6930
6931        if (bp->autoneg & AUTONEG_SPEED) {
6932                cmd->base.autoneg = AUTONEG_ENABLE;
6933        } else {
6934                cmd->base.autoneg = AUTONEG_DISABLE;
6935        }
6936
6937        if (netif_carrier_ok(dev)) {
6938                cmd->base.speed = bp->line_speed;
6939                cmd->base.duplex = bp->duplex;
6940                if (!(bp->phy_flags & BNX2_PHY_FLAG_SERDES)) {
6941                        if (bp->phy_flags & BNX2_PHY_FLAG_MDIX)
6942                                cmd->base.eth_tp_mdix = ETH_TP_MDI_X;
6943                        else
6944                                cmd->base.eth_tp_mdix = ETH_TP_MDI;
6945                }
6946        }
6947        else {
6948                cmd->base.speed = SPEED_UNKNOWN;
6949                cmd->base.duplex = DUPLEX_UNKNOWN;
6950        }
6951        spin_unlock_bh(&bp->phy_lock);
6952
6953        cmd->base.phy_address = bp->phy_addr;
6954
6955        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
6956                                                supported);
6957        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
6958                                                advertising);
6959
6960        return 0;
6961}
6962
6963static int
6964bnx2_set_link_ksettings(struct net_device *dev,
6965                        const struct ethtool_link_ksettings *cmd)
6966{
6967        struct bnx2 *bp = netdev_priv(dev);
6968        u8 autoneg = bp->autoneg;
6969        u8 req_duplex = bp->req_duplex;
6970        u16 req_line_speed = bp->req_line_speed;
6971        u32 advertising = bp->advertising;
6972        int err = -EINVAL;
6973
6974        spin_lock_bh(&bp->phy_lock);
6975
6976        if (cmd->base.port != PORT_TP && cmd->base.port != PORT_FIBRE)
6977                goto err_out_unlock;
6978
6979        if (cmd->base.port != bp->phy_port &&
6980            !(bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP))
6981                goto err_out_unlock;
6982
6983        /* If device is down, we can store the settings only if the user
6984         * is setting the currently active port.
6985         */
6986        if (!netif_running(dev) && cmd->base.port != bp->phy_port)
6987                goto err_out_unlock;
6988
6989        if (cmd->base.autoneg == AUTONEG_ENABLE) {
6990                autoneg |= AUTONEG_SPEED;
6991
6992                ethtool_convert_link_mode_to_legacy_u32(
6993                        &advertising, cmd->link_modes.advertising);
6994
6995                if (cmd->base.port == PORT_TP) {
6996                        advertising &= ETHTOOL_ALL_COPPER_SPEED;
6997                        if (!advertising)
6998                                advertising = ETHTOOL_ALL_COPPER_SPEED;
6999                } else {
7000                        advertising &= ETHTOOL_ALL_FIBRE_SPEED;
7001                        if (!advertising)
7002                                advertising = ETHTOOL_ALL_FIBRE_SPEED;
7003                }
7004                advertising |= ADVERTISED_Autoneg;
7005        }
7006        else {
7007                u32 speed = cmd->base.speed;
7008
7009                if (cmd->base.port == PORT_FIBRE) {
7010                        if ((speed != SPEED_1000 &&
7011                             speed != SPEED_2500) ||
7012                            (cmd->base.duplex != DUPLEX_FULL))
7013                                goto err_out_unlock;
7014
7015                        if (speed == SPEED_2500 &&
7016                            !(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
7017                                goto err_out_unlock;
7018                } else if (speed == SPEED_1000 || speed == SPEED_2500)
7019                        goto err_out_unlock;
7020
7021                autoneg &= ~AUTONEG_SPEED;
7022                req_line_speed = speed;
7023                req_duplex = cmd->base.duplex;
7024                advertising = 0;
7025        }
7026
7027        bp->autoneg = autoneg;
7028        bp->advertising = advertising;
7029        bp->req_line_speed = req_line_speed;
7030        bp->req_duplex = req_duplex;
7031
7032        err = 0;
7033        /* If device is down, the new settings will be picked up when it is
7034         * brought up.
7035         */
7036        if (netif_running(dev))
7037                err = bnx2_setup_phy(bp, cmd->base.port);
7038
7039err_out_unlock:
7040        spin_unlock_bh(&bp->phy_lock);
7041
7042        return err;
7043}
7044
7045static void
7046bnx2_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
7047{
7048        struct bnx2 *bp = netdev_priv(dev);
7049
7050        strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
7051        strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
7052        strlcpy(info->bus_info, pci_name(bp->pdev), sizeof(info->bus_info));
7053        strlcpy(info->fw_version, bp->fw_version, sizeof(info->fw_version));
7054}
7055
7056#define BNX2_REGDUMP_LEN                (32 * 1024)
7057
7058static int
7059bnx2_get_regs_len(struct net_device *dev)
7060{
7061        return BNX2_REGDUMP_LEN;
7062}
7063
7064static void
7065bnx2_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
7066{
7067        u32 *p = _p, i, offset;
7068        u8 *orig_p = _p;
7069        struct bnx2 *bp = netdev_priv(dev);
7070        static const u32 reg_boundaries[] = {
7071                0x0000, 0x0098, 0x0400, 0x045c,
7072                0x0800, 0x0880, 0x0c00, 0x0c10,
7073                0x0c30, 0x0d08, 0x1000, 0x101c,
7074                0x1040, 0x1048, 0x1080, 0x10a4,
7075                0x1400, 0x1490, 0x1498, 0x14f0,
7076                0x1500, 0x155c, 0x1580, 0x15dc,
7077                0x1600, 0x1658, 0x1680, 0x16d8,
7078                0x1800, 0x1820, 0x1840, 0x1854,
7079                0x1880, 0x1894, 0x1900, 0x1984,
7080                0x1c00, 0x1c0c, 0x1c40, 0x1c54,
7081                0x1c80, 0x1c94, 0x1d00, 0x1d84,
7082                0x2000, 0x2030, 0x23c0, 0x2400,
7083                0x2800, 0x2820, 0x2830, 0x2850,
7084                0x2b40, 0x2c10, 0x2fc0, 0x3058,
7085                0x3c00, 0x3c94, 0x4000, 0x4010,
7086                0x4080, 0x4090, 0x43c0, 0x4458,
7087                0x4c00, 0x4c18, 0x4c40, 0x4c54,
7088                0x4fc0, 0x5010, 0x53c0, 0x5444,
7089                0x5c00, 0x5c18, 0x5c80, 0x5c90,
7090                0x5fc0, 0x6000, 0x6400, 0x6428,
7091                0x6800, 0x6848, 0x684c, 0x6860,
7092                0x6888, 0x6910, 0x8000
7093        };
7094
7095        regs->version = 0;
7096
7097        memset(p, 0, BNX2_REGDUMP_LEN);
7098
7099        if (!netif_running(bp->dev))
7100                return;
7101
7102        i = 0;
7103        offset = reg_boundaries[0];
7104        p += offset;
7105        while (offset < BNX2_REGDUMP_LEN) {
7106                *p++ = BNX2_RD(bp, offset);
7107                offset += 4;
7108                if (offset == reg_boundaries[i + 1]) {
7109                        offset = reg_boundaries[i + 2];
7110                        p = (u32 *) (orig_p + offset);
7111                        i += 2;
7112                }
7113        }
7114}
7115
7116static void
7117bnx2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
7118{
7119        struct bnx2 *bp = netdev_priv(dev);
7120
7121        if (bp->flags & BNX2_FLAG_NO_WOL) {
7122                wol->supported = 0;
7123                wol->wolopts = 0;
7124        }
7125        else {
7126                wol->supported = WAKE_MAGIC;
7127                if (bp->wol)
7128                        wol->wolopts = WAKE_MAGIC;
7129                else
7130                        wol->wolopts = 0;
7131        }
7132        memset(&wol->sopass, 0, sizeof(wol->sopass));
7133}
7134
7135static int
7136bnx2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
7137{
7138        struct bnx2 *bp = netdev_priv(dev);
7139
7140        if (wol->wolopts & ~WAKE_MAGIC)
7141                return -EINVAL;
7142
7143        if (wol->wolopts & WAKE_MAGIC) {
7144                if (bp->flags & BNX2_FLAG_NO_WOL)
7145                        return -EINVAL;
7146
7147                bp->wol = 1;
7148        }
7149        else {
7150                bp->wol = 0;
7151        }
7152
7153        device_set_wakeup_enable(&bp->pdev->dev, bp->wol);
7154
7155        return 0;
7156}
7157
7158static int
7159bnx2_nway_reset(struct net_device *dev)
7160{
7161        struct bnx2 *bp = netdev_priv(dev);
7162        u32 bmcr;
7163
7164        if (!netif_running(dev))
7165                return -EAGAIN;
7166
7167        if (!(bp->autoneg & AUTONEG_SPEED)) {
7168                return -EINVAL;
7169        }
7170
7171        spin_lock_bh(&bp->phy_lock);
7172
7173        if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
7174                int rc;
7175
7176                rc = bnx2_setup_remote_phy(bp, bp->phy_port);
7177                spin_unlock_bh(&bp->phy_lock);
7178                return rc;
7179        }
7180
7181        /* Force a link down visible on the other side */
7182        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
7183                bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
7184                spin_unlock_bh(&bp->phy_lock);
7185
7186                msleep(20);
7187
7188                spin_lock_bh(&bp->phy_lock);
7189
7190                bp->current_interval = BNX2_SERDES_AN_TIMEOUT;
7191                bp->serdes_an_pending = 1;
7192                mod_timer(&bp->timer, jiffies + bp->current_interval);
7193        }
7194
7195        bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
7196        bmcr &= ~BMCR_LOOPBACK;
7197        bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART | BMCR_ANENABLE);
7198
7199        spin_unlock_bh(&bp->phy_lock);
7200
7201        return 0;
7202}
7203
7204static u32
7205bnx2_get_link(struct net_device *dev)
7206{
7207        struct bnx2 *bp = netdev_priv(dev);
7208
7209        return bp->link_up;
7210}
7211
7212static int
7213bnx2_get_eeprom_len(struct net_device *dev)
7214{
7215        struct bnx2 *bp = netdev_priv(dev);
7216
7217        if (!bp->flash_info)
7218                return 0;
7219
7220        return (int) bp->flash_size;
7221}
7222
7223static int
7224bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
7225                u8 *eebuf)
7226{
7227        struct bnx2 *bp = netdev_priv(dev);
7228        int rc;
7229
7230        /* parameters already validated in ethtool_get_eeprom */
7231
7232        rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
7233
7234        return rc;
7235}
7236
7237static int
7238bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
7239                u8 *eebuf)
7240{
7241        struct bnx2 *bp = netdev_priv(dev);
7242        int rc;
7243
7244        /* parameters already validated in ethtool_set_eeprom */
7245
7246        rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
7247
7248        return rc;
7249}
7250
7251static int
7252bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
7253{
7254        struct bnx2 *bp = netdev_priv(dev);
7255
7256        memset(coal, 0, sizeof(struct ethtool_coalesce));
7257
7258        coal->rx_coalesce_usecs = bp->rx_ticks;
7259        coal->rx_max_coalesced_frames = bp->rx_quick_cons_trip;
7260        coal->rx_coalesce_usecs_irq = bp->rx_ticks_int;
7261        coal->rx_max_coalesced_frames_irq = bp->rx_quick_cons_trip_int;
7262
7263        coal->tx_coalesce_usecs = bp->tx_ticks;
7264        coal->tx_max_coalesced_frames = bp->tx_quick_cons_trip;
7265        coal->tx_coalesce_usecs_irq = bp->tx_ticks_int;
7266        coal->tx_max_coalesced_frames_irq = bp->tx_quick_cons_trip_int;
7267
7268        coal->stats_block_coalesce_usecs = bp->stats_ticks;
7269
7270        return 0;
7271}
7272
7273static int
7274bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
7275{
7276        struct bnx2 *bp = netdev_priv(dev);
7277
7278        bp->rx_ticks = (u16) coal->rx_coalesce_usecs;
7279        if (bp->rx_ticks > 0x3ff) bp->rx_ticks = 0x3ff;
7280
7281        bp->rx_quick_cons_trip = (u16) coal->rx_max_coalesced_frames;
7282        if (bp->rx_quick_cons_trip > 0xff) bp->rx_quick_cons_trip = 0xff;
7283
7284        bp->rx_ticks_int = (u16) coal->rx_coalesce_usecs_irq;
7285        if (bp->rx_ticks_int > 0x3ff) bp->rx_ticks_int = 0x3ff;
7286
7287        bp->rx_quick_cons_trip_int = (u16) coal->rx_max_coalesced_frames_irq;
7288        if (bp->rx_quick_cons_trip_int > 0xff)
7289                bp->rx_quick_cons_trip_int = 0xff;
7290
7291        bp->tx_ticks = (u16) coal->tx_coalesce_usecs;
7292        if (bp->tx_ticks > 0x3ff) bp->tx_ticks = 0x3ff;
7293
7294        bp->tx_quick_cons_trip = (u16) coal->tx_max_coalesced_frames;
7295        if (bp->tx_quick_cons_trip > 0xff) bp->tx_quick_cons_trip = 0xff;
7296
7297        bp->tx_ticks_int = (u16) coal->tx_coalesce_usecs_irq;
7298        if (bp->tx_ticks_int > 0x3ff) bp->tx_ticks_int = 0x3ff;
7299
7300        bp->tx_quick_cons_trip_int = (u16) coal->tx_max_coalesced_frames_irq;
7301        if (bp->tx_quick_cons_trip_int > 0xff) bp->tx_quick_cons_trip_int =
7302                0xff;
7303
7304        bp->stats_ticks = coal->stats_block_coalesce_usecs;
7305        if (bp->flags & BNX2_FLAG_BROKEN_STATS) {
7306                if (bp->stats_ticks != 0 && bp->stats_ticks != USEC_PER_SEC)
7307                        bp->stats_ticks = USEC_PER_SEC;
7308        }
7309        if (bp->stats_ticks > BNX2_HC_STATS_TICKS_HC_STAT_TICKS)
7310                bp->stats_ticks = BNX2_HC_STATS_TICKS_HC_STAT_TICKS;
7311        bp->stats_ticks &= BNX2_HC_STATS_TICKS_HC_STAT_TICKS;
7312
7313        if (netif_running(bp->dev)) {
7314                bnx2_netif_stop(bp, true);
7315                bnx2_init_nic(bp, 0);
7316                bnx2_netif_start(bp, true);
7317        }
7318
7319        return 0;
7320}
7321
7322static void
7323bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
7324{
7325        struct bnx2 *bp = netdev_priv(dev);
7326
7327        ering->rx_max_pending = BNX2_MAX_TOTAL_RX_DESC_CNT;
7328        ering->rx_jumbo_max_pending = BNX2_MAX_TOTAL_RX_PG_DESC_CNT;
7329
7330        ering->rx_pending = bp->rx_ring_size;
7331        ering->rx_jumbo_pending = bp->rx_pg_ring_size;
7332
7333        ering->tx_max_pending = BNX2_MAX_TX_DESC_CNT;
7334        ering->tx_pending = bp->tx_ring_size;
7335}
7336
7337static int
7338bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx, bool reset_irq)
7339{
7340        if (netif_running(bp->dev)) {
7341                /* Reset will erase chipset stats; save them */
7342                bnx2_save_stats(bp);
7343
7344                bnx2_netif_stop(bp, true);
7345                bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
7346                if (reset_irq) {
7347                        bnx2_free_irq(bp);
7348                        bnx2_del_napi(bp);
7349                } else {
7350                        __bnx2_free_irq(bp);
7351                }
7352                bnx2_free_skbs(bp);
7353                bnx2_free_mem(bp);
7354        }
7355
7356        bnx2_set_rx_ring_size(bp, rx);
7357        bp->tx_ring_size = tx;
7358
7359        if (netif_running(bp->dev)) {
7360                int rc = 0;
7361
7362                if (reset_irq) {
7363                        rc = bnx2_setup_int_mode(bp, disable_msi);
7364                        bnx2_init_napi(bp);
7365                }
7366
7367                if (!rc)
7368                        rc = bnx2_alloc_mem(bp);
7369
7370                if (!rc)
7371                        rc = bnx2_request_irq(bp);
7372
7373                if (!rc)
7374                        rc = bnx2_init_nic(bp, 0);
7375
7376                if (rc) {
7377                        bnx2_napi_enable(bp);
7378                        dev_close(bp->dev);
7379                        return rc;
7380                }
7381#ifdef BCM_CNIC
7382                mutex_lock(&bp->cnic_lock);
7383                /* Let cnic know about the new status block. */
7384                if (bp->cnic_eth_dev.drv_state & CNIC_DRV_STATE_REGD)
7385                        bnx2_setup_cnic_irq_info(bp);
7386                mutex_unlock(&bp->cnic_lock);
7387#endif
7388                bnx2_netif_start(bp, true);
7389        }
7390        return 0;
7391}
7392
7393static int
7394bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
7395{
7396        struct bnx2 *bp = netdev_priv(dev);
7397        int rc;
7398
7399        if ((ering->rx_pending > BNX2_MAX_TOTAL_RX_DESC_CNT) ||
7400                (ering->tx_pending > BNX2_MAX_TX_DESC_CNT) ||
7401                (ering->tx_pending <= MAX_SKB_FRAGS)) {
7402
7403                return -EINVAL;
7404        }
7405        rc = bnx2_change_ring_size(bp, ering->rx_pending, ering->tx_pending,
7406                                   false);
7407        return rc;
7408}
7409
7410static void
7411bnx2_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
7412{
7413        struct bnx2 *bp = netdev_priv(dev);
7414
7415        epause->autoneg = ((bp->autoneg & AUTONEG_FLOW_CTRL) != 0);
7416        epause->rx_pause = ((bp->flow_ctrl & FLOW_CTRL_RX) != 0);
7417        epause->tx_pause = ((bp->flow_ctrl & FLOW_CTRL_TX) != 0);
7418}
7419
7420static int
7421bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
7422{
7423        struct bnx2 *bp = netdev_priv(dev);
7424
7425        bp->req_flow_ctrl = 0;
7426        if (epause->rx_pause)
7427                bp->req_flow_ctrl |= FLOW_CTRL_RX;
7428        if (epause->tx_pause)
7429                bp->req_flow_ctrl |= FLOW_CTRL_TX;
7430
7431        if (epause->autoneg) {
7432                bp->autoneg |= AUTONEG_FLOW_CTRL;
7433        }
7434        else {
7435                bp->autoneg &= ~AUTONEG_FLOW_CTRL;
7436        }
7437
7438        if (netif_running(dev)) {
7439                spin_lock_bh(&bp->phy_lock);
7440                bnx2_setup_phy(bp, bp->phy_port);
7441                spin_unlock_bh(&bp->phy_lock);
7442        }
7443
7444        return 0;
7445}
7446
7447static struct {
7448        char string[ETH_GSTRING_LEN];
7449} bnx2_stats_str_arr[] = {
7450        { "rx_bytes" },
7451        { "rx_error_bytes" },
7452        { "tx_bytes" },
7453        { "tx_error_bytes" },
7454        { "rx_ucast_packets" },
7455        { "rx_mcast_packets" },
7456        { "rx_bcast_packets" },
7457        { "tx_ucast_packets" },
7458        { "tx_mcast_packets" },
7459        { "tx_bcast_packets" },
7460        { "tx_mac_errors" },
7461        { "tx_carrier_errors" },
7462        { "rx_crc_errors" },
7463        { "rx_align_errors" },
7464        { "tx_single_collisions" },
7465        { "tx_multi_collisions" },
7466        { "tx_deferred" },
7467        { "tx_excess_collisions" },
7468        { "tx_late_collisions" },
7469        { "tx_total_collisions" },
7470        { "rx_fragments" },
7471        { "rx_jabbers" },
7472        { "rx_undersize_packets" },
7473        { "rx_oversize_packets" },
7474        { "rx_64_byte_packets" },
7475        { "rx_65_to_127_byte_packets" },
7476        { "rx_128_to_255_byte_packets" },
7477        { "rx_256_to_511_byte_packets" },
7478        { "rx_512_to_1023_byte_packets" },
7479        { "rx_1024_to_1522_byte_packets" },
7480        { "rx_1523_to_9022_byte_packets" },
7481        { "tx_64_byte_packets" },
7482        { "tx_65_to_127_byte_packets" },
7483        { "tx_128_to_255_byte_packets" },
7484        { "tx_256_to_511_byte_packets" },
7485        { "tx_512_to_1023_byte_packets" },
7486        { "tx_1024_to_1522_byte_packets" },
7487        { "tx_1523_to_9022_byte_packets" },
7488        { "rx_xon_frames" },
7489        { "rx_xoff_frames" },
7490        { "tx_xon_frames" },
7491        { "tx_xoff_frames" },
7492        { "rx_mac_ctrl_frames" },
7493        { "rx_filtered_packets" },
7494        { "rx_ftq_discards" },
7495        { "rx_discards" },
7496        { "rx_fw_discards" },
7497};
7498
7499#define BNX2_NUM_STATS ARRAY_SIZE(bnx2_stats_str_arr)
7500
7501#define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4)
7502
7503static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = {
7504    STATS_OFFSET32(stat_IfHCInOctets_hi),
7505    STATS_OFFSET32(stat_IfHCInBadOctets_hi),
7506    STATS_OFFSET32(stat_IfHCOutOctets_hi),
7507    STATS_OFFSET32(stat_IfHCOutBadOctets_hi),
7508    STATS_OFFSET32(stat_IfHCInUcastPkts_hi),
7509    STATS_OFFSET32(stat_IfHCInMulticastPkts_hi),
7510    STATS_OFFSET32(stat_IfHCInBroadcastPkts_hi),
7511    STATS_OFFSET32(stat_IfHCOutUcastPkts_hi),
7512    STATS_OFFSET32(stat_IfHCOutMulticastPkts_hi),
7513    STATS_OFFSET32(stat_IfHCOutBroadcastPkts_hi),
7514    STATS_OFFSET32(stat_emac_tx_stat_dot3statsinternalmactransmiterrors),
7515    STATS_OFFSET32(stat_Dot3StatsCarrierSenseErrors),
7516    STATS_OFFSET32(stat_Dot3StatsFCSErrors),
7517    STATS_OFFSET32(stat_Dot3StatsAlignmentErrors),
7518    STATS_OFFSET32(stat_Dot3StatsSingleCollisionFrames),
7519    STATS_OFFSET32(stat_Dot3StatsMultipleCollisionFrames),
7520    STATS_OFFSET32(stat_Dot3StatsDeferredTransmissions),
7521    STATS_OFFSET32(stat_Dot3StatsExcessiveCollisions),
7522    STATS_OFFSET32(stat_Dot3StatsLateCollisions),
7523    STATS_OFFSET32(stat_EtherStatsCollisions),
7524    STATS_OFFSET32(stat_EtherStatsFragments),
7525    STATS_OFFSET32(stat_EtherStatsJabbers),
7526    STATS_OFFSET32(stat_EtherStatsUndersizePkts),
7527    STATS_OFFSET32(stat_EtherStatsOverrsizePkts),
7528    STATS_OFFSET32(stat_EtherStatsPktsRx64Octets),
7529    STATS_OFFSET32(stat_EtherStatsPktsRx65Octetsto127Octets),
7530    STATS_OFFSET32(stat_EtherStatsPktsRx128Octetsto255Octets),
7531    STATS_OFFSET32(stat_EtherStatsPktsRx256Octetsto511Octets),
7532    STATS_OFFSET32(stat_EtherStatsPktsRx512Octetsto1023Octets),
7533    STATS_OFFSET32(stat_EtherStatsPktsRx1024Octetsto1522Octets),
7534    STATS_OFFSET32(stat_EtherStatsPktsRx1523Octetsto9022Octets),
7535    STATS_OFFSET32(stat_EtherStatsPktsTx64Octets),
7536    STATS_OFFSET32(stat_EtherStatsPktsTx65Octetsto127Octets),
7537    STATS_OFFSET32(stat_EtherStatsPktsTx128Octetsto255Octets),
7538    STATS_OFFSET32(stat_EtherStatsPktsTx256Octetsto511Octets),
7539    STATS_OFFSET32(stat_EtherStatsPktsTx512Octetsto1023Octets),
7540    STATS_OFFSET32(stat_EtherStatsPktsTx1024Octetsto1522Octets),
7541    STATS_OFFSET32(stat_EtherStatsPktsTx1523Octetsto9022Octets),
7542    STATS_OFFSET32(stat_XonPauseFramesReceived),
7543    STATS_OFFSET32(stat_XoffPauseFramesReceived),
7544    STATS_OFFSET32(stat_OutXonSent),
7545    STATS_OFFSET32(stat_OutXoffSent),
7546    STATS_OFFSET32(stat_MacControlFramesReceived),
7547    STATS_OFFSET32(stat_IfInFramesL2FilterDiscards),
7548    STATS_OFFSET32(stat_IfInFTQDiscards),
7549    STATS_OFFSET32(stat_IfInMBUFDiscards),
7550    STATS_OFFSET32(stat_FwRxDrop),
7551};
7552
7553/* stat_IfHCInBadOctets and stat_Dot3StatsCarrierSenseErrors are
7554 * skipped because of errata.
7555 */
7556static u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = {
7557        8,0,8,8,8,8,8,8,8,8,
7558        4,0,4,4,4,4,4,4,4,4,
7559        4,4,4,4,4,4,4,4,4,4,
7560        4,4,4,4,4,4,4,4,4,4,
7561        4,4,4,4,4,4,4,
7562};
7563
7564static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = {
7565        8,0,8,8,8,8,8,8,8,8,
7566        4,4,4,4,4,4,4,4,4,4,
7567        4,4,4,4,4,4,4,4,4,4,
7568        4,4,4,4,4,4,4,4,4,4,
7569        4,4,4,4,4,4,4,
7570};
7571
7572#define BNX2_NUM_TESTS 6
7573
7574static struct {
7575        char string[ETH_GSTRING_LEN];
7576} bnx2_tests_str_arr[BNX2_NUM_TESTS] = {
7577        { "register_test (offline)" },
7578        { "memory_test (offline)" },
7579        { "loopback_test (offline)" },
7580        { "nvram_test (online)" },
7581        { "interrupt_test (online)" },
7582        { "link_test (online)" },
7583};
7584
7585static int
7586bnx2_get_sset_count(struct net_device *dev, int sset)
7587{
7588        switch (sset) {
7589        case ETH_SS_TEST:
7590                return BNX2_NUM_TESTS;
7591        case ETH_SS_STATS:
7592                return BNX2_NUM_STATS;
7593        default:
7594                return -EOPNOTSUPP;
7595        }
7596}
7597
7598static void
7599bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
7600{
7601        struct bnx2 *bp = netdev_priv(dev);
7602
7603        memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
7604        if (etest->flags & ETH_TEST_FL_OFFLINE) {
7605                int i;
7606
7607                bnx2_netif_stop(bp, true);
7608                bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG);
7609                bnx2_free_skbs(bp);
7610
7611                if (bnx2_test_registers(bp) != 0) {
7612                        buf[0] = 1;
7613                        etest->flags |= ETH_TEST_FL_FAILED;
7614                }
7615                if (bnx2_test_memory(bp) != 0) {
7616                        buf[1] = 1;
7617                        etest->flags |= ETH_TEST_FL_FAILED;
7618                }
7619                if ((buf[2] = bnx2_test_loopback(bp)) != 0)
7620                        etest->flags |= ETH_TEST_FL_FAILED;
7621
7622                if (!netif_running(bp->dev))
7623                        bnx2_shutdown_chip(bp);
7624                else {
7625                        bnx2_init_nic(bp, 1);
7626                        bnx2_netif_start(bp, true);
7627                }
7628
7629                /* wait for link up */
7630                for (i = 0; i < 7; i++) {
7631                        if (bp->link_up)
7632                                break;
7633                        msleep_interruptible(1000);
7634                }
7635        }
7636
7637        if (bnx2_test_nvram(bp) != 0) {
7638                buf[3] = 1;
7639                etest->flags |= ETH_TEST_FL_FAILED;
7640        }
7641        if (bnx2_test_intr(bp) != 0) {
7642                buf[4] = 1;
7643                etest->flags |= ETH_TEST_FL_FAILED;
7644        }
7645
7646        if (bnx2_test_link(bp) != 0) {
7647                buf[5] = 1;
7648                etest->flags |= ETH_TEST_FL_FAILED;
7649
7650        }
7651}
7652
7653static void
7654bnx2_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
7655{
7656        switch (stringset) {
7657        case ETH_SS_STATS:
7658                memcpy(buf, bnx2_stats_str_arr,
7659                        sizeof(bnx2_stats_str_arr));
7660                break;
7661        case ETH_SS_TEST:
7662                memcpy(buf, bnx2_tests_str_arr,
7663                        sizeof(bnx2_tests_str_arr));
7664                break;
7665        }
7666}
7667
7668static void
7669bnx2_get_ethtool_stats(struct net_device *dev,
7670                struct ethtool_stats *stats, u64 *buf)
7671{
7672        struct bnx2 *bp = netdev_priv(dev);
7673        int i;
7674        u32 *hw_stats = (u32 *) bp->stats_blk;
7675        u32 *temp_stats = (u32 *) bp->temp_stats_blk;
7676        u8 *stats_len_arr = NULL;
7677
7678        if (!hw_stats) {
7679                memset(buf, 0, sizeof(u64) * BNX2_NUM_STATS);
7680                return;
7681        }
7682
7683        if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) ||
7684            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1) ||
7685            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A2) ||
7686            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0))
7687                stats_len_arr = bnx2_5706_stats_len_arr;
7688        else
7689                stats_len_arr = bnx2_5708_stats_len_arr;
7690
7691        for (i = 0; i < BNX2_NUM_STATS; i++) {
7692                unsigned long offset;
7693
7694                if (stats_len_arr[i] == 0) {
7695                        /* skip this counter */
7696                        buf[i] = 0;
7697                        continue;
7698                }
7699
7700                offset = bnx2_stats_offset_arr[i];
7701                if (stats_len_arr[i] == 4) {
7702                        /* 4-byte counter */
7703                        buf[i] = (u64) *(hw_stats + offset) +
7704                                 *(temp_stats + offset);
7705                        continue;
7706                }
7707                /* 8-byte counter */
7708                buf[i] = (((u64) *(hw_stats + offset)) << 32) +
7709                         *(hw_stats + offset + 1) +
7710                         (((u64) *(temp_stats + offset)) << 32) +
7711                         *(temp_stats + offset + 1);
7712        }
7713}
7714
7715static int
7716bnx2_set_phys_id(struct net_device *dev, enum ethtool_phys_id_state state)
7717{
7718        struct bnx2 *bp = netdev_priv(dev);
7719
7720        switch (state) {
7721        case ETHTOOL_ID_ACTIVE:
7722                bp->leds_save = BNX2_RD(bp, BNX2_MISC_CFG);
7723                BNX2_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC);
7724                return 1;       /* cycle on/off once per second */
7725
7726        case ETHTOOL_ID_ON:
7727                BNX2_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE |
7728                        BNX2_EMAC_LED_1000MB_OVERRIDE |
7729                        BNX2_EMAC_LED_100MB_OVERRIDE |
7730                        BNX2_EMAC_LED_10MB_OVERRIDE |
7731                        BNX2_EMAC_LED_TRAFFIC_OVERRIDE |
7732                        BNX2_EMAC_LED_TRAFFIC);
7733                break;
7734
7735        case ETHTOOL_ID_OFF:
7736                BNX2_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE);
7737                break;
7738
7739        case ETHTOOL_ID_INACTIVE:
7740                BNX2_WR(bp, BNX2_EMAC_LED, 0);
7741                BNX2_WR(bp, BNX2_MISC_CFG, bp->leds_save);
7742                break;
7743        }
7744
7745        return 0;
7746}
7747
7748static int
7749bnx2_set_features(struct net_device *dev, netdev_features_t features)
7750{
7751        struct bnx2 *bp = netdev_priv(dev);
7752
7753        /* TSO with VLAN tag won't work with current firmware */
7754        if (features & NETIF_F_HW_VLAN_CTAG_TX)
7755                dev->vlan_features |= (dev->hw_features & NETIF_F_ALL_TSO);
7756        else
7757                dev->vlan_features &= ~NETIF_F_ALL_TSO;
7758
7759        if ((!!(features & NETIF_F_HW_VLAN_CTAG_RX) !=
7760            !!(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) &&
7761            netif_running(dev)) {
7762                bnx2_netif_stop(bp, false);
7763                dev->features = features;
7764                bnx2_set_rx_mode(dev);
7765                bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1);
7766                bnx2_netif_start(bp, false);
7767                return 1;
7768        }
7769
7770        return 0;
7771}
7772
7773static void bnx2_get_channels(struct net_device *dev,
7774                              struct ethtool_channels *channels)
7775{
7776        struct bnx2 *bp = netdev_priv(dev);
7777        u32 max_rx_rings = 1;
7778        u32 max_tx_rings = 1;
7779
7780        if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !disable_msi) {
7781                max_rx_rings = RX_MAX_RINGS;
7782                max_tx_rings = TX_MAX_RINGS;
7783        }
7784
7785        channels->max_rx = max_rx_rings;
7786        channels->max_tx = max_tx_rings;
7787        channels->max_other = 0;
7788        channels->max_combined = 0;
7789        channels->rx_count = bp->num_rx_rings;
7790        channels->tx_count = bp->num_tx_rings;
7791        channels->other_count = 0;
7792        channels->combined_count = 0;
7793}
7794
7795static int bnx2_set_channels(struct net_device *dev,
7796                              struct ethtool_channels *channels)
7797{
7798        struct bnx2 *bp = netdev_priv(dev);
7799        u32 max_rx_rings = 1;
7800        u32 max_tx_rings = 1;
7801        int rc = 0;
7802
7803        if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !disable_msi) {
7804                max_rx_rings = RX_MAX_RINGS;
7805                max_tx_rings = TX_MAX_RINGS;
7806        }
7807        if (channels->rx_count > max_rx_rings ||
7808            channels->tx_count > max_tx_rings)
7809                return -EINVAL;
7810
7811        bp->num_req_rx_rings = channels->rx_count;
7812        bp->num_req_tx_rings = channels->tx_count;
7813
7814        if (netif_running(dev))
7815                rc = bnx2_change_ring_size(bp, bp->rx_ring_size,
7816                                           bp->tx_ring_size, true);
7817
7818        return rc;
7819}
7820
7821static const struct ethtool_ops bnx2_ethtool_ops = {
7822        .get_drvinfo            = bnx2_get_drvinfo,
7823        .get_regs_len           = bnx2_get_regs_len,
7824        .get_regs               = bnx2_get_regs,
7825        .get_wol                = bnx2_get_wol,
7826        .set_wol                = bnx2_set_wol,
7827        .nway_reset             = bnx2_nway_reset,
7828        .get_link               = bnx2_get_link,
7829        .get_eeprom_len         = bnx2_get_eeprom_len,
7830        .get_eeprom             = bnx2_get_eeprom,
7831        .set_eeprom             = bnx2_set_eeprom,
7832        .get_coalesce           = bnx2_get_coalesce,
7833        .set_coalesce           = bnx2_set_coalesce,
7834        .get_ringparam          = bnx2_get_ringparam,
7835        .set_ringparam          = bnx2_set_ringparam,
7836        .get_pauseparam         = bnx2_get_pauseparam,
7837        .set_pauseparam         = bnx2_set_pauseparam,
7838        .self_test              = bnx2_self_test,
7839        .get_strings            = bnx2_get_strings,
7840        .set_phys_id            = bnx2_set_phys_id,
7841        .get_ethtool_stats      = bnx2_get_ethtool_stats,
7842        .get_sset_count         = bnx2_get_sset_count,
7843        .get_channels           = bnx2_get_channels,
7844        .set_channels           = bnx2_set_channels,
7845        .get_link_ksettings     = bnx2_get_link_ksettings,
7846        .set_link_ksettings     = bnx2_set_link_ksettings,
7847};
7848
7849/* Called with rtnl_lock */
7850static int
7851bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
7852{
7853        struct mii_ioctl_data *data = if_mii(ifr);
7854        struct bnx2 *bp = netdev_priv(dev);
7855        int err;
7856
7857        switch(cmd) {
7858        case SIOCGMIIPHY:
7859                data->phy_id = bp->phy_addr;
7860
7861                /* fallthru */
7862        case SIOCGMIIREG: {
7863                u32 mii_regval;
7864
7865                if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
7866                        return -EOPNOTSUPP;
7867
7868                if (!netif_running(dev))
7869                        return -EAGAIN;
7870
7871                spin_lock_bh(&bp->phy_lock);
7872                err = bnx2_read_phy(bp, data->reg_num & 0x1f, &mii_regval);
7873                spin_unlock_bh(&bp->phy_lock);
7874
7875                data->val_out = mii_regval;
7876
7877                return err;
7878        }
7879
7880        case SIOCSMIIREG:
7881                if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
7882                        return -EOPNOTSUPP;
7883
7884                if (!netif_running(dev))
7885                        return -EAGAIN;
7886
7887                spin_lock_bh(&bp->phy_lock);
7888                err = bnx2_write_phy(bp, data->reg_num & 0x1f, data->val_in);
7889                spin_unlock_bh(&bp->phy_lock);
7890
7891                return err;
7892
7893        default:
7894                /* do nothing */
7895                break;
7896        }
7897        return -EOPNOTSUPP;
7898}
7899
7900/* Called with rtnl_lock */
7901static int
7902bnx2_change_mac_addr(struct net_device *dev, void *p)
7903{
7904        struct sockaddr *addr = p;
7905        struct bnx2 *bp = netdev_priv(dev);
7906
7907        if (!is_valid_ether_addr(addr->sa_data))
7908                return -EADDRNOTAVAIL;
7909
7910        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
7911        if (netif_running(dev))
7912                bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0);
7913
7914        return 0;
7915}
7916
7917/* Called with rtnl_lock */
7918static int
7919bnx2_change_mtu(struct net_device *dev, int new_mtu)
7920{
7921        struct bnx2 *bp = netdev_priv(dev);
7922
7923        dev->mtu = new_mtu;
7924        return bnx2_change_ring_size(bp, bp->rx_ring_size, bp->tx_ring_size,
7925                                     false);
7926}
7927
7928#ifdef CONFIG_NET_POLL_CONTROLLER
7929static void
7930poll_bnx2(struct net_device *dev)
7931{
7932        struct bnx2 *bp = netdev_priv(dev);
7933        int i;
7934
7935        for (i = 0; i < bp->irq_nvecs; i++) {
7936                struct bnx2_irq *irq = &bp->irq_tbl[i];
7937
7938                disable_irq(irq->vector);
7939                irq->handler(irq->vector, &bp->bnx2_napi[i]);
7940                enable_irq(irq->vector);
7941        }
7942}
7943#endif
7944
7945static void
7946bnx2_get_5709_media(struct bnx2 *bp)
7947{
7948        u32 val = BNX2_RD(bp, BNX2_MISC_DUAL_MEDIA_CTRL);
7949        u32 bond_id = val & BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID;
7950        u32 strap;
7951
7952        if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_C)
7953                return;
7954        else if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_S) {
7955                bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7956                return;
7957        }
7958
7959        if (val & BNX2_MISC_DUAL_MEDIA_CTRL_STRAP_OVERRIDE)
7960                strap = (val & BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL) >> 21;
7961        else
7962                strap = (val & BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL_STRAP) >> 8;
7963
7964        if (bp->func == 0) {
7965                switch (strap) {
7966                case 0x4:
7967                case 0x5:
7968                case 0x6:
7969                        bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7970                        return;
7971                }
7972        } else {
7973                switch (strap) {
7974                case 0x1:
7975                case 0x2:
7976                case 0x4:
7977                        bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7978                        return;
7979                }
7980        }
7981}
7982
7983static void
7984bnx2_get_pci_speed(struct bnx2 *bp)
7985{
7986        u32 reg;
7987
7988        reg = BNX2_RD(bp, BNX2_PCICFG_MISC_STATUS);
7989        if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
7990                u32 clkreg;
7991
7992                bp->flags |= BNX2_FLAG_PCIX;
7993
7994                clkreg = BNX2_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);
7995
7996                clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;
7997                switch (clkreg) {
7998                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ:
7999                        bp->bus_speed_mhz = 133;
8000                        break;
8001
8002                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ:
8003                        bp->bus_speed_mhz = 100;
8004                        break;
8005
8006                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ:
8007                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ:
8008                        bp->bus_speed_mhz = 66;
8009                        break;
8010
8011                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ:
8012                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ:
8013                        bp->bus_speed_mhz = 50;
8014                        break;
8015
8016                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW:
8017                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ:
8018                case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ:
8019                        bp->bus_speed_mhz = 33;
8020                        break;
8021                }
8022        }
8023        else {
8024                if (reg & BNX2_PCICFG_MISC_STATUS_M66EN)
8025                        bp->bus_speed_mhz = 66;
8026                else
8027                        bp->bus_speed_mhz = 33;
8028        }
8029
8030        if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET)
8031                bp->flags |= BNX2_FLAG_PCI_32BIT;
8032
8033}
8034
8035static void
8036bnx2_read_vpd_fw_ver(struct bnx2 *bp)
8037{
8038        int rc, i, j;
8039        u8 *data;
8040        unsigned int block_end, rosize, len;
8041
8042#define BNX2_VPD_NVRAM_OFFSET   0x300
8043#define BNX2_VPD_LEN            128
8044#define BNX2_MAX_VER_SLEN       30
8045
8046        data = kmalloc(256, GFP_KERNEL);
8047        if (!data)
8048                return;
8049
8050        rc = bnx2_nvram_read(bp, BNX2_VPD_NVRAM_OFFSET, data + BNX2_VPD_LEN,
8051                             BNX2_VPD_LEN);
8052        if (rc)
8053                goto vpd_done;
8054
8055        for (i = 0; i < BNX2_VPD_LEN; i += 4) {
8056                data[i] = data[i + BNX2_VPD_LEN + 3];
8057                data[i + 1] = data[i + BNX2_VPD_LEN + 2];
8058                data[i + 2] = data[i + BNX2_VPD_LEN + 1];
8059                data[i + 3] = data[i + BNX2_VPD_LEN];
8060        }
8061
8062        i = pci_vpd_find_tag(data, 0, BNX2_VPD_LEN, PCI_VPD_LRDT_RO_DATA);
8063        if (i < 0)
8064                goto vpd_done;
8065
8066        rosize = pci_vpd_lrdt_size(&data[i]);
8067        i += PCI_VPD_LRDT_TAG_SIZE;
8068        block_end = i + rosize;
8069
8070        if (block_end > BNX2_VPD_LEN)
8071                goto vpd_done;
8072
8073        j = pci_vpd_find_info_keyword(data, i, rosize,
8074                                      PCI_VPD_RO_KEYWORD_MFR_ID);
8075        if (j < 0)
8076                goto vpd_done;
8077
8078        len = pci_vpd_info_field_size(&data[j]);
8079
8080        j += PCI_VPD_INFO_FLD_HDR_SIZE;
8081        if (j + len > block_end || len != 4 ||
8082            memcmp(&data[j], "1028", 4))
8083                goto vpd_done;
8084
8085        j = pci_vpd_find_info_keyword(data, i, rosize,
8086                                      PCI_VPD_RO_KEYWORD_VENDOR0);
8087        if (j < 0)
8088                goto vpd_done;
8089
8090        len = pci_vpd_info_field_size(&data[j]);
8091
8092        j += PCI_VPD_INFO_FLD_HDR_SIZE;
8093        if (j + len > block_end || len > BNX2_MAX_VER_SLEN)
8094                goto vpd_done;
8095
8096        memcpy(bp->fw_version, &data[j], len);
8097        bp->fw_version[len] = ' ';
8098
8099vpd_done:
8100        kfree(data);
8101}
8102
8103static int
8104bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
8105{
8106        struct bnx2 *bp;
8107        int rc, i, j;
8108        u32 reg;
8109        u64 dma_mask, persist_dma_mask;
8110        int err;
8111
8112        SET_NETDEV_DEV(dev, &pdev->dev);
8113        bp = netdev_priv(dev);
8114
8115        bp->flags = 0;
8116        bp->phy_flags = 0;
8117
8118        bp->temp_stats_blk =
8119                kzalloc(sizeof(struct statistics_block), GFP_KERNEL);
8120
8121        if (!bp->temp_stats_blk) {
8122                rc = -ENOMEM;
8123                goto err_out;
8124        }
8125
8126        /* enable device (incl. PCI PM wakeup), and bus-mastering */
8127        rc = pci_enable_device(pdev);
8128        if (rc) {
8129                dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
8130                goto err_out;
8131        }
8132
8133        if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
8134                dev_err(&pdev->dev,
8135                        "Cannot find PCI device base address, aborting\n");
8136                rc = -ENODEV;
8137                goto err_out_disable;
8138        }
8139
8140        rc = pci_request_regions(pdev, DRV_MODULE_NAME);
8141        if (rc) {
8142                dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting\n");
8143                goto err_out_disable;
8144        }
8145
8146        pci_set_master(pdev);
8147
8148        bp->pm_cap = pdev->pm_cap;
8149        if (bp->pm_cap == 0) {
8150                dev_err(&pdev->dev,
8151                        "Cannot find power management capability, aborting\n");
8152                rc = -EIO;
8153                goto err_out_release;
8154        }
8155
8156        bp->dev = dev;
8157        bp->pdev = pdev;
8158
8159        spin_lock_init(&bp->phy_lock);
8160        spin_lock_init(&bp->indirect_lock);
8161#ifdef BCM_CNIC
8162        mutex_init(&bp->cnic_lock);
8163#endif
8164        INIT_WORK(&bp->reset_task, bnx2_reset_task);
8165
8166        bp->regview = pci_iomap(pdev, 0, MB_GET_CID_ADDR(TX_TSS_CID +
8167                                                         TX_MAX_TSS_RINGS + 1));
8168        if (!bp->regview) {
8169                dev_err(&pdev->dev, "Cannot map register space, aborting\n");
8170                rc = -ENOMEM;
8171                goto err_out_release;
8172        }
8173
8174        /* Configure byte swap and enable write to the reg_window registers.
8175         * Rely on CPU to do target byte swapping on big endian systems
8176         * The chip's target access swapping will not swap all accesses
8177         */
8178        BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG,
8179                BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
8180                BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP);
8181
8182        bp->chip_id = BNX2_RD(bp, BNX2_MISC_ID);
8183
8184        if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
8185                if (!pci_is_pcie(pdev)) {
8186                        dev_err(&pdev->dev, "Not PCIE, aborting\n");
8187                        rc = -EIO;
8188                        goto err_out_unmap;
8189                }
8190                bp->flags |= BNX2_FLAG_PCIE;
8191                if (BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Ax)
8192                        bp->flags |= BNX2_FLAG_JUMBO_BROKEN;
8193
8194                /* AER (Advanced Error Reporting) hooks */
8195                err = pci_enable_pcie_error_reporting(pdev);
8196                if (!err)
8197                        bp->flags |= BNX2_FLAG_AER_ENABLED;
8198
8199        } else {
8200                bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
8201                if (bp->pcix_cap == 0) {
8202                        dev_err(&pdev->dev,
8203                                "Cannot find PCIX capability, aborting\n");
8204                        rc = -EIO;
8205                        goto err_out_unmap;
8206                }
8207                bp->flags |= BNX2_FLAG_BROKEN_STATS;
8208        }
8209
8210        if (BNX2_CHIP(bp) == BNX2_CHIP_5709 &&
8211            BNX2_CHIP_REV(bp) != BNX2_CHIP_REV_Ax) {
8212                if (pdev->msix_cap)
8213                        bp->flags |= BNX2_FLAG_MSIX_CAP;
8214        }
8215
8216        if (BNX2_CHIP_ID(bp) != BNX2_CHIP_ID_5706_A0 &&
8217            BNX2_CHIP_ID(bp) != BNX2_CHIP_ID_5706_A1) {
8218                if (pdev->msi_cap)
8219                        bp->flags |= BNX2_FLAG_MSI_CAP;
8220        }
8221
8222        /* 5708 cannot support DMA addresses > 40-bit.  */
8223        if (BNX2_CHIP(bp) == BNX2_CHIP_5708)
8224                persist_dma_mask = dma_mask = DMA_BIT_MASK(40);
8225        else
8226                persist_dma_mask = dma_mask = DMA_BIT_MASK(64);
8227
8228        /* Configure DMA attributes. */
8229        if (pci_set_dma_mask(pdev, dma_mask) == 0) {
8230                dev->features |= NETIF_F_HIGHDMA;
8231                rc = pci_set_consistent_dma_mask(pdev, persist_dma_mask);
8232                if (rc) {
8233                        dev_err(&pdev->dev,
8234                                "pci_set_consistent_dma_mask failed, aborting\n");
8235                        goto err_out_unmap;
8236                }
8237        } else if ((rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
8238                dev_err(&pdev->dev, "System does not support DMA, aborting\n");
8239                goto err_out_unmap;
8240        }
8241
8242        if (!(bp->flags & BNX2_FLAG_PCIE))
8243                bnx2_get_pci_speed(bp);
8244
8245        /* 5706A0 may falsely detect SERR and PERR. */
8246        if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {
8247                reg = BNX2_RD(bp, PCI_COMMAND);
8248                reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
8249                BNX2_WR(bp, PCI_COMMAND, reg);
8250        } else if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1) &&
8251                !(bp->flags & BNX2_FLAG_PCIX)) {
8252
8253                dev_err(&pdev->dev,
8254                        "5706 A1 can only be used in a PCIX bus, aborting\n");
8255                goto err_out_unmap;
8256        }
8257
8258        bnx2_init_nvram(bp);
8259
8260        reg = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_SIGNATURE);
8261
8262        if (bnx2_reg_rd_ind(bp, BNX2_MCP_TOE_ID) & BNX2_MCP_TOE_ID_FUNCTION_ID)
8263                bp->func = 1;
8264
8265        if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
8266            BNX2_SHM_HDR_SIGNATURE_SIG) {
8267                u32 off = bp->func << 2;
8268
8269                bp->shmem_base = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_ADDR_0 + off);
8270        } else
8271                bp->shmem_base = HOST_VIEW_SHMEM_BASE;
8272
8273        /* Get the permanent MAC address.  First we need to make sure the
8274         * firmware is actually running.
8275         */
8276        reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_SIGNATURE);
8277
8278        if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
8279            BNX2_DEV_INFO_SIGNATURE_MAGIC) {
8280                dev_err(&pdev->dev, "Firmware not running, aborting\n");
8281                rc = -ENODEV;
8282                goto err_out_unmap;
8283        }
8284
8285        bnx2_read_vpd_fw_ver(bp);
8286
8287        j = strlen(bp->fw_version);
8288        reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_BC_REV);
8289        for (i = 0; i < 3 && j < 24; i++) {
8290                u8 num, k, skip0;
8291
8292                if (i == 0) {
8293                        bp->fw_version[j++] = 'b';
8294                        bp->fw_version[j++] = 'c';
8295                        bp->fw_version[j++] = ' ';
8296                }
8297                num = (u8) (reg >> (24 - (i * 8)));
8298                for (k = 100, skip0 = 1; k >= 1; num %= k, k /= 10) {
8299                        if (num >= k || !skip0 || k == 1) {
8300                                bp->fw_version[j++] = (num / k) + '0';
8301                                skip0 = 0;
8302                        }
8303                }
8304                if (i != 2)
8305                        bp->fw_version[j++] = '.';
8306        }
8307        reg = bnx2_shmem_rd(bp, BNX2_PORT_FEATURE);
8308        if (reg & BNX2_PORT_FEATURE_WOL_ENABLED)
8309                bp->wol = 1;
8310
8311        if (reg & BNX2_PORT_FEATURE_ASF_ENABLED) {
8312                bp->flags |= BNX2_FLAG_ASF_ENABLE;
8313
8314                for (i = 0; i < 30; i++) {
8315                        reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION);
8316                        if (reg & BNX2_CONDITION_MFW_RUN_MASK)
8317                                break;
8318                        msleep(10);
8319                }
8320        }
8321        reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION);
8322        reg &= BNX2_CONDITION_MFW_RUN_MASK;
8323        if (reg != BNX2_CONDITION_MFW_RUN_UNKNOWN &&
8324            reg != BNX2_CONDITION_MFW_RUN_NONE) {
8325                u32 addr = bnx2_shmem_rd(bp, BNX2_MFW_VER_PTR);
8326
8327                if (j < 32)
8328                        bp->fw_version[j++] = ' ';
8329                for (i = 0; i < 3 && j < 28; i++) {
8330                        reg = bnx2_reg_rd_ind(bp, addr + i * 4);
8331                        reg = be32_to_cpu(reg);
8332                        memcpy(&bp->fw_version[j], &reg, 4);
8333                        j += 4;
8334                }
8335        }
8336
8337        reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_UPPER);
8338        bp->mac_addr[0] = (u8) (reg >> 8);
8339        bp->mac_addr[1] = (u8) reg;
8340
8341        reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_LOWER);
8342        bp->mac_addr[2] = (u8) (reg >> 24);
8343        bp->mac_addr[3] = (u8) (reg >> 16);
8344        bp->mac_addr[4] = (u8) (reg >> 8);
8345        bp->mac_addr[5] = (u8) reg;
8346
8347        bp->tx_ring_size = BNX2_MAX_TX_DESC_CNT;
8348        bnx2_set_rx_ring_size(bp, 255);
8349
8350        bp->tx_quick_cons_trip_int = 2;
8351        bp->tx_quick_cons_trip = 20;
8352        bp->tx_ticks_int = 18;
8353        bp->tx_ticks = 80;
8354
8355        bp->rx_quick_cons_trip_int = 2;
8356        bp->rx_quick_cons_trip = 12;
8357        bp->rx_ticks_int = 18;
8358        bp->rx_ticks = 18;
8359
8360        bp->stats_ticks = USEC_PER_SEC & BNX2_HC_STATS_TICKS_HC_STAT_TICKS;
8361
8362        bp->current_interval = BNX2_TIMER_INTERVAL;
8363
8364        bp->phy_addr = 1;
8365
8366        /* allocate stats_blk */
8367        rc = bnx2_alloc_stats_blk(dev);
8368        if (rc)
8369                goto err_out_unmap;
8370
8371        /* Disable WOL support if we are running on a SERDES chip. */
8372        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
8373                bnx2_get_5709_media(bp);
8374        else if (BNX2_CHIP_BOND(bp) & BNX2_CHIP_BOND_SERDES_BIT)
8375                bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
8376
8377        bp->phy_port = PORT_TP;
8378        if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
8379                bp->phy_port = PORT_FIBRE;
8380                reg = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG);
8381                if (!(reg & BNX2_SHARED_HW_CFG_GIG_LINK_ON_VAUX)) {
8382                        bp->flags |= BNX2_FLAG_NO_WOL;
8383                        bp->wol = 0;
8384                }
8385                if (BNX2_CHIP(bp) == BNX2_CHIP_5706) {
8386                        /* Don't do parallel detect on this board because of
8387                         * some board problems.  The link will not go down
8388                         * if we do parallel detect.
8389                         */
8390                        if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
8391                            pdev->subsystem_device == 0x310c)
8392                                bp->phy_flags |= BNX2_PHY_FLAG_NO_PARALLEL;
8393                } else {
8394                        bp->phy_addr = 2;
8395                        if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G)
8396                                bp->phy_flags |= BNX2_PHY_FLAG_2_5G_CAPABLE;
8397                }
8398        } else if (BNX2_CHIP(bp) == BNX2_CHIP_5706 ||
8399                   BNX2_CHIP(bp) == BNX2_CHIP_5708)
8400                bp->phy_flags |= BNX2_PHY_FLAG_CRC_FIX;
8401        else if (BNX2_CHIP(bp) == BNX2_CHIP_5709 &&
8402                 (BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Ax ||
8403                  BNX2_CHIP_REV(bp) == BNX2_CHIP_REV_Bx))
8404                bp->phy_flags |= BNX2_PHY_FLAG_DIS_EARLY_DAC;
8405
8406        bnx2_init_fw_cap(bp);
8407
8408        if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_A0) ||
8409            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B0) ||
8410            (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5708_B1) ||
8411            !(BNX2_RD(bp, BNX2_PCI_CONFIG_3) & BNX2_PCI_CONFIG_3_VAUX_PRESET)) {
8412                bp->flags |= BNX2_FLAG_NO_WOL;
8413                bp->wol = 0;
8414        }
8415
8416        if (bp->flags & BNX2_FLAG_NO_WOL)
8417                device_set_wakeup_capable(&bp->pdev->dev, false);
8418        else
8419                device_set_wakeup_enable(&bp->pdev->dev, bp->wol);
8420
8421        if (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) {
8422                bp->tx_quick_cons_trip_int =
8423                        bp->tx_quick_cons_trip;
8424                bp->tx_ticks_int = bp->tx_ticks;
8425                bp->rx_quick_cons_trip_int =
8426                        bp->rx_quick_cons_trip;
8427                bp->rx_ticks_int = bp->rx_ticks;
8428                bp->comp_prod_trip_int = bp->comp_prod_trip;
8429                bp->com_ticks_int = bp->com_ticks;
8430                bp->cmd_ticks_int = bp->cmd_ticks;
8431        }
8432
8433        /* Disable MSI on 5706 if AMD 8132 bridge is found.
8434         *
8435         * MSI is defined to be 32-bit write.  The 5706 does 64-bit MSI writes
8436         * with byte enables disabled on the unused 32-bit word.  This is legal
8437         * but causes problems on the AMD 8132 which will eventually stop
8438         * responding after a while.
8439         *
8440         * AMD believes this incompatibility is unique to the 5706, and
8441         * prefers to locally disable MSI rather than globally disabling it.
8442         */
8443        if (BNX2_CHIP(bp) == BNX2_CHIP_5706 && disable_msi == 0) {
8444                struct pci_dev *amd_8132 = NULL;
8445
8446                while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD,
8447                                                  PCI_DEVICE_ID_AMD_8132_BRIDGE,
8448                                                  amd_8132))) {
8449
8450                        if (amd_8132->revision >= 0x10 &&
8451                            amd_8132->revision <= 0x13) {
8452                                disable_msi = 1;
8453                                pci_dev_put(amd_8132);
8454                                break;
8455                        }
8456                }
8457        }
8458
8459        bnx2_set_default_link(bp);
8460        bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
8461
8462        timer_setup(&bp->timer, bnx2_timer, 0);
8463        bp->timer.expires = RUN_AT(BNX2_TIMER_INTERVAL);
8464
8465#ifdef BCM_CNIC
8466        if (bnx2_shmem_rd(bp, BNX2_ISCSI_INITIATOR) & BNX2_ISCSI_INITIATOR_EN)
8467                bp->cnic_eth_dev.max_iscsi_conn =
8468                        (bnx2_shmem_rd(bp, BNX2_ISCSI_MAX_CONN) &
8469                         BNX2_ISCSI_MAX_CONN_MASK) >> BNX2_ISCSI_MAX_CONN_SHIFT;
8470        bp->cnic_probe = bnx2_cnic_probe;
8471#endif
8472        pci_save_state(pdev);
8473
8474        return 0;
8475
8476err_out_unmap:
8477        if (bp->flags & BNX2_FLAG_AER_ENABLED) {
8478                pci_disable_pcie_error_reporting(pdev);
8479                bp->flags &= ~BNX2_FLAG_AER_ENABLED;
8480        }
8481
8482        pci_iounmap(pdev, bp->regview);
8483        bp->regview = NULL;
8484
8485err_out_release:
8486        pci_release_regions(pdev);
8487
8488err_out_disable:
8489        pci_disable_device(pdev);
8490
8491err_out:
8492        kfree(bp->temp_stats_blk);
8493
8494        return rc;
8495}
8496
8497static char *
8498bnx2_bus_string(struct bnx2 *bp, char *str)
8499{
8500        char *s = str;
8501
8502        if (bp->flags & BNX2_FLAG_PCIE) {
8503                s += sprintf(s, "PCI Express");
8504        } else {
8505                s += sprintf(s, "PCI");
8506                if (bp->flags & BNX2_FLAG_PCIX)
8507                        s += sprintf(s, "-X");
8508                if (bp->flags & BNX2_FLAG_PCI_32BIT)
8509                        s += sprintf(s, " 32-bit");
8510                else
8511                        s += sprintf(s, " 64-bit");
8512                s += sprintf(s, " %dMHz", bp->bus_speed_mhz);
8513        }
8514        return str;
8515}
8516
8517static void
8518bnx2_del_napi(struct bnx2 *bp)
8519{
8520        int i;
8521
8522        for (i = 0; i < bp->irq_nvecs; i++)
8523                netif_napi_del(&bp->bnx2_napi[i].napi);
8524}
8525
8526static void
8527bnx2_init_napi(struct bnx2 *bp)
8528{
8529        int i;
8530
8531        for (i = 0; i < bp->irq_nvecs; i++) {
8532                struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
8533                int (*poll)(struct napi_struct *, int);
8534
8535                if (i == 0)
8536                        poll = bnx2_poll;
8537                else
8538                        poll = bnx2_poll_msix;
8539
8540                netif_napi_add(bp->dev, &bp->bnx2_napi[i].napi, poll, 64);
8541                bnapi->bp = bp;
8542        }
8543}
8544
8545static const struct net_device_ops bnx2_netdev_ops = {
8546        .ndo_open               = bnx2_open,
8547        .ndo_start_xmit         = bnx2_start_xmit,
8548        .ndo_stop               = bnx2_close,
8549        .ndo_get_stats64        = bnx2_get_stats64,
8550        .ndo_set_rx_mode        = bnx2_set_rx_mode,
8551        .ndo_do_ioctl           = bnx2_ioctl,
8552        .ndo_validate_addr      = eth_validate_addr,
8553        .ndo_set_mac_address    = bnx2_change_mac_addr,
8554        .ndo_change_mtu         = bnx2_change_mtu,
8555        .ndo_set_features       = bnx2_set_features,
8556        .ndo_tx_timeout         = bnx2_tx_timeout,
8557#ifdef CONFIG_NET_POLL_CONTROLLER
8558        .ndo_poll_controller    = poll_bnx2,
8559#endif
8560};
8561
8562static int
8563bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8564{
8565        static int version_printed = 0;
8566        struct net_device *dev;
8567        struct bnx2 *bp;
8568        int rc;
8569        char str[40];
8570
8571        if (version_printed++ == 0)
8572                pr_info("%s", version);
8573
8574        /* dev zeroed in init_etherdev */
8575        dev = alloc_etherdev_mq(sizeof(*bp), TX_MAX_RINGS);
8576        if (!dev)
8577                return -ENOMEM;
8578
8579        rc = bnx2_init_board(pdev, dev);
8580        if (rc < 0)
8581                goto err_free;
8582
8583        dev->netdev_ops = &bnx2_netdev_ops;
8584        dev->watchdog_timeo = TX_TIMEOUT;
8585        dev->ethtool_ops = &bnx2_ethtool_ops;
8586
8587        bp = netdev_priv(dev);
8588
8589        pci_set_drvdata(pdev, dev);
8590
8591        /*
8592         * In-flight DMA from 1st kernel could continue going in kdump kernel.
8593         * New io-page table has been created before bnx2 does reset at open stage.
8594         * We have to wait for the in-flight DMA to complete to avoid it look up
8595         * into the newly created io-page table.
8596         */
8597        if (is_kdump_kernel())
8598                bnx2_wait_dma_complete(bp);
8599
8600        memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN);
8601
8602        dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
8603                NETIF_F_TSO | NETIF_F_TSO_ECN |
8604                NETIF_F_RXHASH | NETIF_F_RXCSUM;
8605
8606        if (BNX2_CHIP(bp) == BNX2_CHIP_5709)
8607                dev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
8608
8609        dev->vlan_features = dev->hw_features;
8610        dev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
8611        dev->features |= dev->hw_features;
8612        dev->priv_flags |= IFF_UNICAST_FLT;
8613        dev->min_mtu = MIN_ETHERNET_PACKET_SIZE;
8614        dev->max_mtu = MAX_ETHERNET_JUMBO_PACKET_SIZE;
8615
8616        if (!(bp->flags & BNX2_FLAG_CAN_KEEP_VLAN))
8617                dev->hw_features &= ~NETIF_F_HW_VLAN_CTAG_RX;
8618
8619        if ((rc = register_netdev(dev))) {
8620                dev_err(&pdev->dev, "Cannot register net device\n");
8621                goto error;
8622        }
8623
8624        netdev_info(dev, "%s (%c%d) %s found at mem %lx, IRQ %d, "
8625                    "node addr %pM\n", board_info[ent->driver_data].name,
8626                    ((BNX2_CHIP_ID(bp) & 0xf000) >> 12) + 'A',
8627                    ((BNX2_CHIP_ID(bp) & 0x0ff0) >> 4),
8628                    bnx2_bus_string(bp, str), (long)pci_resource_start(pdev, 0),
8629                    pdev->irq, dev->dev_addr);
8630
8631        return 0;
8632
8633error:
8634        pci_iounmap(pdev, bp->regview);
8635        pci_release_regions(pdev);
8636        pci_disable_device(pdev);
8637err_free:
8638        bnx2_free_stats_blk(dev);
8639        free_netdev(dev);
8640        return rc;
8641}
8642
8643static void
8644bnx2_remove_one(struct pci_dev *pdev)
8645{
8646        struct net_device *dev = pci_get_drvdata(pdev);
8647        struct bnx2 *bp = netdev_priv(dev);
8648
8649        unregister_netdev(dev);
8650
8651        del_timer_sync(&bp->timer);
8652        cancel_work_sync(&bp->reset_task);
8653
8654        pci_iounmap(bp->pdev, bp->regview);
8655
8656        bnx2_free_stats_blk(dev);
8657        kfree(bp->temp_stats_blk);
8658
8659        if (bp->flags & BNX2_FLAG_AER_ENABLED) {
8660                pci_disable_pcie_error_reporting(pdev);
8661                bp->flags &= ~BNX2_FLAG_AER_ENABLED;
8662        }
8663
8664        bnx2_release_firmware(bp);
8665
8666        free_netdev(dev);
8667
8668        pci_release_regions(pdev);
8669        pci_disable_device(pdev);
8670}
8671
8672#ifdef CONFIG_PM_SLEEP
8673static int
8674bnx2_suspend(struct device *device)
8675{
8676        struct net_device *dev = dev_get_drvdata(device);
8677        struct bnx2 *bp = netdev_priv(dev);
8678
8679        if (netif_running(dev)) {
8680                cancel_work_sync(&bp->reset_task);
8681                bnx2_netif_stop(bp, true);
8682                netif_device_detach(dev);
8683                del_timer_sync(&bp->timer);
8684                bnx2_shutdown_chip(bp);
8685                __bnx2_free_irq(bp);
8686                bnx2_free_skbs(bp);
8687        }
8688        bnx2_setup_wol(bp);
8689        return 0;
8690}
8691
8692static int
8693bnx2_resume(struct device *device)
8694{
8695        struct net_device *dev = dev_get_drvdata(device);
8696        struct bnx2 *bp = netdev_priv(dev);
8697
8698        if (!netif_running(dev))
8699                return 0;
8700
8701        bnx2_set_power_state(bp, PCI_D0);
8702        netif_device_attach(dev);
8703        bnx2_request_irq(bp);
8704        bnx2_init_nic(bp, 1);
8705        bnx2_netif_start(bp, true);
8706        return 0;
8707}
8708
8709static SIMPLE_DEV_PM_OPS(bnx2_pm_ops, bnx2_suspend, bnx2_resume);
8710#define BNX2_PM_OPS (&bnx2_pm_ops)
8711
8712#else
8713
8714#define BNX2_PM_OPS NULL
8715
8716#endif /* CONFIG_PM_SLEEP */
8717/**
8718 * bnx2_io_error_detected - called when PCI error is detected
8719 * @pdev: Pointer to PCI device
8720 * @state: The current pci connection state
8721 *
8722 * This function is called after a PCI bus error affecting
8723 * this device has been detected.
8724 */
8725static pci_ers_result_t bnx2_io_error_detected(struct pci_dev *pdev,
8726                                               pci_channel_state_t state)
8727{
8728        struct net_device *dev = pci_get_drvdata(pdev);
8729        struct bnx2 *bp = netdev_priv(dev);
8730
8731        rtnl_lock();
8732        netif_device_detach(dev);
8733
8734        if (state == pci_channel_io_perm_failure) {
8735                rtnl_unlock();
8736                return PCI_ERS_RESULT_DISCONNECT;
8737        }
8738
8739        if (netif_running(dev)) {
8740                bnx2_netif_stop(bp, true);
8741                del_timer_sync(&bp->timer);
8742                bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET);
8743        }
8744
8745        pci_disable_device(pdev);
8746        rtnl_unlock();
8747
8748        /* Request a slot slot reset. */
8749        return PCI_ERS_RESULT_NEED_RESET;
8750}
8751
8752/**
8753 * bnx2_io_slot_reset - called after the pci bus has been reset.
8754 * @pdev: Pointer to PCI device
8755 *
8756 * Restart the card from scratch, as if from a cold-boot.
8757 */
8758static pci_ers_result_t bnx2_io_slot_reset(struct pci_dev *pdev)
8759{
8760        struct net_device *dev = pci_get_drvdata(pdev);
8761        struct bnx2 *bp = netdev_priv(dev);
8762        pci_ers_result_t result = PCI_ERS_RESULT_DISCONNECT;
8763        int err = 0;
8764
8765        rtnl_lock();
8766        if (pci_enable_device(pdev)) {
8767                dev_err(&pdev->dev,
8768                        "Cannot re-enable PCI device after reset\n");
8769        } else {
8770                pci_set_master(pdev);
8771                pci_restore_state(pdev);
8772                pci_save_state(pdev);
8773
8774                if (netif_running(dev))
8775                        err = bnx2_init_nic(bp, 1);
8776
8777                if (!err)
8778                        result = PCI_ERS_RESULT_RECOVERED;
8779        }
8780
8781        if (result != PCI_ERS_RESULT_RECOVERED && netif_running(dev)) {
8782                bnx2_napi_enable(bp);
8783                dev_close(dev);
8784        }
8785        rtnl_unlock();
8786
8787        if (!(bp->flags & BNX2_FLAG_AER_ENABLED))
8788                return result;
8789
8790        return result;
8791}
8792
8793/**
8794 * bnx2_io_resume - called when traffic can start flowing again.
8795 * @pdev: Pointer to PCI device
8796 *
8797 * This callback is called when the error recovery driver tells us that
8798 * its OK to resume normal operation.
8799 */
8800static void bnx2_io_resume(struct pci_dev *pdev)
8801{
8802        struct net_device *dev = pci_get_drvdata(pdev);
8803        struct bnx2 *bp = netdev_priv(dev);
8804
8805        rtnl_lock();
8806        if (netif_running(dev))
8807                bnx2_netif_start(bp, true);
8808
8809        netif_device_attach(dev);
8810        rtnl_unlock();
8811}
8812
8813static void bnx2_shutdown(struct pci_dev *pdev)
8814{
8815        struct net_device *dev = pci_get_drvdata(pdev);
8816        struct bnx2 *bp;
8817
8818        if (!dev)
8819                return;
8820
8821        bp = netdev_priv(dev);
8822        if (!bp)
8823                return;
8824
8825        rtnl_lock();
8826        if (netif_running(dev))
8827                dev_close(bp->dev);
8828
8829        if (system_state == SYSTEM_POWER_OFF)
8830                bnx2_set_power_state(bp, PCI_D3hot);
8831
8832        rtnl_unlock();
8833}
8834
8835static const struct pci_error_handlers bnx2_err_handler = {
8836        .error_detected = bnx2_io_error_detected,
8837        .slot_reset     = bnx2_io_slot_reset,
8838        .resume         = bnx2_io_resume,
8839};
8840
8841static struct pci_driver bnx2_pci_driver = {
8842        .name           = DRV_MODULE_NAME,
8843        .id_table       = bnx2_pci_tbl,
8844        .probe          = bnx2_init_one,
8845        .remove         = bnx2_remove_one,
8846        .driver.pm      = BNX2_PM_OPS,
8847        .err_handler    = &bnx2_err_handler,
8848        .shutdown       = bnx2_shutdown,
8849};
8850
8851module_pci_driver(bnx2_pci_driver);
8852