|
@@ -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)
|
|
|
- udelay(100);
|
|
|
+ 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)
|
|
@@ -608,10 +612,13 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp,
|
|
|
return ret - 1;
|
|
|
}
|
|
|
else if ((ack & DP_AUX_NATIVE_REPLY_MASK) == DP_AUX_NATIVE_REPLY_DEFER)
|
|
|
- udelay(100);
|
|
|
+ usleep_range(400, 500);
|
|
|
else
|
|
|
return -EIO;
|
|
|
}
|
|
|
+
|
|
|
+ DRM_ERROR("too many retries, giving up\n");
|
|
|
+ return -EIO;
|
|
|
}
|
|
|
|
|
|
static int
|