Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp330483ybz; Tue, 21 Apr 2020 22:13:44 -0700 (PDT) X-Google-Smtp-Source: APiQypKm76XovGLs0seRtwcfKXhIF2h2yxCB2wrX6LEme7w6kVOnk/4rJAQx1Nxo6INdwY2ZOekI X-Received: by 2002:a17:906:4548:: with SMTP id s8mr23852146ejq.349.1587532424030; Tue, 21 Apr 2020 22:13:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587532424; cv=none; d=google.com; s=arc-20160816; b=MLCqsoPgxHpyJWE7YXevqcoVqnypC/NUmaioLkdYSHID7jO6oTCZ0HVtMQgeL6vyxD zanX0c74ff2gYPocE3dVFg5Dvh7jXQUOnie992AbXzXi8q6VjpWXwcxjGdcTh4fql/Ly dBWCKx9A41bNA4ajLlFENmtV0BcWcEVmgqY6mvfjzzMs+WdZU67ULFaS+Mf9ODEYgKvg yirgzQZc42fd8siJWI/quGzIUqlDZQHy8NST3Q/vm2kd0alH9/AFLGILvVFaDk82T69w 8c6rVFnc91gFQHbqk4i/ixXGxwNGPW6Ys00Irmx7Q/EDVs8pG9x31EuKfJysKVUBJTSo axrg== 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=m5LJs8OCYtoiaa1WpPfPHy0Im1CBN5FUEi59T95x5pc=; b=JBRHxfGPo3fAOVuqhPMRUwrpxpdgIN67v/dKoN5oKy3VI4XB/trX+YmCIsejMueXQc WrQqZcR2aYi+5C0oY5LC7UcXTQEvcrW58PedH4yW5ABDSyyuQQwAQyIvuqa+GASgkJx5 tn76I24hR8bOm/c583Ix1eUbU7us/J04b8dCLaQc2UCHufM9LjQoBGdVU8LvwHuqcwMl xGv3o0YWfuzwD0RTAW+fVDcMWU6ma4hu7DmQXYWoiTdXOjEQdGbUizndosQdeL1NDoX5 4D4eGf7FQ13cux/UBXdoh3gbluLf9dqYw2OqBJDrzL5j92frvE8IoXmP/99PsTtzv6dX CrEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=QPFKKrsN; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x16si2777159eds.487.2020.04.21.22.13.16; Tue, 21 Apr 2020 22:13:44 -0700 (PDT) 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=@linaro.org header.s=google header.b=QPFKKrsN; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726033AbgDVFJj (ORCPT + 99 others); Wed, 22 Apr 2020 01:09:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43440 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725787AbgDVFJj (ORCPT ); Wed, 22 Apr 2020 01:09:39 -0400 Received: from mail-ot1-x343.google.com (mail-ot1-x343.google.com [IPv6:2607:f8b0:4864:20::343]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 621FFC061BD3 for ; Tue, 21 Apr 2020 22:09:39 -0700 (PDT) Received: by mail-ot1-x343.google.com with SMTP id b13so1066765oti.3 for ; Tue, 21 Apr 2020 22:09:39 -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=m5LJs8OCYtoiaa1WpPfPHy0Im1CBN5FUEi59T95x5pc=; b=QPFKKrsN5XoPK/cGxa3UYGDE8OE2TIzoh66phZcNzO+yLmQwwff5EqxUWG4CZlJePr /MtEV6Hf/4M6GfONyptmEln7jog97FZntgfVQ7zViC8d38bVtKmLOJ9gLVmMg28E/gfB bwEk+1Ctv0qmsJcsArUEPaDUk4M5cACjJbV2XExu6w/kxk43rKaxQEyT0U207E3VGskj nUKkS9PVowVv3cMjj9ujA6guMioD/Ulyq/TAQW5zDFEgKYukQih3QCsWm6BNT6IaBPXt 3Gt8txN9wxxI7+rRCLVdoCBFFrZIp45qo2Oa4N6y/Nh2KQIEDZ4tzwuss7R3cpY9uRXA hWRQ== 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=m5LJs8OCYtoiaa1WpPfPHy0Im1CBN5FUEi59T95x5pc=; b=MnyzX/i54/sI9nIyfSsQ+rT+rGeWoc7ds/p9hPGlfScjQXgspI40BwwfZviKdjHR32 ykQws3Tw+ZBrfLdNamcjX8ebs4AaC+zCtF1w6igcPRkaHTOlvjg04jXTcXIXXlVQXBGw 4znn2mQ2HIhN083QHArLvckZo60AywQsOCv2SjE2tYFo8IZ2YmPnxIwT1a9qjMhO4R/9 LqbkYkVdmjsJPMSbtl9HvLI4J3/1eKz/JP3xHgtIZsqYApub2QB+8CDAsgaUTOC5Etdu c5BJ4kj+Cjg4sYv9l3dPkKC9Tn8bZpsclXO/hZ7Fw4hjrUXwo15VRDqt9wLKquGyrhjQ sB4g== X-Gm-Message-State: AGi0PuYFwR0TMWM0pYbZMKHNdLZM7tKtGtlbN//doKqScyEatJP9SbKK 3hq1rnV03Ni87oQg5YOUXddqn2KhZ7XYdmk+3dJpKQ== X-Received: by 2002:a9d:3988:: with SMTP id y8mr15530511otb.352.1587532178717; Tue, 21 Apr 2020 22:09:38 -0700 (PDT) MIME-Version: 1.0 References: <877dyfsv00.fsf@kernel.org> In-Reply-To: From: John Stultz Date: Tue, 21 Apr 2020 22:09:27 -0700 Message-ID: Subject: Re: More dwc3 gadget issues with adb To: Felipe Balbi Cc: Josh Gao , YongQin Liu , Anurag Kumar Vulisha , Yang Fei , Thinh Nguyen , Tejas Joglekar , Andrzej Pietrasiewicz , Jack Pham , Todd Kjos , Greg KH , Linux USB List , lkml 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 Tue, Apr 21, 2020 at 9:38 PM John Stultz wrote: > > On Thu, Apr 16, 2020 at 1:19 AM Felipe Balbi wrote: > > One thing I noticed is that we're missing a giveback on ep1out. Here's a > > working case: > > > > Hey Felipe, > So I found some time to dig around on this today and I started > trying to understand this issue that you've pointed out about missing > the giveback. > > It seems part of the issue is we get to a point where we have some req > where pending_sgs is more than one. > > We call dwc3_prepare_one_trb_sg() on it: > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc3/gadget.c?h=v5.7-rc2#n1068 > > And we process the sg list incrementing req->num_queued_sgs for each one. > > then later, dwc3_gadget_ep_cleanup_completed_request() is called on the request: > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc3/gadget.c?h=v5.7-rc2#n2522 > > We call dwc3_gadget_ep_reclaim_trb_sg() > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc3/gadget.c?h=v5.7-rc2#n2470 > > Where we iterate over the req->sg, ideally decrementing > num_pending_sgs each time and return. > > But back in dwc3_gadget_ep_cleanup_completed_request() and there > we're hitting the: > if (!dwc3_gadget_ep_request_completed(req) || > req->num_pending_sgs) { > case which causes us to skip the call to dwc3_gadget_giveback(). > > Looking as to why the num_pending_sgs is non zero, that's because in > dwc3_gadget_ep_reclaim_trb_sg we're hitting the case where the trb has > the DWC3_TRB_CTRL_HWO ctrl flag set, which breaks us out of the loop > early before we decrement num_pending_sgs. > > For that trb, we're setting the HWO flag in __dwc3_prepare_one_trb() > (called from dwc3_prepare_one_trb_sg() back at the beginning): > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc3/gadget.c?h=v5.7-rc2#n921 > > I added logic showing every time we set or clear that flag, and it > seems like we're always setting it but never clearing it. And often > that's not an issue as we only have one sg entry. But if its set on a > trb in a request with multiple sgs, that's where it seems to be > causing the issue. > > I'll continue to dig around to try to understand where it might be > going awry (why we never clear the HWO flag). But figured I'd try to > explain this much in case it rings any bells to you. I was looking some more at this and it seems a little odd... In dwc3_gadget_ep_reclaim_trb_sg(): https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc3/gadget.c?h=v5.7-rc2#n2470 The check for (trb->ctrl & DWC3_TRB_CTRL_HWO) which breaks us out of the loop happens before we call dwc3_gadget_ep_reclaim_completed_trb(): https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/dwc3/gadget.c?h=v5.7-rc2#n2406 Which is what clears the DWC3_TRB_CTRL_HWO flag (outside of dwc3_gadget_ep_skip_trbs()). So on a whim I dropped that check, and things go back to working on HiKey960, no more adb stalls! Does something like this make sense? It's not causing trouble on db845c either so far in my testing. thanks -john (sorry gmail will whitespace corrupt this code paste - just want to communicate what I did clearly, not to apply) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 4d3c79d90a6e..2a26d33520ce 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2457,9 +2457,6 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep, 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--;