linux/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
<<
>>
Prefs
   1/*
   2 * QLogic qlcnic NIC Driver
   3 * Copyright (c) 2009-2013 QLogic Corporation
   4 *
   5 * See LICENSE.qlcnic for copyright and licensing details.
   6 */
   7
   8#include <linux/vmalloc.h>
   9#include <linux/interrupt.h>
  10
  11#include "qlcnic.h"
  12#include "qlcnic_sriov.h"
  13#include "qlcnic_hw.h"
  14
  15#include <linux/swab.h>
  16#include <linux/dma-mapping.h>
  17#include <linux/if_vlan.h>
  18#include <net/ip.h>
  19#include <linux/ipv6.h>
  20#include <linux/inetdevice.h>
  21#include <linux/aer.h>
  22#include <linux/log2.h>
  23#include <linux/pci.h>
  24
  25MODULE_DESCRIPTION("QLogic 1/10 GbE Converged/Intelligent Ethernet Driver");
  26MODULE_LICENSE("GPL");
  27MODULE_VERSION(QLCNIC_LINUX_VERSIONID);
  28MODULE_FIRMWARE(QLCNIC_UNIFIED_ROMIMAGE_NAME);
  29
  30char qlcnic_driver_name[] = "qlcnic";
  31static const char qlcnic_driver_string[] = "QLogic 1/10 GbE "
  32        "Converged/Intelligent Ethernet Driver v" QLCNIC_LINUX_VERSIONID;
  33
  34static int qlcnic_mac_learn;
  35module_param(qlcnic_mac_learn, int, 0444);
  36MODULE_PARM_DESC(qlcnic_mac_learn,
  37                 "Mac Filter (0=learning is disabled, 1=Driver learning is enabled, 2=FDB learning is enabled)");
  38
  39int qlcnic_use_msi = 1;
  40MODULE_PARM_DESC(use_msi, "MSI interrupt (0=disabled, 1=enabled)");
  41module_param_named(use_msi, qlcnic_use_msi, int, 0444);
  42
  43int qlcnic_use_msi_x = 1;
  44MODULE_PARM_DESC(use_msi_x, "MSI-X interrupt (0=disabled, 1=enabled)");
  45module_param_named(use_msi_x, qlcnic_use_msi_x, int, 0444);
  46
  47int qlcnic_auto_fw_reset = 1;
  48MODULE_PARM_DESC(auto_fw_reset, "Auto firmware reset (0=disabled, 1=enabled)");
  49module_param_named(auto_fw_reset, qlcnic_auto_fw_reset, int, 0644);
  50
  51int qlcnic_load_fw_file;
  52MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file)");
  53module_param_named(load_fw_file, qlcnic_load_fw_file, int, 0444);
  54
  55static int qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
  56static void qlcnic_remove(struct pci_dev *pdev);
  57static int qlcnic_open(struct net_device *netdev);
  58static int qlcnic_close(struct net_device *netdev);
  59static void qlcnic_tx_timeout(struct net_device *netdev);
  60static void qlcnic_attach_work(struct work_struct *work);
  61static void qlcnic_fwinit_work(struct work_struct *work);
  62#ifdef CONFIG_NET_POLL_CONTROLLER
  63static void qlcnic_poll_controller(struct net_device *netdev);
  64#endif
  65
  66static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
  67static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
  68
  69static irqreturn_t qlcnic_tmp_intr(int irq, void *data);
  70static irqreturn_t qlcnic_intr(int irq, void *data);
  71static irqreturn_t qlcnic_msi_intr(int irq, void *data);
  72static irqreturn_t qlcnic_msix_intr(int irq, void *data);
  73static irqreturn_t qlcnic_msix_tx_intr(int irq, void *data);
  74
  75static struct net_device_stats *qlcnic_get_stats(struct net_device *netdev);
  76static int qlcnic_start_firmware(struct qlcnic_adapter *);
  77
  78static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter);
  79static void qlcnic_dev_set_npar_ready(struct qlcnic_adapter *);
  80static int qlcnicvf_start_firmware(struct qlcnic_adapter *);
  81static int qlcnic_vlan_rx_add(struct net_device *, __be16, u16);
  82static int qlcnic_vlan_rx_del(struct net_device *, __be16, u16);
  83
  84static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter)
  85{
  86        struct qlcnic_hardware_context *ahw = adapter->ahw;
  87
  88        if (adapter->pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X)
  89                return ahw->capabilities & QLCNIC_FW_CAPABILITY_FVLANTX;
  90        else
  91                return 1;
  92}
  93
  94/*  PCI Device ID Table  */
  95#define ENTRY(device) \
  96        {PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, (device)), \
  97        .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
  98
  99static DEFINE_PCI_DEVICE_TABLE(qlcnic_pci_tbl) = {
 100        ENTRY(PCI_DEVICE_ID_QLOGIC_QLE824X),
 101        ENTRY(PCI_DEVICE_ID_QLOGIC_QLE834X),
 102        ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE834X),
 103        ENTRY(PCI_DEVICE_ID_QLOGIC_QLE844X),
 104        ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE844X),
 105        {0,}
 106};
 107
 108MODULE_DEVICE_TABLE(pci, qlcnic_pci_tbl);
 109
 110
 111inline void qlcnic_update_cmd_producer(struct qlcnic_host_tx_ring *tx_ring)
 112{
 113        writel(tx_ring->producer, tx_ring->crb_cmd_producer);
 114}
 115
 116static const u32 msi_tgt_status[8] = {
 117        ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
 118        ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
 119        ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
 120        ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
 121};
 122
 123static const u32 qlcnic_reg_tbl[] = {
 124        0x1B20A8,       /* PEG_HALT_STAT1 */
 125        0x1B20AC,       /* PEG_HALT_STAT2 */
 126        0x1B20B0,       /* FW_HEARTBEAT */
 127        0x1B2100,       /* LOCK ID */
 128        0x1B2128,       /* FW_CAPABILITIES */
 129        0x1B2138,       /* drv active */
 130        0x1B2140,       /* dev state */
 131        0x1B2144,       /* drv state */
 132        0x1B2148,       /* drv scratch */
 133        0x1B214C,       /* dev partition info */
 134        0x1B2174,       /* drv idc ver */
 135        0x1B2150,       /* fw version major */
 136        0x1B2154,       /* fw version minor */
 137        0x1B2158,       /* fw version sub */
 138        0x1B219C,       /* npar state */
 139        0x1B21FC,       /* FW_IMG_VALID */
 140        0x1B2250,       /* CMD_PEG_STATE */
 141        0x1B233C,       /* RCV_PEG_STATE */
 142        0x1B23B4,       /* ASIC TEMP */
 143        0x1B216C,       /* FW api */
 144        0x1B2170,       /* drv op mode */
 145        0x13C010,       /* flash lock */
 146        0x13C014,       /* flash unlock */
 147};
 148
 149static const struct qlcnic_board_info qlcnic_boards[] = {
 150        { PCI_VENDOR_ID_QLOGIC,
 151          PCI_DEVICE_ID_QLOGIC_QLE844X,
 152          0x0,
 153          0x0,
 154          "8400 series 10GbE Converged Network Adapter (TCP/IP Networking)" },
 155        { PCI_VENDOR_ID_QLOGIC,
 156          PCI_DEVICE_ID_QLOGIC_QLE834X,
 157          PCI_VENDOR_ID_QLOGIC,
 158          0x24e,
 159          "8300 Series Dual Port 10GbE Converged Network Adapter "
 160          "(TCP/IP Networking)" },
 161        { PCI_VENDOR_ID_QLOGIC,
 162          PCI_DEVICE_ID_QLOGIC_QLE834X,
 163          PCI_VENDOR_ID_QLOGIC,
 164          0x243,
 165          "8300 Series Single Port 10GbE Converged Network Adapter "
 166          "(TCP/IP Networking)" },
 167        { PCI_VENDOR_ID_QLOGIC,
 168          PCI_DEVICE_ID_QLOGIC_QLE834X,
 169          PCI_VENDOR_ID_QLOGIC,
 170          0x24a,
 171          "8300 Series Dual Port 10GbE Converged Network Adapter "
 172          "(TCP/IP Networking)" },
 173        { PCI_VENDOR_ID_QLOGIC,
 174          PCI_DEVICE_ID_QLOGIC_QLE834X,
 175          PCI_VENDOR_ID_QLOGIC,
 176          0x246,
 177          "8300 Series Dual Port 10GbE Converged Network Adapter "
 178          "(TCP/IP Networking)" },
 179        { PCI_VENDOR_ID_QLOGIC,
 180          PCI_DEVICE_ID_QLOGIC_QLE834X,
 181          PCI_VENDOR_ID_QLOGIC,
 182          0x252,
 183          "8300 Series Dual Port 10GbE Converged Network Adapter "
 184          "(TCP/IP Networking)" },
 185        { PCI_VENDOR_ID_QLOGIC,
 186          PCI_DEVICE_ID_QLOGIC_QLE834X,
 187          PCI_VENDOR_ID_QLOGIC,
 188          0x26e,
 189          "8300 Series Dual Port 10GbE Converged Network Adapter "
 190          "(TCP/IP Networking)" },
 191        { PCI_VENDOR_ID_QLOGIC,
 192          PCI_DEVICE_ID_QLOGIC_QLE834X,
 193          PCI_VENDOR_ID_QLOGIC,
 194          0x260,
 195          "8300 Series Dual Port 10GbE Converged Network Adapter "
 196          "(TCP/IP Networking)" },
 197        { PCI_VENDOR_ID_QLOGIC,
 198          PCI_DEVICE_ID_QLOGIC_QLE834X,
 199          PCI_VENDOR_ID_QLOGIC,
 200          0x266,
 201          "8300 Series Single Port 10GbE Converged Network Adapter "
 202          "(TCP/IP Networking)" },
 203        { PCI_VENDOR_ID_QLOGIC,
 204          PCI_DEVICE_ID_QLOGIC_QLE834X,
 205          PCI_VENDOR_ID_QLOGIC,
 206          0x269,
 207          "8300 Series Dual Port 10GbE Converged Network Adapter "
 208          "(TCP/IP Networking)" },
 209        { PCI_VENDOR_ID_QLOGIC,
 210          PCI_DEVICE_ID_QLOGIC_QLE834X,
 211          PCI_VENDOR_ID_QLOGIC,
 212          0x271,
 213          "8300 Series Dual Port 10GbE Converged Network Adapter "
 214          "(TCP/IP Networking)" },
 215        { PCI_VENDOR_ID_QLOGIC,
 216          PCI_DEVICE_ID_QLOGIC_QLE834X,
 217          0x0, 0x0, "8300 Series 1/10GbE Controller" },
 218        { PCI_VENDOR_ID_QLOGIC,
 219          PCI_DEVICE_ID_QLOGIC_QLE824X,
 220          PCI_VENDOR_ID_QLOGIC,
 221          0x203,
 222          "8200 Series Single Port 10GbE Converged Network Adapter"
 223          "(TCP/IP Networking)" },
 224        { PCI_VENDOR_ID_QLOGIC,
 225          PCI_DEVICE_ID_QLOGIC_QLE824X,
 226          PCI_VENDOR_ID_QLOGIC,
 227          0x207,
 228          "8200 Series Dual Port 10GbE Converged Network Adapter"
 229          "(TCP/IP Networking)" },
 230        { PCI_VENDOR_ID_QLOGIC,
 231          PCI_DEVICE_ID_QLOGIC_QLE824X,
 232          PCI_VENDOR_ID_QLOGIC,
 233          0x20b,
 234          "3200 Series Dual Port 10Gb Intelligent Ethernet Adapter" },
 235        { PCI_VENDOR_ID_QLOGIC,
 236          PCI_DEVICE_ID_QLOGIC_QLE824X,
 237          PCI_VENDOR_ID_QLOGIC,
 238          0x20c,
 239          "3200 Series Quad Port 1Gb Intelligent Ethernet Adapter" },
 240        { PCI_VENDOR_ID_QLOGIC,
 241          PCI_DEVICE_ID_QLOGIC_QLE824X,
 242          PCI_VENDOR_ID_QLOGIC,
 243          0x20f,
 244          "3200 Series Single Port 10Gb Intelligent Ethernet Adapter" },
 245        { PCI_VENDOR_ID_QLOGIC,
 246          PCI_DEVICE_ID_QLOGIC_QLE824X,
 247          0x103c, 0x3733,
 248          "NC523SFP 10Gb 2-port Server Adapter" },
 249        { PCI_VENDOR_ID_QLOGIC,
 250          PCI_DEVICE_ID_QLOGIC_QLE824X,
 251          0x103c, 0x3346,
 252          "CN1000Q Dual Port Converged Network Adapter" },
 253        { PCI_VENDOR_ID_QLOGIC,
 254          PCI_DEVICE_ID_QLOGIC_QLE824X,
 255          PCI_VENDOR_ID_QLOGIC,
 256          0x210,
 257          "QME8242-k 10GbE Dual Port Mezzanine Card" },
 258        { PCI_VENDOR_ID_QLOGIC,
 259          PCI_DEVICE_ID_QLOGIC_QLE824X,
 260          0x0, 0x0, "cLOM8214 1/10GbE Controller" },
 261};
 262
 263#define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards)
 264
 265static const
 266struct qlcnic_legacy_intr_set legacy_intr[] = QLCNIC_LEGACY_INTR_CONFIG;
 267
 268int qlcnic_alloc_sds_rings(struct qlcnic_recv_context *recv_ctx, int count)
 269{
 270        int size = sizeof(struct qlcnic_host_sds_ring) * count;
 271
 272        recv_ctx->sds_rings = kzalloc(size, GFP_KERNEL);
 273
 274        return recv_ctx->sds_rings == NULL;
 275}
 276
 277void qlcnic_free_sds_rings(struct qlcnic_recv_context *recv_ctx)
 278{
 279        if (recv_ctx->sds_rings != NULL)
 280                kfree(recv_ctx->sds_rings);
 281
 282        recv_ctx->sds_rings = NULL;
 283}
 284
 285int qlcnic_read_mac_addr(struct qlcnic_adapter *adapter)
 286{
 287        struct net_device *netdev = adapter->netdev;
 288        struct pci_dev *pdev = adapter->pdev;
 289        u8 mac_addr[ETH_ALEN];
 290        int ret;
 291
 292        ret = qlcnic_get_mac_address(adapter, mac_addr,
 293                                     adapter->ahw->pci_func);
 294        if (ret)
 295                return ret;
 296
 297        memcpy(netdev->dev_addr, mac_addr, ETH_ALEN);
 298        memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len);
 299
 300        /* set station address */
 301
 302        if (!is_valid_ether_addr(netdev->dev_addr))
 303                dev_warn(&pdev->dev, "Bad MAC address %pM.\n",
 304                                        netdev->dev_addr);
 305
 306        return 0;
 307}
 308
 309static void qlcnic_delete_adapter_mac(struct qlcnic_adapter *adapter)
 310{
 311        struct qlcnic_mac_list_s *cur;
 312        struct list_head *head;
 313
 314        list_for_each(head, &adapter->mac_list) {
 315                cur = list_entry(head, struct qlcnic_mac_list_s, list);
 316                if (!memcmp(adapter->mac_addr, cur->mac_addr, ETH_ALEN)) {
 317                        qlcnic_sre_macaddr_change(adapter, cur->mac_addr,
 318                                                  0, QLCNIC_MAC_DEL);
 319                        list_del(&cur->list);
 320                        kfree(cur);
 321                        return;
 322                }
 323        }
 324}
 325
 326static int qlcnic_set_mac(struct net_device *netdev, void *p)
 327{
 328        struct qlcnic_adapter *adapter = netdev_priv(netdev);
 329        struct sockaddr *addr = p;
 330
 331        if (qlcnic_sriov_vf_check(adapter))
 332                return -EINVAL;
 333
 334        if ((adapter->flags & QLCNIC_MAC_OVERRIDE_DISABLED))
 335                return -EOPNOTSUPP;
 336
 337        if (!is_valid_ether_addr(addr->sa_data))
 338                return -EINVAL;
 339
 340        if (!memcmp(adapter->mac_addr, addr->sa_data, ETH_ALEN))
 341                return 0;
 342
 343        if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
 344                netif_device_detach(netdev);
 345                qlcnic_napi_disable(adapter);
 346        }
 347
 348        qlcnic_delete_adapter_mac(adapter);
 349        memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len);
 350        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
 351        qlcnic_set_multi(adapter->netdev);
 352
 353        if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
 354                netif_device_attach(netdev);
 355                qlcnic_napi_enable(adapter);
 356        }
 357        return 0;
 358}
 359
 360static int qlcnic_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
 361                        struct net_device *netdev, const unsigned char *addr)
 362{
 363        struct qlcnic_adapter *adapter = netdev_priv(netdev);
 364        int err = -EOPNOTSUPP;
 365
 366        if (!adapter->fdb_mac_learn)
 367                return ndo_dflt_fdb_del(ndm, tb, netdev, addr);
 368
 369        if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
 370                if (is_unicast_ether_addr(addr)) {
 371                        err = dev_uc_del(netdev, addr);
 372                        if (!err)
 373                                err = qlcnic_nic_del_mac(adapter, addr);
 374                } else if (is_multicast_ether_addr(addr)) {
 375                        err = dev_mc_del(netdev, addr);
 376                } else {
 377                        err =  -EINVAL;
 378                }
 379        }
 380        return err;
 381}
 382
 383static int qlcnic_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
 384                        struct net_device *netdev,
 385                        const unsigned char *addr, u16 flags)
 386{
 387        struct qlcnic_adapter *adapter = netdev_priv(netdev);
 388        int err = 0;
 389
 390        if (!adapter->fdb_mac_learn)
 391                return ndo_dflt_fdb_add(ndm, tb, netdev, addr, flags);
 392
 393        if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
 394                pr_info("%s: FDB e-switch is not enabled\n", __func__);
 395                return -EOPNOTSUPP;
 396        }
 397
 398        if (ether_addr_equal(addr, adapter->mac_addr))
 399                return err;
 400
 401        if (is_unicast_ether_addr(addr)) {
 402                if (netdev_uc_count(netdev) < adapter->ahw->max_uc_count)
 403                        err = dev_uc_add_excl(netdev, addr);
 404                else
 405                        err = -ENOMEM;
 406        } else if (is_multicast_ether_addr(addr)) {
 407                err = dev_mc_add_excl(netdev, addr);
 408        } else {
 409                err = -EINVAL;
 410        }
 411
 412        return err;
 413}
 414
 415static int qlcnic_fdb_dump(struct sk_buff *skb, struct netlink_callback *ncb,
 416                        struct net_device *netdev, int idx)
 417{
 418        struct qlcnic_adapter *adapter = netdev_priv(netdev);
 419
 420        if (!adapter->fdb_mac_learn)
 421                return ndo_dflt_fdb_dump(skb, ncb, netdev, idx);
 422
 423        if (adapter->flags & QLCNIC_ESWITCH_ENABLED)
 424                idx = ndo_dflt_fdb_dump(skb, ncb, netdev, idx);
 425
 426        return idx;
 427}
 428
 429static void qlcnic_82xx_cancel_idc_work(struct qlcnic_adapter *adapter)
 430{
 431        while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
 432                usleep_range(10000, 11000);
 433
 434        if (!adapter->fw_work.work.func)
 435                return;
 436
 437        cancel_delayed_work_sync(&adapter->fw_work);
 438}
 439
 440static int qlcnic_get_phys_port_id(struct net_device *netdev,
 441                                   struct netdev_phys_port_id *ppid)
 442{
 443        struct qlcnic_adapter *adapter = netdev_priv(netdev);
 444        struct qlcnic_hardware_context *ahw = adapter->ahw;
 445
 446        if (!(adapter->flags & QLCNIC_HAS_PHYS_PORT_ID))
 447                return -EOPNOTSUPP;
 448
 449        ppid->id_len = sizeof(ahw->phys_port_id);
 450        memcpy(ppid->id, ahw->phys_port_id, ppid->id_len);
 451
 452        return 0;
 453}
 454
 455static const struct net_device_ops qlcnic_netdev_ops = {
 456        .ndo_open          = qlcnic_open,
 457        .ndo_stop          = qlcnic_close,
 458        .ndo_start_xmit    = qlcnic_xmit_frame,
 459        .ndo_get_stats     = qlcnic_get_stats,
 460        .ndo_validate_addr = eth_validate_addr,
 461        .ndo_set_rx_mode   = qlcnic_set_multi,
 462        .ndo_set_mac_address    = qlcnic_set_mac,
 463        .ndo_change_mtu    = qlcnic_change_mtu,
 464        .ndo_fix_features  = qlcnic_fix_features,
 465        .ndo_set_features  = qlcnic_set_features,
 466        .ndo_tx_timeout    = qlcnic_tx_timeout,
 467        .ndo_vlan_rx_add_vid    = qlcnic_vlan_rx_add,
 468        .ndo_vlan_rx_kill_vid   = qlcnic_vlan_rx_del,
 469        .ndo_fdb_add            = qlcnic_fdb_add,
 470        .ndo_fdb_del            = qlcnic_fdb_del,
 471        .ndo_fdb_dump           = qlcnic_fdb_dump,
 472        .ndo_get_phys_port_id   = qlcnic_get_phys_port_id,
 473#ifdef CONFIG_NET_POLL_CONTROLLER
 474        .ndo_poll_controller = qlcnic_poll_controller,
 475#endif
 476#ifdef CONFIG_QLCNIC_SRIOV
 477        .ndo_set_vf_mac         = qlcnic_sriov_set_vf_mac,
 478        .ndo_set_vf_tx_rate     = qlcnic_sriov_set_vf_tx_rate,
 479        .ndo_get_vf_config      = qlcnic_sriov_get_vf_config,
 480        .ndo_set_vf_vlan        = qlcnic_sriov_set_vf_vlan,
 481        .ndo_set_vf_spoofchk    = qlcnic_sriov_set_vf_spoofchk,
 482#endif
 483};
 484
 485static const struct net_device_ops qlcnic_netdev_failed_ops = {
 486        .ndo_open          = qlcnic_open,
 487};
 488
 489static struct qlcnic_nic_template qlcnic_ops = {
 490        .config_bridged_mode    = qlcnic_config_bridged_mode,
 491        .config_led             = qlcnic_82xx_config_led,
 492        .start_firmware         = qlcnic_82xx_start_firmware,
 493        .request_reset          = qlcnic_82xx_dev_request_reset,
 494        .cancel_idc_work        = qlcnic_82xx_cancel_idc_work,
 495        .napi_add               = qlcnic_82xx_napi_add,
 496        .napi_del               = qlcnic_82xx_napi_del,
 497        .config_ipaddr          = qlcnic_82xx_config_ipaddr,
 498        .shutdown               = qlcnic_82xx_shutdown,
 499        .resume                 = qlcnic_82xx_resume,
 500        .clear_legacy_intr      = qlcnic_82xx_clear_legacy_intr,
 501};
 502
 503struct qlcnic_nic_template qlcnic_vf_ops = {
 504        .config_bridged_mode    = qlcnicvf_config_bridged_mode,
 505        .config_led             = qlcnicvf_config_led,
 506        .start_firmware         = qlcnicvf_start_firmware
 507};
 508
 509static struct qlcnic_hardware_ops qlcnic_hw_ops = {
 510        .read_crb                       = qlcnic_82xx_read_crb,
 511        .write_crb                      = qlcnic_82xx_write_crb,
 512        .read_reg                       = qlcnic_82xx_hw_read_wx_2M,
 513        .write_reg                      = qlcnic_82xx_hw_write_wx_2M,
 514        .get_mac_address                = qlcnic_82xx_get_mac_address,
 515        .setup_intr                     = qlcnic_82xx_setup_intr,
 516        .alloc_mbx_args                 = qlcnic_82xx_alloc_mbx_args,
 517        .mbx_cmd                        = qlcnic_82xx_issue_cmd,
 518        .get_func_no                    = qlcnic_82xx_get_func_no,
 519        .api_lock                       = qlcnic_82xx_api_lock,
 520        .api_unlock                     = qlcnic_82xx_api_unlock,
 521        .add_sysfs                      = qlcnic_82xx_add_sysfs,
 522        .remove_sysfs                   = qlcnic_82xx_remove_sysfs,
 523        .process_lb_rcv_ring_diag       = qlcnic_82xx_process_rcv_ring_diag,
 524        .create_rx_ctx                  = qlcnic_82xx_fw_cmd_create_rx_ctx,
 525        .create_tx_ctx                  = qlcnic_82xx_fw_cmd_create_tx_ctx,
 526        .del_rx_ctx                     = qlcnic_82xx_fw_cmd_del_rx_ctx,
 527        .del_tx_ctx                     = qlcnic_82xx_fw_cmd_del_tx_ctx,
 528        .setup_link_event               = qlcnic_82xx_linkevent_request,
 529        .get_nic_info                   = qlcnic_82xx_get_nic_info,
 530        .get_pci_info                   = qlcnic_82xx_get_pci_info,
 531        .set_nic_info                   = qlcnic_82xx_set_nic_info,
 532        .change_macvlan                 = qlcnic_82xx_sre_macaddr_change,
 533        .napi_enable                    = qlcnic_82xx_napi_enable,
 534        .napi_disable                   = qlcnic_82xx_napi_disable,
 535        .config_intr_coal               = qlcnic_82xx_config_intr_coalesce,
 536        .config_rss                     = qlcnic_82xx_config_rss,
 537        .config_hw_lro                  = qlcnic_82xx_config_hw_lro,
 538        .config_loopback                = qlcnic_82xx_set_lb_mode,
 539        .clear_loopback                 = qlcnic_82xx_clear_lb_mode,
 540        .config_promisc_mode            = qlcnic_82xx_nic_set_promisc,
 541        .change_l2_filter               = qlcnic_82xx_change_filter,
 542        .get_board_info                 = qlcnic_82xx_get_board_info,
 543        .set_mac_filter_count           = qlcnic_82xx_set_mac_filter_count,
 544        .free_mac_list                  = qlcnic_82xx_free_mac_list,
 545        .read_phys_port_id              = qlcnic_82xx_read_phys_port_id,
 546        .io_error_detected              = qlcnic_82xx_io_error_detected,
 547        .io_slot_reset                  = qlcnic_82xx_io_slot_reset,
 548        .io_resume                      = qlcnic_82xx_io_resume,
 549};
 550
 551static void qlcnic_get_multiq_capability(struct qlcnic_adapter *adapter)
 552{
 553        struct qlcnic_hardware_context *ahw = adapter->ahw;
 554        int num_tx_q;
 555
 556        if (ahw->msix_supported &&
 557            (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_2_MULTI_TX)) {
 558                num_tx_q = min_t(int, QLCNIC_DEF_NUM_TX_RINGS,
 559                                 num_online_cpus());
 560                if (num_tx_q > 1) {
 561                        test_and_set_bit(__QLCNIC_MULTI_TX_UNIQUE,
 562                                         &adapter->state);
 563                        adapter->max_drv_tx_rings = num_tx_q;
 564                }
 565        } else {
 566                adapter->max_drv_tx_rings = 1;
 567        }
 568}
 569
 570int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix)
 571{
 572        struct pci_dev *pdev = adapter->pdev;
 573        int max_tx_rings, max_sds_rings, tx_vector;
 574        int err = -1, i;
 575
 576        if (adapter->flags & QLCNIC_TX_INTR_SHARED) {
 577                max_tx_rings = 0;
 578                tx_vector = 0;
 579        } else {
 580                max_tx_rings = adapter->max_drv_tx_rings;
 581                tx_vector = 1;
 582        }
 583
 584        if (!adapter->msix_entries) {
 585                adapter->msix_entries = kcalloc(num_msix,
 586                                                sizeof(struct msix_entry),
 587                                                GFP_KERNEL);
 588                if (!adapter->msix_entries)
 589                        return -ENOMEM;
 590        }
 591
 592        adapter->max_sds_rings = 1;
 593        adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED);
 594
 595        if (adapter->ahw->msix_supported) {
 596 enable_msix:
 597                for (i = 0; i < num_msix; i++)
 598                        adapter->msix_entries[i].entry = i;
 599                err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
 600                if (err == 0) {
 601                        adapter->flags |= QLCNIC_MSIX_ENABLED;
 602                        if (qlcnic_83xx_check(adapter)) {
 603                                adapter->ahw->num_msix = num_msix;
 604                                /* subtract mail box and tx ring vectors */
 605                                adapter->max_sds_rings = num_msix -
 606                                                         max_tx_rings - 1;
 607                        } else {
 608                                adapter->ahw->num_msix = num_msix;
 609                                if (qlcnic_check_multi_tx(adapter) &&
 610                                    !adapter->ahw->diag_test &&
 611                                    (adapter->max_drv_tx_rings > 1))
 612                                        max_sds_rings = num_msix - max_tx_rings;
 613                                else
 614                                        max_sds_rings = num_msix;
 615
 616                                adapter->max_sds_rings = max_sds_rings;
 617                        }
 618                        dev_info(&pdev->dev, "using msi-x interrupts\n");
 619                        return err;
 620                } else if (err > 0) {
 621                        dev_info(&pdev->dev,
 622                                 "Unable to allocate %d MSI-X interrupt vectors\n",
 623                                 num_msix);
 624                        if (qlcnic_83xx_check(adapter)) {
 625                                if (err < (QLC_83XX_MINIMUM_VECTOR - tx_vector))
 626                                        return err;
 627                                err -= (max_tx_rings + 1);
 628                                num_msix = rounddown_pow_of_two(err);
 629                                num_msix += (max_tx_rings + 1);
 630                        } else {
 631                                num_msix = rounddown_pow_of_two(err);
 632                                if (qlcnic_check_multi_tx(adapter))
 633                                        num_msix += max_tx_rings;
 634                        }
 635
 636                        if (num_msix) {
 637                                dev_info(&pdev->dev,
 638                                         "Trying to allocate %d MSI-X interrupt vectors\n",
 639                                         num_msix);
 640                                goto enable_msix;
 641                        }
 642                } else {
 643                        dev_info(&pdev->dev,
 644                                 "Unable to allocate %d MSI-X interrupt vectors\n",
 645                                 num_msix);
 646                }
 647        }
 648
 649        return err;
 650}
 651
 652static int qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter)
 653{
 654        int err = 0;
 655        u32 offset, mask_reg;
 656        const struct qlcnic_legacy_intr_set *legacy_intrp;
 657        struct qlcnic_hardware_context *ahw = adapter->ahw;
 658        struct pci_dev *pdev = adapter->pdev;
 659
 660        if (qlcnic_use_msi && !pci_enable_msi(pdev)) {
 661                adapter->flags |= QLCNIC_MSI_ENABLED;
 662                offset = msi_tgt_status[adapter->ahw->pci_func];
 663                adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter->ahw,
 664                                                            offset);
 665                dev_info(&pdev->dev, "using msi interrupts\n");
 666                adapter->msix_entries[0].vector = pdev->irq;
 667                return err;
 668        }
 669
 670        if (qlcnic_use_msi || qlcnic_use_msi_x)
 671                return -EOPNOTSUPP;
 672
 673        legacy_intrp = &legacy_intr[adapter->ahw->pci_func];
 674        adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit;
 675        offset = legacy_intrp->tgt_status_reg;
 676        adapter->tgt_status_reg = qlcnic_get_ioaddr(ahw, offset);
 677        mask_reg = legacy_intrp->tgt_mask_reg;
 678        adapter->tgt_mask_reg = qlcnic_get_ioaddr(ahw, mask_reg);
 679        adapter->isr_int_vec = qlcnic_get_ioaddr(ahw, ISR_INT_VECTOR);
 680        adapter->crb_int_state_reg = qlcnic_get_ioaddr(ahw, ISR_INT_STATE_REG);
 681        dev_info(&pdev->dev, "using legacy interrupts\n");
 682        adapter->msix_entries[0].vector = pdev->irq;
 683        return err;
 684}
 685
 686int qlcnic_82xx_setup_intr(struct qlcnic_adapter *adapter, u8 num_intr, int txq)
 687{
 688        struct qlcnic_hardware_context *ahw = adapter->ahw;
 689        int num_msix, err = 0;
 690
 691        if (!num_intr)
 692                num_intr = QLCNIC_DEF_NUM_STS_DESC_RINGS;
 693
 694        if (ahw->msix_supported) {
 695                num_msix = rounddown_pow_of_two(min_t(int, num_online_cpus(),
 696                                                num_intr));
 697                if (qlcnic_check_multi_tx(adapter)) {
 698                        if (txq)
 699                                adapter->max_drv_tx_rings = txq;
 700                        num_msix += adapter->max_drv_tx_rings;
 701                }
 702        } else {
 703                num_msix = 1;
 704        }
 705
 706        err = qlcnic_enable_msix(adapter, num_msix);
 707        if (err == -ENOMEM)
 708                return err;
 709
 710        if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
 711                qlcnic_disable_multi_tx(adapter);
 712
 713                err = qlcnic_enable_msi_legacy(adapter);
 714                if (!err)
 715                        return err;
 716        }
 717
 718        return 0;
 719}
 720
 721int qlcnic_82xx_mq_intrpt(struct qlcnic_adapter *adapter, int op_type)
 722{
 723        struct qlcnic_hardware_context *ahw = adapter->ahw;
 724        int err, i;
 725
 726        if (qlcnic_check_multi_tx(adapter) &&
 727            !ahw->diag_test &&
 728            (adapter->flags & QLCNIC_MSIX_ENABLED)) {
 729                ahw->intr_tbl = vzalloc(ahw->num_msix *
 730                                        sizeof(struct qlcnic_intrpt_config));
 731                if (!ahw->intr_tbl)
 732                        return -ENOMEM;
 733
 734                for (i = 0; i < ahw->num_msix; i++) {
 735                        ahw->intr_tbl[i].type = QLCNIC_INTRPT_MSIX;
 736                        ahw->intr_tbl[i].id = i;
 737                        ahw->intr_tbl[i].src = 0;
 738                }
 739
 740                err = qlcnic_82xx_config_intrpt(adapter, 1);
 741                if (err)
 742                        dev_err(&adapter->pdev->dev,
 743                                "Failed to configure Interrupt for %d vector\n",
 744                                ahw->num_msix);
 745                return err;
 746        }
 747
 748        return 0;
 749}
 750
 751void qlcnic_teardown_intr(struct qlcnic_adapter *adapter)
 752{
 753        if (adapter->flags & QLCNIC_MSIX_ENABLED)
 754                pci_disable_msix(adapter->pdev);
 755        if (adapter->flags & QLCNIC_MSI_ENABLED)
 756                pci_disable_msi(adapter->pdev);
 757
 758        kfree(adapter->msix_entries);
 759        adapter->msix_entries = NULL;
 760
 761        if (adapter->ahw->intr_tbl) {
 762                vfree(adapter->ahw->intr_tbl);
 763                adapter->ahw->intr_tbl = NULL;
 764        }
 765}
 766
 767static void qlcnic_cleanup_pci_map(struct qlcnic_hardware_context *ahw)
 768{
 769        if (ahw->pci_base0 != NULL)
 770                iounmap(ahw->pci_base0);
 771}
 772
 773static int qlcnic_get_act_pci_func(struct qlcnic_adapter *adapter)
 774{
 775        struct qlcnic_pci_info *pci_info;
 776        int ret;
 777
 778        if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
 779                switch (adapter->ahw->port_type) {
 780                case QLCNIC_GBE:
 781                        adapter->ahw->act_pci_func = QLCNIC_NIU_MAX_GBE_PORTS;
 782                        break;
 783                case QLCNIC_XGBE:
 784                        adapter->ahw->act_pci_func = QLCNIC_NIU_MAX_XG_PORTS;
 785                        break;
 786                }
 787                return 0;
 788        }
 789
 790        if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
 791                return 0;
 792
 793        pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
 794        if (!pci_info)
 795                return -ENOMEM;
 796
 797        ret = qlcnic_get_pci_info(adapter, pci_info);
 798        kfree(pci_info);
 799        return ret;
 800}
 801
 802static bool qlcnic_port_eswitch_cfg_capability(struct qlcnic_adapter *adapter)
 803{
 804        bool ret = false;
 805
 806        if (qlcnic_84xx_check(adapter)) {
 807                ret = true;
 808        } else if (qlcnic_83xx_check(adapter)) {
 809                if (adapter->ahw->extra_capability[0] &
 810                    QLCNIC_FW_CAPABILITY_2_PER_PORT_ESWITCH_CFG)
 811                        ret = true;
 812                else
 813                        ret = false;
 814        }
 815
 816        return ret;
 817}
 818
 819int qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
 820{
 821        struct qlcnic_pci_info *pci_info;
 822        int i, ret = 0, j = 0;
 823        u16 act_pci_func;
 824        u8 pfn;
 825
 826        pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
 827        if (!pci_info)
 828                return -ENOMEM;
 829
 830        ret = qlcnic_get_pci_info(adapter, pci_info);
 831        if (ret)
 832                goto err_pci_info;
 833
 834        act_pci_func = adapter->ahw->act_pci_func;
 835
 836        adapter->npars = kzalloc(sizeof(struct qlcnic_npar_info) *
 837                                 act_pci_func, GFP_KERNEL);
 838        if (!adapter->npars) {
 839                ret = -ENOMEM;
 840                goto err_pci_info;
 841        }
 842
 843        adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) *
 844                                QLCNIC_NIU_MAX_XG_PORTS, GFP_KERNEL);
 845        if (!adapter->eswitch) {
 846                ret = -ENOMEM;
 847                goto err_npars;
 848        }
 849
 850        for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
 851                pfn = pci_info[i].id;
 852
 853                if (pfn >= QLCNIC_MAX_PCI_FUNC) {
 854                        ret = QL_STATUS_INVALID_PARAM;
 855                        goto err_eswitch;
 856                }
 857
 858                if (!pci_info[i].active ||
 859                    (pci_info[i].type != QLCNIC_TYPE_NIC))
 860                        continue;
 861
 862                if (qlcnic_port_eswitch_cfg_capability(adapter)) {
 863                        if (!qlcnic_83xx_enable_port_eswitch(adapter, pfn))
 864                                adapter->npars[j].eswitch_status = true;
 865                        else
 866                                continue;
 867                } else {
 868                        adapter->npars[j].eswitch_status = true;
 869                }
 870
 871                adapter->npars[j].pci_func = pfn;
 872                adapter->npars[j].active = (u8)pci_info[i].active;
 873                adapter->npars[j].type = (u8)pci_info[i].type;
 874                adapter->npars[j].phy_port = (u8)pci_info[i].default_port;
 875                adapter->npars[j].min_bw = pci_info[i].tx_min_bw;
 876                adapter->npars[j].max_bw = pci_info[i].tx_max_bw;
 877
 878                j++;
 879        }
 880
 881        if (qlcnic_82xx_check(adapter)) {
 882                for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++)
 883                        adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE;
 884        } else if (!qlcnic_port_eswitch_cfg_capability(adapter)) {
 885                for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++)
 886                        qlcnic_enable_eswitch(adapter, i, 1);
 887        }
 888
 889        kfree(pci_info);
 890        return 0;
 891
 892err_eswitch:
 893        kfree(adapter->eswitch);
 894        adapter->eswitch = NULL;
 895err_npars:
 896        kfree(adapter->npars);
 897        adapter->npars = NULL;
 898err_pci_info:
 899        kfree(pci_info);
 900
 901        return ret;
 902}
 903
 904static int
 905qlcnic_set_function_modes(struct qlcnic_adapter *adapter)
 906{
 907        u8 id;
 908        int ret;
 909        u32 data = QLCNIC_MGMT_FUNC;
 910        struct qlcnic_hardware_context *ahw = adapter->ahw;
 911
 912        ret = qlcnic_api_lock(adapter);
 913        if (ret)
 914                goto err_lock;
 915
 916        id = ahw->pci_func;
 917        data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
 918        data = (data & ~QLC_DEV_SET_DRV(0xf, id)) |
 919               QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, id);
 920        QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data);
 921        qlcnic_api_unlock(adapter);
 922err_lock:
 923        return ret;
 924}
 925
 926static void qlcnic_check_vf(struct qlcnic_adapter *adapter,
 927                            const struct pci_device_id *ent)
 928{
 929        u32 op_mode, priv_level;
 930
 931        /* Determine FW API version */
 932        adapter->ahw->fw_hal_version = QLC_SHARED_REG_RD32(adapter,
 933                                                           QLCNIC_FW_API);
 934
 935        /* Find PCI function number */
 936        qlcnic_get_func_no(adapter);
 937
 938        /* Determine function privilege level */
 939        op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
 940        if (op_mode == QLC_DEV_DRV_DEFAULT)
 941                priv_level = QLCNIC_MGMT_FUNC;
 942        else
 943                priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func);
 944
 945        if (priv_level == QLCNIC_NON_PRIV_FUNC) {
 946                adapter->ahw->op_mode = QLCNIC_NON_PRIV_FUNC;
 947                dev_info(&adapter->pdev->dev,
 948                        "HAL Version: %d Non Privileged function\n",
 949                         adapter->ahw->fw_hal_version);
 950                adapter->nic_ops = &qlcnic_vf_ops;
 951        } else
 952                adapter->nic_ops = &qlcnic_ops;
 953}
 954
 955#define QLCNIC_82XX_BAR0_LENGTH 0x00200000UL
 956#define QLCNIC_83XX_BAR0_LENGTH 0x4000
 957static void qlcnic_get_bar_length(u32 dev_id, ulong *bar)
 958{
 959        switch (dev_id) {
 960        case PCI_DEVICE_ID_QLOGIC_QLE824X:
 961                *bar = QLCNIC_82XX_BAR0_LENGTH;
 962                break;
 963        case PCI_DEVICE_ID_QLOGIC_QLE834X:
 964        case PCI_DEVICE_ID_QLOGIC_QLE844X:
 965        case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
 966        case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
 967                *bar = QLCNIC_83XX_BAR0_LENGTH;
 968                break;
 969        default:
 970                *bar = 0;
 971        }
 972}
 973
 974static int qlcnic_setup_pci_map(struct pci_dev *pdev,
 975                                struct qlcnic_hardware_context *ahw)
 976{
 977        u32 offset;
 978        void __iomem *mem_ptr0 = NULL;
 979        unsigned long mem_len, pci_len0 = 0, bar0_len;
 980
 981        /* remap phys address */
 982        mem_len = pci_resource_len(pdev, 0);
 983
 984        qlcnic_get_bar_length(pdev->device, &bar0_len);
 985        if (mem_len >= bar0_len) {
 986
 987                mem_ptr0 = pci_ioremap_bar(pdev, 0);
 988                if (mem_ptr0 == NULL) {
 989                        dev_err(&pdev->dev, "failed to map PCI bar 0\n");
 990                        return -EIO;
 991                }
 992                pci_len0 = mem_len;
 993        } else {
 994                return -EIO;
 995        }
 996
 997        dev_info(&pdev->dev, "%dKB memory map\n", (int)(mem_len >> 10));
 998
 999        ahw->pci_base0 = mem_ptr0;
1000        ahw->pci_len0 = pci_len0;
1001        offset = QLCNIC_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(ahw->pci_func));
1002        qlcnic_get_ioaddr(ahw, offset);
1003
1004        return 0;
1005}
1006
1007static bool qlcnic_validate_subsystem_id(struct qlcnic_adapter *adapter,
1008                                         int index)
1009{
1010        struct pci_dev *pdev = adapter->pdev;
1011        unsigned short subsystem_vendor;
1012        bool ret = true;
1013
1014        subsystem_vendor = pdev->subsystem_vendor;
1015
1016        if (pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X ||
1017            pdev->device == PCI_DEVICE_ID_QLOGIC_QLE834X) {
1018                if (qlcnic_boards[index].sub_vendor == subsystem_vendor &&
1019                    qlcnic_boards[index].sub_device == pdev->subsystem_device)
1020                        ret = true;
1021                else
1022                        ret = false;
1023        }
1024
1025        return ret;
1026}
1027
1028static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name)
1029{
1030        struct pci_dev *pdev = adapter->pdev;
1031        int i, found = 0;
1032
1033        for (i = 0; i < NUM_SUPPORTED_BOARDS; ++i) {
1034                if (qlcnic_boards[i].vendor == pdev->vendor &&
1035                    qlcnic_boards[i].device == pdev->device &&
1036                    qlcnic_validate_subsystem_id(adapter, i)) {
1037                        found = 1;
1038                        break;
1039                }
1040        }
1041
1042        if (!found)
1043                sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr);
1044        else
1045                sprintf(name, "%pM: %s" , adapter->mac_addr,
1046                        qlcnic_boards[i].short_name);
1047}
1048
1049static void
1050qlcnic_check_options(struct qlcnic_adapter *adapter)
1051{
1052        int err;
1053        u32 fw_major, fw_minor, fw_build, prev_fw_version;
1054        struct pci_dev *pdev = adapter->pdev;
1055        struct qlcnic_hardware_context *ahw = adapter->ahw;
1056        struct qlcnic_fw_dump *fw_dump = &ahw->fw_dump;
1057
1058        prev_fw_version = adapter->fw_version;
1059
1060        fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR);
1061        fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR);
1062        fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB);
1063
1064        adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build);
1065
1066        err = qlcnic_get_board_info(adapter);
1067        if (err) {
1068                dev_err(&pdev->dev, "Error getting board config info.\n");
1069                return;
1070        }
1071        if (ahw->op_mode != QLCNIC_NON_PRIV_FUNC) {
1072                if (fw_dump->tmpl_hdr == NULL ||
1073                                adapter->fw_version > prev_fw_version) {
1074                        if (fw_dump->tmpl_hdr)
1075                                vfree(fw_dump->tmpl_hdr);
1076                        if (!qlcnic_fw_cmd_get_minidump_temp(adapter))
1077                                dev_info(&pdev->dev,
1078                                        "Supports FW dump capability\n");
1079                }
1080        }
1081
1082        dev_info(&pdev->dev, "Driver v%s, firmware v%d.%d.%d\n",
1083                 QLCNIC_LINUX_VERSIONID, fw_major, fw_minor, fw_build);
1084
1085        if (adapter->ahw->port_type == QLCNIC_XGBE) {
1086                if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
1087                        adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF;
1088                        adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF;
1089                } else {
1090                        adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
1091                        adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
1092                }
1093
1094                adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
1095                adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
1096
1097        } else if (adapter->ahw->port_type == QLCNIC_GBE) {
1098                adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
1099                adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
1100                adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
1101                adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
1102        }
1103
1104        adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
1105
1106        adapter->num_txd = MAX_CMD_DESCRIPTORS;
1107
1108        adapter->max_rds_rings = MAX_RDS_RINGS;
1109}
1110
1111static int
1112qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
1113{
1114        struct qlcnic_info nic_info;
1115        int err = 0;
1116
1117        memset(&nic_info, 0, sizeof(struct qlcnic_info));
1118        err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func);
1119        if (err)
1120                return err;
1121
1122        adapter->ahw->physical_port = (u8)nic_info.phys_port;
1123        adapter->ahw->switch_mode = nic_info.switch_mode;
1124        adapter->ahw->max_tx_ques = nic_info.max_tx_ques;
1125        adapter->ahw->max_rx_ques = nic_info.max_rx_ques;
1126        adapter->ahw->capabilities = nic_info.capabilities;
1127
1128        if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
1129                u32 temp;
1130                temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err);
1131                if (err == -EIO)
1132                        return err;
1133                adapter->ahw->extra_capability[0] = temp;
1134        }
1135        adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
1136        adapter->ahw->max_mtu = nic_info.max_mtu;
1137
1138        /* Disable NPAR for 83XX */
1139        if (qlcnic_83xx_check(adapter))
1140                return err;
1141
1142        if (adapter->ahw->capabilities & BIT_6)
1143                adapter->flags |= QLCNIC_ESWITCH_ENABLED;
1144        else
1145                adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
1146
1147        return err;
1148}
1149
1150void qlcnic_set_vlan_config(struct qlcnic_adapter *adapter,
1151                            struct qlcnic_esw_func_cfg *esw_cfg)
1152{
1153        if (esw_cfg->discard_tagged)
1154                adapter->flags &= ~QLCNIC_TAGGING_ENABLED;
1155        else
1156                adapter->flags |= QLCNIC_TAGGING_ENABLED;
1157
1158        if (esw_cfg->vlan_id) {
1159                adapter->rx_pvid = esw_cfg->vlan_id;
1160                adapter->tx_pvid = esw_cfg->vlan_id;
1161        } else {
1162                adapter->rx_pvid = 0;
1163                adapter->tx_pvid = 0;
1164        }
1165}
1166
1167static int
1168qlcnic_vlan_rx_add(struct net_device *netdev, __be16 proto, u16 vid)
1169{
1170        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1171        int err;
1172
1173        if (qlcnic_sriov_vf_check(adapter)) {
1174                err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 1);
1175                if (err) {
1176                        netdev_err(netdev,
1177                                   "Cannot add VLAN filter for VLAN id %d, err=%d",
1178                                   vid, err);
1179                        return err;
1180                }
1181        }
1182
1183        set_bit(vid, adapter->vlans);
1184        return 0;
1185}
1186
1187static int
1188qlcnic_vlan_rx_del(struct net_device *netdev, __be16 proto, u16 vid)
1189{
1190        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1191        int err;
1192
1193        if (qlcnic_sriov_vf_check(adapter)) {
1194                err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 0);
1195                if (err) {
1196                        netdev_err(netdev,
1197                                   "Cannot delete VLAN filter for VLAN id %d, err=%d",
1198                                   vid, err);
1199                        return err;
1200                }
1201        }
1202
1203        qlcnic_restore_indev_addr(netdev, NETDEV_DOWN);
1204        clear_bit(vid, adapter->vlans);
1205        return 0;
1206}
1207
1208void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter,
1209                                      struct qlcnic_esw_func_cfg *esw_cfg)
1210{
1211        adapter->flags &= ~(QLCNIC_MACSPOOF | QLCNIC_MAC_OVERRIDE_DISABLED |
1212                                QLCNIC_PROMISC_DISABLED);
1213
1214        if (esw_cfg->mac_anti_spoof)
1215                adapter->flags |= QLCNIC_MACSPOOF;
1216
1217        if (!esw_cfg->mac_override)
1218                adapter->flags |= QLCNIC_MAC_OVERRIDE_DISABLED;
1219
1220        if (!esw_cfg->promisc_mode)
1221                adapter->flags |= QLCNIC_PROMISC_DISABLED;
1222}
1223
1224int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *adapter)
1225{
1226        struct qlcnic_esw_func_cfg esw_cfg;
1227
1228        if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1229                return 0;
1230
1231        esw_cfg.pci_func = adapter->ahw->pci_func;
1232        if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg))
1233                        return -EIO;
1234        qlcnic_set_vlan_config(adapter, &esw_cfg);
1235        qlcnic_set_eswitch_port_features(adapter, &esw_cfg);
1236        qlcnic_set_netdev_features(adapter, &esw_cfg);
1237
1238        return 0;
1239}
1240
1241void qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
1242                                struct qlcnic_esw_func_cfg *esw_cfg)
1243{
1244        struct net_device *netdev = adapter->netdev;
1245
1246        if (qlcnic_83xx_check(adapter))
1247                return;
1248
1249        adapter->offload_flags = esw_cfg->offload_flags;
1250        adapter->flags |= QLCNIC_APP_CHANGED_FLAGS;
1251        netdev_update_features(netdev);
1252        adapter->flags &= ~QLCNIC_APP_CHANGED_FLAGS;
1253}
1254
1255static int
1256qlcnic_check_eswitch_mode(struct qlcnic_adapter *adapter)
1257{
1258        u32 op_mode, priv_level;
1259        int err = 0;
1260
1261        err = qlcnic_initialize_nic(adapter);
1262        if (err)
1263                return err;
1264
1265        if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED)
1266                return 0;
1267
1268        op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
1269        priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func);
1270
1271        if (op_mode == QLC_DEV_DRV_DEFAULT)
1272                priv_level = QLCNIC_MGMT_FUNC;
1273        else
1274                priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func);
1275
1276        if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
1277                if (priv_level == QLCNIC_MGMT_FUNC) {
1278                        adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
1279                        err = qlcnic_init_pci_info(adapter);
1280                        if (err)
1281                                return err;
1282                        /* Set privilege level for other functions */
1283                        qlcnic_set_function_modes(adapter);
1284                        dev_info(&adapter->pdev->dev,
1285                                "HAL Version: %d, Management function\n",
1286                                 adapter->ahw->fw_hal_version);
1287                } else if (priv_level == QLCNIC_PRIV_FUNC) {
1288                        adapter->ahw->op_mode = QLCNIC_PRIV_FUNC;
1289                        dev_info(&adapter->pdev->dev,
1290                                "HAL Version: %d, Privileged function\n",
1291                                 adapter->ahw->fw_hal_version);
1292                }
1293        }
1294
1295        adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
1296
1297        return err;
1298}
1299
1300int qlcnic_set_default_offload_settings(struct qlcnic_adapter *adapter)
1301{
1302        struct qlcnic_esw_func_cfg esw_cfg;
1303        struct qlcnic_npar_info *npar;
1304        u8 i;
1305
1306        if (adapter->need_fw_reset)
1307                return 0;
1308
1309        for (i = 0; i < adapter->ahw->act_pci_func; i++) {
1310                if (!adapter->npars[i].eswitch_status)
1311                        continue;
1312
1313                memset(&esw_cfg, 0, sizeof(struct qlcnic_esw_func_cfg));
1314                esw_cfg.pci_func = adapter->npars[i].pci_func;
1315                esw_cfg.mac_override = BIT_0;
1316                esw_cfg.promisc_mode = BIT_0;
1317                if (qlcnic_82xx_check(adapter)) {
1318                        esw_cfg.offload_flags = BIT_0;
1319                        if (QLCNIC_IS_TSO_CAPABLE(adapter))
1320                                esw_cfg.offload_flags |= (BIT_1 | BIT_2);
1321                }
1322                if (qlcnic_config_switch_port(adapter, &esw_cfg))
1323                        return -EIO;
1324                npar = &adapter->npars[i];
1325                npar->pvid = esw_cfg.vlan_id;
1326                npar->mac_override = esw_cfg.mac_override;
1327                npar->mac_anti_spoof = esw_cfg.mac_anti_spoof;
1328                npar->discard_tagged = esw_cfg.discard_tagged;
1329                npar->promisc_mode = esw_cfg.promisc_mode;
1330                npar->offload_flags = esw_cfg.offload_flags;
1331        }
1332
1333        return 0;
1334}
1335
1336
1337static int
1338qlcnic_reset_eswitch_config(struct qlcnic_adapter *adapter,
1339                        struct qlcnic_npar_info *npar, int pci_func)
1340{
1341        struct qlcnic_esw_func_cfg esw_cfg;
1342        esw_cfg.op_mode = QLCNIC_PORT_DEFAULTS;
1343        esw_cfg.pci_func = pci_func;
1344        esw_cfg.vlan_id = npar->pvid;
1345        esw_cfg.mac_override = npar->mac_override;
1346        esw_cfg.discard_tagged = npar->discard_tagged;
1347        esw_cfg.mac_anti_spoof = npar->mac_anti_spoof;
1348        esw_cfg.offload_flags = npar->offload_flags;
1349        esw_cfg.promisc_mode = npar->promisc_mode;
1350        if (qlcnic_config_switch_port(adapter, &esw_cfg))
1351                return -EIO;
1352
1353        esw_cfg.op_mode = QLCNIC_ADD_VLAN;
1354        if (qlcnic_config_switch_port(adapter, &esw_cfg))
1355                return -EIO;
1356
1357        return 0;
1358}
1359
1360int qlcnic_reset_npar_config(struct qlcnic_adapter *adapter)
1361{
1362        int i, err;
1363        struct qlcnic_npar_info *npar;
1364        struct qlcnic_info nic_info;
1365        u8 pci_func;
1366
1367        if (qlcnic_82xx_check(adapter))
1368                if (!adapter->need_fw_reset)
1369                        return 0;
1370
1371        /* Set the NPAR config data after FW reset */
1372        for (i = 0; i < adapter->ahw->act_pci_func; i++) {
1373                npar = &adapter->npars[i];
1374                pci_func = npar->pci_func;
1375                if (!adapter->npars[i].eswitch_status)
1376                        continue;
1377
1378                memset(&nic_info, 0, sizeof(struct qlcnic_info));
1379                err = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
1380                if (err)
1381                        return err;
1382                nic_info.min_tx_bw = npar->min_bw;
1383                nic_info.max_tx_bw = npar->max_bw;
1384                err = qlcnic_set_nic_info(adapter, &nic_info);
1385                if (err)
1386                        return err;
1387
1388                if (npar->enable_pm) {
1389                        err = qlcnic_config_port_mirroring(adapter,
1390                                                           npar->dest_npar, 1,
1391                                                           pci_func);
1392                        if (err)
1393                                return err;
1394                }
1395                err = qlcnic_reset_eswitch_config(adapter, npar, pci_func);
1396                if (err)
1397                        return err;
1398        }
1399        return 0;
1400}
1401
1402static int qlcnic_check_npar_opertional(struct qlcnic_adapter *adapter)
1403{
1404        u8 npar_opt_timeo = QLCNIC_DEV_NPAR_OPER_TIMEO;
1405        u32 npar_state;
1406
1407        if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
1408                return 0;
1409
1410        npar_state = QLC_SHARED_REG_RD32(adapter,
1411                                         QLCNIC_CRB_DEV_NPAR_STATE);
1412        while (npar_state != QLCNIC_DEV_NPAR_OPER && --npar_opt_timeo) {
1413                msleep(1000);
1414                npar_state = QLC_SHARED_REG_RD32(adapter,
1415                                                 QLCNIC_CRB_DEV_NPAR_STATE);
1416        }
1417        if (!npar_opt_timeo) {
1418                dev_err(&adapter->pdev->dev,
1419                        "Waiting for NPAR state to operational timeout\n");
1420                return -EIO;
1421        }
1422        return 0;
1423}
1424
1425static int
1426qlcnic_set_mgmt_operations(struct qlcnic_adapter *adapter)
1427{
1428        int err;
1429
1430        if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) ||
1431            adapter->ahw->op_mode != QLCNIC_MGMT_FUNC)
1432                return 0;
1433
1434        err = qlcnic_set_default_offload_settings(adapter);
1435        if (err)
1436                return err;
1437
1438        err = qlcnic_reset_npar_config(adapter);
1439        if (err)
1440                return err;
1441
1442        qlcnic_dev_set_npar_ready(adapter);
1443
1444        return err;
1445}
1446
1447int qlcnic_82xx_start_firmware(struct qlcnic_adapter *adapter)
1448{
1449        int err;
1450
1451        err = qlcnic_can_start_firmware(adapter);
1452        if (err < 0)
1453                return err;
1454        else if (!err)
1455                goto check_fw_status;
1456
1457        if (qlcnic_load_fw_file)
1458                qlcnic_request_firmware(adapter);
1459        else {
1460                err = qlcnic_check_flash_fw_ver(adapter);
1461                if (err)
1462                        goto err_out;
1463
1464                adapter->ahw->fw_type = QLCNIC_FLASH_ROMIMAGE;
1465        }
1466
1467        err = qlcnic_need_fw_reset(adapter);
1468        if (err == 0)
1469                goto check_fw_status;
1470
1471        err = qlcnic_pinit_from_rom(adapter);
1472        if (err)
1473                goto err_out;
1474
1475        err = qlcnic_load_firmware(adapter);
1476        if (err)
1477                goto err_out;
1478
1479        qlcnic_release_firmware(adapter);
1480        QLCWR32(adapter, CRB_DRIVER_VERSION, QLCNIC_DRIVER_VERSION);
1481
1482check_fw_status:
1483        err = qlcnic_check_fw_status(adapter);
1484        if (err)
1485                goto err_out;
1486
1487        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY);
1488        qlcnic_idc_debug_info(adapter, 1);
1489        err = qlcnic_check_eswitch_mode(adapter);
1490        if (err) {
1491                dev_err(&adapter->pdev->dev,
1492                        "Memory allocation failed for eswitch\n");
1493                goto err_out;
1494        }
1495        err = qlcnic_set_mgmt_operations(adapter);
1496        if (err)
1497                goto err_out;
1498
1499        qlcnic_check_options(adapter);
1500        adapter->need_fw_reset = 0;
1501
1502        qlcnic_release_firmware(adapter);
1503        return 0;
1504
1505err_out:
1506        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_FAILED);
1507        dev_err(&adapter->pdev->dev, "Device state set to failed\n");
1508
1509        qlcnic_release_firmware(adapter);
1510        return err;
1511}
1512
1513static int
1514qlcnic_request_irq(struct qlcnic_adapter *adapter)
1515{
1516        irq_handler_t handler;
1517        struct qlcnic_host_sds_ring *sds_ring;
1518        struct qlcnic_host_tx_ring *tx_ring;
1519        int err, ring, num_sds_rings;
1520
1521        unsigned long flags = 0;
1522        struct net_device *netdev = adapter->netdev;
1523        struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1524
1525        if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1526                if (qlcnic_82xx_check(adapter))
1527                        handler = qlcnic_tmp_intr;
1528                else
1529                        handler = qlcnic_83xx_tmp_intr;
1530                if (!QLCNIC_IS_MSI_FAMILY(adapter))
1531                        flags |= IRQF_SHARED;
1532
1533        } else {
1534                if (adapter->flags & QLCNIC_MSIX_ENABLED)
1535                        handler = qlcnic_msix_intr;
1536                else if (adapter->flags & QLCNIC_MSI_ENABLED)
1537                        handler = qlcnic_msi_intr;
1538                else {
1539                        flags |= IRQF_SHARED;
1540                        if (qlcnic_82xx_check(adapter))
1541                                handler = qlcnic_intr;
1542                        else
1543                                handler = qlcnic_83xx_intr;
1544                }
1545        }
1546        adapter->irq = netdev->irq;
1547
1548        if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
1549                if (qlcnic_82xx_check(adapter) ||
1550                    (qlcnic_83xx_check(adapter) &&
1551                     (adapter->flags & QLCNIC_MSIX_ENABLED))) {
1552                        num_sds_rings = adapter->max_sds_rings;
1553                        for (ring = 0; ring < num_sds_rings; ring++) {
1554                                sds_ring = &recv_ctx->sds_rings[ring];
1555                                if (qlcnic_82xx_check(adapter) &&
1556                                    !qlcnic_check_multi_tx(adapter) &&
1557                                    (ring == (num_sds_rings - 1))) {
1558                                        if (!(adapter->flags &
1559                                              QLCNIC_MSIX_ENABLED))
1560                                                snprintf(sds_ring->name,
1561                                                         sizeof(sds_ring->name),
1562                                                         "qlcnic");
1563                                        else
1564                                                snprintf(sds_ring->name,
1565                                                         sizeof(sds_ring->name),
1566                                                         "%s-tx-0-rx-%d",
1567                                                         netdev->name, ring);
1568                                } else {
1569                                        snprintf(sds_ring->name,
1570                                                 sizeof(sds_ring->name),
1571                                                 "%s-rx-%d",
1572                                                 netdev->name, ring);
1573                                }
1574                                err = request_irq(sds_ring->irq, handler, flags,
1575                                                  sds_ring->name, sds_ring);
1576                                if (err)
1577                                        return err;
1578                        }
1579                }
1580                if ((qlcnic_82xx_check(adapter) &&
1581                     qlcnic_check_multi_tx(adapter)) ||
1582                    (qlcnic_83xx_check(adapter) &&
1583                     (adapter->flags & QLCNIC_MSIX_ENABLED) &&
1584                     !(adapter->flags & QLCNIC_TX_INTR_SHARED))) {
1585                        handler = qlcnic_msix_tx_intr;
1586                        for (ring = 0; ring < adapter->max_drv_tx_rings;
1587                             ring++) {
1588                                tx_ring = &adapter->tx_ring[ring];
1589                                snprintf(tx_ring->name, sizeof(tx_ring->name),
1590                                         "%s-tx-%d", netdev->name, ring);
1591                                err = request_irq(tx_ring->irq, handler, flags,
1592                                                  tx_ring->name, tx_ring);
1593                                if (err)
1594                                        return err;
1595                        }
1596                }
1597        }
1598        return 0;
1599}
1600
1601static void
1602qlcnic_free_irq(struct qlcnic_adapter *adapter)
1603{
1604        int ring;
1605        struct qlcnic_host_sds_ring *sds_ring;
1606        struct qlcnic_host_tx_ring *tx_ring;
1607
1608        struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1609
1610        if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
1611                if (qlcnic_82xx_check(adapter) ||
1612                    (qlcnic_83xx_check(adapter) &&
1613                     (adapter->flags & QLCNIC_MSIX_ENABLED))) {
1614                        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1615                                sds_ring = &recv_ctx->sds_rings[ring];
1616                                free_irq(sds_ring->irq, sds_ring);
1617                        }
1618                }
1619                if ((qlcnic_83xx_check(adapter) &&
1620                     !(adapter->flags & QLCNIC_TX_INTR_SHARED)) ||
1621                    (qlcnic_82xx_check(adapter) &&
1622                     qlcnic_check_multi_tx(adapter))) {
1623                        for (ring = 0; ring < adapter->max_drv_tx_rings;
1624                             ring++) {
1625                                tx_ring = &adapter->tx_ring[ring];
1626                                if (tx_ring->irq)
1627                                        free_irq(tx_ring->irq, tx_ring);
1628                        }
1629                }
1630        }
1631}
1632
1633static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter)
1634{
1635        u32 capab = 0;
1636
1637        if (qlcnic_82xx_check(adapter)) {
1638                if (adapter->ahw->extra_capability[0] &
1639                    QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
1640                        adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
1641        } else {
1642                capab = adapter->ahw->capabilities;
1643                if (QLC_83XX_GET_FW_LRO_MSS_CAPABILITY(capab))
1644                        adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
1645        }
1646}
1647
1648int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
1649{
1650        int ring;
1651        struct qlcnic_host_rds_ring *rds_ring;
1652
1653        if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1654                return -EIO;
1655
1656        if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
1657                return 0;
1658
1659        if (qlcnic_set_eswitch_port_config(adapter))
1660                return -EIO;
1661
1662        qlcnic_get_lro_mss_capability(adapter);
1663
1664        if (qlcnic_fw_create_ctx(adapter))
1665                return -EIO;
1666
1667        for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1668                rds_ring = &adapter->recv_ctx->rds_rings[ring];
1669                qlcnic_post_rx_buffers(adapter, rds_ring, ring);
1670        }
1671
1672        qlcnic_set_multi(netdev);
1673        qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu);
1674
1675        adapter->ahw->linkup = 0;
1676
1677        if (adapter->max_sds_rings > 1)
1678                qlcnic_config_rss(adapter, 1);
1679
1680        qlcnic_config_intr_coalesce(adapter);
1681
1682        if (netdev->features & NETIF_F_LRO)
1683                qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
1684
1685        set_bit(__QLCNIC_DEV_UP, &adapter->state);
1686        qlcnic_napi_enable(adapter);
1687
1688        qlcnic_linkevent_request(adapter, 1);
1689
1690        adapter->ahw->reset_context = 0;
1691        return 0;
1692}
1693
1694int qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
1695{
1696        int err = 0;
1697
1698        rtnl_lock();
1699        if (netif_running(netdev))
1700                err = __qlcnic_up(adapter, netdev);
1701        rtnl_unlock();
1702
1703        return err;
1704}
1705
1706void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
1707{
1708        int ring;
1709
1710        if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1711                return;
1712
1713        if (!test_and_clear_bit(__QLCNIC_DEV_UP, &adapter->state))
1714                return;
1715
1716        if (qlcnic_sriov_vf_check(adapter))
1717                qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc);
1718        smp_mb();
1719        netif_carrier_off(netdev);
1720        adapter->ahw->linkup = 0;
1721        netif_tx_disable(netdev);
1722
1723        qlcnic_free_mac_list(adapter);
1724
1725        if (adapter->fhash.fnum)
1726                qlcnic_delete_lb_filters(adapter);
1727
1728        qlcnic_nic_set_promisc(adapter, QLCNIC_NIU_NON_PROMISC_MODE);
1729
1730        qlcnic_napi_disable(adapter);
1731
1732        qlcnic_fw_destroy_ctx(adapter);
1733        adapter->flags &= ~QLCNIC_FW_LRO_MSS_CAP;
1734
1735        qlcnic_reset_rx_buffers_list(adapter);
1736
1737        for (ring = 0; ring < adapter->max_drv_tx_rings; ring++)
1738                qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]);
1739}
1740
1741/* Usage: During suspend and firmware recovery module */
1742
1743void qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
1744{
1745        rtnl_lock();
1746        if (netif_running(netdev))
1747                __qlcnic_down(adapter, netdev);
1748        rtnl_unlock();
1749
1750}
1751
1752int
1753qlcnic_attach(struct qlcnic_adapter *adapter)
1754{
1755        struct net_device *netdev = adapter->netdev;
1756        struct pci_dev *pdev = adapter->pdev;
1757        int err;
1758
1759        if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC)
1760                return 0;
1761
1762        err = qlcnic_napi_add(adapter, netdev);
1763        if (err)
1764                return err;
1765
1766        err = qlcnic_alloc_sw_resources(adapter);
1767        if (err) {
1768                dev_err(&pdev->dev, "Error in setting sw resources\n");
1769                goto err_out_napi_del;
1770        }
1771
1772        err = qlcnic_alloc_hw_resources(adapter);
1773        if (err) {
1774                dev_err(&pdev->dev, "Error in setting hw resources\n");
1775                goto err_out_free_sw;
1776        }
1777
1778        err = qlcnic_request_irq(adapter);
1779        if (err) {
1780                dev_err(&pdev->dev, "failed to setup interrupt\n");
1781                goto err_out_free_hw;
1782        }
1783
1784        qlcnic_create_sysfs_entries(adapter);
1785
1786        adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC;
1787        return 0;
1788
1789err_out_free_hw:
1790        qlcnic_free_hw_resources(adapter);
1791err_out_free_sw:
1792        qlcnic_free_sw_resources(adapter);
1793err_out_napi_del:
1794        qlcnic_napi_del(adapter);
1795        return err;
1796}
1797
1798void qlcnic_detach(struct qlcnic_adapter *adapter)
1799{
1800        if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1801                return;
1802
1803        qlcnic_remove_sysfs_entries(adapter);
1804
1805        qlcnic_free_hw_resources(adapter);
1806        qlcnic_release_rx_buffers(adapter);
1807        qlcnic_free_irq(adapter);
1808        qlcnic_napi_del(adapter);
1809        qlcnic_free_sw_resources(adapter);
1810
1811        adapter->is_up = 0;
1812}
1813
1814void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings)
1815{
1816        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1817        struct qlcnic_host_sds_ring *sds_ring;
1818        int max_tx_rings = adapter->max_drv_tx_rings;
1819        int ring;
1820
1821        clear_bit(__QLCNIC_DEV_UP, &adapter->state);
1822        if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1823                for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1824                        sds_ring = &adapter->recv_ctx->sds_rings[ring];
1825                        qlcnic_disable_int(sds_ring);
1826                }
1827        }
1828
1829        qlcnic_fw_destroy_ctx(adapter);
1830
1831        qlcnic_detach(adapter);
1832
1833        adapter->ahw->diag_test = 0;
1834        adapter->max_sds_rings = max_sds_rings;
1835        adapter->max_drv_tx_rings = max_tx_rings;
1836
1837        if (qlcnic_attach(adapter))
1838                goto out;
1839
1840        if (netif_running(netdev))
1841                __qlcnic_up(adapter, netdev);
1842out:
1843        netif_device_attach(netdev);
1844}
1845
1846static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter)
1847{
1848        struct qlcnic_hardware_context *ahw = adapter->ahw;
1849        int err = 0;
1850
1851        adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context),
1852                                GFP_KERNEL);
1853        if (!adapter->recv_ctx) {
1854                err = -ENOMEM;
1855                goto err_out;
1856        }
1857        /* Initialize interrupt coalesce parameters */
1858        ahw->coal.flag = QLCNIC_INTR_DEFAULT;
1859        ahw->coal.type = QLCNIC_INTR_COAL_TYPE_RX;
1860        ahw->coal.rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1861        ahw->coal.rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1862        if (qlcnic_83xx_check(adapter)) {
1863                ahw->coal.tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
1864                ahw->coal.tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
1865        }
1866        /* clear stats */
1867        memset(&adapter->stats, 0, sizeof(adapter->stats));
1868err_out:
1869        return err;
1870}
1871
1872static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter)
1873{
1874        kfree(adapter->recv_ctx);
1875        adapter->recv_ctx = NULL;
1876
1877        if (adapter->ahw->fw_dump.tmpl_hdr) {
1878                vfree(adapter->ahw->fw_dump.tmpl_hdr);
1879                adapter->ahw->fw_dump.tmpl_hdr = NULL;
1880        }
1881
1882        kfree(adapter->ahw->reset.buff);
1883        adapter->ahw->fw_dump.tmpl_hdr = NULL;
1884}
1885
1886int qlcnic_diag_alloc_res(struct net_device *netdev, int test)
1887{
1888        struct qlcnic_adapter *adapter = netdev_priv(netdev);
1889        struct qlcnic_host_sds_ring *sds_ring;
1890        struct qlcnic_host_rds_ring *rds_ring;
1891        int ring;
1892        int ret;
1893
1894        netif_device_detach(netdev);
1895
1896        if (netif_running(netdev))
1897                __qlcnic_down(adapter, netdev);
1898
1899        qlcnic_detach(adapter);
1900
1901        adapter->max_sds_rings = 1;
1902        adapter->ahw->diag_test = test;
1903        adapter->ahw->linkup = 0;
1904        adapter->max_drv_tx_rings = 1;
1905
1906        ret = qlcnic_attach(adapter);
1907        if (ret) {
1908                netif_device_attach(netdev);
1909                return ret;
1910        }
1911
1912        ret = qlcnic_fw_create_ctx(adapter);
1913        if (ret) {
1914                qlcnic_detach(adapter);
1915                netif_device_attach(netdev);
1916                return ret;
1917        }
1918
1919        for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1920                rds_ring = &adapter->recv_ctx->rds_rings[ring];
1921                qlcnic_post_rx_buffers(adapter, rds_ring, ring);
1922        }
1923
1924        if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1925                for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1926                        sds_ring = &adapter->recv_ctx->sds_rings[ring];
1927                        qlcnic_enable_int(sds_ring);
1928                }
1929        }
1930
1931        if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) {
1932                adapter->ahw->loopback_state = 0;
1933                qlcnic_linkevent_request(adapter, 1);
1934        }
1935
1936        set_bit(__QLCNIC_DEV_UP, &adapter->state);
1937
1938        return 0;
1939}
1940
1941/* Reset context in hardware only */
1942static int
1943qlcnic_reset_hw_context(struct qlcnic_adapter *adapter)
1944{
1945        struct net_device *netdev = adapter->netdev;
1946
1947        if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1948                return -EBUSY;
1949
1950        netif_device_detach(netdev);
1951
1952        qlcnic_down(adapter, netdev);
1953
1954        qlcnic_up(adapter, netdev);
1955
1956        netif_device_attach(netdev);
1957
1958        clear_bit(__QLCNIC_RESETTING, &adapter->state);
1959        dev_err(&adapter->pdev->dev, "%s:\n", __func__);
1960        return 0;
1961}
1962
1963int
1964qlcnic_reset_context(struct qlcnic_adapter *adapter)
1965{
1966        int err = 0;
1967        struct net_device *netdev = adapter->netdev;
1968
1969        if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1970                return -EBUSY;
1971
1972        if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) {
1973
1974                netif_device_detach(netdev);
1975
1976                if (netif_running(netdev))
1977                        __qlcnic_down(adapter, netdev);
1978
1979                qlcnic_detach(adapter);
1980
1981                if (netif_running(netdev)) {
1982                        err = qlcnic_attach(adapter);
1983                        if (!err) {
1984                                __qlcnic_up(adapter, netdev);
1985                                qlcnic_restore_indev_addr(netdev, NETDEV_UP);
1986                        }
1987                }
1988
1989                netif_device_attach(netdev);
1990        }
1991
1992        clear_bit(__QLCNIC_RESETTING, &adapter->state);
1993        return err;
1994}
1995
1996void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *adapter)
1997{
1998        struct qlcnic_hardware_context *ahw = adapter->ahw;
1999        u16 act_pci_fn = ahw->act_pci_func;
2000        u16 count;
2001
2002        ahw->max_mc_count = QLCNIC_MAX_MC_COUNT;
2003        if (act_pci_fn <= 2)
2004                count = (QLCNIC_MAX_UC_COUNT - QLCNIC_MAX_MC_COUNT) /
2005                         act_pci_fn;
2006        else
2007                count = (QLCNIC_LB_MAX_FILTERS - QLCNIC_MAX_MC_COUNT) /
2008                         act_pci_fn;
2009        ahw->max_uc_count = count;
2010}
2011
2012int
2013qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
2014                    int pci_using_dac)
2015{
2016        int err;
2017        struct pci_dev *pdev = adapter->pdev;
2018
2019        adapter->rx_csum = 1;
2020        adapter->ahw->mc_enabled = 0;
2021        qlcnic_set_mac_filter_count(adapter);
2022
2023        netdev->netdev_ops         = &qlcnic_netdev_ops;
2024        netdev->watchdog_timeo     = QLCNIC_WATCHDOG_TIMEOUTVALUE * HZ;
2025
2026        qlcnic_change_mtu(netdev, netdev->mtu);
2027
2028        if (qlcnic_sriov_vf_check(adapter))
2029                SET_ETHTOOL_OPS(netdev, &qlcnic_sriov_vf_ethtool_ops);
2030        else
2031                SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_ops);
2032
2033        netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
2034                             NETIF_F_IPV6_CSUM | NETIF_F_GRO |
2035                             NETIF_F_HW_VLAN_CTAG_RX);
2036        netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
2037                                  NETIF_F_IPV6_CSUM);
2038
2039        if (QLCNIC_IS_TSO_CAPABLE(adapter)) {
2040                netdev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
2041                netdev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO6);
2042        }
2043
2044        if (pci_using_dac) {
2045                netdev->features |= NETIF_F_HIGHDMA;
2046                netdev->vlan_features |= NETIF_F_HIGHDMA;
2047        }
2048
2049        if (qlcnic_vlan_tx_check(adapter))
2050                netdev->features |= (NETIF_F_HW_VLAN_CTAG_TX);
2051
2052        if (qlcnic_sriov_vf_check(adapter))
2053                netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
2054
2055        if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
2056                netdev->features |= NETIF_F_LRO;
2057
2058        netdev->hw_features = netdev->features;
2059        netdev->priv_flags |= IFF_UNICAST_FLT;
2060        netdev->irq = adapter->msix_entries[0].vector;
2061
2062        err = qlcnic_set_real_num_queues(adapter, netdev);
2063        if (err)
2064                return err;
2065
2066        err = register_netdev(netdev);
2067        if (err) {
2068                dev_err(&pdev->dev, "failed to register net device\n");
2069                return err;
2070        }
2071
2072        qlcnic_dcb_init_dcbnl_ops(adapter);
2073
2074        return 0;
2075}
2076
2077static int qlcnic_set_dma_mask(struct pci_dev *pdev, int *pci_using_dac)
2078{
2079        if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
2080                        !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
2081                *pci_using_dac = 1;
2082        else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) &&
2083                        !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
2084                *pci_using_dac = 0;
2085        else {
2086                dev_err(&pdev->dev, "Unable to set DMA mask, aborting\n");
2087                return -EIO;
2088        }
2089
2090        return 0;
2091}
2092
2093void qlcnic_free_tx_rings(struct qlcnic_adapter *adapter)
2094{
2095        int ring;
2096        struct qlcnic_host_tx_ring *tx_ring;
2097
2098        for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
2099                tx_ring = &adapter->tx_ring[ring];
2100                if (tx_ring && tx_ring->cmd_buf_arr != NULL) {
2101                        vfree(tx_ring->cmd_buf_arr);
2102                        tx_ring->cmd_buf_arr = NULL;
2103                }
2104        }
2105        if (adapter->tx_ring != NULL)
2106                kfree(adapter->tx_ring);
2107}
2108
2109int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter,
2110                          struct net_device *netdev)
2111{
2112        int ring, vector, index;
2113        struct qlcnic_host_tx_ring *tx_ring;
2114        struct qlcnic_cmd_buffer *cmd_buf_arr;
2115
2116        tx_ring = kcalloc(adapter->max_drv_tx_rings,
2117                          sizeof(struct qlcnic_host_tx_ring), GFP_KERNEL);
2118        if (tx_ring == NULL)
2119                return -ENOMEM;
2120
2121        adapter->tx_ring = tx_ring;
2122
2123        for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
2124                tx_ring = &adapter->tx_ring[ring];
2125                tx_ring->num_desc = adapter->num_txd;
2126                tx_ring->txq = netdev_get_tx_queue(netdev, ring);
2127                cmd_buf_arr = vzalloc(TX_BUFF_RINGSIZE(tx_ring));
2128                if (cmd_buf_arr == NULL) {
2129                        qlcnic_free_tx_rings(adapter);
2130                        return -ENOMEM;
2131                }
2132                memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring));
2133                tx_ring->cmd_buf_arr = cmd_buf_arr;
2134        }
2135
2136        if (qlcnic_83xx_check(adapter) ||
2137            (qlcnic_82xx_check(adapter) && qlcnic_check_multi_tx(adapter))) {
2138                for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
2139                        tx_ring = &adapter->tx_ring[ring];
2140                        tx_ring->adapter = adapter;
2141                        if (adapter->flags & QLCNIC_MSIX_ENABLED) {
2142                                index = adapter->max_sds_rings + ring;
2143                                vector = adapter->msix_entries[index].vector;
2144                                tx_ring->irq = vector;
2145                        }
2146                }
2147        }
2148
2149        return 0;
2150}
2151
2152void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
2153{
2154        struct qlcnic_hardware_context *ahw = adapter->ahw;
2155        u32 fw_cmd = 0;
2156
2157        if (qlcnic_82xx_check(adapter))
2158                fw_cmd = QLCNIC_CMD_82XX_SET_DRV_VER;
2159        else if (qlcnic_83xx_check(adapter))
2160                fw_cmd = QLCNIC_CMD_83XX_SET_DRV_VER;
2161
2162        if ((ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) &&
2163            (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_SET_DRV_VER))
2164                qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
2165}
2166
2167static int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
2168{
2169        return __qlcnic_register_dcb(adapter);
2170}
2171
2172void qlcnic_clear_dcb_ops(struct qlcnic_adapter *adapter)
2173{
2174        kfree(adapter->dcb);
2175        adapter->dcb = NULL;
2176}
2177
2178static int
2179qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2180{
2181        struct net_device *netdev = NULL;
2182        struct qlcnic_adapter *adapter = NULL;
2183        struct qlcnic_hardware_context *ahw;
2184        int err, pci_using_dac = -1;
2185        char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
2186
2187        if (pdev->is_virtfn)
2188                return -ENODEV;
2189
2190        err = pci_enable_device(pdev);
2191        if (err)
2192                return err;
2193
2194        if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
2195                err = -ENODEV;
2196                goto err_out_disable_pdev;
2197        }
2198
2199        err = qlcnic_set_dma_mask(pdev, &pci_using_dac);
2200        if (err)
2201                goto err_out_disable_pdev;
2202
2203        err = pci_request_regions(pdev, qlcnic_driver_name);
2204        if (err)
2205                goto err_out_disable_pdev;
2206
2207        pci_set_master(pdev);
2208        pci_enable_pcie_error_reporting(pdev);
2209
2210        ahw = kzalloc(sizeof(struct qlcnic_hardware_context), GFP_KERNEL);
2211        if (!ahw) {
2212                err = -ENOMEM;
2213                goto err_out_free_res;
2214        }
2215
2216        switch (ent->device) {
2217        case PCI_DEVICE_ID_QLOGIC_QLE824X:
2218                ahw->hw_ops = &qlcnic_hw_ops;
2219                ahw->reg_tbl = (u32 *) qlcnic_reg_tbl;
2220                break;
2221        case PCI_DEVICE_ID_QLOGIC_QLE834X:
2222        case PCI_DEVICE_ID_QLOGIC_QLE844X:
2223                qlcnic_83xx_register_map(ahw);
2224                break;
2225        case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
2226        case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
2227                qlcnic_sriov_vf_register_map(ahw);
2228                break;
2229        default:
2230                goto err_out_free_hw_res;
2231        }
2232
2233        err = qlcnic_setup_pci_map(pdev, ahw);
2234        if (err)
2235                goto err_out_free_hw_res;
2236
2237        netdev = alloc_etherdev_mq(sizeof(struct qlcnic_adapter),
2238                                   QLCNIC_MAX_TX_RINGS);
2239        if (!netdev) {
2240                err = -ENOMEM;
2241                goto err_out_iounmap;
2242        }
2243
2244        SET_NETDEV_DEV(netdev, &pdev->dev);
2245
2246        adapter = netdev_priv(netdev);
2247        adapter->netdev  = netdev;
2248        adapter->pdev    = pdev;
2249        adapter->ahw = ahw;
2250
2251        adapter->qlcnic_wq = create_singlethread_workqueue("qlcnic");
2252        if (adapter->qlcnic_wq == NULL) {
2253                err = -ENOMEM;
2254                dev_err(&pdev->dev, "Failed to create workqueue\n");
2255                goto err_out_free_netdev;
2256        }
2257
2258        err = qlcnic_alloc_adapter_resources(adapter);
2259        if (err)
2260                goto err_out_free_wq;
2261
2262        adapter->dev_rst_time = jiffies;
2263        adapter->ahw->revision_id = pdev->revision;
2264        if (qlcnic_mac_learn == FDB_MAC_LEARN)
2265                adapter->fdb_mac_learn = true;
2266        else if (qlcnic_mac_learn == DRV_MAC_LEARN)
2267                adapter->drv_mac_learn = true;
2268
2269        rwlock_init(&adapter->ahw->crb_lock);
2270        mutex_init(&adapter->ahw->mem_lock);
2271
2272        INIT_LIST_HEAD(&adapter->mac_list);
2273
2274        qlcnic_register_dcb(adapter);
2275
2276        if (qlcnic_82xx_check(adapter)) {
2277                qlcnic_check_vf(adapter, ent);
2278                adapter->portnum = adapter->ahw->pci_func;
2279                err = qlcnic_start_firmware(adapter);
2280                if (err) {
2281                        dev_err(&pdev->dev, "Loading fw failed.Please Reboot\n"
2282                                "\t\tIf reboot doesn't help, try flashing the card\n");
2283                        goto err_out_maintenance_mode;
2284                }
2285
2286                qlcnic_get_multiq_capability(adapter);
2287
2288                if ((adapter->ahw->act_pci_func > 2) &&
2289                    qlcnic_check_multi_tx(adapter)) {
2290                        adapter->max_drv_tx_rings = QLCNIC_DEF_NUM_TX_RINGS;
2291                        dev_info(&adapter->pdev->dev,
2292                                 "vNIC mode enabled, Set max TX rings = %d\n",
2293                                 adapter->max_drv_tx_rings);
2294                }
2295
2296                if (!qlcnic_check_multi_tx(adapter)) {
2297                        clear_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state);
2298                        adapter->max_drv_tx_rings = 1;
2299                }
2300                err = qlcnic_setup_idc_param(adapter);
2301                if (err)
2302                        goto err_out_free_hw;
2303
2304                adapter->flags |= QLCNIC_NEED_FLR;
2305
2306                if (adapter->dcb && qlcnic_dcb_attach(adapter))
2307                        qlcnic_clear_dcb_ops(adapter);
2308
2309        } else if (qlcnic_83xx_check(adapter)) {
2310                adapter->max_drv_tx_rings = 1;
2311                qlcnic_83xx_check_vf(adapter, ent);
2312                adapter->portnum = adapter->ahw->pci_func;
2313                err = qlcnic_83xx_init(adapter, pci_using_dac);
2314                if (err) {
2315                        dev_err(&pdev->dev, "%s: failed\n", __func__);
2316                        goto err_out_free_hw;
2317                }
2318                if (qlcnic_sriov_vf_check(adapter))
2319                        return 0;
2320        } else {
2321                dev_err(&pdev->dev,
2322                        "%s: failed. Please Reboot\n", __func__);
2323                goto err_out_free_hw;
2324        }
2325
2326        if (qlcnic_read_mac_addr(adapter))
2327                dev_warn(&pdev->dev, "failed to read mac addr\n");
2328
2329        qlcnic_read_phys_port_id(adapter);
2330
2331        if (adapter->portnum == 0) {
2332                qlcnic_get_board_name(adapter, board_name);
2333
2334                pr_info("%s: %s Board Chip rev 0x%x\n",
2335                        module_name(THIS_MODULE),
2336                        board_name, adapter->ahw->revision_id);
2337        }
2338
2339        if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x &&
2340            !!qlcnic_use_msi)
2341                dev_warn(&pdev->dev,
2342                         "Device does not support MSI interrupts\n");
2343
2344        if (qlcnic_82xx_check(adapter)) {
2345                err = qlcnic_setup_intr(adapter, 0, 0);
2346                if (err) {
2347                        dev_err(&pdev->dev, "Failed to setup interrupt\n");
2348                        goto err_out_disable_msi;
2349                }
2350        }
2351
2352        err = qlcnic_get_act_pci_func(adapter);
2353        if (err)
2354                goto err_out_disable_mbx_intr;
2355
2356        err = qlcnic_setup_netdev(adapter, netdev, pci_using_dac);
2357        if (err)
2358                goto err_out_disable_mbx_intr;
2359
2360        if (adapter->portnum == 0)
2361                qlcnic_set_drv_version(adapter);
2362
2363        pci_set_drvdata(pdev, adapter);
2364
2365        if (qlcnic_82xx_check(adapter))
2366                qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
2367                                     FW_POLL_DELAY);
2368
2369        switch (adapter->ahw->port_type) {
2370        case QLCNIC_GBE:
2371                dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
2372                                adapter->netdev->name);
2373                break;
2374        case QLCNIC_XGBE:
2375                dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
2376                                adapter->netdev->name);
2377                break;
2378        }
2379
2380        if (adapter->drv_mac_learn)
2381                qlcnic_alloc_lb_filters_mem(adapter);
2382
2383        qlcnic_add_sysfs(adapter);
2384
2385        return 0;
2386
2387err_out_disable_mbx_intr:
2388        if (qlcnic_83xx_check(adapter))
2389                qlcnic_83xx_free_mbx_intr(adapter);
2390
2391err_out_disable_msi:
2392        qlcnic_teardown_intr(adapter);
2393        qlcnic_cancel_idc_work(adapter);
2394        qlcnic_clr_all_drv_state(adapter, 0);
2395
2396err_out_free_hw:
2397        qlcnic_free_adapter_resources(adapter);
2398
2399err_out_free_wq:
2400        destroy_workqueue(adapter->qlcnic_wq);
2401
2402err_out_free_netdev:
2403        free_netdev(netdev);
2404
2405err_out_iounmap:
2406        qlcnic_cleanup_pci_map(ahw);
2407
2408err_out_free_hw_res:
2409        kfree(ahw);
2410
2411err_out_free_res:
2412        pci_release_regions(pdev);
2413
2414err_out_disable_pdev:
2415        pci_set_drvdata(pdev, NULL);
2416        pci_disable_device(pdev);
2417        return err;
2418
2419err_out_maintenance_mode:
2420        netdev->netdev_ops = &qlcnic_netdev_failed_ops;
2421        SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_failed_ops);
2422        err = register_netdev(netdev);
2423
2424        if (err) {
2425                dev_err(&pdev->dev, "Failed to register net device\n");
2426                qlcnic_clr_all_drv_state(adapter, 0);
2427                goto err_out_free_hw;
2428        }
2429
2430        pci_set_drvdata(pdev, adapter);
2431        qlcnic_add_sysfs(adapter);
2432
2433        return 0;
2434}
2435
2436static void qlcnic_remove(struct pci_dev *pdev)
2437{
2438        struct qlcnic_adapter *adapter;
2439        struct net_device *netdev;
2440        struct qlcnic_hardware_context *ahw;
2441
2442        adapter = pci_get_drvdata(pdev);
2443        if (adapter == NULL)
2444                return;
2445
2446        netdev = adapter->netdev;
2447        qlcnic_sriov_pf_disable(adapter);
2448
2449        qlcnic_cancel_idc_work(adapter);
2450        ahw = adapter->ahw;
2451
2452        qlcnic_dcb_free(adapter);
2453
2454        unregister_netdev(netdev);
2455        qlcnic_sriov_cleanup(adapter);
2456
2457        if (qlcnic_83xx_check(adapter)) {
2458                qlcnic_83xx_register_nic_idc_func(adapter, 0);
2459                cancel_delayed_work_sync(&adapter->idc_aen_work);
2460                qlcnic_83xx_free_mbx_intr(adapter);
2461                qlcnic_83xx_detach_mailbox_work(adapter);
2462                qlcnic_83xx_free_mailbox(ahw->mailbox);
2463                kfree(ahw->fw_info);
2464        }
2465
2466        qlcnic_detach(adapter);
2467
2468        if (adapter->npars != NULL)
2469                kfree(adapter->npars);
2470        if (adapter->eswitch != NULL)
2471                kfree(adapter->eswitch);
2472
2473        if (qlcnic_82xx_check(adapter))
2474                qlcnic_clr_all_drv_state(adapter, 0);
2475
2476        clear_bit(__QLCNIC_RESETTING, &adapter->state);
2477
2478        qlcnic_free_lb_filters_mem(adapter);
2479
2480        qlcnic_teardown_intr(adapter);
2481
2482        qlcnic_remove_sysfs(adapter);
2483
2484        qlcnic_cleanup_pci_map(adapter->ahw);
2485
2486        qlcnic_release_firmware(adapter);
2487
2488        pci_disable_pcie_error_reporting(pdev);
2489        pci_release_regions(pdev);
2490        pci_disable_device(pdev);
2491        pci_set_drvdata(pdev, NULL);
2492
2493        if (adapter->qlcnic_wq) {
2494                destroy_workqueue(adapter->qlcnic_wq);
2495                adapter->qlcnic_wq = NULL;
2496        }
2497
2498        qlcnic_free_adapter_resources(adapter);
2499        kfree(ahw);
2500        free_netdev(netdev);
2501}
2502
2503static void qlcnic_shutdown(struct pci_dev *pdev)
2504{
2505        if (__qlcnic_shutdown(pdev))
2506                return;
2507
2508        pci_disable_device(pdev);
2509}
2510
2511#ifdef CONFIG_PM
2512static int qlcnic_suspend(struct pci_dev *pdev, pm_message_t state)
2513{
2514        int retval;
2515
2516        retval = __qlcnic_shutdown(pdev);
2517        if (retval)
2518                return retval;
2519
2520        pci_set_power_state(pdev, pci_choose_state(pdev, state));
2521        return 0;
2522}
2523
2524static int qlcnic_resume(struct pci_dev *pdev)
2525{
2526        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
2527        int err;
2528
2529        err = pci_enable_device(pdev);
2530        if (err)
2531                return err;
2532
2533        pci_set_power_state(pdev, PCI_D0);
2534        pci_set_master(pdev);
2535        pci_restore_state(pdev);
2536
2537        return  __qlcnic_resume(adapter);
2538}
2539#endif
2540
2541static int qlcnic_open(struct net_device *netdev)
2542{
2543        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2544        u32 state;
2545        int err;
2546
2547        state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
2548        if (state == QLCNIC_DEV_FAILED || state == QLCNIC_DEV_BADBAD) {
2549                netdev_err(netdev, "%s: Device is in FAILED state\n", __func__);
2550
2551                return -EIO;
2552        }
2553
2554        netif_carrier_off(netdev);
2555
2556        err = qlcnic_attach(adapter);
2557        if (err)
2558                return err;
2559
2560        err = __qlcnic_up(adapter, netdev);
2561        if (err)
2562                goto err_out;
2563
2564        netif_tx_start_all_queues(netdev);
2565
2566        return 0;
2567
2568err_out:
2569        qlcnic_detach(adapter);
2570        return err;
2571}
2572
2573/*
2574 * qlcnic_close - Disables a network interface entry point
2575 */
2576static int qlcnic_close(struct net_device *netdev)
2577{
2578        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2579
2580        __qlcnic_down(adapter, netdev);
2581
2582        return 0;
2583}
2584
2585void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter)
2586{
2587        void *head;
2588        int i;
2589        struct net_device *netdev = adapter->netdev;
2590        u32 filter_size = 0;
2591        u16 act_pci_func = 0;
2592
2593        if (adapter->fhash.fmax && adapter->fhash.fhead)
2594                return;
2595
2596        act_pci_func = adapter->ahw->act_pci_func;
2597        spin_lock_init(&adapter->mac_learn_lock);
2598        spin_lock_init(&adapter->rx_mac_learn_lock);
2599
2600        if (qlcnic_82xx_check(adapter)) {
2601                filter_size = QLCNIC_LB_MAX_FILTERS;
2602                adapter->fhash.fbucket_size = QLCNIC_LB_BUCKET_SIZE;
2603        } else {
2604                filter_size = QLC_83XX_LB_MAX_FILTERS;
2605                adapter->fhash.fbucket_size = QLC_83XX_LB_BUCKET_SIZE;
2606        }
2607
2608        head = kcalloc(adapter->fhash.fbucket_size,
2609                       sizeof(struct hlist_head), GFP_ATOMIC);
2610
2611        if (!head)
2612                return;
2613
2614        adapter->fhash.fmax = (filter_size / act_pci_func);
2615        adapter->fhash.fhead = head;
2616
2617        netdev_info(netdev, "active nic func = %d, mac filter size=%d\n",
2618                    act_pci_func, adapter->fhash.fmax);
2619
2620        for (i = 0; i < adapter->fhash.fbucket_size; i++)
2621                INIT_HLIST_HEAD(&adapter->fhash.fhead[i]);
2622
2623        adapter->rx_fhash.fbucket_size = adapter->fhash.fbucket_size;
2624
2625        head = kcalloc(adapter->rx_fhash.fbucket_size,
2626                       sizeof(struct hlist_head), GFP_ATOMIC);
2627
2628        if (!head)
2629                return;
2630
2631        adapter->rx_fhash.fmax = (filter_size / act_pci_func);
2632        adapter->rx_fhash.fhead = head;
2633
2634        for (i = 0; i < adapter->rx_fhash.fbucket_size; i++)
2635                INIT_HLIST_HEAD(&adapter->rx_fhash.fhead[i]);
2636}
2637
2638static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter)
2639{
2640        if (adapter->fhash.fmax && adapter->fhash.fhead)
2641                kfree(adapter->fhash.fhead);
2642
2643        adapter->fhash.fhead = NULL;
2644        adapter->fhash.fmax = 0;
2645
2646        if (adapter->rx_fhash.fmax && adapter->rx_fhash.fhead)
2647                kfree(adapter->rx_fhash.fhead);
2648
2649        adapter->rx_fhash.fmax = 0;
2650        adapter->rx_fhash.fhead = NULL;
2651}
2652
2653int qlcnic_check_temp(struct qlcnic_adapter *adapter)
2654{
2655        struct net_device *netdev = adapter->netdev;
2656        u32 temp_state, temp_val, temp = 0;
2657        int rv = 0;
2658
2659        if (qlcnic_83xx_check(adapter))
2660                temp = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP);
2661
2662        if (qlcnic_82xx_check(adapter))
2663                temp = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP);
2664
2665        temp_state = qlcnic_get_temp_state(temp);
2666        temp_val = qlcnic_get_temp_val(temp);
2667
2668        if (temp_state == QLCNIC_TEMP_PANIC) {
2669                dev_err(&netdev->dev,
2670                       "Device temperature %d degrees C exceeds"
2671                       " maximum allowed. Hardware has been shut down.\n",
2672                       temp_val);
2673                rv = 1;
2674        } else if (temp_state == QLCNIC_TEMP_WARN) {
2675                if (adapter->ahw->temp == QLCNIC_TEMP_NORMAL) {
2676                        dev_err(&netdev->dev,
2677                               "Device temperature %d degrees C "
2678                               "exceeds operating range."
2679                               " Immediate action needed.\n",
2680                               temp_val);
2681                }
2682        } else {
2683                if (adapter->ahw->temp == QLCNIC_TEMP_WARN) {
2684                        dev_info(&netdev->dev,
2685                               "Device temperature is now %d degrees C"
2686                               " in normal range.\n", temp_val);
2687                }
2688        }
2689        adapter->ahw->temp = temp_state;
2690        return rv;
2691}
2692
2693static void qlcnic_tx_timeout(struct net_device *netdev)
2694{
2695        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2696        struct qlcnic_host_tx_ring *tx_ring;
2697        int ring;
2698
2699        if (test_bit(__QLCNIC_RESETTING, &adapter->state))
2700                return;
2701
2702        if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS) {
2703                netdev_info(netdev, "Tx timeout, reset the adapter.\n");
2704                if (qlcnic_82xx_check(adapter))
2705                        adapter->need_fw_reset = 1;
2706                else if (qlcnic_83xx_check(adapter))
2707                        qlcnic_83xx_idc_request_reset(adapter,
2708                                                      QLCNIC_FORCE_FW_DUMP_KEY);
2709        } else {
2710                netdev_info(netdev, "Tx timeout, reset adapter context.\n");
2711                if (qlcnic_82xx_check(adapter)) {
2712                        for (ring = 0; ring < adapter->max_drv_tx_rings;
2713                             ring++) {
2714                                tx_ring = &adapter->tx_ring[ring];
2715                                dev_info(&netdev->dev, "ring=%d\n", ring);
2716                                dev_info(&netdev->dev, "crb_intr_mask=%d\n",
2717                                         readl(tx_ring->crb_intr_mask));
2718                                dev_info(&netdev->dev, "producer=%d\n",
2719                                         readl(tx_ring->crb_cmd_producer));
2720                                dev_info(&netdev->dev, "sw_consumer = %d\n",
2721                                         tx_ring->sw_consumer);
2722                                dev_info(&netdev->dev, "hw_consumer = %d\n",
2723                                         le32_to_cpu(*(tx_ring->hw_consumer)));
2724                                dev_info(&netdev->dev, "xmit-on=%llu\n",
2725                                         tx_ring->xmit_on);
2726                                dev_info(&netdev->dev, "xmit-off=%llu\n",
2727                                         tx_ring->xmit_off);
2728                        }
2729                }
2730                adapter->ahw->reset_context = 1;
2731        }
2732}
2733
2734static struct net_device_stats *qlcnic_get_stats(struct net_device *netdev)
2735{
2736        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2737        struct net_device_stats *stats = &netdev->stats;
2738
2739        stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
2740        stats->tx_packets = adapter->stats.xmitfinished;
2741        stats->rx_bytes = adapter->stats.rxbytes + adapter->stats.lrobytes;
2742        stats->tx_bytes = adapter->stats.txbytes;
2743        stats->rx_dropped = adapter->stats.rxdropped;
2744        stats->tx_dropped = adapter->stats.txdropped;
2745
2746        return stats;
2747}
2748
2749irqreturn_t qlcnic_82xx_clear_legacy_intr(struct qlcnic_adapter *adapter)
2750{
2751        u32 status;
2752
2753        status = readl(adapter->isr_int_vec);
2754
2755        if (!(status & adapter->ahw->int_vec_bit))
2756                return IRQ_NONE;
2757
2758        /* check interrupt state machine, to be sure */
2759        status = readl(adapter->crb_int_state_reg);
2760        if (!ISR_LEGACY_INT_TRIGGERED(status))
2761                return IRQ_NONE;
2762
2763        writel(0xffffffff, adapter->tgt_status_reg);
2764        /* read twice to ensure write is flushed */
2765        readl(adapter->isr_int_vec);
2766        readl(adapter->isr_int_vec);
2767
2768        return IRQ_HANDLED;
2769}
2770
2771static irqreturn_t qlcnic_tmp_intr(int irq, void *data)
2772{
2773        struct qlcnic_host_sds_ring *sds_ring = data;
2774        struct qlcnic_adapter *adapter = sds_ring->adapter;
2775
2776        if (adapter->flags & QLCNIC_MSIX_ENABLED)
2777                goto done;
2778        else if (adapter->flags & QLCNIC_MSI_ENABLED) {
2779                writel(0xffffffff, adapter->tgt_status_reg);
2780                goto done;
2781        }
2782
2783        if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE)
2784                return IRQ_NONE;
2785
2786done:
2787        adapter->ahw->diag_cnt++;
2788        qlcnic_enable_int(sds_ring);
2789        return IRQ_HANDLED;
2790}
2791
2792static irqreturn_t qlcnic_intr(int irq, void *data)
2793{
2794        struct qlcnic_host_sds_ring *sds_ring = data;
2795        struct qlcnic_adapter *adapter = sds_ring->adapter;
2796
2797        if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE)
2798                return IRQ_NONE;
2799
2800        napi_schedule(&sds_ring->napi);
2801
2802        return IRQ_HANDLED;
2803}
2804
2805static irqreturn_t qlcnic_msi_intr(int irq, void *data)
2806{
2807        struct qlcnic_host_sds_ring *sds_ring = data;
2808        struct qlcnic_adapter *adapter = sds_ring->adapter;
2809
2810        /* clear interrupt */
2811        writel(0xffffffff, adapter->tgt_status_reg);
2812
2813        napi_schedule(&sds_ring->napi);
2814        return IRQ_HANDLED;
2815}
2816
2817static irqreturn_t qlcnic_msix_intr(int irq, void *data)
2818{
2819        struct qlcnic_host_sds_ring *sds_ring = data;
2820
2821        napi_schedule(&sds_ring->napi);
2822        return IRQ_HANDLED;
2823}
2824
2825static irqreturn_t qlcnic_msix_tx_intr(int irq, void *data)
2826{
2827        struct qlcnic_host_tx_ring *tx_ring = data;
2828
2829        napi_schedule(&tx_ring->napi);
2830        return IRQ_HANDLED;
2831}
2832
2833#ifdef CONFIG_NET_POLL_CONTROLLER
2834static void qlcnic_poll_controller(struct net_device *netdev)
2835{
2836        int ring;
2837        struct qlcnic_host_sds_ring *sds_ring;
2838        struct qlcnic_adapter *adapter = netdev_priv(netdev);
2839        struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
2840
2841        disable_irq(adapter->irq);
2842        for (ring = 0; ring < adapter->max_sds_rings; ring++) {
2843                sds_ring = &recv_ctx->sds_rings[ring];
2844                qlcnic_intr(adapter->irq, sds_ring);
2845        }
2846        enable_irq(adapter->irq);
2847}
2848#endif
2849
2850static void
2851qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding)
2852{
2853        u32 val;
2854
2855        val = adapter->portnum & 0xf;
2856        val |= encoding << 7;
2857        val |= (jiffies - adapter->dev_rst_time) << 8;
2858
2859        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_SCRATCH, val);
2860        adapter->dev_rst_time = jiffies;
2861}
2862
2863static int
2864qlcnic_set_drv_state(struct qlcnic_adapter *adapter, u8 state)
2865{
2866        u32  val;
2867
2868        WARN_ON(state != QLCNIC_DEV_NEED_RESET &&
2869                        state != QLCNIC_DEV_NEED_QUISCENT);
2870
2871        if (qlcnic_api_lock(adapter))
2872                return -EIO;
2873
2874        val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2875
2876        if (state == QLCNIC_DEV_NEED_RESET)
2877                QLC_DEV_SET_RST_RDY(val, adapter->portnum);
2878        else if (state == QLCNIC_DEV_NEED_QUISCENT)
2879                QLC_DEV_SET_QSCNT_RDY(val, adapter->portnum);
2880
2881        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2882
2883        qlcnic_api_unlock(adapter);
2884
2885        return 0;
2886}
2887
2888static int
2889qlcnic_clr_drv_state(struct qlcnic_adapter *adapter)
2890{
2891        u32  val;
2892
2893        if (qlcnic_api_lock(adapter))
2894                return -EBUSY;
2895
2896        val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2897        QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum);
2898        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2899
2900        qlcnic_api_unlock(adapter);
2901
2902        return 0;
2903}
2904
2905void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed)
2906{
2907        u32  val;
2908
2909        if (qlcnic_api_lock(adapter))
2910                goto err;
2911
2912        val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
2913        QLC_DEV_CLR_REF_CNT(val, adapter->portnum);
2914        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val);
2915
2916        if (failed) {
2917                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2918                                    QLCNIC_DEV_FAILED);
2919                dev_info(&adapter->pdev->dev,
2920                                "Device state set to Failed. Please Reboot\n");
2921        } else if (!(val & 0x11111111))
2922                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2923                                    QLCNIC_DEV_COLD);
2924
2925        val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2926        QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum);
2927        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2928
2929        qlcnic_api_unlock(adapter);
2930err:
2931        adapter->fw_fail_cnt = 0;
2932        adapter->flags &= ~QLCNIC_FW_HANG;
2933        clear_bit(__QLCNIC_START_FW, &adapter->state);
2934        clear_bit(__QLCNIC_RESETTING, &adapter->state);
2935}
2936
2937/* Grab api lock, before checking state */
2938static int
2939qlcnic_check_drv_state(struct qlcnic_adapter *adapter)
2940{
2941        int act, state, active_mask;
2942        struct qlcnic_hardware_context *ahw = adapter->ahw;
2943
2944        state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2945        act = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
2946
2947        if (adapter->flags & QLCNIC_FW_RESET_OWNER) {
2948                active_mask = (~(1 << (ahw->pci_func * 4)));
2949                act = act & active_mask;
2950        }
2951
2952        if (((state & 0x11111111) == (act & 0x11111111)) ||
2953                        ((act & 0x11111111) == ((state >> 1) & 0x11111111)))
2954                return 0;
2955        else
2956                return 1;
2957}
2958
2959static int qlcnic_check_idc_ver(struct qlcnic_adapter *adapter)
2960{
2961        u32 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_IDC_VER);
2962
2963        if (val != QLCNIC_DRV_IDC_VER) {
2964                dev_warn(&adapter->pdev->dev, "IDC Version mismatch, driver's"
2965                        " idc ver = %x; reqd = %x\n", QLCNIC_DRV_IDC_VER, val);
2966        }
2967
2968        return 0;
2969}
2970
2971static int
2972qlcnic_can_start_firmware(struct qlcnic_adapter *adapter)
2973{
2974        u32 val, prev_state;
2975        u8 dev_init_timeo = adapter->dev_init_timeo;
2976        u8 portnum = adapter->portnum;
2977        u8 ret;
2978
2979        if (test_and_clear_bit(__QLCNIC_START_FW, &adapter->state))
2980                return 1;
2981
2982        if (qlcnic_api_lock(adapter))
2983                return -1;
2984
2985        val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
2986        if (!(val & (1 << (portnum * 4)))) {
2987                QLC_DEV_SET_REF_CNT(val, portnum);
2988                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val);
2989        }
2990
2991        prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
2992        QLCDB(adapter, HW, "Device state = %u\n", prev_state);
2993
2994        switch (prev_state) {
2995        case QLCNIC_DEV_COLD:
2996                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2997                                    QLCNIC_DEV_INITIALIZING);
2998                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_IDC_VER,
2999                                    QLCNIC_DRV_IDC_VER);
3000                qlcnic_idc_debug_info(adapter, 0);
3001                qlcnic_api_unlock(adapter);
3002                return 1;
3003
3004        case QLCNIC_DEV_READY:
3005                ret = qlcnic_check_idc_ver(adapter);
3006                qlcnic_api_unlock(adapter);
3007                return ret;
3008
3009        case QLCNIC_DEV_NEED_RESET:
3010                val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
3011                QLC_DEV_SET_RST_RDY(val, portnum);
3012                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
3013                break;
3014
3015        case QLCNIC_DEV_NEED_QUISCENT:
3016                val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
3017                QLC_DEV_SET_QSCNT_RDY(val, portnum);
3018                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
3019                break;
3020
3021        case QLCNIC_DEV_FAILED:
3022                dev_err(&adapter->pdev->dev, "Device in failed state.\n");
3023                qlcnic_api_unlock(adapter);
3024                return -1;
3025
3026        case QLCNIC_DEV_INITIALIZING:
3027        case QLCNIC_DEV_QUISCENT:
3028                break;
3029        }
3030
3031        qlcnic_api_unlock(adapter);
3032
3033        do {
3034                msleep(1000);
3035                prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3036
3037                if (prev_state == QLCNIC_DEV_QUISCENT)
3038                        continue;
3039        } while ((prev_state != QLCNIC_DEV_READY) && --dev_init_timeo);
3040
3041        if (!dev_init_timeo) {
3042                dev_err(&adapter->pdev->dev,
3043                        "Waiting for device to initialize timeout\n");
3044                return -1;
3045        }
3046
3047        if (qlcnic_api_lock(adapter))
3048                return -1;
3049
3050        val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
3051        QLC_DEV_CLR_RST_QSCNT(val, portnum);
3052        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
3053
3054        ret = qlcnic_check_idc_ver(adapter);
3055        qlcnic_api_unlock(adapter);
3056
3057        return ret;
3058}
3059
3060static void
3061qlcnic_fwinit_work(struct work_struct *work)
3062{
3063        struct qlcnic_adapter *adapter = container_of(work,
3064                        struct qlcnic_adapter, fw_work.work);
3065        u32 dev_state = 0xf;
3066        u32 val;
3067
3068        if (qlcnic_api_lock(adapter))
3069                goto err_ret;
3070
3071        dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3072        if (dev_state == QLCNIC_DEV_QUISCENT ||
3073            dev_state == QLCNIC_DEV_NEED_QUISCENT) {
3074                qlcnic_api_unlock(adapter);
3075                qlcnic_schedule_work(adapter, qlcnic_fwinit_work,
3076                                                FW_POLL_DELAY * 2);
3077                return;
3078        }
3079
3080        if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
3081                qlcnic_api_unlock(adapter);
3082                goto wait_npar;
3083        }
3084
3085        if (dev_state == QLCNIC_DEV_INITIALIZING ||
3086            dev_state == QLCNIC_DEV_READY) {
3087                dev_info(&adapter->pdev->dev, "Detected state change from "
3088                                "DEV_NEED_RESET, skipping ack check\n");
3089                goto skip_ack_check;
3090        }
3091
3092        if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) {
3093                dev_info(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n",
3094                                        adapter->reset_ack_timeo);
3095                goto skip_ack_check;
3096        }
3097
3098        if (!qlcnic_check_drv_state(adapter)) {
3099skip_ack_check:
3100                dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3101
3102                if (dev_state == QLCNIC_DEV_NEED_RESET) {
3103                        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
3104                                            QLCNIC_DEV_INITIALIZING);
3105                        set_bit(__QLCNIC_START_FW, &adapter->state);
3106                        QLCDB(adapter, DRV, "Restarting fw\n");
3107                        qlcnic_idc_debug_info(adapter, 0);
3108                        val = QLC_SHARED_REG_RD32(adapter,
3109                                                  QLCNIC_CRB_DRV_STATE);
3110                        QLC_DEV_SET_RST_RDY(val, adapter->portnum);
3111                        QLC_SHARED_REG_WR32(adapter,
3112                                            QLCNIC_CRB_DRV_STATE, val);
3113                }
3114
3115                qlcnic_api_unlock(adapter);
3116
3117                rtnl_lock();
3118                if (qlcnic_check_fw_dump_state(adapter) &&
3119                    (adapter->flags & QLCNIC_FW_RESET_OWNER)) {
3120                        QLCDB(adapter, DRV, "Take FW dump\n");
3121                        qlcnic_dump_fw(adapter);
3122                        adapter->flags |= QLCNIC_FW_HANG;
3123                }
3124                rtnl_unlock();
3125
3126                adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
3127                if (!adapter->nic_ops->start_firmware(adapter)) {
3128                        qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
3129                        adapter->fw_wait_cnt = 0;
3130                        return;
3131                }
3132                goto err_ret;
3133        }
3134
3135        qlcnic_api_unlock(adapter);
3136
3137wait_npar:
3138        dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3139        QLCDB(adapter, HW, "Func waiting: Device state=%u\n", dev_state);
3140
3141        switch (dev_state) {
3142        case QLCNIC_DEV_READY:
3143                if (!qlcnic_start_firmware(adapter)) {
3144                        qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
3145                        adapter->fw_wait_cnt = 0;
3146                        return;
3147                }
3148        case QLCNIC_DEV_FAILED:
3149                break;
3150        default:
3151                qlcnic_schedule_work(adapter,
3152                        qlcnic_fwinit_work, FW_POLL_DELAY);
3153                return;
3154        }
3155
3156err_ret:
3157        dev_err(&adapter->pdev->dev, "Fwinit work failed state=%u "
3158                "fw_wait_cnt=%u\n", dev_state, adapter->fw_wait_cnt);
3159        netif_device_attach(adapter->netdev);
3160        qlcnic_clr_all_drv_state(adapter, 0);
3161}
3162
3163static void
3164qlcnic_detach_work(struct work_struct *work)
3165{
3166        struct qlcnic_adapter *adapter = container_of(work,
3167                        struct qlcnic_adapter, fw_work.work);
3168        struct net_device *netdev = adapter->netdev;
3169        u32 status;
3170
3171        netif_device_detach(netdev);
3172
3173        /* Dont grab rtnl lock during Quiscent mode */
3174        if (adapter->dev_state == QLCNIC_DEV_NEED_QUISCENT) {
3175                if (netif_running(netdev))
3176                        __qlcnic_down(adapter, netdev);
3177        } else
3178                qlcnic_down(adapter, netdev);
3179
3180        status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
3181
3182        if (status & QLCNIC_RCODE_FATAL_ERROR) {
3183                dev_err(&adapter->pdev->dev,
3184                        "Detaching the device: peg halt status1=0x%x\n",
3185                                        status);
3186
3187                if (QLCNIC_FWERROR_CODE(status) == QLCNIC_FWERROR_FAN_FAILURE) {
3188                        dev_err(&adapter->pdev->dev,
3189                        "On board active cooling fan failed. "
3190                                "Device has been halted.\n");
3191                        dev_err(&adapter->pdev->dev,
3192                                "Replace the adapter.\n");
3193                }
3194
3195                goto err_ret;
3196        }
3197
3198        if (adapter->ahw->temp == QLCNIC_TEMP_PANIC) {
3199                dev_err(&adapter->pdev->dev, "Detaching the device: temp=%d\n",
3200                        adapter->ahw->temp);
3201                goto err_ret;
3202        }
3203
3204        /* Dont ack if this instance is the reset owner */
3205        if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) {
3206                if (qlcnic_set_drv_state(adapter, adapter->dev_state)) {
3207                        dev_err(&adapter->pdev->dev,
3208                                "Failed to set driver state,"
3209                                        "detaching the device.\n");
3210                        goto err_ret;
3211                }
3212        }
3213
3214        adapter->fw_wait_cnt = 0;
3215
3216        qlcnic_schedule_work(adapter, qlcnic_fwinit_work, FW_POLL_DELAY);
3217
3218        return;
3219
3220err_ret:
3221        netif_device_attach(netdev);
3222        qlcnic_clr_all_drv_state(adapter, 1);
3223}
3224
3225/*Transit NPAR state to NON Operational */
3226static void
3227qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter)
3228{
3229        u32 state;
3230
3231        state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
3232        if (state == QLCNIC_DEV_NPAR_NON_OPER)
3233                return;
3234
3235        if (qlcnic_api_lock(adapter))
3236                return;
3237        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
3238                            QLCNIC_DEV_NPAR_NON_OPER);
3239        qlcnic_api_unlock(adapter);
3240}
3241
3242void qlcnic_82xx_dev_request_reset(struct qlcnic_adapter *adapter, u32 key)
3243{
3244        u32 state, xg_val = 0, gb_val = 0;
3245
3246        qlcnic_xg_set_xg0_mask(xg_val);
3247        qlcnic_xg_set_xg1_mask(xg_val);
3248        QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, xg_val);
3249        qlcnic_gb_set_gb0_mask(gb_val);
3250        qlcnic_gb_set_gb1_mask(gb_val);
3251        qlcnic_gb_set_gb2_mask(gb_val);
3252        qlcnic_gb_set_gb3_mask(gb_val);
3253        QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, gb_val);
3254        dev_info(&adapter->pdev->dev, "Pause control frames disabled"
3255                                " on all ports\n");
3256        adapter->need_fw_reset = 1;
3257
3258        if (qlcnic_api_lock(adapter))
3259                return;
3260
3261        state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3262        if (state == QLCNIC_DEV_FAILED || state == QLCNIC_DEV_BADBAD) {
3263                netdev_err(adapter->netdev, "%s: Device is in FAILED state\n",
3264                           __func__);
3265                qlcnic_api_unlock(adapter);
3266
3267                return;
3268        }
3269
3270        if (state == QLCNIC_DEV_READY) {
3271                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
3272                                    QLCNIC_DEV_NEED_RESET);
3273                adapter->flags |= QLCNIC_FW_RESET_OWNER;
3274                QLCDB(adapter, DRV, "NEED_RESET state set\n");
3275                qlcnic_idc_debug_info(adapter, 0);
3276        }
3277
3278        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
3279                            QLCNIC_DEV_NPAR_NON_OPER);
3280        qlcnic_api_unlock(adapter);
3281}
3282
3283/* Transit to NPAR READY state from NPAR NOT READY state */
3284static void
3285qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter)
3286{
3287        if (qlcnic_api_lock(adapter))
3288                return;
3289
3290        QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
3291                            QLCNIC_DEV_NPAR_OPER);
3292        QLCDB(adapter, DRV, "NPAR operational state set\n");
3293
3294        qlcnic_api_unlock(adapter);
3295}
3296
3297void qlcnic_schedule_work(struct qlcnic_adapter *adapter,
3298                          work_func_t func, int delay)
3299{
3300        if (test_bit(__QLCNIC_AER, &adapter->state))
3301                return;
3302
3303        INIT_DELAYED_WORK(&adapter->fw_work, func);
3304        queue_delayed_work(adapter->qlcnic_wq, &adapter->fw_work,
3305                           round_jiffies_relative(delay));
3306}
3307
3308static void
3309qlcnic_attach_work(struct work_struct *work)
3310{
3311        struct qlcnic_adapter *adapter = container_of(work,
3312                                struct qlcnic_adapter, fw_work.work);
3313        struct net_device *netdev = adapter->netdev;
3314        u32 npar_state;
3315
3316        if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) {
3317                npar_state = QLC_SHARED_REG_RD32(adapter,
3318                                                 QLCNIC_CRB_DEV_NPAR_STATE);
3319                if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO)
3320                        qlcnic_clr_all_drv_state(adapter, 0);
3321                else if (npar_state != QLCNIC_DEV_NPAR_OPER)
3322                        qlcnic_schedule_work(adapter, qlcnic_attach_work,
3323                                                        FW_POLL_DELAY);
3324                else
3325                        goto attach;
3326                QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n");
3327                return;
3328        }
3329attach:
3330        qlcnic_dcb_get_info(adapter);
3331
3332        if (netif_running(netdev)) {
3333                if (qlcnic_up(adapter, netdev))
3334                        goto done;
3335
3336                qlcnic_restore_indev_addr(netdev, NETDEV_UP);
3337        }
3338
3339done:
3340        netif_device_attach(netdev);
3341        adapter->fw_fail_cnt = 0;
3342        adapter->flags &= ~QLCNIC_FW_HANG;
3343        clear_bit(__QLCNIC_RESETTING, &adapter->state);
3344        if (adapter->portnum == 0)
3345                qlcnic_set_drv_version(adapter);
3346
3347        if (!qlcnic_clr_drv_state(adapter))
3348                qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
3349                                                        FW_POLL_DELAY);
3350}
3351
3352static int
3353qlcnic_check_health(struct qlcnic_adapter *adapter)
3354{
3355        u32 state = 0, heartbeat;
3356        u32 peg_status;
3357        int err = 0;
3358
3359        if (qlcnic_check_temp(adapter))
3360                goto detach;
3361
3362        if (adapter->need_fw_reset)
3363                qlcnic_dev_request_reset(adapter, 0);
3364
3365        state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3366        if (state == QLCNIC_DEV_NEED_RESET) {
3367                qlcnic_set_npar_non_operational(adapter);
3368                adapter->need_fw_reset = 1;
3369        } else if (state == QLCNIC_DEV_NEED_QUISCENT)
3370                goto detach;
3371
3372        heartbeat = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_ALIVE_COUNTER);
3373        if (heartbeat != adapter->heartbeat) {
3374                adapter->heartbeat = heartbeat;
3375                adapter->fw_fail_cnt = 0;
3376                if (adapter->need_fw_reset)
3377                        goto detach;
3378
3379                if (adapter->ahw->reset_context && qlcnic_auto_fw_reset)
3380                        qlcnic_reset_hw_context(adapter);
3381
3382                return 0;
3383        }
3384
3385        if (++adapter->fw_fail_cnt < FW_FAIL_THRESH)
3386                return 0;
3387
3388        adapter->flags |= QLCNIC_FW_HANG;
3389
3390        qlcnic_dev_request_reset(adapter, 0);
3391
3392        if (qlcnic_auto_fw_reset)
3393                clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state);
3394
3395        dev_err(&adapter->pdev->dev, "firmware hang detected\n");
3396        peg_status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
3397        dev_err(&adapter->pdev->dev, "Dumping hw/fw registers\n"
3398                        "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
3399                        "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
3400                        "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
3401                        "PEG_NET_4_PC: 0x%x\n",
3402                        peg_status,
3403                        QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2),
3404                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err),
3405                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err),
3406                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err),
3407                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err),
3408                        QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err));
3409        if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
3410                dev_err(&adapter->pdev->dev,
3411                        "Firmware aborted with error code 0x00006700. "
3412                                "Device is being reset.\n");
3413detach:
3414        adapter->dev_state = (state == QLCNIC_DEV_NEED_QUISCENT) ? state :
3415                QLCNIC_DEV_NEED_RESET;
3416
3417        if (qlcnic_auto_fw_reset && !test_and_set_bit(__QLCNIC_RESETTING,
3418                                                      &adapter->state)) {
3419
3420                qlcnic_schedule_work(adapter, qlcnic_detach_work, 0);
3421                QLCDB(adapter, DRV, "fw recovery scheduled.\n");
3422        }
3423
3424        return 1;
3425}
3426
3427void qlcnic_fw_poll_work(struct work_struct *work)
3428{
3429        struct qlcnic_adapter *adapter = container_of(work,
3430                                struct qlcnic_adapter, fw_work.work);
3431
3432        if (test_bit(__QLCNIC_RESETTING, &adapter->state))
3433                goto reschedule;
3434
3435
3436        if (qlcnic_check_health(adapter))
3437                return;
3438
3439        if (adapter->fhash.fnum)
3440                qlcnic_prune_lb_filters(adapter);
3441
3442reschedule:
3443        qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY);
3444}
3445
3446static int qlcnic_is_first_func(struct pci_dev *pdev)
3447{
3448        struct pci_dev *oth_pdev;
3449        int val = pdev->devfn;
3450
3451        while (val-- > 0) {
3452                oth_pdev = pci_get_domain_bus_and_slot(pci_domain_nr
3453                        (pdev->bus), pdev->bus->number,
3454                        PCI_DEVFN(PCI_SLOT(pdev->devfn), val));
3455                if (!oth_pdev)
3456                        continue;
3457
3458                if (oth_pdev->current_state != PCI_D3cold) {
3459                        pci_dev_put(oth_pdev);
3460                        return 0;
3461                }
3462                pci_dev_put(oth_pdev);
3463        }
3464        return 1;
3465}
3466
3467static int qlcnic_attach_func(struct pci_dev *pdev)
3468{
3469        int err, first_func;
3470        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3471        struct net_device *netdev = adapter->netdev;
3472
3473        pdev->error_state = pci_channel_io_normal;
3474
3475        err = pci_enable_device(pdev);
3476        if (err)
3477                return err;
3478
3479        pci_set_master(pdev);
3480        pci_restore_state(pdev);
3481
3482        first_func = qlcnic_is_first_func(pdev);
3483
3484        if (qlcnic_api_lock(adapter))
3485                return -EINVAL;
3486
3487        if (adapter->ahw->op_mode != QLCNIC_NON_PRIV_FUNC && first_func) {
3488                adapter->need_fw_reset = 1;
3489                set_bit(__QLCNIC_START_FW, &adapter->state);
3490                QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
3491                                    QLCNIC_DEV_INITIALIZING);
3492                QLCDB(adapter, DRV, "Restarting fw\n");
3493        }
3494        qlcnic_api_unlock(adapter);
3495
3496        err = qlcnic_start_firmware(adapter);
3497        if (err)
3498                return err;
3499
3500        qlcnic_clr_drv_state(adapter);
3501        kfree(adapter->msix_entries);
3502        adapter->msix_entries = NULL;
3503        err = qlcnic_setup_intr(adapter, 0, 0);
3504
3505        if (err) {
3506                kfree(adapter->msix_entries);
3507                netdev_err(netdev, "failed to setup interrupt\n");
3508                return err;
3509        }
3510
3511        if (netif_running(netdev)) {
3512                err = qlcnic_attach(adapter);
3513                if (err) {
3514                        qlcnic_clr_all_drv_state(adapter, 1);
3515                        clear_bit(__QLCNIC_AER, &adapter->state);
3516                        netif_device_attach(netdev);
3517                        return err;
3518                }
3519
3520                err = qlcnic_up(adapter, netdev);
3521                if (err)
3522                        goto done;
3523
3524                qlcnic_restore_indev_addr(netdev, NETDEV_UP);
3525        }
3526 done:
3527        netif_device_attach(netdev);
3528        return err;
3529}
3530
3531pci_ers_result_t qlcnic_82xx_io_error_detected(struct pci_dev *pdev,
3532                                               pci_channel_state_t state)
3533{
3534        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3535        struct net_device *netdev = adapter->netdev;
3536
3537        if (state == pci_channel_io_perm_failure)
3538                return PCI_ERS_RESULT_DISCONNECT;
3539
3540        if (state == pci_channel_io_normal)
3541                return PCI_ERS_RESULT_RECOVERED;
3542
3543        set_bit(__QLCNIC_AER, &adapter->state);
3544        netif_device_detach(netdev);
3545
3546        cancel_delayed_work_sync(&adapter->fw_work);
3547
3548        if (netif_running(netdev))
3549                qlcnic_down(adapter, netdev);
3550
3551        qlcnic_detach(adapter);
3552        qlcnic_teardown_intr(adapter);
3553
3554        clear_bit(__QLCNIC_RESETTING, &adapter->state);
3555
3556        pci_save_state(pdev);
3557        pci_disable_device(pdev);
3558
3559        return PCI_ERS_RESULT_NEED_RESET;
3560}
3561
3562pci_ers_result_t qlcnic_82xx_io_slot_reset(struct pci_dev *pdev)
3563{
3564        return qlcnic_attach_func(pdev) ? PCI_ERS_RESULT_DISCONNECT :
3565                                PCI_ERS_RESULT_RECOVERED;
3566}
3567
3568void qlcnic_82xx_io_resume(struct pci_dev *pdev)
3569{
3570        u32 state;
3571        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3572
3573        pci_cleanup_aer_uncorrect_error_status(pdev);
3574        state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3575        if (state == QLCNIC_DEV_READY && test_and_clear_bit(__QLCNIC_AER,
3576                                                            &adapter->state))
3577                qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
3578                                     FW_POLL_DELAY);
3579}
3580
3581static pci_ers_result_t qlcnic_io_error_detected(struct pci_dev *pdev,
3582                                                 pci_channel_state_t state)
3583{
3584        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3585        struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops;
3586
3587        if (hw_ops->io_error_detected) {
3588                return hw_ops->io_error_detected(pdev, state);
3589        } else {
3590                dev_err(&pdev->dev, "AER error_detected handler not registered.\n");
3591                return PCI_ERS_RESULT_DISCONNECT;
3592        }
3593}
3594
3595static pci_ers_result_t qlcnic_io_slot_reset(struct pci_dev *pdev)
3596{
3597        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3598        struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops;
3599
3600        if (hw_ops->io_slot_reset) {
3601                return hw_ops->io_slot_reset(pdev);
3602        } else {
3603                dev_err(&pdev->dev, "AER slot_reset handler not registered.\n");
3604                return PCI_ERS_RESULT_DISCONNECT;
3605        }
3606}
3607
3608static void qlcnic_io_resume(struct pci_dev *pdev)
3609{
3610        struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3611        struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops;
3612
3613        if (hw_ops->io_resume)
3614                hw_ops->io_resume(pdev);
3615        else
3616                dev_err(&pdev->dev, "AER resume handler not registered.\n");
3617}
3618
3619
3620static int
3621qlcnicvf_start_firmware(struct qlcnic_adapter *adapter)
3622{
3623        int err;
3624
3625        err = qlcnic_can_start_firmware(adapter);
3626        if (err)
3627                return err;
3628
3629        err = qlcnic_check_npar_opertional(adapter);
3630        if (err)
3631                return err;
3632
3633        err = qlcnic_initialize_nic(adapter);
3634        if (err)
3635                return err;
3636
3637        qlcnic_check_options(adapter);
3638
3639        err = qlcnic_set_eswitch_port_config(adapter);
3640        if (err)
3641                return err;
3642
3643        adapter->need_fw_reset = 0;
3644
3645        return err;
3646}
3647
3648int qlcnic_validate_max_tx_rings(struct qlcnic_adapter *adapter, u32 txq)
3649{
3650        struct net_device *netdev = adapter->netdev;
3651        u8 max_hw = QLCNIC_MAX_TX_RINGS;
3652        u32 max_allowed;
3653
3654        if (!qlcnic_use_msi_x && !qlcnic_use_msi) {
3655                netdev_err(netdev, "No Multi TX-Q support in INT-x mode\n");
3656                return -EINVAL;
3657        }
3658
3659        if (!qlcnic_check_multi_tx(adapter)) {
3660                netdev_err(netdev, "No Multi TX-Q support\n");
3661                return -EINVAL;
3662        }
3663
3664        if (txq > QLCNIC_MAX_TX_RINGS) {
3665                netdev_err(netdev, "Invalid ring count\n");
3666                return -EINVAL;
3667        }
3668
3669        max_allowed = rounddown_pow_of_two(min_t(int, max_hw,
3670                                                 num_online_cpus()));
3671        if ((txq > max_allowed) || !is_power_of_2(txq)) {
3672                if (!is_power_of_2(txq))
3673                        netdev_err(netdev,
3674                                   "TX queue should be a power of 2\n");
3675                if (txq > num_online_cpus())
3676                        netdev_err(netdev,
3677                                   "Tx queue should not be higher than [%u], number of online CPUs in the system\n",
3678                                   num_online_cpus());
3679                netdev_err(netdev, "Unable to configure %u Tx rings\n", txq);
3680                return -EINVAL;
3681        }
3682
3683        return 0;
3684}
3685
3686int qlcnic_validate_max_rss(struct qlcnic_adapter *adapter,
3687                                __u32 val)
3688{
3689        struct net_device *netdev = adapter->netdev;
3690        u8 max_hw = adapter->ahw->max_rx_ques;
3691        u32 max_allowed;
3692
3693        if (!qlcnic_use_msi_x && !qlcnic_use_msi) {
3694                netdev_err(netdev, "No RSS support in INT-x mode\n");
3695                return -EINVAL;
3696        }
3697
3698        if (val > QLCNIC_MAX_SDS_RINGS) {
3699                netdev_err(netdev, "RSS value should not be higher than %u\n",
3700                           QLCNIC_MAX_SDS_RINGS);
3701                return -EINVAL;
3702        }
3703
3704        max_allowed = rounddown_pow_of_two(min_t(int, max_hw,
3705                                                 num_online_cpus()));
3706        if ((val > max_allowed) || (val < 2) || !is_power_of_2(val)) {
3707                if (!is_power_of_2(val))
3708                        netdev_err(netdev, "RSS value should be a power of 2\n");
3709
3710                if (val < 2)
3711                        netdev_err(netdev, "RSS value should not be lower than 2\n");
3712
3713                if (val > max_hw)
3714                        netdev_err(netdev,
3715                                   "RSS value should not be higher than[%u], the max RSS rings supported by the adapter\n",
3716                                   max_hw);
3717
3718                if (val > num_online_cpus())
3719                        netdev_err(netdev,
3720                                   "RSS value should not be higher than[%u], number of online CPUs in the system\n",
3721                                   num_online_cpus());
3722
3723                netdev_err(netdev, "Unable to configure %u RSS rings\n", val);
3724
3725                return -EINVAL;
3726        }
3727        return 0;
3728}
3729
3730int qlcnic_set_max_rss(struct qlcnic_adapter *adapter, u8 data, int txq)
3731{
3732        int err;
3733        struct net_device *netdev = adapter->netdev;
3734        int num_msix;
3735
3736        if (test_bit(__QLCNIC_RESETTING, &adapter->state))
3737                return -EBUSY;
3738
3739        if (qlcnic_82xx_check(adapter) && !qlcnic_use_msi_x &&
3740            !qlcnic_use_msi) {
3741                netdev_err(netdev, "No RSS support in INT-x mode\n");
3742                return -EINVAL;
3743        }
3744
3745        netif_device_detach(netdev);
3746        if (netif_running(netdev))
3747                __qlcnic_down(adapter, netdev);
3748
3749        qlcnic_detach(adapter);
3750
3751        if (qlcnic_82xx_check(adapter)) {
3752                if (txq != 0)
3753                        adapter->max_drv_tx_rings = txq;
3754
3755                if (qlcnic_check_multi_tx(adapter) &&
3756                    (txq > adapter->max_drv_tx_rings))
3757                        num_msix = adapter->max_drv_tx_rings;
3758                else
3759                        num_msix = data;
3760        }
3761
3762        if (qlcnic_83xx_check(adapter)) {
3763                qlcnic_83xx_free_mbx_intr(adapter);
3764                qlcnic_83xx_enable_mbx_poll(adapter);
3765        }
3766
3767        netif_set_real_num_tx_queues(netdev, adapter->max_drv_tx_rings);
3768
3769        qlcnic_teardown_intr(adapter);
3770
3771        err = qlcnic_setup_intr(adapter, data, txq);
3772        if (err) {
3773                kfree(adapter->msix_entries);
3774                netdev_err(netdev, "failed to setup interrupt\n");
3775                return err;
3776        }
3777
3778        if (qlcnic_83xx_check(adapter)) {
3779                /* register for NIC IDC AEN Events */
3780                qlcnic_83xx_register_nic_idc_func(adapter, 1);
3781                err = qlcnic_83xx_setup_mbx_intr(adapter);
3782                qlcnic_83xx_disable_mbx_poll(adapter);
3783                if (err) {
3784                        dev_err(&adapter->pdev->dev,
3785                                "failed to setup mbx interrupt\n");
3786                        goto done;
3787                }
3788        }
3789
3790        if (netif_running(netdev)) {
3791                err = qlcnic_attach(adapter);
3792                if (err)
3793                        goto done;
3794                err = __qlcnic_up(adapter, netdev);
3795                if (err)
3796                        goto done;
3797                qlcnic_restore_indev_addr(netdev, NETDEV_UP);
3798        }
3799done:
3800        netif_device_attach(netdev);
3801        clear_bit(__QLCNIC_RESETTING, &adapter->state);
3802        return err;
3803}
3804
3805#ifdef CONFIG_INET
3806
3807#define is_qlcnic_netdev(dev) (dev->netdev_ops == &qlcnic_netdev_ops)
3808
3809static void
3810qlcnic_config_indev_addr(struct qlcnic_adapter *adapter,
3811                        struct net_device *dev, unsigned long event)
3812{
3813        struct in_device *indev;
3814
3815        indev = in_dev_get(dev);
3816        if (!indev)
3817                return;
3818
3819        for_ifa(indev) {
3820                switch (event) {
3821                case NETDEV_UP:
3822                        qlcnic_config_ipaddr(adapter,
3823                                        ifa->ifa_address, QLCNIC_IP_UP);
3824                        break;
3825                case NETDEV_DOWN:
3826                        qlcnic_config_ipaddr(adapter,
3827                                        ifa->ifa_address, QLCNIC_IP_DOWN);
3828                        break;
3829                default:
3830                        break;
3831                }
3832        } endfor_ifa(indev);
3833
3834        in_dev_put(indev);
3835}
3836
3837void qlcnic_restore_indev_addr(struct net_device *netdev, unsigned long event)
3838{
3839        struct qlcnic_adapter *adapter = netdev_priv(netdev);
3840        struct net_device *dev;
3841        u16 vid;
3842
3843        qlcnic_config_indev_addr(adapter, netdev, event);
3844
3845        rcu_read_lock();
3846        for_each_set_bit(vid, adapter->vlans, VLAN_N_VID) {
3847                dev = __vlan_find_dev_deep(netdev, htons(ETH_P_8021Q), vid);
3848                if (!dev)
3849                        continue;
3850                qlcnic_config_indev_addr(adapter, dev, event);
3851        }
3852        rcu_read_unlock();
3853}
3854
3855static int qlcnic_netdev_event(struct notifier_block *this,
3856                                 unsigned long event, void *ptr)
3857{
3858        struct qlcnic_adapter *adapter;
3859        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
3860
3861recheck:
3862        if (dev == NULL)
3863                goto done;
3864
3865        if (dev->priv_flags & IFF_802_1Q_VLAN) {
3866                dev = vlan_dev_real_dev(dev);
3867                goto recheck;
3868        }
3869
3870        if (!is_qlcnic_netdev(dev))
3871                goto done;
3872
3873        adapter = netdev_priv(dev);
3874
3875        if (!adapter)
3876                goto done;
3877
3878        if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
3879                goto done;
3880
3881        qlcnic_config_indev_addr(adapter, dev, event);
3882done:
3883        return NOTIFY_DONE;
3884}
3885
3886static int
3887qlcnic_inetaddr_event(struct notifier_block *this,
3888                unsigned long event, void *ptr)
3889{
3890        struct qlcnic_adapter *adapter;
3891        struct net_device *dev;
3892
3893        struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
3894
3895        dev = ifa->ifa_dev ? ifa->ifa_dev->dev : NULL;
3896
3897recheck:
3898        if (dev == NULL)
3899                goto done;
3900
3901        if (dev->priv_flags & IFF_802_1Q_VLAN) {
3902                dev = vlan_dev_real_dev(dev);
3903                goto recheck;
3904        }
3905
3906        if (!is_qlcnic_netdev(dev))
3907                goto done;
3908
3909        adapter = netdev_priv(dev);
3910
3911        if (!adapter)
3912                goto done;
3913
3914        if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
3915                goto done;
3916
3917        switch (event) {
3918        case NETDEV_UP:
3919                qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_UP);
3920
3921                break;
3922        case NETDEV_DOWN:
3923                qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_DOWN);
3924
3925                break;
3926        default:
3927                break;
3928        }
3929
3930done:
3931        return NOTIFY_DONE;
3932}
3933
3934static struct notifier_block    qlcnic_netdev_cb = {
3935        .notifier_call = qlcnic_netdev_event,
3936};
3937
3938static struct notifier_block qlcnic_inetaddr_cb = {
3939        .notifier_call = qlcnic_inetaddr_event,
3940};
3941#else
3942void qlcnic_restore_indev_addr(struct net_device *dev, unsigned long event)
3943{ }
3944#endif
3945static const struct pci_error_handlers qlcnic_err_handler = {
3946        .error_detected = qlcnic_io_error_detected,
3947        .slot_reset = qlcnic_io_slot_reset,
3948        .resume = qlcnic_io_resume,
3949};
3950
3951static struct pci_driver qlcnic_driver = {
3952        .name = qlcnic_driver_name,
3953        .id_table = qlcnic_pci_tbl,
3954        .probe = qlcnic_probe,
3955        .remove = qlcnic_remove,
3956#ifdef CONFIG_PM
3957        .suspend = qlcnic_suspend,
3958        .resume = qlcnic_resume,
3959#endif
3960        .shutdown = qlcnic_shutdown,
3961        .err_handler = &qlcnic_err_handler,
3962#ifdef CONFIG_QLCNIC_SRIOV
3963        .sriov_configure = qlcnic_pci_sriov_configure,
3964#endif
3965
3966};
3967
3968static int __init qlcnic_init_module(void)
3969{
3970        int ret;
3971
3972        printk(KERN_INFO "%s\n", qlcnic_driver_string);
3973
3974#ifdef CONFIG_INET
3975        register_netdevice_notifier(&qlcnic_netdev_cb);
3976        register_inetaddr_notifier(&qlcnic_inetaddr_cb);
3977#endif
3978
3979        ret = pci_register_driver(&qlcnic_driver);
3980        if (ret) {
3981#ifdef CONFIG_INET
3982                unregister_inetaddr_notifier(&qlcnic_inetaddr_cb);
3983                unregister_netdevice_notifier(&qlcnic_netdev_cb);
3984#endif
3985        }
3986
3987        return ret;
3988}
3989
3990module_init(qlcnic_init_module);
3991
3992static void __exit qlcnic_exit_module(void)
3993{
3994        pci_unregister_driver(&qlcnic_driver);
3995
3996#ifdef CONFIG_INET
3997        unregister_inetaddr_notifier(&qlcnic_inetaddr_cb);
3998        unregister_netdevice_notifier(&qlcnic_netdev_cb);
3999#endif
4000}
4001
4002module_exit(qlcnic_exit_module);
4003