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 | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c 
b/drivers/gpu/drm/mediatek/mtk_dp.c
index fe91ab8b2fd89..4e880d8a8a186 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -1879,7 +1879,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);
 
@@ -1913,15 +1913,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 = 7;
+               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;
+                       msleep(50);
                }
        } else {
                while (accessed_bytes < msg->size) {
                        size_t to_access =
                                min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES,
                                      msg->size - accessed_bytes);
+                       retry = 7;
                        while (retry--) {
                                ret = mtk_dp_aux_do_transfer(mtk_dp,
                                                             is_read, request,
-- 
2.34.1

Reply via email to