diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 15 | 
1 files changed, 11 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index c36960488c89..57552eb386b0 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -537,6 +537,7 @@ intel_dp_aux_native_write(struct intel_dp *intel_dp,  	uint8_t	msg[20];  	int msg_bytes;  	uint8_t	ack; +	int retry;  	if (WARN_ON(send_bytes > 16))  		return -E2BIG; @@ -548,19 +549,21 @@ intel_dp_aux_native_write(struct intel_dp *intel_dp,  	msg[3] = send_bytes - 1;  	memcpy(&msg[4], send, send_bytes);  	msg_bytes = send_bytes + 4; -	for (;;) { +	for (retry = 0; retry < 7; retry++) {  		ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes, &ack, 1);  		if (ret < 0)  			return ret;  		ack >>= 4;  		if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_ACK) -			break; +			return send_bytes;  		else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER)  			usleep_range(400, 500);  		else  			return -EIO;  	} -	return send_bytes; + +	DRM_ERROR("too many retries, giving up\n"); +	return -EIO;  }  /* Write a single byte to the aux channel in native mode */ @@ -582,6 +585,7 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp,  	int reply_bytes;  	uint8_t ack;  	int ret; +	int retry;  	if (WARN_ON(recv_bytes > 19))  		return -E2BIG; @@ -595,7 +599,7 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp,  	msg_bytes = 4;  	reply_bytes = recv_bytes + 1; -	for (;;) { +	for (retry = 0; retry < 7; retry++) {  		ret = intel_dp_aux_ch(intel_dp, msg, msg_bytes,  				      reply, reply_bytes);  		if (ret == 0) @@ -612,6 +616,9 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp,  		else  			return -EIO;  	} + +	DRM_ERROR("too many retries, giving up\n"); +	return -EIO;  }  static int | 
