mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-29 02:19:54 -04:00
ice: update representor when VSI is ready
In case of reset of VF VSI can be reallocated. To handle this case it should be properly updated. Reload representor as vsi->vsi_num can be different than the one stored when representor was created. Instead of only changing antispoof do whole VSI configuration for eswitch. Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com> Reviewed-by: Simon Horman <horms@kernel.org> Tested-by: Sujai Buvaneswaran <sujai.buvaneswaran@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
4d364df2b5
commit
fff5cca345
@@ -178,16 +178,16 @@ void ice_eswitch_decfg_vsi(struct ice_vsi *vsi, const u8 *mac)
|
||||
* @repr_id: representor ID
|
||||
* @vsi: VSI for which port representor is configured
|
||||
*/
|
||||
void ice_eswitch_update_repr(unsigned long repr_id, struct ice_vsi *vsi)
|
||||
void ice_eswitch_update_repr(unsigned long *repr_id, struct ice_vsi *vsi)
|
||||
{
|
||||
struct ice_pf *pf = vsi->back;
|
||||
struct ice_repr *repr;
|
||||
int ret;
|
||||
int err;
|
||||
|
||||
if (!ice_is_switchdev_running(pf))
|
||||
return;
|
||||
|
||||
repr = xa_load(&pf->eswitch.reprs, repr_id);
|
||||
repr = xa_load(&pf->eswitch.reprs, *repr_id);
|
||||
if (!repr)
|
||||
return;
|
||||
|
||||
@@ -197,12 +197,19 @@ void ice_eswitch_update_repr(unsigned long repr_id, struct ice_vsi *vsi)
|
||||
if (repr->br_port)
|
||||
repr->br_port->vsi = vsi;
|
||||
|
||||
ret = ice_vsi_update_security(vsi, ice_vsi_ctx_clear_antispoof);
|
||||
if (ret) {
|
||||
ice_fltr_add_mac_and_broadcast(vsi, repr->parent_mac,
|
||||
ICE_FWD_TO_VSI);
|
||||
err = ice_eswitch_cfg_vsi(vsi, repr->parent_mac);
|
||||
if (err)
|
||||
dev_err(ice_pf_to_dev(pf), "Failed to update VSI of port representor %d",
|
||||
repr->id);
|
||||
|
||||
/* The VSI number is different, reload the PR with new id */
|
||||
if (repr->id != vsi->vsi_num) {
|
||||
xa_erase(&pf->eswitch.reprs, repr->id);
|
||||
repr->id = vsi->vsi_num;
|
||||
if (xa_insert(&pf->eswitch.reprs, repr->id, repr, GFP_KERNEL))
|
||||
dev_err(ice_pf_to_dev(pf), "Failed to reload port representor %d",
|
||||
repr->id);
|
||||
*repr_id = repr->id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ ice_eswitch_mode_set(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack);
|
||||
bool ice_is_eswitch_mode_switchdev(struct ice_pf *pf);
|
||||
|
||||
void ice_eswitch_update_repr(unsigned long repr_id, struct ice_vsi *vsi);
|
||||
void ice_eswitch_update_repr(unsigned long *repr_id, struct ice_vsi *vsi);
|
||||
|
||||
void ice_eswitch_stop_all_tx_queues(struct ice_pf *pf);
|
||||
|
||||
@@ -47,7 +47,7 @@ ice_eswitch_set_target_vsi(struct sk_buff *skb,
|
||||
struct ice_tx_offload_params *off) { }
|
||||
|
||||
static inline void
|
||||
ice_eswitch_update_repr(unsigned long repr_id, struct ice_vsi *vsi) { }
|
||||
ice_eswitch_update_repr(unsigned long *repr_id, struct ice_vsi *vsi) { }
|
||||
|
||||
static inline int ice_eswitch_configure(struct ice_pf *pf)
|
||||
{
|
||||
|
||||
@@ -948,7 +948,7 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
ice_eswitch_update_repr(vf->repr_id, vsi);
|
||||
ice_eswitch_update_repr(&vf->repr_id, vsi);
|
||||
|
||||
/* if the VF has been reset allow it to come up again */
|
||||
ice_mbx_clear_malvf(&vf->mbx_info);
|
||||
|
||||
Reference in New Issue
Block a user