diff options
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 70 |
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 | ||
2935 | static int be_clear(struct be_adapter *adapter) | 2946 | static 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 | |||
2961 | static 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; |
4368 | err: | 4392 | err: |
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 | } |