Merge remote branch 'korg/drm-radeon-testing' into drm-next-stage
[linux-2.6.git] / drivers / gpu / drm / radeon / atombios_dp.c
index 0b6f2ce..8a133bd 100644 (file)
@@ -336,11 +336,13 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes,
        union aux_channel_transaction args;
        int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction);
        unsigned char *base;
+       int retry_count = 0;
 
        memset(&args, 0, sizeof(args));
 
        base = (unsigned char *)rdev->mode_info.atom_context->scratch;
 
+retry:
        memcpy(base, req_bytes, num_bytes);
 
        args.v1.lpAuxRequest = 0;
@@ -353,10 +355,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);
 
-       if (args.v1.ucReplyStatus) {
-               DRM_DEBUG("failed to get auxch %02x%02x %02x %02x 0x%02x %02x\n",
+       if (args.v1.ucReplyStatus && !args.v1.ucDataOutLen) {
+               if (args.v1.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],
-                         chan->rec.i2c_id, args.v1.ucReplyStatus);
+                         chan->rec.i2c_id, args.v1.ucReplyStatus, retry_count);
                return false;
        }