net/i40e: fix returned code for RSS hardware failure
authorAlvin Zhang <alvinx.zhang@intel.com>
Fri, 8 Jan 2021 05:35:39 +0000 (13:35 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 8 Jan 2021 18:20:09 +0000 (19:20 +0100)
The API should return the system error status, but it returned the
hardware error status, this is confuses the caller.
This patch adds check on hardware execution status and returns -EIO
in case of hardware execution failure.

Fixes: 1d4b2b4966bb ("net/i40e: fix VF overwrite PF RSS LUT for X722")
Fixes: d0a349409bd7 ("i40e: support AQ based RSS config")
Cc: stable@dpdk.org
Signed-off-by: Alvin Zhang <alvinx.zhang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/i40e/i40e_ethdev.c

index 7f9bba4..5984e52 100644 (file)
@@ -4443,7 +4443,6 @@ i40e_set_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, uint16_t lut_size)
 {
        struct i40e_pf *pf;
        struct i40e_hw *hw;
-       int ret;
 
        if (!vsi || !lut)
                return -EINVAL;
@@ -4452,12 +4451,16 @@ i40e_set_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, uint16_t lut_size)
        hw = I40E_VSI_TO_HW(vsi);
 
        if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) {
-               ret = i40e_aq_set_rss_lut(hw, vsi->vsi_id,
-                                         vsi->type != I40E_VSI_SRIOV,
-                                         lut, lut_size);
-               if (ret) {
-                       PMD_DRV_LOG(ERR, "Failed to set RSS lookup table");
-                       return ret;
+               enum i40e_status_code status;
+
+               status = i40e_aq_set_rss_lut(hw, vsi->vsi_id,
+                                            vsi->type != I40E_VSI_SRIOV,
+                                            lut, lut_size);
+               if (status) {
+                       PMD_DRV_LOG(ERR,
+                                   "Failed to update RSS lookup table, error status: %d",
+                                   status);
+                       return -EIO;
                }
        } else {
                uint32_t *lut_dw = (uint32_t *)lut;
@@ -7612,7 +7615,6 @@ i40e_set_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t key_len)
        uint16_t key_idx = (vsi->type == I40E_VSI_SRIOV) ?
                           I40E_VFQF_HKEY_MAX_INDEX :
                           I40E_PFQF_HKEY_MAX_INDEX;
-       int ret = 0;
 
        if (!key || key_len == 0) {
                PMD_DRV_LOG(DEBUG, "No key to be configured");
@@ -7625,11 +7627,16 @@ i40e_set_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t key_len)
 
        if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) {
                struct i40e_aqc_get_set_rss_key_data *key_dw =
-                       (struct i40e_aqc_get_set_rss_key_data *)key;
+                               (struct i40e_aqc_get_set_rss_key_data *)key;
+               enum i40e_status_code status =
+                               i40e_aq_set_rss_key(hw, vsi->vsi_id, key_dw);
 
-               ret = i40e_aq_set_rss_key(hw, vsi->vsi_id, key_dw);
-               if (ret)
-                       PMD_INIT_LOG(ERR, "Failed to configure RSS key via AQ");
+               if (status) {
+                       PMD_DRV_LOG(ERR,
+                                   "Failed to configure RSS key via AQ, error status: %d",
+                                   status);
+                       return -EIO;
+               }
        } else {
                uint32_t *hash_key = (uint32_t *)key;
                uint16_t i;
@@ -7649,7 +7656,7 @@ i40e_set_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t key_len)
                I40E_WRITE_FLUSH(hw);
        }
 
-       return ret;
+       return 0;
 }
 
 static int