]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[karo-tx-linux.git] / drivers / net / ethernet / qlogic / qlcnic / qlcnic_main.c
index 9e61eb8674524575481d0f1158d75353ea4ef724..dcf4a4e7ce23d49073b949b2275f8192b09a0c97 100644 (file)
@@ -819,7 +819,7 @@ static bool qlcnic_port_eswitch_cfg_capability(struct qlcnic_adapter *adapter)
 int qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
 {
        struct qlcnic_pci_info *pci_info;
-       int i, ret = 0, j = 0;
+       int i, id = 0, ret = 0, j = 0;
        u16 act_pci_func;
        u8 pfn;
 
@@ -860,7 +860,8 @@ int qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
                        continue;
 
                if (qlcnic_port_eswitch_cfg_capability(adapter)) {
-                       if (!qlcnic_83xx_enable_port_eswitch(adapter, pfn))
+                       if (!qlcnic_83xx_set_port_eswitch_status(adapter, pfn,
+                                                                &id))
                                adapter->npars[j].eswitch_status = true;
                        else
                                continue;
@@ -875,15 +876,16 @@ int qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
                adapter->npars[j].min_bw = pci_info[i].tx_min_bw;
                adapter->npars[j].max_bw = pci_info[i].tx_max_bw;
 
+               memcpy(&adapter->npars[j].mac, &pci_info[i].mac, ETH_ALEN);
                j++;
        }
 
-       if (qlcnic_82xx_check(adapter)) {
+       /* Update eSwitch status for adapters without per port eSwitch
+        * configuration capability
+        */
+       if (!qlcnic_port_eswitch_cfg_capability(adapter)) {
                for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++)
                        adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE;
-       } else if (!qlcnic_port_eswitch_cfg_capability(adapter)) {
-               for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++)
-                       qlcnic_enable_eswitch(adapter, i, 1);
        }
 
        kfree(pci_info);
@@ -2069,7 +2071,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
                return err;
        }
 
-       qlcnic_dcb_init_dcbnl_ops(adapter);
+       qlcnic_dcb_init_dcbnl_ops(adapter->dcb);
 
        return 0;
 }
@@ -2164,17 +2166,6 @@ void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
                qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
 }
 
-static int qlcnic_register_dcb(struct qlcnic_adapter *adapter)
-{
-       return __qlcnic_register_dcb(adapter);
-}
-
-void qlcnic_clear_dcb_ops(struct qlcnic_adapter *adapter)
-{
-       kfree(adapter->dcb);
-       adapter->dcb = NULL;
-}
-
 static int
 qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
@@ -2183,6 +2174,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct qlcnic_hardware_context *ahw;
        int err, pci_using_dac = -1;
        char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
+       struct qlcnic_dcb *dcb;
 
        if (pdev->is_virtfn)
                return -ENODEV;
@@ -2303,8 +2295,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
                adapter->flags |= QLCNIC_NEED_FLR;
 
-               if (adapter->dcb && qlcnic_dcb_attach(adapter))
-                       qlcnic_clear_dcb_ops(adapter);
+               dcb = adapter->dcb;
+
+               if (dcb && qlcnic_dcb_attach(dcb))
+                       qlcnic_clear_dcb_ops(dcb);
 
        } else if (qlcnic_83xx_check(adapter)) {
                adapter->max_drv_tx_rings = 1;
@@ -2412,7 +2406,6 @@ err_out_free_res:
        pci_release_regions(pdev);
 
 err_out_disable_pdev:
-       pci_set_drvdata(pdev, NULL);
        pci_disable_device(pdev);
        return err;
 
@@ -2449,7 +2442,7 @@ static void qlcnic_remove(struct pci_dev *pdev)
        qlcnic_cancel_idc_work(adapter);
        ahw = adapter->ahw;
 
-       qlcnic_dcb_free(adapter);
+       qlcnic_dcb_free(adapter->dcb);
 
        unregister_netdev(netdev);
        qlcnic_sriov_cleanup(adapter);
@@ -2488,7 +2481,6 @@ static void qlcnic_remove(struct pci_dev *pdev)
        pci_disable_pcie_error_reporting(pdev);
        pci_release_regions(pdev);
        pci_disable_device(pdev);
-       pci_set_drvdata(pdev, NULL);
 
        if (adapter->qlcnic_wq) {
                destroy_workqueue(adapter->qlcnic_wq);
@@ -3327,7 +3319,7 @@ qlcnic_attach_work(struct work_struct *work)
                return;
        }
 attach:
-       qlcnic_dcb_get_info(adapter);
+       qlcnic_dcb_get_info(adapter->dcb);
 
        if (netif_running(netdev)) {
                if (qlcnic_up(adapter, netdev))
@@ -3352,6 +3344,8 @@ done:
 static int
 qlcnic_check_health(struct qlcnic_adapter *adapter)
 {
+       struct qlcnic_hardware_context *ahw = adapter->ahw;
+       struct qlcnic_fw_dump *fw_dump = &ahw->fw_dump;
        u32 state = 0, heartbeat;
        u32 peg_status;
        int err = 0;
@@ -3376,7 +3370,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
                if (adapter->need_fw_reset)
                        goto detach;
 
-               if (adapter->ahw->reset_context && qlcnic_auto_fw_reset)
+               if (ahw->reset_context && qlcnic_auto_fw_reset)
                        qlcnic_reset_hw_context(adapter);
 
                return 0;
@@ -3419,6 +3413,9 @@ detach:
 
                qlcnic_schedule_work(adapter, qlcnic_detach_work, 0);
                QLCDB(adapter, DRV, "fw recovery scheduled.\n");
+       } else if (!qlcnic_auto_fw_reset && fw_dump->enable &&
+                  adapter->flags & QLCNIC_FW_RESET_OWNER) {
+               qlcnic_dump_fw(adapter);
        }
 
        return 1;