You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
usb: typec: ucsi: Fix role swapping
commiteb5d7ff3cfupstream. All attempts to swap the roles timed out because the completion was done without releasing the port lock. Fixing that by releasing the lock before starting to wait for the completion. Link: https://lore.kernel.org/linux-usb/037de7ac-e210-bdf5-ec7a-8c0c88a0be20@gmail.com/ Fixes:ad74b8649b("usb: typec: ucsi: Preliminary support for alternate modes") Cc: stable@vger.kernel.org Reported-and-tested-by: Jia-Ju Bai <baijiaju1990@gmail.com> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Link: https://lore.kernel.org/r/20220405134824.68067-3-heikki.krogerus@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
06826eb063
commit
fb1fe1a455
@@ -937,14 +937,18 @@ static int ucsi_dr_swap(struct typec_port *port, enum typec_data_role role)
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
|
||||
mutex_unlock(&con->lock);
|
||||
|
||||
if (!wait_for_completion_timeout(&con->complete,
|
||||
msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS)))
|
||||
ret = -ETIMEDOUT;
|
||||
msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS)))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return 0;
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&con->lock);
|
||||
|
||||
return ret < 0 ? ret : 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ucsi_pr_swap(struct typec_port *port, enum typec_role role)
|
||||
@@ -975,11 +979,13 @@ static int ucsi_pr_swap(struct typec_port *port, enum typec_role role)
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
|
||||
mutex_unlock(&con->lock);
|
||||
|
||||
if (!wait_for_completion_timeout(&con->complete,
|
||||
msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS))) {
|
||||
ret = -ETIMEDOUT;
|
||||
goto out_unlock;
|
||||
}
|
||||
msecs_to_jiffies(UCSI_SWAP_TIMEOUT_MS)))
|
||||
return -ETIMEDOUT;
|
||||
|
||||
mutex_lock(&con->lock);
|
||||
|
||||
/* Something has gone wrong while swapping the role */
|
||||
if (UCSI_CONSTAT_PWR_OPMODE(con->status.flags) !=
|
||||
|
||||
Reference in New Issue
Block a user