diff options
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 69d15560fdf9..d66470d75601 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -5244,6 +5244,8 @@ static void i40e_vsi_update_queue_map(struct i40e_vsi *vsi, | |||
5244 | static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc) | 5244 | static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc) |
5245 | { | 5245 | { |
5246 | u8 bw_share[I40E_MAX_TRAFFIC_CLASS] = {0}; | 5246 | u8 bw_share[I40E_MAX_TRAFFIC_CLASS] = {0}; |
5247 | struct i40e_pf *pf = vsi->back; | ||
5248 | struct i40e_hw *hw = &pf->hw; | ||
5247 | struct i40e_vsi_context ctxt; | 5249 | struct i40e_vsi_context ctxt; |
5248 | int ret = 0; | 5250 | int ret = 0; |
5249 | int i; | 5251 | int i; |
@@ -5261,10 +5263,40 @@ static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc) | |||
5261 | 5263 | ||
5262 | ret = i40e_vsi_configure_bw_alloc(vsi, enabled_tc, bw_share); | 5264 | ret = i40e_vsi_configure_bw_alloc(vsi, enabled_tc, bw_share); |
5263 | if (ret) { | 5265 | if (ret) { |
5266 | struct i40e_aqc_query_vsi_bw_config_resp bw_config = {0}; | ||
5267 | |||
5264 | dev_info(&vsi->back->pdev->dev, | 5268 | dev_info(&vsi->back->pdev->dev, |
5265 | "Failed configuring TC map %d for VSI %d\n", | 5269 | "Failed configuring TC map %d for VSI %d\n", |
5266 | enabled_tc, vsi->seid); | 5270 | enabled_tc, vsi->seid); |
5267 | goto out; | 5271 | ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid, |
5272 | &bw_config, NULL); | ||
5273 | if (ret) { | ||
5274 | dev_info(&pf->pdev->dev, | ||
5275 | "Failed querying vsi bw info, err %s aq_err %s\n", | ||
5276 | i40e_stat_str(hw, ret), | ||
5277 | i40e_aq_str(hw, hw->aq.asq_last_status)); | ||
5278 | goto out; | ||
5279 | } | ||
5280 | if ((bw_config.tc_valid_bits & enabled_tc) != enabled_tc) { | ||
5281 | u8 valid_tc = bw_config.tc_valid_bits & enabled_tc; | ||
5282 | |||
5283 | if (!valid_tc) | ||
5284 | valid_tc = bw_config.tc_valid_bits; | ||
5285 | /* Always enable TC0, no matter what */ | ||
5286 | valid_tc |= 1; | ||
5287 | dev_info(&pf->pdev->dev, | ||
5288 | "Requested tc 0x%x, but FW reports 0x%x as valid. Attempting to use 0x%x.\n", | ||
5289 | enabled_tc, bw_config.tc_valid_bits, valid_tc); | ||
5290 | enabled_tc = valid_tc; | ||
5291 | } | ||
5292 | |||
5293 | ret = i40e_vsi_configure_bw_alloc(vsi, enabled_tc, bw_share); | ||
5294 | if (ret) { | ||
5295 | dev_err(&pf->pdev->dev, | ||
5296 | "Unable to configure TC map %d for VSI %d\n", | ||
5297 | enabled_tc, vsi->seid); | ||
5298 | goto out; | ||
5299 | } | ||
5268 | } | 5300 | } |
5269 | 5301 | ||
5270 | /* Update Queue Pairs Mapping for currently enabled UPs */ | 5302 | /* Update Queue Pairs Mapping for currently enabled UPs */ |