Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3706241imu; Mon, 28 Jan 2019 09:21:25 -0800 (PST) X-Google-Smtp-Source: ALg8bN7IboZmWNYN+uN+CJkNnh4RiOJd/q8UhZ1aAeJFtwELPthIHvWkKb3Hv6E8EUd4B2jNsGuH X-Received: by 2002:a63:587:: with SMTP id 129mr20329107pgf.273.1548696085697; Mon, 28 Jan 2019 09:21:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548696085; cv=none; d=google.com; s=arc-20160816; b=wNvMUOU1TUuxYnciQzjQqtOxRJXXyTo0RhBPU39rLK0cBCZMYFtmxHl5Hqlp67rJxQ WtjK0ROiR9zl/aE6gOU63eX7GENYwWULnKYoxjqOxLIrackcMujchF9mdkkAfYABkeai uvyJpRHnp6agpEkqTtZ/mhvAr2Mtw1aK54xyMzmA9Xm5EjnYNrM97VcrhXd29hfSajTl 5VsE1wGlLkQhzbLdJFs8CErtXwg7roo+eEMHR8tMk+rfp0xiMM3FzLmWMTDRJ3CetkHo x43X2SDgxmC4jrUPe7JFG1YCOo5t72ns9cJBDNOR1TtPODMz1pKak1MD7Fu9oyKlS5re q5hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Xki5mzy3FfuNJwl5w7+Kokc5Ar77z/HUTpfHSvZBXdQ=; b=SA2jf96C+HKvcTDKYuNRfJ/Zj8hkAebZfHo/iplqkESRNo5Ijl5RRLloNlVaVb6JKi cFj4G/SM4O7y63h+knlbuMEN0Apgycp0RjCAJwTiPzXFzrwHqijY35e//jsY7TiCsi5N /1JidFnziPVvSeODF5oCSsyBGK46END9mH0DDFMtOCwJG3QKZk75Fh5XaXUgJchtu00i mKkBTpypnghjzoZfcRoqaX5dvKQ4ImcQt2Dj60WLJcwhB7nNLsPq0/gDjzm4ll9yaLH6 Eqm+kvgwBdBMBDqrs7edbz2zPy+CUk/bXhFC6DhEUUpKZ3EGYOZVXOZxkoxQ4ZlT+JkU oLWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fB0sPUbC; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m65si33641285pfg.282.2019.01.28.09.21.10; Mon, 28 Jan 2019 09:21:25 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fB0sPUbC; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731597AbfA1QEc (ORCPT + 99 others); Mon, 28 Jan 2019 11:04:32 -0500 Received: from mail.kernel.org ([198.145.29.99]:49970 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731564AbfA1QE0 (ORCPT ); Mon, 28 Jan 2019 11:04:26 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B6DDE20989; Mon, 28 Jan 2019 16:04:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548691465; bh=nEFArfkRICKerMzA/bikpjdDUnlsvrIEudBWI1+9V6M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fB0sPUbCo/+bx2fXyiKnPRoK3LUDhEfw/KrY34M/E3nSNqtJov9UX0XgWjRXeJmCj RjGu4X4wAtxwUYgFrsVb5zZOKEpgZPPyWGhvIAAzlJhm4NAS4cdWJ2YoXebD4lIX4N 36jfDm56CCkx6tpiNUj5rABiSP03HxwYRxt74p+o= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Anurag Kumar Vulisha , Felipe Balbi , Sasha Levin , linux-usb@vger.kernel.org Subject: [PATCH AUTOSEL 4.19 102/258] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Date: Mon, 28 Jan 2019 10:56:48 -0500 Message-Id: <20190128155924.51521-102-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190128155924.51521-1-sashal@kernel.org> References: <20190128155924.51521-1-sashal@kernel.org> MIME-Version: 1.0 X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Anurag Kumar Vulisha [ Upstream commit b7a4fbe2300a8965ea760c7e871507b84aea17f6 ] Availability of TRB's is calculated using dwc3_calc_trbs_left(), which determines total available TRB's based on the HWO bit set in a TRB. In the present code, __dwc3_prepare_one_trb() is called with a TRB which needs to be prepared for transfer. This __dwc3_prepare_one_trb() calls dwc3_calc_trbs_left() to determine total available TRBs and set IOC bit if the total available TRBs are zero. Since the present working TRB (which is passed as an argument to __dwc3_prepare_one_trb() ) doesn't yet have the HWO bit set before calling dwc3_calc_trbs_left(), there are chances that dwc3_calc_trbs_left() wrongly calculates this present working TRB as free(since the HWO bit is not yet set) and returns the total available TRBs as greater than zero (including the present working TRB). This could be a problem. This patch corrects the above mentioned problem in __dwc3_prepare_one_trb() by increementing the dep->trb_enqueue at the last (after preparing the TRB) instead of increementing at the start and setting the IOC bit only if the total available TRBs returned by dwc3_calc_trbs_left() is 1 . Since we are increementing the dep->trb_enqueue at the last, the present working TRB is also considered as available by dwc3_calc_trbs_left() and non zero value is returned . So, according to the modified logic, when the total available TRBs is equal to 1 that means the total available TRBs in the pool are 0. Signed-off-by: Anurag Kumar Vulisha Reviewed-by: Thinh Nguyen Tested-by: Tejas Joglekar Signed-off-by: Felipe Balbi Signed-off-by: Sasha Levin --- drivers/usb/dwc3/gadget.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 558949b826d0..a9f22a0a3462 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -910,8 +910,6 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, struct usb_gadget *gadget = &dwc->gadget; enum usb_device_speed speed = gadget->speed; - dwc3_ep_inc_enq(dep); - trb->size = DWC3_TRB_SIZE_LENGTH(length); trb->bpl = lower_32_bits(dma); trb->bph = upper_32_bits(dma); @@ -990,7 +988,7 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, } if ((!no_interrupt && !chain) || - (dwc3_calc_trbs_left(dep) == 0)) + (dwc3_calc_trbs_left(dep) == 1)) trb->ctrl |= DWC3_TRB_CTRL_IOC; if (chain) @@ -1001,6 +999,8 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb, trb->ctrl |= DWC3_TRB_CTRL_HWO; + dwc3_ep_inc_enq(dep); + trace_dwc3_prepare_trb(dep, trb); } -- 2.19.1