diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_dcb_lib.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_dcb_lib.c | 49 | 
1 files changed, 43 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_dcb_lib.c b/drivers/net/ethernet/intel/ice/ice_dcb_lib.c index a7c510832824..533eb8930aa8 100644 --- a/drivers/net/ethernet/intel/ice/ice_dcb_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_dcb_lib.c @@ -352,8 +352,8 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)  	struct ice_aqc_port_ets_elem buf = { 0 };  	struct ice_dcbx_cfg *old_cfg, *curr_cfg;  	struct device *dev = ice_pf_to_dev(pf); +	struct iidc_rdma_event *event;  	int ret = ICE_DCB_NO_HW_CHG; -	struct iidc_event *event;  	struct ice_vsi *pf_vsi;  	curr_cfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg; @@ -405,7 +405,7 @@ int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)  		goto free_cfg;  	} -	set_bit(IIDC_EVENT_BEFORE_TC_CHANGE, event->type); +	set_bit(IIDC_RDMA_EVENT_BEFORE_TC_CHANGE, event->type);  	ice_send_event_to_aux(pf, event);  	kfree(event); @@ -740,7 +740,9 @@ static int ice_dcb_noncontig_cfg(struct ice_pf *pf)  void ice_pf_dcb_recfg(struct ice_pf *pf, bool locked)  {  	struct ice_dcbx_cfg *dcbcfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg; -	struct iidc_event *event; +	struct iidc_rdma_priv_dev_info *privd; +	struct iidc_rdma_core_dev_info *cdev; +	struct iidc_rdma_event *event;  	u8 tc_map = 0;  	int v, ret; @@ -783,13 +785,17 @@ void ice_pf_dcb_recfg(struct ice_pf *pf, bool locked)  		if (vsi->type == ICE_VSI_PF)  			ice_dcbnl_set_all(vsi);  	} -	if (!locked) { + +	cdev = pf->cdev_info; +	if (cdev && !locked) { +		privd = cdev->iidc_priv; +		ice_setup_dcb_qos_info(pf, &privd->qos_info);  		/* Notify the AUX drivers that TC change is finished */  		event = kzalloc(sizeof(*event), GFP_KERNEL);  		if (!event)  			return; -		set_bit(IIDC_EVENT_AFTER_TC_CHANGE, event->type); +		set_bit(IIDC_RDMA_EVENT_AFTER_TC_CHANGE, event->type);  		ice_send_event_to_aux(pf, event);  		kfree(event);  	} @@ -846,7 +852,7 @@ int ice_init_pf_dcb(struct ice_pf *pf, bool locked)  			goto dcb_init_err;  		} -		ice_cfg_sw_lldp(pf_vsi, false, true); +		ice_cfg_sw_rx_lldp(pf, true);  		pf->dcbx_cap = ice_dcb_get_mode(port_info, true);  		return 0; @@ -945,6 +951,37 @@ ice_tx_prepare_vlan_flags_dcb(struct ice_tx_ring *tx_ring,  }  /** + * ice_setup_dcb_qos_info - Setup DCB QoS information + * @pf: ptr to ice_pf + * @qos_info: QoS param instance + */ +void ice_setup_dcb_qos_info(struct ice_pf *pf, struct iidc_rdma_qos_params *qos_info) +{ +	struct ice_dcbx_cfg *dcbx_cfg; +	unsigned int i; +	u32 up2tc; + +	if (!pf || !qos_info) +		return; + +	dcbx_cfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg; +	up2tc = rd32(&pf->hw, PRTDCB_TUP2TC); + +	qos_info->num_tc = ice_dcb_get_num_tc(dcbx_cfg); + +	for (i = 0; i < IIDC_MAX_USER_PRIORITY; i++) +		qos_info->up2tc[i] = (up2tc >> (i * 3)) & 0x7; + +	for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) +		qos_info->tc_info[i].rel_bw = dcbx_cfg->etscfg.tcbwtable[i]; + +	qos_info->pfc_mode = dcbx_cfg->pfc_mode; +	if (qos_info->pfc_mode == IIDC_DSCP_PFC_MODE) +		for (i = 0; i < DSCP_MAX; i++) +			qos_info->dscp_map[i] = dcbx_cfg->dscp_map[i]; +} + +/**   * ice_dcb_is_mib_change_pending - Check if MIB change is pending   * @state: MIB change state   */  | 
