diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_eswitch.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_eswitch.c | 84 | 
1 files changed, 27 insertions, 57 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.c b/drivers/net/ethernet/intel/ice/ice_eswitch.c index f6dd3f8fd936..ad0a007b7398 100644 --- a/drivers/net/ethernet/intel/ice/ice_eswitch.c +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.c @@ -10,16 +10,15 @@  #include "ice_tc_lib.h"  /** - * ice_eswitch_add_vf_mac_rule - add adv rule with VF's MAC + * ice_eswitch_add_vf_sp_rule - add adv rule with VF's VSI index   * @pf: pointer to PF struct   * @vf: pointer to VF struct - * @mac: VF's MAC address   *   * This function adds advanced rule that forwards packets with - * VF's MAC address (src MAC) to the corresponding switchdev ctrl VSI queue. + * VF's VSI index to the corresponding switchdev ctrl VSI queue.   */ -int -ice_eswitch_add_vf_mac_rule(struct ice_pf *pf, struct ice_vf *vf, const u8 *mac) +static int +ice_eswitch_add_vf_sp_rule(struct ice_pf *pf, struct ice_vf *vf)  {  	struct ice_vsi *ctrl_vsi = pf->switchdev.control_vsi;  	struct ice_adv_rule_info rule_info = { 0 }; @@ -32,76 +31,41 @@ ice_eswitch_add_vf_mac_rule(struct ice_pf *pf, struct ice_vf *vf, const u8 *mac)  	if (!list)  		return -ENOMEM; -	list[0].type = ICE_MAC_OFOS; -	ether_addr_copy(list[0].h_u.eth_hdr.src_addr, mac); -	eth_broadcast_addr(list[0].m_u.eth_hdr.src_addr); +	ice_rule_add_src_vsi_metadata(list); -	rule_info.sw_act.flag |= ICE_FLTR_TX; +	rule_info.sw_act.flag = ICE_FLTR_TX;  	rule_info.sw_act.vsi_handle = ctrl_vsi->idx;  	rule_info.sw_act.fltr_act = ICE_FWD_TO_Q; -	rule_info.rx = false;  	rule_info.sw_act.fwd_id.q_id = hw->func_caps.common_cap.rxq_first_id +  				       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; +	rule_info.src_vsi = vf->lan_vsi_idx;  	err = ice_add_adv_rule(hw, list, lkups_cnt, &rule_info, -			       vf->repr->mac_rule); +			       &vf->repr->sp_rule);  	if (err) -		dev_err(ice_pf_to_dev(pf), "Unable to add VF mac rule in switchdev mode for VF %d", +		dev_err(ice_pf_to_dev(pf), "Unable to add VF slow-path rule in switchdev mode for VF %d",  			vf->vf_id); -	else -		vf->repr->rule_added = true;  	kfree(list);  	return err;  }  /** - * ice_eswitch_replay_vf_mac_rule - replay adv rule with VF's MAC - * @vf: pointer to vF struct - * - * This function replays VF's MAC rule after reset. - */ -void ice_eswitch_replay_vf_mac_rule(struct ice_vf *vf) -{ -	int err; - -	if (!ice_is_switchdev_running(vf->pf)) -		return; - -	if (is_valid_ether_addr(vf->hw_lan_addr)) { -		err = ice_eswitch_add_vf_mac_rule(vf->pf, vf, -						  vf->hw_lan_addr); -		if (err) { -			dev_err(ice_pf_to_dev(vf->pf), "Failed to add MAC %pM for VF %d\n, error %d\n", -				vf->hw_lan_addr, vf->vf_id, err); -			return; -		} -		vf->num_mac++; - -		ether_addr_copy(vf->dev_lan_addr, vf->hw_lan_addr); -	} -} - -/** - * ice_eswitch_del_vf_mac_rule - delete adv rule with VF's MAC + * ice_eswitch_del_vf_sp_rule - delete adv rule with VF's VSI index   * @vf: pointer to the VF struct   * - * Delete the advanced rule that was used to forward packets with the VF's MAC - * address (src MAC) to the corresponding switchdev ctrl VSI queue. + * Delete the advanced rule that was used to forward packets with the VF's VSI + * index to the corresponding switchdev ctrl VSI queue.   */ -void ice_eswitch_del_vf_mac_rule(struct ice_vf *vf) +static void ice_eswitch_del_vf_sp_rule(struct ice_vf *vf)  { -	if (!ice_is_switchdev_running(vf->pf)) -		return; - -	if (!vf->repr->rule_added) +	if (!vf->repr)  		return; -	ice_rem_adv_rule_by_id(&vf->pf->hw, vf->repr->mac_rule); -	vf->repr->rule_added = false; +	ice_rem_adv_rule_by_id(&vf->pf->hw, &vf->repr->sp_rule);  }  /** @@ -237,6 +201,7 @@ ice_eswitch_release_reprs(struct ice_pf *pf, struct ice_vsi *ctrl_vsi)  		ice_vsi_update_security(vsi, ice_vsi_ctx_set_antispoof);  		metadata_dst_free(vf->repr->dst);  		vf->repr->dst = NULL; +		ice_eswitch_del_vf_sp_rule(vf);  		ice_fltr_add_mac_and_broadcast(vsi, vf->hw_lan_addr,  					       ICE_FWD_TO_VSI); @@ -264,25 +229,30 @@ static int ice_eswitch_setup_reprs(struct ice_pf *pf)  		vf->repr->dst = metadata_dst_alloc(0, METADATA_HW_PORT_MUX,  						   GFP_KERNEL);  		if (!vf->repr->dst) { -			ice_fltr_add_mac_and_broadcast(vsi, -						       vf->hw_lan_addr, +			ice_fltr_add_mac_and_broadcast(vsi, vf->hw_lan_addr, +						       ICE_FWD_TO_VSI); +			goto err; +		} + +		if (ice_eswitch_add_vf_sp_rule(pf, vf)) { +			ice_fltr_add_mac_and_broadcast(vsi, vf->hw_lan_addr,  						       ICE_FWD_TO_VSI);  			goto err;  		}  		if (ice_vsi_update_security(vsi, ice_vsi_ctx_clear_antispoof)) { -			ice_fltr_add_mac_and_broadcast(vsi, -						       vf->hw_lan_addr, +			ice_fltr_add_mac_and_broadcast(vsi, vf->hw_lan_addr,  						       ICE_FWD_TO_VSI); +			ice_eswitch_del_vf_sp_rule(vf);  			metadata_dst_free(vf->repr->dst);  			vf->repr->dst = NULL;  			goto err;  		}  		if (ice_vsi_add_vlan_zero(vsi)) { -			ice_fltr_add_mac_and_broadcast(vsi, -						       vf->hw_lan_addr, +			ice_fltr_add_mac_and_broadcast(vsi, vf->hw_lan_addr,  						       ICE_FWD_TO_VSI); +			ice_eswitch_del_vf_sp_rule(vf);  			metadata_dst_free(vf->repr->dst);  			vf->repr->dst = NULL;  			ice_vsi_update_security(vsi, ice_vsi_ctx_set_antispoof);  |