From patchwork Thu Apr 13 19:53:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wesley Cheng X-Patchwork-Id: 83083 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1297462vqo; Thu, 13 Apr 2023 13:18:22 -0700 (PDT) X-Google-Smtp-Source: AKy350Z7wOdAph6dOx7XbEEbh2hQ5mv6SFZOgwL23SUN5yUtjsAlnF6OmbokIS9eaf7FREbHyCI5 X-Received: by 2002:a05:6a20:4c24:b0:da:318a:981f with SMTP id fm36-20020a056a204c2400b000da318a981fmr2836717pzb.42.1681417102323; Thu, 13 Apr 2023 13:18:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681417102; cv=none; d=google.com; s=arc-20160816; b=lc/0Abc+U0JuOghbb13+65RGdluBawFA9wZZF0LqJPSUVbSSEjzL5sAYprDRap/cQh iJ4gOEq8NPvs28rtAm1OoLMrEb50xEANJOTgRFLVhlWwQ6lWbwRInLs2WjyB1mlpXAiq l+2oVD0fzqvCjjy6L7A98HIyEkoir1CgvjXWSLZGL3NQ7PmLRRzuRN4qoCMSnd+3wxLT bCFZQzn2zk3h6wmtCgj3LLzkpTRjDZNwavfE4+4mpfpdeFCriIMh20MUL1iVj7rHji6Y iILyKPvmw27IfPf4jF0LhxUtZF8A1kk99PiyCSf1kIM3zcF98bTRhA96N1ebEYarzm8z 1HLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=G+OlpJM+zenbHOMNZmnRI9W00zcei4fB6OwOqJVtDVk=; b=w+hq8+X3mnp63yGQ0yU5/D0KGlE2NcI2fqbEhfIkz+h2CuYnZg8DhZv5fnxOfgPo28 oQzRW0+dIe6oVZ5B4PRbryOzPZXc4S1JRtNjomtchlOAWd6Ox0BOaYpRvwqJtioGvzm4 sYKURlD8/9wcMQlNTC36iJJUNu/uDfKGJHpn29IC9+MLILz7tQMmMX4tVEdbM3BjK4Af sgg3QzHQjDsqNNMEe4h4OxgcQlYP77iZdL2NA/puTYtwTBinP95+NFL3g3KbCb5WvKMT zuW02s0MZvemxj3DUdgQdHkCFOMhxcGbQKWrBYbAft3NqUX5su+6Y2dyF1JlOc/aekue zznQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=aKJ6a1uv; 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=quicinc.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r133-20020a632b8b000000b005090553fae2si2678240pgr.814.2023.04.13.13.18.06; Thu, 13 Apr 2023 13:18:22 -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=@quicinc.com header.s=qcppdkim1 header.b=aKJ6a1uv; 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=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230112AbjDMTxz (ORCPT + 99 others); Thu, 13 Apr 2023 15:53:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230016AbjDMTxq (ORCPT ); Thu, 13 Apr 2023 15:53:46 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B0CBE65BD; Thu, 13 Apr 2023 12:53:45 -0700 (PDT) Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 33DJgZY6003281; Thu, 13 Apr 2023 19:53:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=G+OlpJM+zenbHOMNZmnRI9W00zcei4fB6OwOqJVtDVk=; b=aKJ6a1uvalmaCFqV3VCTEwm3CrlBM9VMbV6M8aBhn+pmdtSbWg7bcWuHsHjO/lMbTcCb jQjlC2wsQOKNU1Oi6pzOwazvBaVFf1DgIqVsKlZJ4sL5WztqhbLMmezibDtSthnbhTT3 LrSTwzBYLbiyPTwPg+H9Thq9KWe7+is2K8d4Ak87dIMCCbzlAuTaYJ9xs1xK9fECtqK5 mjzSQz3DtkkDJ088VB3vNwotXkQ01FpfEaX0ksvuIYeOmstVi38HN+k0gyCZp5ZWp2o3 xnsT7ZQPokb1E/qxOhKZ6ZkdStMzTelRHgd/U9fHPpPAz4MmCYm6fkbiIDiLG5FLdtHL TQ== Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3px3reten5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Apr 2023 19:53:41 +0000 Received: from nalasex01b.na.qualcomm.com (nalasex01b.na.qualcomm.com [10.47.209.197]) by NALASPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 33DJreuK014243 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Apr 2023 19:53:40 GMT Received: from hu-wcheng-lv.qualcomm.com (10.49.16.6) by nalasex01b.na.qualcomm.com (10.47.209.197) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Thu, 13 Apr 2023 12:53:40 -0700 From: Wesley Cheng To: , CC: , , Wesley Cheng , stable Subject: [PATCH v4 1/3] usb: dwc3: gadget: Stall and restart EP0 if host is unresponsive Date: Thu, 13 Apr 2023 12:53:15 -0700 Message-ID: <20230413195317.7468-2-quic_wcheng@quicinc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230413195317.7468-1-quic_wcheng@quicinc.com> References: <20230413195317.7468-1-quic_wcheng@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01b.na.qualcomm.com (10.47.209.197) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: xltX7HgFQBaChghGfKE4jRLAGyNBf2oT X-Proofpoint-GUID: xltX7HgFQBaChghGfKE4jRLAGyNBf2oT X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-13_14,2023-04-13_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 impostorscore=0 mlxscore=0 adultscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 phishscore=0 mlxlogscore=925 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304130176 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763093619404484987?= X-GMAIL-MSGID: =?utf-8?q?1763093619404484987?= It was observed that there are hosts that may complete pending SETUP transactions before the stop active transfers and controller halt occurs, leading to lingering endxfer commands on DEPs on subsequent pullup/gadget start iterations. dwc3_gadget_ep_disable name=ep8in flags=0x3009 direction=1 dwc3_gadget_ep_disable name=ep4in flags=1 direction=1 dwc3_gadget_ep_disable name=ep3out flags=1 direction=0 usb_gadget_disconnect deactivated=0 connected=0 ret=0 The sequence shows that the USB gadget disconnect (dwc3_gadget_pullup(0)) routine completed successfully, allowing for the USB gadget to proceed with a USB gadget connect. However, if this occurs the system runs into an issue where: BUG: spinlock already unlocked on CPU spin_bug+0x0 dwc3_remove_requests+0x278 dwc3_ep0_out_start+0xb0 __dwc3_gadget_start+0x25c This is due to the pending endxfers, leading to gadget start (w/o lock held) to execute the remove requests, which will unlock the dwc3 spinlock as part of giveback. To mitigate this, resolve the pending endxfers on the pullup disable path by re-locating the SETUP phase check after stop active transfers, since that is where the DWC3_EP_DELAY_STOP is potentially set. This also allows for handling of a host that may be unresponsive by using the completion timeout to trigger the stall and restart for EP0. Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage") Cc: stable Signed-off-by: Wesley Cheng --- drivers/usb/dwc3/gadget.c | 49 +++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 3c63fa97a680..be84c133f0d7 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2528,29 +2528,17 @@ static int __dwc3_gadget_start(struct dwc3 *dwc); static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) { unsigned long flags; + int ret; spin_lock_irqsave(&dwc->lock, flags); dwc->connected = false; /* - * Per databook, when we want to stop the gadget, if a control transfer - * is still in process, complete it and get the core into setup phase. + * Attempt to end pending SETUP status phase, and not wait for the + * function to do so. */ - if (dwc->ep0state != EP0_SETUP_PHASE) { - int ret; - - if (dwc->delayed_status) - dwc3_ep0_send_delayed_status(dwc); - - reinit_completion(&dwc->ep0_in_setup); - - spin_unlock_irqrestore(&dwc->lock, flags); - ret = wait_for_completion_timeout(&dwc->ep0_in_setup, - msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT)); - spin_lock_irqsave(&dwc->lock, flags); - if (ret == 0) - dev_warn(dwc->dev, "timed out waiting for SETUP phase\n"); - } + if (dwc->delayed_status) + dwc3_ep0_send_delayed_status(dwc); /* * In the Synopsys DesignWare Cores USB3 Databook Rev. 3.30a @@ -2563,6 +2551,33 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) __dwc3_gadget_stop(dwc); spin_unlock_irqrestore(&dwc->lock, flags); + /* + * Per databook, when we want to stop the gadget, if a control transfer + * is still in process, complete it and get the core into setup phase. + * In case the host is unresponsive to a SETUP transaction, forcefully + * stall the transfer, and move back to the SETUP phase, so that any + * pending endxfers can be executed. + */ + if (dwc->ep0state != EP0_SETUP_PHASE) { + reinit_completion(&dwc->ep0_in_setup); + + ret = wait_for_completion_timeout(&dwc->ep0_in_setup, + msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT)); + if (ret == 0) { + unsigned int dir; + + dev_warn(dwc->dev, "wait for SETUP phase timed out\n"); + spin_lock_irqsave(&dwc->lock, flags); + dir = !!dwc->ep0_expect_in; + if (dwc->ep0state == EP0_DATA_PHASE) + dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); + else + dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); + dwc3_ep0_stall_and_restart(dwc); + spin_unlock_irqrestore(&dwc->lock, flags); + } + } + /* * Note: if the GEVNTCOUNT indicates events in the event buffer, the * driver needs to acknowledge them before the controller can halt. From patchwork Thu Apr 13 19:53:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wesley Cheng X-Patchwork-Id: 83084 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1298062vqo; Thu, 13 Apr 2023 13:19:38 -0700 (PDT) X-Google-Smtp-Source: AKy350bUS2JlWNrfm38FVi7jqO4KgzrepP58utWe2fiXlvnH1HFtxoWKjPEwxBm6x0HekwpzK9WK X-Received: by 2002:a05:6a00:2190:b0:63b:5f0f:94f1 with SMTP id h16-20020a056a00219000b0063b5f0f94f1mr1269469pfi.4.1681417178304; Thu, 13 Apr 2023 13:19:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681417178; cv=none; d=google.com; s=arc-20160816; b=rUmHvORdJn8c7oV5tBoswHD3+jZ4fAG28wAPaoNUM08FQaEjvgVWZEqQxAbR/4K9uh jrvNjDS1p9TOzHe384FxDG+bOJDFqFJa1mcy3RhdK3Oq72cUePdoVYYbbOgXY+P5r/EM 4YyzZIEdHRGvZNN4hGW0iuw5arKAfaeVcT3Rk1RVG3HYpF5znNgkRg6TQqOldIE/I7Fe J19FBH3eR4xBH5W8TjBFCb0JfrcnfB5BRN8gsdTzi8iN/Dz7a6U0Uuvv+kqAJ65M+i5b x4cBWYjSoHOYaqoeFmflqpo09i0lJxtrDj/JZF664lYRSiC27zacJ+s+CwVP+ctMgCRc Nd4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=6kXjPv3JSqmlJQBfZMf+Jgzn2FTqzODxouHwtO4Ijek=; b=SA0Ja3ox4fg3T5i9ad6zeSRGzG31Yt+aX6jhSojdrk3ar+mxV6zqUWdOtZ99V2byIa DMLEvm+2BKItAYf/P1dx0VEEbLYG8HW/mdhhartQh3abAz6RHrPm6vaOBuHzpSAyNWAF n3/v3oIFWMYoP+i076Ggy+CcgPaGjT/ouOMy3+vwsNL5Kg0qwyamAltNpgD2oJEVxgGQ HEVtzEAlwhhvt9a7KzOKQG13tlrsyyo1W94icPiL8ZPqGljfiVgrLMvbBuK4FoOVt+w5 adW6JreskIo0n23WsJ1JRkgExl7LXZr4I4esrd9bqZ6nUqlhXmuBVOPHlCUk3Fc492tQ /wjw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=ZfkHRVS1; 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=quicinc.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r133-20020a632b8b000000b005090553fae2si2678240pgr.814.2023.04.13.13.19.21; Thu, 13 Apr 2023 13:19:38 -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=@quicinc.com header.s=qcppdkim1 header.b=ZfkHRVS1; 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=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230073AbjDMTxw (ORCPT + 99 others); Thu, 13 Apr 2023 15:53:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46320 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230003AbjDMTxq (ORCPT ); Thu, 13 Apr 2023 15:53:46 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9803F6182; Thu, 13 Apr 2023 12:53:45 -0700 (PDT) Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 33DJpDm3003282; Thu, 13 Apr 2023 19:53:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=6kXjPv3JSqmlJQBfZMf+Jgzn2FTqzODxouHwtO4Ijek=; b=ZfkHRVS1wEeX8cCY2Di8oPhlUYO4j/GmWwWdFUmRgM/BDXj7gMAqzTXQIcRG606oKSf7 vug5+A7Uh5SKfECEz/HhVXa5GuMrmCgIB9gx82dqDpqwm3OcfEUSRRGhDt4Gd/u4oeOH AhIgn0SR9tOToeGJ0jGhznf7qvnb6OKIuWaDL/o+C7g0xwPHjsiK5sN/ZRL7Hi+/ljz3 z3iOmoiwYAweTxwrWW/ErZ/07XOiXYH/hyW3/AVK/pp8MeP2uOcZr/2fUASLxhzYgLSd xFXKBfhNP6aUGLdzExD1hueMxQZln2RfFFtrgPiyD6uEgtUX9dzAAJVKMbvOtIaSeGCD CA== Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pxdrk9g3f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Apr 2023 19:53:41 +0000 Received: from nalasex01b.na.qualcomm.com (nalasex01b.na.qualcomm.com [10.47.209.197]) by NALASPPMTA04.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 33DJreQd008813 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Apr 2023 19:53:40 GMT Received: from hu-wcheng-lv.qualcomm.com (10.49.16.6) by nalasex01b.na.qualcomm.com (10.47.209.197) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Thu, 13 Apr 2023 12:53:40 -0700 From: Wesley Cheng To: , CC: , , Wesley Cheng , stable Subject: [PATCH v4 2/3] usb: dwc3: gadget: Execute gadget stop after halting the controller Date: Thu, 13 Apr 2023 12:53:16 -0700 Message-ID: <20230413195317.7468-3-quic_wcheng@quicinc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230413195317.7468-1-quic_wcheng@quicinc.com> References: <20230413195317.7468-1-quic_wcheng@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01b.na.qualcomm.com (10.47.209.197) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: fSik2OxNBC7VIQ9t2qduW9sPuNhBc0r6 X-Proofpoint-GUID: fSik2OxNBC7VIQ9t2qduW9sPuNhBc0r6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-13_14,2023-04-13_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 suspectscore=0 spamscore=0 mlxscore=0 malwarescore=0 impostorscore=0 phishscore=0 mlxlogscore=672 clxscore=1011 bulkscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304130176 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763093699315095949?= X-GMAIL-MSGID: =?utf-8?q?1763093699315095949?= Do not call gadget stop until the poll for controller halt is completed. DEVTEN is cleared as part of gadget stop, so the intention to allow ep0 events to continue while waiting for controller halt is not happening. Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage") Cc: stable Acked-by: Thinh Nguyen Signed-off-by: Wesley Cheng --- drivers/usb/dwc3/gadget.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index be84c133f0d7..0bb4926933b6 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2548,7 +2548,6 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) * bit. */ dwc3_stop_active_transfers(dwc); - __dwc3_gadget_stop(dwc); spin_unlock_irqrestore(&dwc->lock, flags); /* @@ -2585,7 +2584,19 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) * remaining event generated by the controller while polling for * DSTS.DEVCTLHLT. */ - return dwc3_gadget_run_stop(dwc, false, false); + ret = dwc3_gadget_run_stop(dwc, false, false); + + /* + * Stop the gadget after controller is halted, so that if needed, the + * events to update EP0 state can still occur while the run/stop + * routine polls for the halted state. DEVTEN is cleared as part of + * gadget stop. + */ + spin_lock_irqsave(&dwc->lock, flags); + __dwc3_gadget_stop(dwc); + spin_unlock_irqrestore(&dwc->lock, flags); + + return ret; } static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) From patchwork Thu Apr 13 19:53:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wesley Cheng X-Patchwork-Id: 83079 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1290595vqo; Thu, 13 Apr 2023 13:05:45 -0700 (PDT) X-Google-Smtp-Source: AKy350adQ6epCPyrzOCvt72kPR6eOpwrIg5jk8Ffa2Mx2CkDpI2FBR0A089p22POoBdemccxCm0K X-Received: by 2002:a05:6a00:17a4:b0:633:3954:986e with SMTP id s36-20020a056a0017a400b006333954986emr4956848pfg.28.1681416344752; Thu, 13 Apr 2023 13:05:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681416344; cv=none; d=google.com; s=arc-20160816; b=sgWqzKFx8wMvHdas+hdirmunDAA+sRoOrSu3bSiNmretb1/WnwBPsVni4DCqDlhx4l JcS6uABPNTyjnchnzvwwWdxPlZUFP0FCr/CA7nG24L/ohtapk9ZMN/nxT5FiuJO21DFE SotWHpuGo9BKyXQq5ftPZo1C8D6M2M0g0BCOkpQ0WuD6nlqGKLZdg5eSecN2jyhDPx8u XlAPOONWOjoXQT2MPT+hDXA6KWq6t4wFNt3Utkfol2tzHuORYRGZLhn7ErSMZfpi1oC3 UP1CsPeZUIBbOELfzmbeDq55LxNzRGaM1+cEIBx8P6mMibY2rmvsbeGGN3mJRRj6kBZG wKoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=785MwKS2iQyp2XbJLbbqFpGyH2DA45lwssNOf53Znf0=; b=DIGUuzzwtBIc/J1s/OzJuppcj7bXchm8xQ1KHx9J8z5B8wmTxsOAFjhE5x9iL6Z+U4 bZ/FntVmnz61QQihY8mIe51km/J1QIPeI1UYP3subYoFS/rNq9d9MtOGuGSj+Jc3Y7xI 51ROADk7yIFqOiWICG3XxXaK1vKfxdpSpGnLTGc3/B9P79QBqzlBuWGg7ph4Cs7U0iYE IWG6So85fB/wl/8oiraj2AiYFflSDT4ZQAloMaHLluH6boFlrWmh69H21GJ52Y4dFgDh 7+BJ19D6jlWGfljGWGryYIbrl7E6qUNaeYJMmcbRVQ1nkP5DI0w/ignzlsrV69ZILB2k a22g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=pr7zWFoP; 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=quicinc.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n9-20020a635909000000b00519858f0ac3si2720081pgb.157.2023.04.13.13.05.29; Thu, 13 Apr 2023 13:05:44 -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=@quicinc.com header.s=qcppdkim1 header.b=pr7zWFoP; 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=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230028AbjDMTxs (ORCPT + 99 others); Thu, 13 Apr 2023 15:53:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46304 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229598AbjDMTxo (ORCPT ); Thu, 13 Apr 2023 15:53:44 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 855CE65BD; Thu, 13 Apr 2023 12:53:43 -0700 (PDT) Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 33DJljN6002936; Thu, 13 Apr 2023 19:53:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=qcppdkim1; bh=785MwKS2iQyp2XbJLbbqFpGyH2DA45lwssNOf53Znf0=; b=pr7zWFoPihJga3FCCcEe/VAAmsADVmpaBdIxiXf6MdhBH8XXIXa20kfW6ObwlDt+mVf5 qAUorE/0Mgk65fLmiW+Xz7Fpfa1xrIU+sSIcrWrqqsBP/otWqNpfLDJ/NTkdPa1zYMKC ooq4uSy2BTJrpIhnS9c/PVcMIf0aZUEi2r2X/vgTMBXu+sKpVL7B4TNNYRYtdy3RwFbu xofnpsyt/d6bFavIUHun8iaRROa5c8rMIYIGjpkiqQ9wbZFVHYHzp73+7tO5Qt+vMZTt D/eM5Y/ZL9cP3bGxnu17rOwxsPwz96tpMWQ7NAplQpNfWnGBgCp6E0UaxmXfD1WD6FEx Gw== Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pxdtehfxa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Apr 2023 19:53:41 +0000 Received: from nalasex01b.na.qualcomm.com (nalasex01b.na.qualcomm.com [10.47.209.197]) by NALASPPMTA04.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 33DJrfRP008818 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 13 Apr 2023 19:53:41 GMT Received: from hu-wcheng-lv.qualcomm.com (10.49.16.6) by nalasex01b.na.qualcomm.com (10.47.209.197) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Thu, 13 Apr 2023 12:53:40 -0700 From: Wesley Cheng To: , CC: , , Wesley Cheng Subject: [PATCH v4 3/3] usb: dwc3: gadget: Refactor EP0 forced stall/restart into a separate API Date: Thu, 13 Apr 2023 12:53:17 -0700 Message-ID: <20230413195317.7468-4-quic_wcheng@quicinc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230413195317.7468-1-quic_wcheng@quicinc.com> References: <20230413195317.7468-1-quic_wcheng@quicinc.com> MIME-Version: 1.0 X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01b.na.qualcomm.com (10.47.209.197) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: k918EoJDH2M2yJQXHGlkY2GkwdZquI-S X-Proofpoint-GUID: k918EoJDH2M2yJQXHGlkY2GkwdZquI-S X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-13_14,2023-04-13_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 mlxlogscore=918 clxscore=1015 spamscore=0 lowpriorityscore=0 phishscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 mlxscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304130176 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763092825320072136?= X-GMAIL-MSGID: =?utf-8?q?1763092825320072136?= Several sequences utilize the same routine for forcing the control endpoint back into the SETUP phase. This is required, because those operations need to ensure that EP0 is back in the default state. Signed-off-by: Wesley Cheng --- drivers/usb/dwc3/gadget.c | 53 ++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 0bb4926933b6..9715de8e99bc 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -139,6 +139,24 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state) return -ETIMEDOUT; } +static void dwc3_ep0_reset_state(struct dwc3 *dwc) +{ + unsigned int dir; + + if (dwc->ep0state != EP0_SETUP_PHASE) { + dir = !!dwc->ep0_expect_in; + if (dwc->ep0state == EP0_DATA_PHASE) + dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); + else + dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); + + dwc->eps[0]->trb_enqueue = 0; + dwc->eps[1]->trb_enqueue = 0; + + dwc3_ep0_stall_and_restart(dwc); + } +} + /** * dwc3_ep_inc_trb - increment a trb index. * @index: Pointer to the TRB index to increment. @@ -2563,16 +2581,9 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) ret = wait_for_completion_timeout(&dwc->ep0_in_setup, msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT)); if (ret == 0) { - unsigned int dir; - dev_warn(dwc->dev, "wait for SETUP phase timed out\n"); spin_lock_irqsave(&dwc->lock, flags); - dir = !!dwc->ep0_expect_in; - if (dwc->ep0state == EP0_DATA_PHASE) - dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); - else - dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); - dwc3_ep0_stall_and_restart(dwc); + dwc3_ep0_reset_state(dwc); spin_unlock_irqrestore(&dwc->lock, flags); } } @@ -3847,16 +3858,7 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) dwc->setup_packet_pending = false; usb_gadget_set_state(dwc->gadget, USB_STATE_NOTATTACHED); - if (dwc->ep0state != EP0_SETUP_PHASE) { - unsigned int dir; - - dir = !!dwc->ep0_expect_in; - if (dwc->ep0state == EP0_DATA_PHASE) - dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); - else - dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); - dwc3_ep0_stall_and_restart(dwc); - } + dwc3_ep0_reset_state(dwc); } static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) @@ -3910,20 +3912,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) * phase. So ensure that EP0 is in setup phase by issuing a stall * and restart if EP0 is not in setup phase. */ - if (dwc->ep0state != EP0_SETUP_PHASE) { - unsigned int dir; - - dir = !!dwc->ep0_expect_in; - if (dwc->ep0state == EP0_DATA_PHASE) - dwc3_ep0_end_control_data(dwc, dwc->eps[dir]); - else - dwc3_ep0_end_control_data(dwc, dwc->eps[!dir]); - - dwc->eps[0]->trb_enqueue = 0; - dwc->eps[1]->trb_enqueue = 0; - - dwc3_ep0_stall_and_restart(dwc); - } + dwc3_ep0_reset_state(dwc); /* * In the Synopsis DesignWare Cores USB3 Databook Rev. 3.30a