Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp799651rwb; Mon, 26 Sep 2022 06:07:02 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4JexuDXfswOjNc/b47zbbT2ZIxQAcOrJQhMZ2dGXE/9XHXGuuX6QwMh+m87NyKHfft7Z7S X-Received: by 2002:a17:906:58c7:b0:722:f4bf:cb75 with SMTP id e7-20020a17090658c700b00722f4bfcb75mr17727762ejs.450.1664197622395; Mon, 26 Sep 2022 06:07:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664197622; cv=none; d=google.com; s=arc-20160816; b=LdtgWtEI/Z4ir9I9RTqsr0cBV+X6jPtdgXcb20cDBDH0dgF81F9MhPat0smV4390gl 8jLCpJO90iwr+ijUb8nEU/DUOFSWBPXfj7FxOM+0ioZ8tzs8fAWC4nwtD7QPMjtNxEPN 1jwsaJC7MJ4yw6NyRTw3I6EhvbjvGtc58pal3FV0v+Zpta53U9hkQ1NEgJ3SZr8QPUe0 2iuqVao3dOLIISnufxq6szGYo10geeoBph/GdP8KRD4emuMHI1SJ2Mbp6OY4lFw/Vo/E 3vrmHIset8Yi0z2cprt6AOggRST3WkYaHMeYa1jQhQ5anrkZ5KtNzrE/NK0OZf0uo4/N xLMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=8qHQtm8//ChXJ14xu+DJyO42oPrSA45EEHxF0iVsLD0=; b=Sskz2xuxQ3yP+9Lg8GZ24v4v53LTiM1GB+Y3Rg8qygTa+OcJrpx7JIolcqdlkmXoOR A5yIz9zSLauIv36uBV3cJ6OFuX2afQWbLYWZL5qIkkA65eBAgVIOVeAcohkgQZni77HG 9tSjWjV8t7EBdw3aDO0EphzYKb8J0plO8iWz2yFDOvaj27eU3Lm6+EbCkeRlW+d5WFGL WWoFePrA5kAM2ZUfldgIfjwF5xzuLKQLZ3h56vNgPbTZAqb+yIzVzmEKgd2cRpnsucX8 stLEafWf68bXCQrt8waVvgRa5PTpGih+yEs23QcgagROPNTKiTAW8UiylpSpOWecT7XF XyFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iOBCvlet; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qa34-20020a17090786a200b007417e9a2c71si16071126ejc.352.2022.09.26.06.06.35; Mon, 26 Sep 2022 06:07:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iOBCvlet; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236740AbiIZKwF (ORCPT + 99 others); Mon, 26 Sep 2022 06:52:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37692 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236854AbiIZKti (ORCPT ); Mon, 26 Sep 2022 06:49:38 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1ED964D81B; Mon, 26 Sep 2022 03:26:50 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id E7C5DB80924; Mon, 26 Sep 2022 10:26:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1CC3AC433C1; Mon, 26 Sep 2022 10:26:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1664188007; bh=U5tyQGcMranG7ShypjbUfZyuQ8JD6q2bS91ZPJvY1+o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iOBCvletlftEZELHHAR8R6Mi18EPIBfl9F4T5B5l+/eVxHB2aEaNqWL0P6xV6fSP/ gpzq9yhaIZSPUvr3MmnPbZPPLS/MsweFLoDA67vI7bEjztYvKeQlbMmSF+h/9YXPjz 3pnTc3xznxjwoapK3NE72Z/GSTGtvyC6Dr/C1sBo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Thinh Nguyen , Sasha Levin Subject: [PATCH 5.10 011/141] usb: dwc3: gadget: Dont modify GEVNTCOUNT in pullup() Date: Mon, 26 Sep 2022 12:10:37 +0200 Message-Id: <20220926100755.014782292@linuxfoundation.org> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20220926100754.639112000@linuxfoundation.org> References: <20220926100754.639112000@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thinh Nguyen [ Upstream commit 8f8034f493b5eb1ad21ff392fd30c0cf9e71f73f ] If the GEVNTCOUNT indicates events in the event buffer, the driver needs to acknowledge them before the controller can halt. Simply let the interrupt handler acknowledges the remaining event generated by the controller while polling for DSTS.DEVCTLHLT. This avoids disabling irq and taking care of race condition between the interrupt handlers and pullup(). Signed-off-by: Thinh Nguyen Link: https://lore.kernel.org/r/ea306ec93c41ccafbdb5d16404ff3b6eca299613.1650593829.git.Thinh.Nguyen@synopsys.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: 040f2dbd2010 ("usb: dwc3: gadget: Avoid duplicate requests to enable Run/Stop") Signed-off-by: Sasha Levin --- drivers/usb/dwc3/gadget.c | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index bd1050f75558..818a70e56d89 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2122,8 +2122,9 @@ static int __dwc3_gadget_start(struct dwc3 *dwc); static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) { - u32 count; + unsigned long flags; + spin_lock_irqsave(&dwc->lock, flags); dwc->connected = false; /* @@ -2135,29 +2136,21 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) */ dwc3_stop_active_transfers(dwc); __dwc3_gadget_stop(dwc); + spin_unlock_irqrestore(&dwc->lock, flags); /* - * In the Synopsys DesignWare Cores USB3 Databook Rev. 3.30a - * Section 1.3.4, it mentions that for the DEVCTRLHLT bit, the - * "software needs to acknowledge the events that are generated - * (by writing to GEVNTCOUNTn) while it is waiting for this bit - * to be set to '1'." + * Note: if the GEVNTCOUNT indicates events in the event buffer, the + * driver needs to acknowledge them before the controller can halt. + * Simply let the interrupt handler acknowledges and handle the + * remaining event generated by the controller while polling for + * DSTS.DEVCTLHLT. */ - count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0)); - count &= DWC3_GEVNTCOUNT_MASK; - if (count > 0) { - dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count); - dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % - dwc->ev_buf->length; - } - return dwc3_gadget_run_stop(dwc, false, false); } static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) { struct dwc3 *dwc = gadget_to_dwc(g); - unsigned long flags; int ret; is_on = !!is_on; @@ -2201,14 +2194,6 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) return 0; } - /* - * Synchronize and disable any further event handling while controller - * is being enabled/disabled. - */ - disable_irq(dwc->irq_gadget); - - spin_lock_irqsave(&dwc->lock, flags); - if (!is_on) { ret = dwc3_gadget_soft_disconnect(dwc); } else { @@ -2218,16 +2203,12 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) * device-initiated disconnect requires a core soft reset * (DCTL.CSftRst) before enabling the run/stop bit. */ - spin_unlock_irqrestore(&dwc->lock, flags); dwc3_core_soft_reset(dwc); - spin_lock_irqsave(&dwc->lock, flags); dwc3_event_buffers_setup(dwc); __dwc3_gadget_start(dwc); ret = dwc3_gadget_run_stop(dwc, true, false); } - spin_unlock_irqrestore(&dwc->lock, flags); - enable_irq(dwc->irq_gadget); pm_runtime_put(dwc->dev); -- 2.35.1