Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp769103pxf; Thu, 11 Mar 2021 14:36:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJztsSZ4ZrWRvjVqqLQ0DnYRgd6zVRRfZGr4USIw1GdcKFHpxeeM48hpEIqMtRvBFt8xwPH4 X-Received: by 2002:a17:906:565a:: with SMTP id v26mr5421083ejr.516.1615502204938; Thu, 11 Mar 2021 14:36:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615502204; cv=none; d=google.com; s=arc-20160816; b=ZU24g07byLyIECyCFISdie9PKDU4sXcuG7pVZlyj8hbOh8p0CCcvEjC0kQwHTh8qOj ovVSFCmMMPv2l3q5P6Sm6URR+okc3vc6tTGYTp3LmYCzFaA/T0lLfh56sPW+dj5gGyLc zeYvD6czX3eyqvUkKyFmb/cVLKPtVjMhC0f2zxpT6ERAXkRRqufr8fScTiEScrMyp8sR NGEDtEtp1zHrJxh4wNSL0bcqMWe24FX/o6B75OauFGhDptOa6DuWSJON+WzkI7ytAb0i 3OTUs3/dg2Vt0GYoloailt35B0L7BAO+VmGybd7rc/5efsE8as0xNbKg/FKzNADmXIug cMSg== 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=gPRKyBExqJQNkPdn6dFYBYsorDab2vJPOI9Ls/gdbzc=; b=O7+/Khw6jFfclQUmNP58XLgod4+l3uprym1cnDhdI68i5j1Ut7tYLe71gaAaFIAMML cYxBVx8qrm35rikksqexTu8a422duMCP/vfptiFVyMHgtydkcOcLmfm11J41QdlCvcQt cwZ+vO691/w7eXn+RvuP7vRpbJlbSblYHEUXnLK1N6Zi6FlU0BUipc8M5SkhnotJIFtC ZIpQoNmJePGf/PMz+5Nf6xW4iJ44B1ibsuIvgX5DmS2V+GpryRfeaW21Pb6RqbtVWH5n RyG00y56UbLpkh5GfdkeQni2fFeMTJ3XvcND7Hc8D3c7qFwJKgrrjFjxwIstKIoB1Ru2 zOow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=nPOUbNtA; 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 bx12si2755414edb.404.2021.03.11.14.36.22; Thu, 11 Mar 2021 14:36:44 -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=nPOUbNtA; 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 S230231AbhCKWfH (ORCPT + 99 others); Thu, 11 Mar 2021 17:35:07 -0500 Received: from z11.mailgun.us ([104.130.96.11]:59316 "EHLO z11.mailgun.us" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229938AbhCKWe4 (ORCPT ); Thu, 11 Mar 2021 17:34:56 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1615502095; h=Message-Id: Date: Subject: Cc: To: From: Sender; bh=gPRKyBExqJQNkPdn6dFYBYsorDab2vJPOI9Ls/gdbzc=; b=nPOUbNtAkNktJ4m3F0+FlEABCFiCADcXjv7a8mFDw/dmOrHTYTqJ0nouSyY9yTOHlv4XqoXv z+kgITA7q9DIXvTZm1Tb/I+5QGCCycJ2K7fq0Goed92ny5BeepR4TUKqWtZ/NAM3Wiu5cICz hTHamE/EYmfjPoYENj7xuYCtxqE= 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-n07.prod.us-west-2.postgun.com with SMTP id 604a9afde2200c0a0dce15a3 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 11 Mar 2021 22:34:37 GMT Sender: wcheng=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 4E81CC433CA; Thu, 11 Mar 2021 22:34:37 +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, URIBL_BLOCKED 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 54268C433C6; Thu, 11 Mar 2021 22:34:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 54268C433C6 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 v2] usb: dwc3: gadget: Prevent EP queuing while stopping transfers Date: Thu, 11 Mar 2021 14:34:30 -0800 Message-Id: <1615502070-19705-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 V1: - Added Fixes tag to point to the commit this is addressing drivers/usb/dwc3/gadget.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 4780983..4d98fbf 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 @@ -3329,8 +3330,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 +3369,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