diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_switch.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_switch.c | 26 | 
1 files changed, 22 insertions, 4 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 61f844d22512..46b36851af46 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -1780,18 +1780,36 @@ ice_update_vsi(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi_ctx,  int  ice_cfg_rdma_fltr(struct ice_hw *hw, u16 vsi_handle, bool enable)  { -	struct ice_vsi_ctx *ctx; +	struct ice_vsi_ctx *ctx, *cached_ctx; +	int status; + +	cached_ctx = ice_get_vsi_ctx(hw, vsi_handle); +	if (!cached_ctx) +		return -ENOENT; -	ctx = ice_get_vsi_ctx(hw, vsi_handle); +	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);  	if (!ctx) -		return -EIO; +		return -ENOMEM; + +	ctx->info.q_opt_rss = cached_ctx->info.q_opt_rss; +	ctx->info.q_opt_tc = cached_ctx->info.q_opt_tc; +	ctx->info.q_opt_flags = cached_ctx->info.q_opt_flags; + +	ctx->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_Q_OPT_VALID);  	if (enable)  		ctx->info.q_opt_flags |= ICE_AQ_VSI_Q_OPT_PE_FLTR_EN;  	else  		ctx->info.q_opt_flags &= ~ICE_AQ_VSI_Q_OPT_PE_FLTR_EN; -	return ice_update_vsi(hw, vsi_handle, ctx, NULL); +	status = ice_update_vsi(hw, vsi_handle, ctx, NULL); +	if (!status) { +		cached_ctx->info.q_opt_flags = ctx->info.q_opt_flags; +		cached_ctx->info.valid_sections |= ctx->info.valid_sections; +	} + +	kfree(ctx); +	return status;  }  /** |