From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-1724654-1516626140-2-168071792668601983 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no ("Email failed DMARC policy for domain") 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 roenda, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='com', MailFrom='org' X-Spam-charsets: X-IgnoreVacation: yes ("Email failed DMARC policy for domain") 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=1516626140; b=a0YRPI2/c9g0Nh467SshVG4hpxSx192XB0iSK1waJQvYH7E C17ZGrzhIhBjcHbtkkyNN7xbS2sWvJ7+o9dRcW7Z/KoSIKpNkImnaL7dn4ZAiBKN DnAHxabrqTQGyVXcRKafg+VrziI8gpjqYr+871urPdbnmqVD+cpvlCgpytlwd9JB 0tzfO+N9LOZuWJg3P0V0BmxUlYJdvqogQW1foA/XMUtmR7kE1vnUHwIiMiHmApsG b+yKEp1HQjhOiYchFhEfEzFGqC2s7Nny2BgtaRW5zptrcJaJjdoQSQ/xwAraLocg s/mX8uHRW3UtTfMF81kBUp2uQuTniTFC1IcpnJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-type:sender :list-id; s=arctest; t=1516626140; bh=/uqpYlZplPbm+9oGUlNaG9yT7/ REbUVHarB2Rh4g5hg=; b=SfZ3ZHUFBHt+8gcAZiXmjiEPbDmhhBaA4W2eGM/hKE VCfaWHuXtqMH69qrnnddhVaxyGRMygHYXV2UI1Gzm4cAe4Quj5+fLGNxNtLnXnPJ 7ib8jRCl7m2Y582hT6xdevFbQUZbVPoDAT4m6JaOtZ2hQd7BaYHbOpx1NesBJRwZ wJdmSnB1En6UugRuMwLcPV9Hx09m6b5SLiSuHiOGh/Ur0DnJ30GNKOBSfG7NOYm3 HCy+n2pIbZBZ5OriasQnieW/M/oIAzNiIJFNAcznSfjOrJ7As8mr3Bc96zxC8ve1 muvNMAxZuGI3GYf1vSnKfguqYdUbC2XWXW4Qns9HuynA== ARC-Authentication-Results: i=1; mx3.messagingengine.com; arc=none (no signatures found); dkim=fail (body has been altered; 1024-bit rsa key sha256) header.d=ti.com header.i=@ti.com header.b=H5BgBqM2 x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=ti-com-17Q1; dmarc=fail (p=quarantine,has-list-id=yes,d=quarantine) header.from=ti.com; 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=ti.com header.result=pass header_is_org_domain=yes Authentication-Results: mx3.messagingengine.com; arc=none (no signatures found); dkim=fail (body has been altered; 1024-bit rsa key sha256) header.d=ti.com header.i=@ti.com header.b=H5BgBqM2 x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=ti-com-17Q1; dmarc=fail (p=quarantine,has-list-id=yes,d=quarantine) header.from=ti.com; 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=ti.com header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751303AbeAVNB7 (ORCPT ); Mon, 22 Jan 2018 08:01:59 -0500 Received: from lelnx194.ext.ti.com ([198.47.27.80]:18158 "EHLO lelnx194.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751086AbeAVNB5 (ORCPT ); Mon, 22 Jan 2018 08:01:57 -0500 From: Roger Quadros To: CC: , , Roger Quadros Subject: [PATCH 2/2] usb: dwc3: drd: Fix lock-up on ID change during system suspend/resume Date: Mon, 22 Jan 2018 15:01:43 +0200 Message-ID: <1516626103-1969-3-git-send-email-rogerq@ti.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516626103-1969-1-git-send-email-rogerq@ti.com> References: <1516626103-1969-1-git-send-email-rogerq@ti.com> MIME-Version: 1.0 Content-Type: text/plain X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 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: 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. 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; } -- cheers, -roger Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki