Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp815330pxf; Thu, 11 Mar 2021 16:01:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJz3RhuSk3hJsO2FtVXeEzWxyjgtFwgHcqDdRR86kVjujk7v3yFItRxYBmAqMPkmz/NA0uMQ X-Received: by 2002:a17:907:788e:: with SMTP id ku14mr5743491ejc.17.1615507271856; Thu, 11 Mar 2021 16:01:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615507271; cv=none; d=google.com; s=arc-20160816; b=SwUZF/sLK0/75IDMr6ywLLWYUff+2heuJnLZ0UJk1Za5rQLi2Q7D8t3TIWhP6LRTLi /ZkDSrgW64WLqHELhF89H9SLhfa2fBx/E6xiRA5c+zle/DxovwSVa7ZW2HWtH8dFsm+/ KYTmYa72BldBV7JE0D7PbhjxSXhJCz6w1jLLnN0dWN8uSyV/ejWMx6Vy+j3MQS7ePBjr Tjxh5SmjlJJLLzdVC9Wh2O2rrokb8BdN6qgEyLuDa36jnEhqGfx6oY25GrCFcOoqnupd Kp2xqxzKg3HEldgJ8Tcg0B4OqHGq+ZDzdPwFASwwDPAIf20lqTESuGbenfkxfKqZ4fGl mBhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from:dmarc-filter :sender:dkim-signature; bh=KNh/PgYSoZKPjqJusJ9iEiMUTHAk/zatcqpES2T/4Rg=; b=kwqz3Yb1iLPUJSVdavcWsmh7hFx97XQo+3/1YZRia4Fs493EdflOtnJ6YqJtu50ClJ oumo5wa6XSazygBCwzDsHtgoZoxiA7P9qkkoPEe0S1n4x2JDJfr1Oq8eQ/k4E2gYQf+M spfXYxSOpRkJ3L3OHgGBd/+Ep64ljS5AskmD4lwHIelbxodySLwxPEUw3b+tQiDTfLye 6KgEYOh1NqeF1P24lrg89PhPSWRuJoD6FBZ0yN6CF6Eg5SKsR8M8Ig9N7GJi+SeDHM7V cBwT2h2RT4gK6lpCLQjILTwnSyxOrwYMkaW7hSP/QrnYLHbrfaW6aJi1XrQqrASQmCCR wvrg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=Yp2bv8ig; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u12si3252543eda.90.2021.03.11.16.00.46; Thu, 11 Mar 2021 16:01:11 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=Yp2bv8ig; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230228AbhCKX7q (ORCPT + 99 others); Thu, 11 Mar 2021 18:59:46 -0500 Received: from z11.mailgun.us ([104.130.96.11]:18237 "EHLO z11.mailgun.us" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229526AbhCKX7V (ORCPT ); Thu, 11 Mar 2021 18:59:21 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1615507161; h=Message-Id: Date: Subject: Cc: To: From: Sender; bh=KNh/PgYSoZKPjqJusJ9iEiMUTHAk/zatcqpES2T/4Rg=; b=Yp2bv8igfGUiWMd3g5R2ZicyIOrQXGYoXiqiP5wCGvIQEr2ECMRDYRoVT7yWpqEjIglHDgBR jcHq+Wu/Y4vZyzOMQyFlNZ7eqMm+CqvzinihILTLGehll7Vu/GEkycE6D1XCbz/o1IqXBHcM fjUerA5Ygogdw30CcAOSpIK2HTI= X-Mailgun-Sending-Ip: 104.130.96.11 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n05.prod.us-east-1.postgun.com with SMTP id 604aaed24db3bb6801c5505f (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 11 Mar 2021 23:59:14 GMT Sender: wcheng=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id B6441C433ED; Thu, 11 Mar 2021 23:59:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=ALL_TRUSTED,BAYES_00,SPF_FAIL autolearn=no autolearn_force=no version=3.4.0 Received: from wcheng-linux.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: wcheng) by smtp.codeaurora.org (Postfix) with ESMTPSA id F0FF5C433CA; Thu, 11 Mar 2021 23:59:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org F0FF5C433CA Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=wcheng@codeaurora.org From: Wesley Cheng To: balbi@kernel.org, gregkh@linuxfoundation.org Cc: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Wesley Cheng Subject: [PATCH v3] usb: dwc3: gadget: Prevent EP queuing while stopping transfers Date: Thu, 11 Mar 2021 15:59:02 -0800 Message-Id: <1615507142-23097-1-git-send-email-wcheng@codeaurora.org> X-Mailer: git-send-email 2.7.4 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the situations where the DWC3 gadget stops active transfers, once calling the dwc3_gadget_giveback(), there is a chance where a function driver can queue a new USB request in between the time where the dwc3 lock has been released and re-aquired. This occurs after we've already issued an ENDXFER command. When the stop active transfers continues to remove USB requests from all dep lists, the newly added request will also be removed, while controller still has an active TRB for it. This can lead to the controller accessing an unmapped memory address. Fix this by ensuring parameters to prevent EP queuing are set before calling the stop active transfers API. Fixes: ae7e86108b12 ("usb: dwc3: Stop active transfers before halting the controller") Signed-off-by: Wesley Cheng --- Changes since V2: - Removed duplicate dwc->connected = false setting in pullup routine Changes since V1: - Added Fixes tag to point to the commit this is addressing drivers/usb/dwc3/gadget.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 4780983..2c94cc9 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -783,8 +783,6 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) trace_dwc3_gadget_ep_disable(dep); - dwc3_remove_requests(dwc, dep); - /* make sure HW endpoint isn't stalled */ if (dep->flags & DWC3_EP_STALL) __dwc3_gadget_ep_set_halt(dep, 0, false); @@ -803,6 +801,8 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) dep->endpoint.desc = NULL; } + dwc3_remove_requests(dwc, dep); + return 0; } @@ -1617,7 +1617,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) { struct dwc3 *dwc = dep->dwc; - if (!dep->endpoint.desc || !dwc->pullups_connected) { + if (!dep->endpoint.desc || !dwc->pullups_connected || !dwc->connected) { dev_err(dwc->dev, "%s: can't queue to disabled endpoint\n", dep->name); return -ESHUTDOWN; @@ -2247,6 +2247,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) if (!is_on) { u32 count; + dwc->connected = false; /* * In the Synopsis DesignWare Cores USB3 Databook Rev. 3.30a * Section 4.1.8 Table 4-7, it states that for a device-initiated @@ -2271,7 +2272,6 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % dwc->ev_buf->length; } - dwc->connected = false; } else { __dwc3_gadget_start(dwc); } @@ -3329,8 +3329,6 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) { u32 reg; - dwc->connected = true; - /* * WORKAROUND: DWC3 revisions <1.88a have an issue which * would cause a missing Disconnect Event if there's a @@ -3370,6 +3368,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) * transfers." */ dwc3_stop_active_transfers(dwc); + dwc->connected = true; reg = dwc3_readl(dwc->regs, DWC3_DCTL); reg &= ~DWC3_DCTL_TSTCTRL_MASK; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project