Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2738259imj; Mon, 11 Feb 2019 07:45:43 -0800 (PST) X-Google-Smtp-Source: AHgI3IZLKK/dG9djDN9Xy9/HfuhfBOjEYfIGM08qme4IpOaMt8zObYmn/AqvUBNB/lNyULp+/loN X-Received: by 2002:a63:d84b:: with SMTP id k11mr30136552pgj.142.1549899942938; Mon, 11 Feb 2019 07:45:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549899942; cv=none; d=google.com; s=arc-20160816; b=Zb3lsHGWKI2K8PDH9cS6gXFYMqbazvdICTsf3GEbrYx6PMNTAYrTiiO7aX2h3+rYCP vDxr9uJQsaLZgFe/+mLN6Z7hLkvXB1JMDfpK07jDDayg1q5eUkYITv7OAeU70UO4Kz3z Tae/FysC1jbPl1HkRcl6ldLZWL+Y/s2Rft8x5K0yv0t9V+Fb/lVqwQBMvai9474x2boA 6d3BPwN8FPt+GGYcqz5LgQkKf9rQAVsN+KEIkJMhw0NfA1gOTytUqYXY3OpBU5atQlp4 8QyAMq/nvGP2ICww4g9ylTHsAaDb2AZvdVrTlgxJsRHp94MeS82E3+B67d50TsYBmIm+ rrNQ== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=daGBDj0eFpYFHygcetyOta4RICj+5/Q53wE75bgurrg=; b=RaaU1UO0Dngeewkuje35hbaTLn3UwlhzP0qOqyocPkngM1oomy9E0uoHCtsCjWnON8 7gIVyO2Fq6BToNGn8A7lLyKPiDUANvuoEe+7gW/P0x9GXSq0A2ktPbiNcp2BKlHxe1JX d7q8yKH09CirCvSoIGj6SNvek3K4aMUVfWDOV2zVsOEXklp1krsVE8QyaZbZ0HrvzoXm wB/fN82GX28MZrRHaykLaHJDShpPh1r0xnuNUgp4J7XxElvv6bDvfigO/4jhcuDl224R Zr0JmgHfpoMcEVlWcHl3xc5z8BmVcd2q6yaN7Ck34hn0ahtuCkES7CQDW5OEKnZAerdi 1vcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yhvjcDRj; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bf3si4504794plb.407.2019.02.11.07.45.26; Mon, 11 Feb 2019 07:45:42 -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=yhvjcDRj; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732821AbfBKOoX (ORCPT + 99 others); Mon, 11 Feb 2019 09:44:23 -0500 Received: from mail.kernel.org ([198.145.29.99]:57072 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731777AbfBKOoV (ORCPT ); Mon, 11 Feb 2019 09:44:21 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5BCF920700; Mon, 11 Feb 2019 14:44:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1549896260; bh=Di/FUz1fCdjZF4SMOBFco0LFj0EC9J0i/Gt7oL7nZAk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yhvjcDRjYLQrzn2dM5W6btpRSp78flN2W/vdAKgSX2YUau86HhNj8DWM30+ubjQep UITDeg7epERX+4cgWm0/toPFNp5Rtlorkx+eOP4ceL7quqO8mGc4CZGBgJu0M3dC3a mw6ktaRTeLCupO11zPGcvrcX0iNXTet8H4fyBpvw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Anurag Kumar Vulisha , Thinh Nguyen , Tejas Joglekar , Felipe Balbi , Sasha Levin Subject: [PATCH 4.19 095/313] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Date: Mon, 11 Feb 2019 15:16:15 +0100 Message-Id: <20190211141900.215100675@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190211141852.749630980@linuxfoundation.org> References: <20190211141852.749630980@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ 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 d8bf9307901e..74d29159f3b9 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -912,8 +912,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); @@ -992,7 +990,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) @@ -1003,6 +1001,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