|
@@ -332,11 +332,13 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes,
|
|
PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION args;
|
|
PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION args;
|
|
int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction);
|
|
int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction);
|
|
unsigned char *base;
|
|
unsigned char *base;
|
|
|
|
+ int retry_count = 0;
|
|
|
|
|
|
memset(&args, 0, sizeof(args));
|
|
memset(&args, 0, sizeof(args));
|
|
|
|
|
|
base = (unsigned char *)rdev->mode_info.atom_context->scratch;
|
|
base = (unsigned char *)rdev->mode_info.atom_context->scratch;
|
|
|
|
|
|
|
|
+retry:
|
|
memcpy(base, req_bytes, num_bytes);
|
|
memcpy(base, req_bytes, num_bytes);
|
|
|
|
|
|
args.lpAuxRequest = 0;
|
|
args.lpAuxRequest = 0;
|
|
@@ -347,10 +349,12 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes,
|
|
|
|
|
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
|
|
|
|
|
- if (args.ucReplyStatus) {
|
|
|
|
- DRM_DEBUG("failed to get auxch %02x%02x %02x %02x 0x%02x %02x\n",
|
|
|
|
|
|
+ if (args.ucReplyStatus && !args.ucDataOutLen) {
|
|
|
|
+ if (args.ucReplyStatus == 0x20 && retry_count < 10)
|
|
|
|
+ goto retry;
|
|
|
|
+ DRM_DEBUG("failed to get auxch %02x%02x %02x %02x 0x%02x %02x after %d retries\n",
|
|
req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3],
|
|
req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3],
|
|
- chan->rec.i2c_id, args.ucReplyStatus);
|
|
|
|
|
|
+ chan->rec.i2c_id, args.ucReplyStatus, retry_count);
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|