diff options
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_common.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_eswitch.c | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_protocol_type.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_ptp.c | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_switch.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_tc_lib.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 42 | 
9 files changed, 39 insertions, 23 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index a9fa701aaa95..473b1f6be9de 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -280,7 +280,6 @@ enum ice_pf_state {  	ICE_VFLR_EVENT_PENDING,  	ICE_FLTR_OVERFLOW_PROMISC,  	ICE_VF_DIS, -	ICE_VF_DEINIT_IN_PROGRESS,  	ICE_CFG_BUSY,  	ICE_SERVICE_SCHED,  	ICE_SERVICE_DIS, diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index a6d7d3eff186..e2af99a763ed 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -3340,7 +3340,7 @@ ice_cfg_phy_fec(struct ice_port_info *pi, struct ice_aqc_set_phy_cfg_data *cfg,  	if (fec == ICE_FEC_AUTO && ice_fw_supports_link_override(hw) &&  	    !ice_fw_supports_report_dflt_cfg(hw)) { -		struct ice_link_default_override_tlv tlv; +		struct ice_link_default_override_tlv tlv = { 0 };  		status = ice_get_link_default_override(&tlv, pi);  		if (status) diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.c b/drivers/net/ethernet/intel/ice/ice_eswitch.c index 864692b157b6..73edc24d81d5 100644 --- a/drivers/net/ethernet/intel/ice/ice_eswitch.c +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.c @@ -44,6 +44,7 @@ ice_eswitch_add_vf_mac_rule(struct ice_pf *pf, struct ice_vf *vf, const u8 *mac)  				       ctrl_vsi->rxq_map[vf->vf_id];  	rule_info.flags_info.act |= ICE_SINGLE_ACT_LB_ENABLE;  	rule_info.flags_info.act_valid = true; +	rule_info.tun_type = ICE_SW_TUN_AND_NON_TUN;  	err = ice_add_adv_rule(hw, list, lkups_cnt, &rule_info,  			       vf->repr->mac_rule); diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 17a9bb461dc3..f3c346e13b7a 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -1799,7 +1799,9 @@ static void ice_handle_mdd_event(struct ice_pf *pf)  				 * reset, so print the event prior to reset.  				 */  				ice_print_vf_rx_mdd_event(vf); +				mutex_lock(&pf->vf[i].cfg_lock);  				ice_reset_vf(&pf->vf[i], false); +				mutex_unlock(&pf->vf[i].cfg_lock);  			}  		}  	} diff --git a/drivers/net/ethernet/intel/ice/ice_protocol_type.h b/drivers/net/ethernet/intel/ice/ice_protocol_type.h index dc1b0e9e6df5..695b6dd61dc2 100644 --- a/drivers/net/ethernet/intel/ice/ice_protocol_type.h +++ b/drivers/net/ethernet/intel/ice/ice_protocol_type.h @@ -47,6 +47,7 @@ enum ice_protocol_type {  enum ice_sw_tunnel_type {  	ICE_NON_TUN = 0, +	ICE_SW_TUN_AND_NON_TUN,  	ICE_SW_TUN_VXLAN,  	ICE_SW_TUN_GENEVE,  	ICE_SW_TUN_NVGRE, diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c index ae291d442539..000c39d163a2 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -1533,9 +1533,12 @@ exit:  static int ice_ptp_adjtime_nonatomic(struct ptp_clock_info *info, s64 delta)  {  	struct timespec64 now, then; +	int ret;  	then = ns_to_timespec64(delta); -	ice_ptp_gettimex64(info, &now, NULL); +	ret = ice_ptp_gettimex64(info, &now, NULL); +	if (ret) +		return ret;  	now = timespec64_add(now, then);  	return ice_ptp_settime64(info, (const struct timespec64 *)&now); diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 11ae0bee3590..475ec2afa210 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -4537,6 +4537,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,  	case ICE_SW_TUN_NVGRE:  		prof_type = ICE_PROF_TUN_GRE;  		break; +	case ICE_SW_TUN_AND_NON_TUN:  	default:  		prof_type = ICE_PROF_ALL;  		break; @@ -5305,7 +5306,8 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,  	if (status)  		goto err_ice_add_adv_rule; -	if (rinfo->tun_type != ICE_NON_TUN) { +	if (rinfo->tun_type != ICE_NON_TUN && +	    rinfo->tun_type != ICE_SW_TUN_AND_NON_TUN) {  		status = ice_fill_adv_packet_tun(hw, rinfo->tun_type,  						 s_rule->pdata.lkup_tx_rx.hdr,  						 pkt_offsets); diff --git a/drivers/net/ethernet/intel/ice/ice_tc_lib.c b/drivers/net/ethernet/intel/ice/ice_tc_lib.c index e8aab664270a..65cf32eb4046 100644 --- a/drivers/net/ethernet/intel/ice/ice_tc_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_tc_lib.c @@ -709,7 +709,7 @@ ice_tc_set_port(struct flow_match_ports match,  			fltr->flags |= ICE_TC_FLWR_FIELD_ENC_DEST_L4_PORT;  		else  			fltr->flags |= ICE_TC_FLWR_FIELD_DEST_L4_PORT; -		fltr->flags |= ICE_TC_FLWR_FIELD_DEST_L4_PORT; +  		headers->l4_key.dst_port = match.key->dst;  		headers->l4_mask.dst_port = match.mask->dst;  	} @@ -718,7 +718,7 @@ ice_tc_set_port(struct flow_match_ports match,  			fltr->flags |= ICE_TC_FLWR_FIELD_ENC_SRC_L4_PORT;  		else  			fltr->flags |= ICE_TC_FLWR_FIELD_SRC_L4_PORT; -		fltr->flags |= ICE_TC_FLWR_FIELD_SRC_L4_PORT; +  		headers->l4_key.src_port = match.key->src;  		headers->l4_mask.src_port = match.mask->src;  	} diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c index 39b80124d282..408f78e3eb13 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c @@ -500,8 +500,6 @@ void ice_free_vfs(struct ice_pf *pf)  	struct ice_hw *hw = &pf->hw;  	unsigned int tmp, i; -	set_bit(ICE_VF_DEINIT_IN_PROGRESS, pf->state); -  	if (!pf->vf)  		return; @@ -519,22 +517,26 @@ void ice_free_vfs(struct ice_pf *pf)  	else  		dev_warn(dev, "VFs are assigned - not disabling SR-IOV\n"); -	/* Avoid wait time by stopping all VFs at the same time */ -	ice_for_each_vf(pf, i) -		ice_dis_vf_qs(&pf->vf[i]); -  	tmp = pf->num_alloc_vfs;  	pf->num_qps_per_vf = 0;  	pf->num_alloc_vfs = 0;  	for (i = 0; i < tmp; i++) { -		if (test_bit(ICE_VF_STATE_INIT, pf->vf[i].vf_states)) { +		struct ice_vf *vf = &pf->vf[i]; + +		mutex_lock(&vf->cfg_lock); + +		ice_dis_vf_qs(vf); + +		if (test_bit(ICE_VF_STATE_INIT, vf->vf_states)) {  			/* disable VF qp mappings and set VF disable state */ -			ice_dis_vf_mappings(&pf->vf[i]); -			set_bit(ICE_VF_STATE_DIS, pf->vf[i].vf_states); -			ice_free_vf_res(&pf->vf[i]); +			ice_dis_vf_mappings(vf); +			set_bit(ICE_VF_STATE_DIS, vf->vf_states); +			ice_free_vf_res(vf);  		} -		mutex_destroy(&pf->vf[i].cfg_lock); +		mutex_unlock(&vf->cfg_lock); + +		mutex_destroy(&vf->cfg_lock);  	}  	if (ice_sriov_free_msix_res(pf)) @@ -570,7 +572,6 @@ void ice_free_vfs(struct ice_pf *pf)  				i);  	clear_bit(ICE_VF_DIS, pf->state); -	clear_bit(ICE_VF_DEINIT_IN_PROGRESS, pf->state);  	clear_bit(ICE_FLAG_SRIOV_ENA, pf->flags);  } @@ -1498,6 +1499,8 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)  	ice_for_each_vf(pf, v) {  		vf = &pf->vf[v]; +		mutex_lock(&vf->cfg_lock); +  		vf->driver_caps = 0;  		ice_vc_set_default_allowlist(vf); @@ -1512,6 +1515,8 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)  		ice_vf_pre_vsi_rebuild(vf);  		ice_vf_rebuild_vsi(vf);  		ice_vf_post_vsi_rebuild(vf); + +		mutex_unlock(&vf->cfg_lock);  	}  	if (ice_is_eswitch_mode_switchdev(pf)) @@ -1562,6 +1567,8 @@ bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)  	u32 reg;  	int i; +	lockdep_assert_held(&vf->cfg_lock); +  	dev = ice_pf_to_dev(pf);  	if (test_bit(ICE_VF_RESETS_DISABLED, pf->state)) { @@ -2061,9 +2068,12 @@ void ice_process_vflr_event(struct ice_pf *pf)  		bit_idx = (hw->func_caps.vf_base_id + vf_id) % 32;  		/* read GLGEN_VFLRSTAT register to find out the flr VFs */  		reg = rd32(hw, GLGEN_VFLRSTAT(reg_idx)); -		if (reg & BIT(bit_idx)) +		if (reg & BIT(bit_idx)) {  			/* GLGEN_VFLRSTAT bit will be cleared in ice_reset_vf */ +			mutex_lock(&vf->cfg_lock);  			ice_reset_vf(vf, true); +			mutex_unlock(&vf->cfg_lock); +		}  	}  } @@ -2140,7 +2150,9 @@ ice_vf_lan_overflow_event(struct ice_pf *pf, struct ice_rq_event_info *event)  	if (!vf)  		return; +	mutex_lock(&vf->cfg_lock);  	ice_vc_reset_vf(vf); +	mutex_unlock(&vf->cfg_lock);  }  /** @@ -4625,10 +4637,6 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event)  	struct device *dev;  	int err = 0; -	/* if de-init is underway, don't process messages from VF */ -	if (test_bit(ICE_VF_DEINIT_IN_PROGRESS, pf->state)) -		return; -  	dev = ice_pf_to_dev(pf);  	if (ice_validate_vf_id(pf, vf_id)) {  		err = -EINVAL;  | 
