forked from Minki/linux
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: Nicholas Mc Guire <hofrat@osadl.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
e5989ee134
commit
9f68ef90aa
@ -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);
|
||||
ssize_t ret;
|
||||
unsigned long time_left;
|
||||
bool native = msg->request & (DP_AUX_NATIVE_WRITE & 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)
|
||||
goto unlock_exit;
|
||||
|
||||
DBG("wait_for_completion");
|
||||
ret = wait_for_completion_timeout(&aux->msg_comp, 300);
|
||||
if (ret <= 0) {
|
||||
time_left = wait_for_completion_timeout(&aux->msg_comp, 300);
|
||||
if (!time_left) {
|
||||
/*
|
||||
* Clear GO and reset AUX channel
|
||||
* to cancel the current transaction.
|
||||
*/
|
||||
edp_write(aux->base + REG_EDP_AUX_TRANS_CTRL, 0);
|
||||
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;
|
||||
}
|
||||
DBG("completion");
|
||||
|
Loading…
Reference in New Issue
Block a user