drm/dp: retry AUX transactions 32 times (v1.1)
authorDave Airlie <airlied@redhat.com>
Wed, 26 Nov 2014 03:13:09 +0000 (13:13 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Jan 2015 16:29:34 +0000 (08:29 -0800)
commit 19a93f042fc241ecdf98543cedfe7c171f8cdf53 upstream.

At least on two MST devices I've tested with, when
they are link training downstream, they are totally
unable to handle aux ch msgs, so they defer like nuts.
I tried 16, it wasn't enough, 32 seems better.

This fixes one Dell 4k monitor and one of the
MST hubs.

v1.1: fixup comment (Tom).

Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/drm_dp_helper.c

index 08e33b8b13a433be43b0a39f462791388a856b95..9f59c9027ebe87a3cd06167b3603f2bb27ade086 100644 (file)
@@ -378,10 +378,11 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request,
 
        /*
         * The specification doesn't give any recommendation on how often to
-        * retry native transactions, so retry 7 times like for I2C-over-AUX
-        * transactions.
+        * retry native transactions. We used to retry 7 times like for
+        * aux i2c transactions but real world devices this wasn't
+        * sufficient, bump to 32 which makes Dell 4k monitors happier.
         */
-       for (retry = 0; retry < 7; retry++) {
+       for (retry = 0; retry < 32; retry++) {
 
                mutex_lock(&aux->hw_mutex);
                err = aux->transfer(aux, &msg);