aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet/be_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c70
1 files changed, 47 insertions, 23 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index fee64bf10446..bf40fdaecfa3 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2464,8 +2464,16 @@ void be_detect_error(struct be_adapter *adapter)
2464 */ 2464 */
2465 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 2465 if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
2466 adapter->hw_error = true; 2466 adapter->hw_error = true;
2467 dev_err(&adapter->pdev->dev, 2467 /* Do not log error messages if its a FW reset */
2468 "Error detected in the card\n"); 2468 if (sliport_err1 == SLIPORT_ERROR_FW_RESET1 &&
2469 sliport_err2 == SLIPORT_ERROR_FW_RESET2) {
2470 dev_info(&adapter->pdev->dev,
2471 "Firmware update in progress\n");
2472 return;
2473 } else {
2474 dev_err(&adapter->pdev->dev,
2475 "Error detected in the card\n");
2476 }
2469 } 2477 }
2470 2478
2471 if (sliport_status & SLIPORT_STATUS_ERR_MASK) { 2479 if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
@@ -2736,13 +2744,16 @@ static int be_rx_qs_create(struct be_adapter *adapter)
2736 if (!BEx_chip(adapter)) 2744 if (!BEx_chip(adapter))
2737 adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 | 2745 adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 |
2738 RSS_ENABLE_UDP_IPV6; 2746 RSS_ENABLE_UDP_IPV6;
2747 } else {
2748 /* Disable RSS, if only default RX Q is created */
2749 adapter->rss_flags = RSS_ENABLE_NONE;
2750 }
2739 2751
2740 rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags, 2752 rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags,
2741 128); 2753 128);
2742 if (rc) { 2754 if (rc) {
2743 adapter->rss_flags = 0; 2755 adapter->rss_flags = RSS_ENABLE_NONE;
2744 return rc; 2756 return rc;
2745 }
2746 } 2757 }
2747 2758
2748 /* First time posting */ 2759 /* First time posting */
@@ -2932,28 +2943,35 @@ static void be_cancel_worker(struct be_adapter *adapter)
2932 } 2943 }
2933} 2944}
2934 2945
2935static int be_clear(struct be_adapter *adapter) 2946static void be_mac_clear(struct be_adapter *adapter)
2936{ 2947{
2937 int i; 2948 int i;
2938 2949
2950 if (adapter->pmac_id) {
2951 for (i = 0; i < (adapter->uc_macs + 1); i++)
2952 be_cmd_pmac_del(adapter, adapter->if_handle,
2953 adapter->pmac_id[i], 0);
2954 adapter->uc_macs = 0;
2955
2956 kfree(adapter->pmac_id);
2957 adapter->pmac_id = NULL;
2958 }
2959}
2960
2961static int be_clear(struct be_adapter *adapter)
2962{
2939 be_cancel_worker(adapter); 2963 be_cancel_worker(adapter);
2940 2964
2941 if (sriov_enabled(adapter)) 2965 if (sriov_enabled(adapter))
2942 be_vf_clear(adapter); 2966 be_vf_clear(adapter);
2943 2967
2944 /* delete the primary mac along with the uc-mac list */ 2968 /* delete the primary mac along with the uc-mac list */
2945 for (i = 0; i < (adapter->uc_macs + 1); i++) 2969 be_mac_clear(adapter);
2946 be_cmd_pmac_del(adapter, adapter->if_handle,
2947 adapter->pmac_id[i], 0);
2948 adapter->uc_macs = 0;
2949 2970
2950 be_cmd_if_destroy(adapter, adapter->if_handle, 0); 2971 be_cmd_if_destroy(adapter, adapter->if_handle, 0);
2951 2972
2952 be_clear_queues(adapter); 2973 be_clear_queues(adapter);
2953 2974
2954 kfree(adapter->pmac_id);
2955 adapter->pmac_id = NULL;
2956
2957 be_msix_disable(adapter); 2975 be_msix_disable(adapter);
2958 return 0; 2976 return 0;
2959} 2977}
@@ -3109,11 +3127,11 @@ static void BEx_get_resources(struct be_adapter *adapter,
3109{ 3127{
3110 struct pci_dev *pdev = adapter->pdev; 3128 struct pci_dev *pdev = adapter->pdev;
3111 bool use_sriov = false; 3129 bool use_sriov = false;
3130 int max_vfs;
3112 3131
3113 if (BE3_chip(adapter) && sriov_want(adapter)) { 3132 max_vfs = pci_sriov_get_totalvfs(pdev);
3114 int max_vfs;
3115 3133
3116 max_vfs = pci_sriov_get_totalvfs(pdev); 3134 if (BE3_chip(adapter) && sriov_want(adapter)) {
3117 res->max_vfs = max_vfs > 0 ? min(MAX_VFS, max_vfs) : 0; 3135 res->max_vfs = max_vfs > 0 ? min(MAX_VFS, max_vfs) : 0;
3118 use_sriov = res->max_vfs; 3136 use_sriov = res->max_vfs;
3119 } 3137 }
@@ -3144,7 +3162,11 @@ static void BEx_get_resources(struct be_adapter *adapter,
3144 BE3_MAX_RSS_QS : BE2_MAX_RSS_QS; 3162 BE3_MAX_RSS_QS : BE2_MAX_RSS_QS;
3145 res->max_rx_qs = res->max_rss_qs + 1; 3163 res->max_rx_qs = res->max_rss_qs + 1;
3146 3164
3147 res->max_evt_qs = be_physfn(adapter) ? BE3_MAX_EVT_QS : 1; 3165 if (be_physfn(adapter))
3166 res->max_evt_qs = (max_vfs > 0) ?
3167 BE3_SRIOV_MAX_EVT_QS : BE3_MAX_EVT_QS;
3168 else
3169 res->max_evt_qs = 1;
3148 3170
3149 res->if_cap_flags = BE_IF_CAP_FLAGS_WANT; 3171 res->if_cap_flags = BE_IF_CAP_FLAGS_WANT;
3150 if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) 3172 if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS))
@@ -3812,6 +3834,8 @@ static int lancer_fw_download(struct be_adapter *adapter,
3812 } 3834 }
3813 3835
3814 if (change_status == LANCER_FW_RESET_NEEDED) { 3836 if (change_status == LANCER_FW_RESET_NEEDED) {
3837 dev_info(&adapter->pdev->dev,
3838 "Resetting adapter to activate new FW\n");
3815 status = lancer_physdev_ctrl(adapter, 3839 status = lancer_physdev_ctrl(adapter,
3816 PHYSDEV_CONTROL_FW_RESET_MASK); 3840 PHYSDEV_CONTROL_FW_RESET_MASK);
3817 if (status) { 3841 if (status) {
@@ -4188,7 +4212,7 @@ static int be_ctrl_init(struct be_adapter *adapter)
4188 spin_lock_init(&adapter->mcc_lock); 4212 spin_lock_init(&adapter->mcc_lock);
4189 spin_lock_init(&adapter->mcc_cq_lock); 4213 spin_lock_init(&adapter->mcc_cq_lock);
4190 4214
4191 init_completion(&adapter->flash_compl); 4215 init_completion(&adapter->et_cmd_compl);
4192 pci_save_state(adapter->pdev); 4216 pci_save_state(adapter->pdev);
4193 return 0; 4217 return 0;
4194 4218
@@ -4363,13 +4387,13 @@ static int lancer_recover_func(struct be_adapter *adapter)
4363 goto err; 4387 goto err;
4364 } 4388 }
4365 4389
4366 dev_err(dev, "Error recovery successful\n"); 4390 dev_err(dev, "Adapter recovery successful\n");
4367 return 0; 4391 return 0;
4368err: 4392err:
4369 if (status == -EAGAIN) 4393 if (status == -EAGAIN)
4370 dev_err(dev, "Waiting for resource provisioning\n"); 4394 dev_err(dev, "Waiting for resource provisioning\n");
4371 else 4395 else
4372 dev_err(dev, "Error recovery failed\n"); 4396 dev_err(dev, "Adapter recovery failed\n");
4373 4397
4374 return status; 4398 return status;
4375} 4399}