|
@@ -5244,6 +5244,8 @@ static void i40e_vsi_update_queue_map(struct i40e_vsi *vsi,
|
|
|
static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc)
|
|
|
{
|
|
|
u8 bw_share[I40E_MAX_TRAFFIC_CLASS] = {0};
|
|
|
+ struct i40e_pf *pf = vsi->back;
|
|
|
+ struct i40e_hw *hw = &pf->hw;
|
|
|
struct i40e_vsi_context ctxt;
|
|
|
int ret = 0;
|
|
|
int i;
|
|
@@ -5261,10 +5263,40 @@ static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc)
|
|
|
|
|
|
ret = i40e_vsi_configure_bw_alloc(vsi, enabled_tc, bw_share);
|
|
|
if (ret) {
|
|
|
+ struct i40e_aqc_query_vsi_bw_config_resp bw_config = {0};
|
|
|
+
|
|
|
dev_info(&vsi->back->pdev->dev,
|
|
|
"Failed configuring TC map %d for VSI %d\n",
|
|
|
enabled_tc, vsi->seid);
|
|
|
- goto out;
|
|
|
+ ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid,
|
|
|
+ &bw_config, NULL);
|
|
|
+ if (ret) {
|
|
|
+ dev_info(&pf->pdev->dev,
|
|
|
+ "Failed querying vsi bw info, err %s aq_err %s\n",
|
|
|
+ i40e_stat_str(hw, ret),
|
|
|
+ i40e_aq_str(hw, hw->aq.asq_last_status));
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ if ((bw_config.tc_valid_bits & enabled_tc) != enabled_tc) {
|
|
|
+ u8 valid_tc = bw_config.tc_valid_bits & enabled_tc;
|
|
|
+
|
|
|
+ if (!valid_tc)
|
|
|
+ valid_tc = bw_config.tc_valid_bits;
|
|
|
+ /* Always enable TC0, no matter what */
|
|
|
+ valid_tc |= 1;
|
|
|
+ dev_info(&pf->pdev->dev,
|
|
|
+ "Requested tc 0x%x, but FW reports 0x%x as valid. Attempting to use 0x%x.\n",
|
|
|
+ enabled_tc, bw_config.tc_valid_bits, valid_tc);
|
|
|
+ enabled_tc = valid_tc;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = i40e_vsi_configure_bw_alloc(vsi, enabled_tc, bw_share);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(&pf->pdev->dev,
|
|
|
+ "Unable to configure TC map %d for VSI %d\n",
|
|
|
+ enabled_tc, vsi->seid);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Update Queue Pairs Mapping for currently enabled UPs */
|