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