diff options
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_common.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_controlq.c | 9 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_controlq.h | 2 | 
3 files changed, 13 insertions, 12 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index f4c256563248..3638598d732b 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -1992,19 +1992,19 @@ ice_acquire_res_exit:   */  void ice_release_res(struct ice_hw *hw, enum ice_aq_res_ids res)  { -	u32 total_delay = 0; +	unsigned long timeout;  	int status; -	status = ice_aq_release_res(hw, res, 0, NULL); -  	/* there are some rare cases when trying to release the resource  	 * results in an admin queue timeout, so handle them correctly  	 */ -	while ((status == -EIO) && (total_delay < ICE_CTL_Q_SQ_CMD_TIMEOUT)) { -		mdelay(1); +	timeout = jiffies + 10 * ICE_CTL_Q_SQ_CMD_TIMEOUT; +	do {  		status = ice_aq_release_res(hw, res, 0, NULL); -		total_delay++; -	} +		if (status != -EIO) +			break; +		usleep_range(1000, 2000); +	} while (time_before(jiffies, timeout));  }  /** diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c index c8fb10106ec3..d2faf1baad2f 100644 --- a/drivers/net/ethernet/intel/ice/ice_controlq.c +++ b/drivers/net/ethernet/intel/ice/ice_controlq.c @@ -964,7 +964,7 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq,  	struct ice_aq_desc *desc_on_ring;  	bool cmd_completed = false;  	struct ice_sq_cd *details; -	u32 total_delay = 0; +	unsigned long timeout;  	int status = 0;  	u16 retval = 0;  	u32 val = 0; @@ -1057,13 +1057,14 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq,  		cq->sq.next_to_use = 0;  	wr32(hw, cq->sq.tail, cq->sq.next_to_use); +	timeout = jiffies + ICE_CTL_Q_SQ_CMD_TIMEOUT;  	do {  		if (ice_sq_done(hw, cq))  			break; -		udelay(ICE_CTL_Q_SQ_CMD_USEC); -		total_delay++; -	} while (total_delay < ICE_CTL_Q_SQ_CMD_TIMEOUT); +		usleep_range(ICE_CTL_Q_SQ_CMD_USEC, +			     ICE_CTL_Q_SQ_CMD_USEC * 3 / 2); +	} while (time_before(jiffies, timeout));  	/* if ready, copy the desc back to temp */  	if (ice_sq_done(hw, cq)) { diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.h b/drivers/net/ethernet/intel/ice/ice_controlq.h index e790b2f4e437..950b7f4a7a05 100644 --- a/drivers/net/ethernet/intel/ice/ice_controlq.h +++ b/drivers/net/ethernet/intel/ice/ice_controlq.h @@ -34,7 +34,7 @@ enum ice_ctl_q {  };  /* Control Queue timeout settings - max delay 1s */ -#define ICE_CTL_Q_SQ_CMD_TIMEOUT	10000 /* Count 10000 times */ +#define ICE_CTL_Q_SQ_CMD_TIMEOUT	HZ    /* Wait max 1s */  #define ICE_CTL_Q_SQ_CMD_USEC		100   /* Check every 100usec */  #define ICE_CTL_Q_ADMIN_INIT_TIMEOUT	10    /* Count 10 times */  #define ICE_CTL_Q_ADMIN_INIT_MSEC	100   /* Check every 100msec */  | 
