Message ID | 20250616133147.1835939-1-akuchynski@chromium.org |
---|---|
Headers | show |
Series | USB Type-C mode selection | expand |
On Tue, Jun 17, 2025 at 10:54 AM Heikki Krogerus <heikki.krogerus@linux.intel.com> wrote: > > Hi Andrei, > > On Mon, Jun 16, 2025 at 01:31:43PM +0000, Andrei Kuchynski wrote: > > This reverts commit b4b38ffb38c91afd4dc387608db26f6fc34ed40b. > > > > The commit introduced a deadlock with the cros_ec_typec driver. > > The deadlock occurs due to a recursive lock acquisition of > > `cros_typec_altmode_work::mutex`. > > The call chain is as follows: > > 1. cros_typec_altmode_work() acquires the mutex > > 2. typec_altmode_vdm() -> dp_altmode_vdm() -> > > 3. typec_altmode_exit() -> cros_typec_altmode_exit() > > 4. cros_typec_altmode_exit() attempts to acquire the mutex again > > > > This revert is considered safe as no other known driver sends back > > DP_CMD_STATUS_UPDATE command with the NAK flag. > > > > Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org> > > --- > > drivers/usb/typec/altmodes/displayport.c | 4 ---- > > 1 file changed, 4 deletions(-) > > > > diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c > > index b09b58d7311d..ac84a6d64c2f 100644 > > --- a/drivers/usb/typec/altmodes/displayport.c > > +++ b/drivers/usb/typec/altmodes/displayport.c > > @@ -393,10 +393,6 @@ static int dp_altmode_vdm(struct typec_altmode *alt, > > break; > > case CMDT_RSP_NAK: > > switch (cmd) { > > - case DP_CMD_STATUS_UPDATE: > > - if (typec_altmode_exit(alt)) > > - dev_err(&dp->alt->dev, "Exit Mode Failed!\n"); > > - break; > > Commit b4b38ffb38c9 ("usb: typec: displayport: Receive DP Status > Update NAK request exit dp altmode") addressed a very real problem > with failure to execute data role swap. You are not really offering > anything else for that issue here. Thanks, I see the problem now. Reverting the patch is not feasible. > > Is it not an option to just schedule the mode exit here instead to > solve the problem? Of course, that's an option. Alternatively, maybe I could resolve the deadlock within the `cros_ec_typec` driver. Regardless, this seems like a separate patch. > > diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c > index b09b58d7311d..2abbe4de3216 100644 > --- a/drivers/usb/typec/altmodes/displayport.c > +++ b/drivers/usb/typec/altmodes/displayport.c > @@ -394,8 +394,7 @@ static int dp_altmode_vdm(struct typec_altmode *alt, > case CMDT_RSP_NAK: > switch (cmd) { > case DP_CMD_STATUS_UPDATE: > - if (typec_altmode_exit(alt)) > - dev_err(&dp->alt->dev, "Exit Mode Failed!\n"); > + dp->state = DP_STATE_EXIT; > break; > case DP_CMD_CONFIGURE: > dp->data.conf = 0; > > > -- > heikki