Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp8983313ybi; Tue, 23 Jul 2019 19:27:01 -0700 (PDT) X-Google-Smtp-Source: APXvYqy0YsAH05KmeN6bEsn+BD5q92claJYIXrPsr8gZ756B4bb2ByMXQC4RbHyUmEDi16BX134U X-Received: by 2002:a17:90a:19d:: with SMTP id 29mr86885769pjc.71.1563935221576; Tue, 23 Jul 2019 19:27:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563935221; cv=none; d=google.com; s=arc-20160816; b=btk828d4JWSS/BwKEx3b73QmRW/DtWGXgw2iIioONPZxFoe4fFLfMgd+ZV//nwOQqw eChlHh05hayy9JtDpMvUqJ9+g7u2Hc6EKckHu+E75aqFG8GqNU57yxgjQEoDt4BEhUoH 6fvETL3bhY90qtl06GKjFeS6aYo+AbqX0zPTnmRgx5AP7zNQhOhHLh50KYFMiqXRl+jZ tKGoqe+hUWygdZUei2eKJu98ZlDXb9VIri9WEXmMMAio2ArEOL3wHPZah0b1B78hAumg VPbpHGtmG55nC55UncvvzBcZ7otdJtvExt05N+SiHRYsnJ2lxh4Oe6YKyEMMh/FRaQRd yKkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=fyhJlYS/nmZVWKWvi27Hp7abC+DbsGqwswaGohdPOpA=; b=d0BiCfs+16ywIWfqZrIzZm0X423pl1zufvY5+qem8C3DexNBnKz8ZecSnN47sFW80k Tyzka0IwHFILd7HM87y7x2mQ0S7AinHgAgx9rB4izTiL1ctIojM1DhL9v9Kf63jz2qxx zDGsP6QYn0dmPEIZc3bxRDVxHerdRlpllAzAelE/pBw4YsYm6sddUw7GbYyqyXIGNN91 bnIX+4PNbXPoOMCnYPYKOrolqrqlt1txCL1qkJC65tsQkdjeq/YSJHzuVBLa59rEWg/G ELpVJBAXjEKPvFZJ9vQVj/fAr8iYpZEjQjgBKsTsR5dw1BFxo+HF0M24ouPn2eh4Nj0O XCsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=zYaV2dx0; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x66si4837502pfd.156.2019.07.23.19.26.45; Tue, 23 Jul 2019 19:27:01 -0700 (PDT) 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=@linaro.org header.s=google header.b=zYaV2dx0; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391575AbfGWSwD (ORCPT + 99 others); Tue, 23 Jul 2019 14:52:03 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:42030 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726621AbfGWSwC (ORCPT ); Tue, 23 Jul 2019 14:52:02 -0400 Received: by mail-wr1-f65.google.com with SMTP id x1so29286124wrr.9 for ; Tue, 23 Jul 2019 11:52:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=fyhJlYS/nmZVWKWvi27Hp7abC+DbsGqwswaGohdPOpA=; b=zYaV2dx0GCGELJRDEgnEx66kKYH6fLEWGmcTfHxHp8NiO832NO1LV81qL8RIhK9Tsj hAmNwACbpLQr/SARJZqkrV5Brs/mkIBkJ66SR8RQrdD3P8Rb74m8ALaG3ZvugP6HISMV lVG8R8vkB1aqiPQy4ff57S+GbKMrdWCYRLA27pDhg2fyAUHppqyPmvyBX3EoRwzX4vea nDktXIkOmtngTtXxPpPG4fWhlq3hNuDtaCSJjzwI/wh92oa9M7XzcbntymOu0moJLN7+ 2UZTvjHbBH9fBJ04/M14wCNpciOtmbW2JiwZp1oPyB78/W1tEXGQG6PB73YGjqJBft9T TwNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=fyhJlYS/nmZVWKWvi27Hp7abC+DbsGqwswaGohdPOpA=; b=K6hr38H+VVlttoLOEROFevn5K3CJIZxa27/au4sVaZUcE/4mmKDBF7z2RkI3VT+r1i 3JGI9emyys+OsRQBAVzJWzHDP3yTAL6zk9t4Z197G+Z1DdLcg6LBfm8IBvaj+LBOdyAz D20JPzie0Vqw7ghhk/T0qSVIkr3UQ1oi3rP97+uH8Jc4qqyfpe7rtJMO1lMXo8nauIhp mUvfuRnydhxOqLD04AK3FY/+urYYnMvqAX6kV5v8R68mp5KEW3Rao5BMSix2fapq5Qu3 IDTe9lLwpZF5u6CNoqWNGznhFJIunGYhKNaAtOP3w//KPiSvrPDmDUqURapXm/gRiBjJ ixcQ== X-Gm-Message-State: APjAAAUsEUB9fi/GRvUvN6tgdcDNSaJ2GVeb81xHeILyfyL2BtGE+wU1 ZOJsmlT7aut5OrOLRIkdHJSojh7TL5nqTsFoUbfv4w== X-Received: by 2002:a05:6000:145:: with SMTP id r5mr3390652wrx.208.1563907919536; Tue, 23 Jul 2019 11:51:59 -0700 (PDT) MIME-Version: 1.0 References: <1563497183-7114-1-git-send-email-fei.yang@intel.com> In-Reply-To: From: John Stultz Date: Tue, 23 Jul 2019 11:51:47 -0700 Message-ID: Subject: Re: [PATCH v3] usb: dwc3: gadget: trb_dequeue is not updated properly To: Thinh Nguyen Cc: "fei.yang@intel.com" , "felipe.balbi@linux.intel.com" , "andrzej.p@collabora.com" , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "gregkh@linuxfoundation.org" , "stable@vger.kernel.org" Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jul 18, 2019 at 6:12 PM Thinh Nguyen wrote: > fei.yang@intel.com wrote: > > From: Fei Yang > > > > If scatter-gather operation is allowed, a large USB request is split into > > multiple TRBs. These TRBs are chained up by setting DWC3_TRB_CTRL_CHN bit > > except the last one which has DWC3_TRB_CTRL_IOC bit set instead. > > Since only the last TRB has IOC set for the whole USB request, the > > dwc3_gadget_ep_reclaim_trb_sg() gets called only once after the last TRB > > completes and all the TRBs allocated for this request are supposed to be > > reclaimed. However that is not what the current code does. > > > > dwc3_gadget_ep_reclaim_trb_sg() is trying to reclaim all the TRBs in the > > following for-loop, > > for_each_sg(sg, s, pending, i) { > > trb = &dep->trb_pool[dep->trb_dequeue]; > > > > if (trb->ctrl & DWC3_TRB_CTRL_HWO) > > break; > > > > req->sg = sg_next(s); > > req->num_pending_sgs--; > > > > ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req, > > trb, event, status, chain); > > if (ret) > > break; > > } > > but since the interrupt comes only after the last TRB completes, the > > event->status has DEPEVT_STATUS_IOC bit set, so that the for-loop ends for > > the first TRB due to dwc3_gadget_ep_reclaim_completed_trb() returns 1. > > if (event->status & DEPEVT_STATUS_IOC) > > return 1; > > > > This patch addresses the issue by checking each TRB in function > > dwc3_gadget_ep_reclaim_trb_sg() and maing sure the chained ones are properly > > reclaimed. dwc3_gadget_ep_reclaim_completed_trb() will return 1 Only for the > > last TRB. > > > > Signed-off-by: Fei Yang > > Cc: stable > > --- > > v2: Better solution is to reclaim chained TRBs in dwc3_gadget_ep_reclaim_trb_sg() > > and leave the last TRB to the dwc3_gadget_ep_reclaim_completed_trb(). > > v3: Checking DWC3_TRB_CTRL_CHN bit for each TRB instead, and making sure that > > dwc3_gadget_ep_reclaim_completed_trb() returns 1 only for the last TRB. > > --- > > drivers/usb/dwc3/gadget.c | 11 ++++++++--- > > 1 file changed, 8 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > > index 173f532..88eed49 100644 > > --- a/drivers/usb/dwc3/gadget.c > > +++ b/drivers/usb/dwc3/gadget.c > > @@ -2394,7 +2394,7 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep, > > if (event->status & DEPEVT_STATUS_SHORT && !chain) > > return 1; > > > > - if (event->status & DEPEVT_STATUS_IOC) > > + if (event->status & DEPEVT_STATUS_IOC && !chain) > > return 1; > > > > return 0; > > @@ -2404,11 +2404,12 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep, > > struct dwc3_request *req, const struct dwc3_event_depevt *event, > > int status) > > { > > - struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue]; > > + struct dwc3_trb *trb; > > struct scatterlist *sg = req->sg; > > struct scatterlist *s; > > unsigned int pending = req->num_pending_sgs; > > unsigned int i; > > + int chain = false; > > int ret = 0; > > > > for_each_sg(sg, s, pending, i) { > > @@ -2419,9 +2420,13 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep, > > > > req->sg = sg_next(s); > > req->num_pending_sgs--; > > + if (trb->ctrl & DWC3_TRB_CTRL_CHN) > > + chain = true; > > + else > > + chain = false; > > > > ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req, > > - trb, event, status, true); > > + trb, event, status, chain); > > if (ret) > > break; > > } > > There was already a fix a long time ago by Anurag. But it never made it > to the kernel mainline. You can check this out: > https://patchwork.kernel.org/patch/10640137/ So, back from a vacation last week, and just validated that both Fei's patch and a forward ported version of this patch Thinh pointed out both seem to resolve the usb stalls I've been seeing sinice 4.20 w/ dwc3 hardware on both hikey960 and dragonboard 845c. Felipe: Does Anurag's patch above make more sense as a proper fix? thanks -john