diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_dcb.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_dcb.c | 50 | 
1 files changed, 44 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_dcb.c b/drivers/net/ethernet/intel/ice/ice_dcb.c index c2002ded65f6..dd7efff121bd 100644 --- a/drivers/net/ethernet/intel/ice/ice_dcb.c +++ b/drivers/net/ethernet/intel/ice/ice_dcb.c @@ -60,7 +60,7 @@ ice_aq_get_lldp_mib(struct ice_hw *hw, u8 bridge_type, u8 mib_type, void *buf,   * Enable or Disable posting of an event on ARQ when LLDP MIB   * associated with the interface changes (0x0A01)   */ -enum ice_status +static enum ice_status  ice_aq_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_update,  			   struct ice_sq_cd *cd)  { @@ -444,9 +444,15 @@ ice_parse_cee_pgcfg_tlv(struct ice_cee_feat_tlv *tlv,  	 *        |pg0|pg1|pg2|pg3|pg4|pg5|pg6|pg7|  	 *        ---------------------------------  	 */ -	ice_for_each_traffic_class(i) +	ice_for_each_traffic_class(i) {  		etscfg->tcbwtable[i] = buf[offset++]; +		if (etscfg->prio_table[i] == ICE_CEE_PGID_STRICT) +			dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_STRICT; +		else +			dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_ETS; +	} +  	/* Number of TCs supported (1 octet) */  	etscfg->maxtcs = buf[offset];  } @@ -937,10 +943,11 @@ enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi)  /**   * ice_init_dcb   * @hw: pointer to the HW struct + * @enable_mib_change: enable MIB change event   *   * Update DCB configuration from the Firmware   */ -enum ice_status ice_init_dcb(struct ice_hw *hw) +enum ice_status ice_init_dcb(struct ice_hw *hw, bool enable_mib_change)  {  	struct ice_port_info *pi = hw->port_info;  	enum ice_status ret = 0; @@ -954,7 +961,8 @@ enum ice_status ice_init_dcb(struct ice_hw *hw)  	pi->dcbx_status = ice_get_dcbx_status(hw);  	if (pi->dcbx_status == ICE_DCBX_STATUS_DONE || -	    pi->dcbx_status == ICE_DCBX_STATUS_IN_PROGRESS) { +	    pi->dcbx_status == ICE_DCBX_STATUS_IN_PROGRESS || +	    pi->dcbx_status == ICE_DCBX_STATUS_NOT_STARTED) {  		/* Get current DCBX configuration */  		ret = ice_get_dcb_cfg(pi);  		pi->is_sw_lldp = (hw->adminq.sq_last_status == ICE_AQ_RC_EPERM); @@ -965,9 +973,39 @@ enum ice_status ice_init_dcb(struct ice_hw *hw)  	}  	/* Configure the LLDP MIB change event */ -	ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL); +	if (enable_mib_change) { +		ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL); +		if (!ret) +			pi->is_sw_lldp = false; +	} + +	return ret; +} + +/** + * ice_cfg_lldp_mib_change + * @hw: pointer to the HW struct + * @ena_mib: enable/disable MIB change event + * + * Configure (disable/enable) MIB + */ +enum ice_status ice_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_mib) +{ +	struct ice_port_info *pi = hw->port_info; +	enum ice_status ret; + +	if (!hw->func_caps.common_cap.dcb) +		return ICE_ERR_NOT_SUPPORTED; + +	/* Get DCBX status */ +	pi->dcbx_status = ice_get_dcbx_status(hw); + +	if (pi->dcbx_status == ICE_DCBX_STATUS_DIS) +		return ICE_ERR_NOT_READY; + +	ret = ice_aq_cfg_lldp_mib_change(hw, ena_mib, NULL);  	if (!ret) -		pi->is_sw_lldp = false; +		pi->is_sw_lldp = !ena_mib;  	return ret;  }  |