Skip to content

Commit

Permalink
usb: typec: ucsi: Fix role swapping
Browse files Browse the repository at this point in the history
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: ad74b86 ("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>
  • Loading branch information
Heikki Krogerus authored and Greg Kroah-Hartman committed Apr 21, 2022
1 parent e25adcc commit eb5d7ff
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions drivers/usb/typec/ucsi/ucsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -958,14 +958,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)
Expand Down Expand Up @@ -996,11 +1000,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) !=
Expand Down

0 comments on commit eb5d7ff

Please sign in to comment.