diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_flow.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_flow.c | 53 | 
1 files changed, 29 insertions, 24 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_flow.c b/drivers/net/ethernet/intel/ice/ice_flow.c index eadc85aee389..89a0cef20506 100644 --- a/drivers/net/ethernet/intel/ice/ice_flow.c +++ b/drivers/net/ethernet/intel/ice/ice_flow.c @@ -708,57 +708,64 @@ ice_flow_add_prof_sync(struct ice_hw *hw, enum ice_block blk,  		       struct ice_flow_seg_info *segs, u8 segs_cnt,  		       struct ice_flow_prof **prof)  { -	struct ice_flow_prof_params params; +	struct ice_flow_prof_params *params;  	enum ice_status status;  	u8 i;  	if (!prof)  		return ICE_ERR_BAD_PTR; -	memset(¶ms, 0, sizeof(params)); -	params.prof = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*params.prof), -				   GFP_KERNEL); -	if (!params.prof) +	params = kzalloc(sizeof(*params), GFP_KERNEL); +	if (!params)  		return ICE_ERR_NO_MEMORY; +	params->prof = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*params->prof), +				    GFP_KERNEL); +	if (!params->prof) { +		status = ICE_ERR_NO_MEMORY; +		goto free_params; +	} +  	/* initialize extraction sequence to all invalid (0xff) */  	for (i = 0; i < ICE_MAX_FV_WORDS; i++) { -		params.es[i].prot_id = ICE_PROT_INVALID; -		params.es[i].off = ICE_FV_OFFSET_INVAL; +		params->es[i].prot_id = ICE_PROT_INVALID; +		params->es[i].off = ICE_FV_OFFSET_INVAL;  	} -	params.blk = blk; -	params.prof->id = prof_id; -	params.prof->dir = dir; -	params.prof->segs_cnt = segs_cnt; +	params->blk = blk; +	params->prof->id = prof_id; +	params->prof->dir = dir; +	params->prof->segs_cnt = segs_cnt;  	/* Make a copy of the segments that need to be persistent in the flow  	 * profile instance  	 */  	for (i = 0; i < segs_cnt; i++) -		memcpy(¶ms.prof->segs[i], &segs[i], sizeof(*segs)); +		memcpy(¶ms->prof->segs[i], &segs[i], sizeof(*segs)); -	status = ice_flow_proc_segs(hw, ¶ms); +	status = ice_flow_proc_segs(hw, params);  	if (status) { -		ice_debug(hw, ICE_DBG_FLOW, -			  "Error processing a flow's packet segments\n"); +		ice_debug(hw, ICE_DBG_FLOW, "Error processing a flow's packet segments\n");  		goto out;  	}  	/* Add a HW profile for this flow profile */ -	status = ice_add_prof(hw, blk, prof_id, (u8 *)params.ptypes, params.es); +	status = ice_add_prof(hw, blk, prof_id, (u8 *)params->ptypes, +			      params->es);  	if (status) {  		ice_debug(hw, ICE_DBG_FLOW, "Error adding a HW flow profile\n");  		goto out;  	} -	INIT_LIST_HEAD(¶ms.prof->entries); -	mutex_init(¶ms.prof->entries_lock); -	*prof = params.prof; +	INIT_LIST_HEAD(¶ms->prof->entries); +	mutex_init(¶ms->prof->entries_lock); +	*prof = params->prof;  out:  	if (status) -		devm_kfree(ice_hw_to_dev(hw), params.prof); +		devm_kfree(ice_hw_to_dev(hw), params->prof); +free_params: +	kfree(params);  	return status;  } @@ -827,8 +834,7 @@ ice_flow_assoc_prof(struct ice_hw *hw, enum ice_block blk,  		if (!status)  			set_bit(vsi_handle, prof->vsis);  		else -			ice_debug(hw, ICE_DBG_FLOW, -				  "HW profile add failed, %d\n", +			ice_debug(hw, ICE_DBG_FLOW, "HW profile add failed, %d\n",  				  status);  	} @@ -859,8 +865,7 @@ ice_flow_disassoc_prof(struct ice_hw *hw, enum ice_block blk,  		if (!status)  			clear_bit(vsi_handle, prof->vsis);  		else -			ice_debug(hw, ICE_DBG_FLOW, -				  "HW profile remove failed, %d\n", +			ice_debug(hw, ICE_DBG_FLOW, "HW profile remove failed, %d\n",  				  status);  	}  | 
