From: Jitao Shi <jitao....@mediatek.com>

DP 1.4a Section 2.8.7.1.5.6.1:
A DP Source device shall retry at least seven times upon receiving
AUX_DEFER before giving up the AUX transaction.

Aux should retry to send msg whether how many bytes.

Signed-off-by: Jitao Shi <jitao....@mediatek.com>
Signed-off-by: Guillaume Ranquet <granq...@baylibre.com>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c 
b/drivers/gpu/drm/mediatek/mtk_dp.c
index 4981a3a3b9ca..de2a1c1b4f8c 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -2018,7 +2018,7 @@ static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux 
*mtk_aux,
        bool is_read;
        u8 request;
        size_t accessed_bytes = 0;
-       int retry = 3, ret = 0;
+       int retry, ret = 0;
 
        mtk_dp = container_of(mtk_aux, struct mtk_dp, aux);
 
@@ -2052,14 +2052,21 @@ static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux 
*mtk_aux,
        }
 
        if (msg->size == 0) {
-               ret = mtk_dp_aux_do_transfer(mtk_dp, is_read, request,
-                                            msg->address + accessed_bytes,
-                                            msg->buffer + accessed_bytes, 0);
+               retry = 32;
+               while (retry--) {
+                       ret = mtk_dp_aux_do_transfer(mtk_dp, is_read, request,
+                                                    msg->address + 
accessed_bytes,
+                                                    msg->buffer + 
accessed_bytes, 0);
+                       if (ret == 0)
+                               break;
+                       usleep_range(500, 600);
+               }
        } else {
                while (accessed_bytes < msg->size) {
                        size_t to_access =
                                min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES,
                                      msg->size - accessed_bytes);
+                       retry = 32;
                        while (retry--) {
                                ret = mtk_dp_aux_do_transfer(mtk_dp,
                                                             is_read, request,
@@ -2068,7 +2075,7 @@ static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux 
*mtk_aux,
                                                             to_access);
                                if (ret == 0)
                                        break;
-                               usleep_range(50, 100);
+                               usleep_range(500, 600);
                        }
                        if (!retry || ret) {
                                drm_info(mtk_dp->drm_dev,
-- 
2.34.1

Reply via email to