From 3abb828534efb18b6c5002f944a93e3bd68d868e Mon Sep 17 00:00:00 2001 From: "Justin M. Forbes" Date: Tue, 28 Apr 2020 10:25:47 -0500 Subject: Fix drm_dp_send_dpcd_write() return code --- ...st-Fix-drm_dp_send_dpcd_write-return-code.patch | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 drm-dp_mst-Fix-drm_dp_send_dpcd_write-return-code.patch (limited to 'drm-dp_mst-Fix-drm_dp_send_dpcd_write-return-code.patch') diff --git a/drm-dp_mst-Fix-drm_dp_send_dpcd_write-return-code.patch b/drm-dp_mst-Fix-drm_dp_send_dpcd_write-return-code.patch new file mode 100644 index 000000000..d5b7f003f --- /dev/null +++ b/drm-dp_mst-Fix-drm_dp_send_dpcd_write-return-code.patch @@ -0,0 +1,47 @@ +From: Lyude Paul +Date: Fri, 24 Apr 2020 15:07:22 -0400 +Subject: drm/dp_mst: Fix drm_dp_send_dpcd_write() return code + +drm_dp_mst_wait_tx_reply() returns > 1 if time elapsed in +wait_event_timeout() before check_txmsg_state(mgr, txmsg) evaluated to +true. However, we make the mistake of returning this time from +drm_dp_send_dpcd_write() on success instead of returning the number of +bytes written - causing spontaneous failures during link probing: + +[drm:drm_dp_send_link_address [drm_kms_helper]] *ERROR* GUID check on +10:01 failed: 3975 + +Yikes! So, fix this by returning the number of bytes written on success +instead. + +Signed-off-by: Lyude Paul +Fixes: cb897542c6d2 ("drm/dp_mst: Fix W=1 warnings") +Cc: Benjamin Gaignard +Cc: Sean Paul +Acked-by: Alex Deucher +Reviewed-by: Sean Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20200424190722.775284-1-lyude@redhat.com +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + + +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 03a1496f6120..21dc78cb4ba6 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -3436,8 +3436,12 @@ static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, + drm_dp_queue_down_tx(mgr, txmsg); + + ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); +- if (ret > 0 && txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) +- ret = -EIO; ++ if (ret > 0) { ++ if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) ++ ret = -EIO; ++ else ++ ret = size; ++ } + + kfree(txmsg); + fail_put: -- cgit