From patchwork Tue Jul 23 20:27:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 169557 Delivered-To: patches@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp9319351ilk; Tue, 23 Jul 2019 13:27:44 -0700 (PDT) X-Received: by 2002:a63:4f58:: with SMTP id p24mr13975457pgl.50.1563913664005; Tue, 23 Jul 2019 13:27:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563913664; cv=none; d=google.com; s=arc-20160816; b=DuvOkQQwqpxYg2hic9FsjFMzsxxO5Eq443gSFBC4wvnrwvQh57fDcItcnrsOdX2Yza pXMyiuEXyUJJWIX4noioZEP6syv+Aa+UEGlxb9mdaVU0grFcAjxrQsA7ncOENHINiv3K uqC0iBzZXJX9YiPVA8M+MNLdoK6G+j86lE6TR+5U73XBZCC3r5vqfti4W5nKwyi2xWgj STrj4dJze1KkpCy2pOjDdmLbE7f6xVOHZusazHF0wWOg5/Yk6puJzO3SxJeQuxvv0zdB hf+PN++1iDNjHTw8OMAtwNpzmuTl260q7Upshx9rCVWZCPK7Ps9Rl7ac1PSV71Alf0eX 22aw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=WOfhFeRwrk1NDQAubrKcIwqzw+J4sPXSqFL3j8L4jQk=; b=s+WKLPMGsBtcegQ9IgY0W0XlYg7LaOSDYH/aYTMNYjdJDnLReg9wz8n/vHUS/Qdmno kCrUgMZVBtVKSwNHMrrfL8eaegyxG2m95FNiohIYt3XuRdngphDfPHAWFfZ52dflXvIo bACgXYs1pF8tZp7PVBaBg3px8Zr48RKSje6ruYavpFo0AENcRZcsKTZFqGThj9/ee3vw r+6N8sJ5RQoa5YiUn/20wNqC5mzbwy7zy8uXFxdS98jjFFTFEgngsBErzYPao48fvWXT 0zzBLD5EuxIjhzRD2yDF9HPYT5WYDvUUd1EeYt7Ii5JNmsASF2xOg7sYSJrxspzlt6Zh EWUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=JezetA0N; spf=pass (google.com: domain of john.stultz@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id v10sor53678599pjy.12.2019.07.23.13.27.43 for (Google Transport Security); Tue, 23 Jul 2019 13:27:43 -0700 (PDT) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=JezetA0N; spf=pass (google.com: domain of john.stultz@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WOfhFeRwrk1NDQAubrKcIwqzw+J4sPXSqFL3j8L4jQk=; b=JezetA0Nxiw1OmCAW2DXcbq3AmvNuAKkd8EZaqtaZE02yn5PvkQjeWHGm89Hdz/5x0 ZL73gKx15WWh+UArNMwog4UBdRwhmA8Aays93Bv5o44Kj6UuElrGHFE0oqlQ6L7Lu2kJ 0jDtfZU+Wr3MXAV4msLIdr/sT1MbA82oTkWRSPhySp0tLXs+dR9/YHF/3UQOUU/Y3OJp FrOqsBBL9FByy1fTW5o4xilcETT+or2inIAtjcbVo+EjXq7WpE9JQMUUBkFJ9aiw4fyv DgxZdF2eLiLg8U5C9f4yWFJ8D1QS4s4Nb9UfauWvP+esjMgTbNPzSAx6zFw3Fr8GkPco fmBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WOfhFeRwrk1NDQAubrKcIwqzw+J4sPXSqFL3j8L4jQk=; b=jz7qoZL/IP6Nck06AZWbx9giyMadpjmvojfhMMesouJb9lCJVYUtpFqoJtFKeheeFx k3c0lh/St2jIE283M4E5ALjkmg75JXhIWyWy98x03Bw3uDMTGJ1OXmu5qDc0TKXdjABe 59z9ImxmRkEoLVoJ/JDSdBvh21h5z32C9tN+IpB3gFSWUT1RsxU6PjIOGptyF8ljdIQN TOOoWZLrRv7i20bHGSQgRrWQY9TRoGkiPS0/+S0Df6XPjOlnOWF4lTtDrksEX1vXqChy qlIE/YHkIJHEjHUnmcLw7jRkSCSkyVVGch2O1T/SVSXbStsxslD5RPaoZAVzQNVz/NZs cnyQ== X-Gm-Message-State: APjAAAX/ZGoGDCGNoxuc82+nU9/QlvN24YC1fljX1of0mkG8NZ3+DY3U HhLapIcIYt7SHNJ9JNsVGTFkJ35f X-Google-Smtp-Source: APXvYqwRAuZr7uU9qydDUT8b6JlLLZPXYg4os9EGyOFJ139Z/P8r3tDqZio8CygZ1zwDz3EFcrGD9Q== X-Received: by 2002:a17:90a:109:: with SMTP id b9mr79845273pjb.112.1563913663333; Tue, 23 Jul 2019 13:27:43 -0700 (PDT) Return-Path: Received: from localhost.localdomain ([2601:1c2:680:1319:692:26ff:feda:3a81]) by smtp.gmail.com with ESMTPSA id r2sm59205538pfl.67.2019.07.23.13.27.41 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 23 Jul 2019 13:27:42 -0700 (PDT) From: John Stultz To: linux-kernel@vger.kernel.org Cc: Anurag Kumar Vulisha , Felipe Balbi , Fei Yang , Thinh Nguyen , Tejas Joglekar , Andrzej Pietrasiewicz , Greg KH , Linux USB List , stable , John Stultz Subject: [PATCH] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields Date: Tue, 23 Jul 2019 20:27:35 +0000 Message-Id: <20190723202735.113381-1-john.stultz@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: From: Anurag Kumar Vulisha The present code in dwc3_gadget_ep_reclaim_completed_trb() will check for IOC/LST bit in the event->status and returns if IOC/LST bit is set. This logic doesn't work if multiple TRBs are queued per request and the IOC/LST bit is set on the last TRB of that request. Consider an example where a queued request has multiple queued TRBs and IOC/LST bit is set only for the last TRB. In this case, the Core generates XferComplete/XferInProgress events only for the last TRB (since IOC/LST are set only for the last TRB). As per the logic in dwc3_gadget_ep_reclaim_completed_trb() event->status is checked for IOC/LST bit and returns on the first TRB. This makes the remaining TRBs left unhandled. To aviod this, changed the code to check for IOC/LST bits in both event->status & TRB->ctrl. This patch does the same. At a practical level, this patch resolves USB transfer stalls seen with adb on dwc3 based Android devices after functionfs gadget added scatter-gather support around v4.20. Cc: Felipe Balbi Cc: Fei Yang Cc: Thinh Nguyen Cc: Tejas Joglekar Cc: Andrzej Pietrasiewicz Cc: Greg KH Cc: Linux USB List Cc: stable Tested-By: Tejas Joglekar Reviewed-by: Thinh Nguyen Signed-off-by: Anurag Kumar Vulisha [jstultz: forward ported to mainline, added note to commit log] Signed-off-by: John Stultz --- Just wanted to send this out so we're all looking at the same thing. Not sure if its correct, but it seems to solve the adb stalls I've been seeing for awhile. thanks -john drivers/usb/dwc3/gadget.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) -- 2.17.1 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index c9cecb3a9670..1d9701dde69b 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2394,7 +2394,12 @@ 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) && + (trb->ctrl & DWC3_TRB_CTRL_IOC)) + return 1; + + if ((event->status & DEPEVT_STATUS_LST) && + (trb->ctrl & DWC3_TRB_CTRL_LST)) return 1; return 0;