drm/i915/dp: retry link status read 3 times on failure
authorJesse Barnes <jbarnes@virtuousgeek.org>
Thu, 7 Jul 2011 18:10:57 +0000 (11:10 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 7 Jul 2011 20:38:27 +0000 (13:38 -0700)
Especially after a hotplug or power status change, the sink may not
reply immediately to a link status query.  So retry 3 times per the spec
to really make sure nothing is there.

See section 9.1 of the 1.1a DisplayPort spec.

Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
drivers/gpu/drm/i915/intel_dp.c

index 391b55f1cc7496e2e313d77332fafb35ecd4aa15..86912bd737ad56435864e7b39ba47e4ab54b1a2e 100644 (file)
@@ -1019,14 +1019,20 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode)
 static bool
 intel_dp_get_link_status(struct intel_dp *intel_dp)
 {
-       int ret;
+       int ret, i;
+
+       /* Must try AUX reads for this at least 3 times */
+       for (i = 0; i < 3; i++) {
+               ret = intel_dp_aux_native_read(intel_dp,
+                                              DP_LANE0_1_STATUS,
+                                              intel_dp->link_status,
+                                              DP_LINK_STATUS_SIZE);
+               if (ret == DP_LINK_STATUS_SIZE)
+                       return true;
+               msleep(1);
+       }
 
-       ret = intel_dp_aux_native_read(intel_dp,
-                                      DP_LANE0_1_STATUS,
-                                      intel_dp->link_status, DP_LINK_STATUS_SIZE);
-       if (ret != DP_LINK_STATUS_SIZE)
-               return false;
-       return true;
+       return false;
 }
 
 static uint8_t