From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-2884130-1516679135-2-16443142982898870913 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES enro, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='org', MailFrom='org' X-Spam-charsets: plain='utf-8' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: linux-usb-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1516679134; b=Xf9CeNESBJhF9n0lKuWfAlVRpc6SJsf3woPDPP0OK0xGEiC VsXVHwgGbWOhPnhnO0drJmAwV350y4n0FVxBYFPZm7IO/HVfnQuN/DZihxZ84gek KgGpRPq+/Si6Es5gFWuSA/JDo3KFnhpYCBDwc6evDw0t5p61mdFjRxL5UF3aKGF5 /x35AUGvk3Tj+AS89pr91v9h81xILyknwoSxS+zFNcrlSwWNcxKdF8YYaxYPiCBd dDngDhs/NPG0/4yVqXUf7DDX6LOUnHH8gr1sz/VDPFKJ5p1BuV25g36yeSUUODqK d8A0oKZiuNiCmbFJ0+QxoMx9eIhoM5c08HFLTLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=subject:to:cc:references:from:message-id :date:mime-version:in-reply-to:content-type :content-transfer-encoding:sender:list-id; s=arctest; t= 1516679134; bh=SMTcm2n3HBjJSONTpcpGgg0/prEDUnP9oeAvXppX8Ew=; b=d xm6rEIWXwMeY5ioLAdPJ+GDeCMd7S+sDp8h8q+O9V4v+tm35Z56f9HPvIpE95hJ8 YsAiCfwDTSr1gbgudchgVdxZmeivmXaYWNehBK21zFlVVimgmzSEXIR4VwqP0/16 0U8dZ0NTmzjV9qUfeW53nrUoVB/Xclag/mBhIwoOVTKYTNP70dmurKvd3l/O7QfP jGe3cX/Cv+rRUJGa33350vkOKLBt4lngr0JtBiUB99Tz80VinwXqtYk6iPXEv1vd B3GF8lxxsvJn1nQmTwyy9NR9YdoKaNuqUDgOSD82rjYyuMULkD/l7FoNQd2rcXPI d9zvbIF9WwNIYQnhuskbQ== ARC-Authentication-Results: i=1; mx4.messagingengine.com; arc=none (no signatures found); dkim=fail (body has been altered; 1024-bit rsa key sha256) header.d=codeaurora.org header.i=@codeaurora.org header.b=JFeVPac2 x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=default; dkim=fail (body has been altered; 1024-bit rsa key sha256) header.d=codeaurora.org header.i=@codeaurora.org header.b=MugeY/bG x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=default; dmarc=none (p=none,has-list-id=yes,d=none) header.from=codeaurora.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-usb-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=codeaurora.org header.result=pass header_is_org_domain=yes Authentication-Results: mx4.messagingengine.com; arc=none (no signatures found); dkim=fail (body has been altered; 1024-bit rsa key sha256) header.d=codeaurora.org header.i=@codeaurora.org header.b=JFeVPac2 x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=default; dkim=fail (body has been altered; 1024-bit rsa key sha256) header.d=codeaurora.org header.i=@codeaurora.org header.b=MugeY/bG x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=default; dmarc=none (p=none,has-list-id=yes,d=none) header.from=codeaurora.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-usb-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=codeaurora.org header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751255AbeAWDpO (ORCPT ); Mon, 22 Jan 2018 22:45:14 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:39578 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751195AbeAWDpN (ORCPT ); Mon, 22 Jan 2018 22:45:13 -0500 X-Remote-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Remote-Spam-Level: X-Remote-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 27EF5607E4 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=mgautam@codeaurora.org Subject: Re: [PATCH 2/2] usb: dwc3: drd: Fix lock-up on ID change during system suspend/resume To: Roger Quadros , balbi@kernel.org Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org References: <1516626103-1969-1-git-send-email-rogerq@ti.com> <1516626103-1969-3-git-send-email-rogerq@ti.com> From: Manu Gautam Message-ID: <522f639a-466f-ae72-745e-61cbcc6fbfc7@codeaurora.org> Date: Tue, 23 Jan 2018 09:15:08 +0530 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <1516626103-1969-3-git-send-email-rogerq@ti.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-usb-owner@vger.kernel.org X-Mailing-List: linux-usb@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Hi, On 1/22/2018 6:31 PM, Roger Quadros wrote: > Adding/removing host/gadget controller before .pm_complete() > causes a lock-up. Let's prevent any dual-role state change > between .pm_prepare() and .pm_complete() to fix this. What kind of lock-up are you seeing? Some hardware lockup or software deadlock? IMO using a freezable_wq for drd_work should address that? > > Signed-off-by: Roger Quadros > --- > drivers/usb/dwc3/core.c | 31 +++++++++++++++++++++++++++++++ > drivers/usb/dwc3/core.h | 5 +++++ > drivers/usb/dwc3/drd.c | 10 ++++++---- > 3 files changed, 42 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index 42379cc..85388dd 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -1414,6 +1414,33 @@ static int dwc3_runtime_idle(struct device *dev) > #endif /* CONFIG_PM */ > > #ifdef CONFIG_PM_SLEEP > +static int dwc3_prepare(struct device *dev) > +{ > + struct dwc3 *dwc = dev_get_drvdata(dev); > + unsigned long flags; > + > + if (dwc->dr_mode == USB_DR_MODE_OTG) { > + spin_lock_irqsave(&dwc->lock, flags); > + dwc->dr_keep_role = true; > + spin_unlock_irqrestore(&dwc->lock, flags); > + } > + > + return 0; > +} > + > +static void dwc3_complete(struct device *dev) > +{ > + struct dwc3 *dwc = dev_get_drvdata(dev); > + unsigned long flags; > + > + if (dwc->dr_mode == USB_DR_MODE_OTG) { > + spin_lock_irqsave(&dwc->lock, flags); > + dwc->dr_keep_role = false; > + spin_unlock_irqrestore(&dwc->lock, flags); > + dwc3_drd_update(dwc); > + } > +} > + > static int dwc3_suspend(struct device *dev) > { > struct dwc3 *dwc = dev_get_drvdata(dev); > @@ -1451,6 +1478,10 @@ static const struct dev_pm_ops dwc3_dev_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume) > SET_RUNTIME_PM_OPS(dwc3_runtime_suspend, dwc3_runtime_resume, > dwc3_runtime_idle) > +#ifdef CONFIG_PM_SLEEP > + .prepare = dwc3_prepare, > + .complete = dwc3_complete, > +#endif > }; > > #ifdef CONFIG_OF > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index 4a4a4c9..f5eb474 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -786,6 +786,7 @@ struct dwc3_scratchpad_array { > * @dr_mode: requested mode of operation > * @current_dr_role: current role of operation when in dual-role mode > * @desired_dr_role: desired role of operation when in dual-role mode > + * @dr_keep_role: keep the current dual-role irrespective of ID changes > * @edev: extcon handle > * @edev_nb: extcon notifier > * @hsphy_mode: UTMI phy mode, one of following: > @@ -901,6 +902,7 @@ struct dwc3 { > enum usb_dr_mode dr_mode; > u32 current_dr_role; > u32 desired_dr_role; > + bool dr_keep_role; > struct extcon_dev *edev; > struct notifier_block edev_nb; > enum usb_phy_interface hsphy_mode; > @@ -1227,11 +1229,14 @@ static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc, > #if IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) > int dwc3_drd_init(struct dwc3 *dwc); > void dwc3_drd_exit(struct dwc3 *dwc); > +void dwc3_drd_update(struct dwc3 *dwc); > #else > static inline int dwc3_drd_init(struct dwc3 *dwc) > { return 0; } > static inline void dwc3_drd_exit(struct dwc3 *dwc) > { } > +static inline void dwc3_drd_update(struct dwc3 *dwc); > +{ } > #endif > > /* power management interface */ > diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c > index cc8ab9a..177a8be 100644 > --- a/drivers/usb/dwc3/drd.c > +++ b/drivers/usb/dwc3/drd.c > @@ -13,7 +13,7 @@ > #include "core.h" > #include "gadget.h" > > -static void dwc3_drd_update(struct dwc3 *dwc) > +void dwc3_drd_update(struct dwc3 *dwc) > { > int id; > > @@ -31,9 +31,11 @@ static int dwc3_drd_notifier(struct notifier_block *nb, > { > struct dwc3 *dwc = container_of(nb, struct dwc3, edev_nb); > > - dwc3_set_mode(dwc, event ? > - DWC3_GCTL_PRTCAP_HOST : > - DWC3_GCTL_PRTCAP_DEVICE); > + if (!dwc->dr_keep_role) { > + dwc3_set_mode(dwc, event ? > + DWC3_GCTL_PRTCAP_HOST : > + DWC3_GCTL_PRTCAP_DEVICE); > + } > > return NOTIFY_DONE; > } -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project