Commit 9f68ef90 authored by Nicholas Mc Guire's avatar Nicholas Mc Guire Committed by Rob Clark

drm/msm: fixup wait_for_completion_timeout handling

wait_for_completion_timeout return >= 0 but never negative so the check
logic looks inconsistent. Further the return value of
wait_for_completion_timeout was being passed up the call chain but the
x call sites as drm_dp_i2c_do_msg()/drm_dp_dpcd_access() check for < 0
thus timeout was being treated as success case.

<snip> drivers/gpu/drm/drm_dp_helper.c:drm_dp_i2c_do_msg()
                mutex_lock(&aux->hw_mutex);
                ret = aux->transfer(aux, msg);
                mutex_unlock(&aux->hw_mutex);
                if (ret < 0) {
<snip>
logic in edp_aux_transfer() seems incorrect as it could return 0 (timeout)
but checks of <= 0 to indicate error so the return probably should be
-ETIMEDOUT in case wait_for_completion_timeout returns 0 (timeout
occurred).
Signed-off-by: default avatarNicholas Mc Guire <hofrat@osadl.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent e5989ee1
...@@ -119,6 +119,7 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg) ...@@ -119,6 +119,7 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg)
{ {
struct edp_aux *aux = to_edp_aux(drm_aux); struct edp_aux *aux = to_edp_aux(drm_aux);
ssize_t ret; ssize_t ret;
unsigned long time_left;
bool native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); bool native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ);
bool read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ); bool read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ);
...@@ -147,15 +148,16 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg) ...@@ -147,15 +148,16 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg)
goto unlock_exit; goto unlock_exit;
DBG("wait_for_completion"); DBG("wait_for_completion");
ret = wait_for_completion_timeout(&aux->msg_comp, 300); time_left = wait_for_completion_timeout(&aux->msg_comp, 300);
if (ret <= 0) { if (!time_left) {
/* /*
* Clear GO and reset AUX channel * Clear GO and reset AUX channel
* to cancel the current transaction. * to cancel the current transaction.
*/ */
edp_write(aux->base + REG_EDP_AUX_TRANS_CTRL, 0); edp_write(aux->base + REG_EDP_AUX_TRANS_CTRL, 0);
msm_edp_aux_ctrl(aux, 1); msm_edp_aux_ctrl(aux, 1);
pr_err("%s: aux timeout, %zd\n", __func__, ret); pr_err("%s: aux timeout, %lu\n", __func__, time_left);
ret = -ETIMEDOUT;
goto unlock_exit; goto unlock_exit;
} }
DBG("completion"); DBG("completion");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment