From patchwork Tue Mar 31 08:40:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thinh Nguyen X-Patchwork-Id: 11466965 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D828B159A for ; Tue, 31 Mar 2020 08:40:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B7966212CC for ; Tue, 31 Mar 2020 08:40:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=synopsys.com header.i=@synopsys.com header.b="EEHetHTJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730130AbgCaIki (ORCPT ); Tue, 31 Mar 2020 04:40:38 -0400 Received: from smtprelay-out1.synopsys.com ([149.117.87.133]:33328 "EHLO smtprelay-out1.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726488AbgCaIkh (ORCPT ); Tue, 31 Mar 2020 04:40:37 -0400 Received: from mailhost.synopsys.com (sv2-mailhost1.synopsys.com [10.205.2.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtprelay-out1.synopsys.com (Postfix) with ESMTPS id 6C4B9C0F3C; Tue, 31 Mar 2020 08:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1585644037; bh=gqFs5GBRR0/mdABAZSL2Z2tRlGeg16ZQ4Vz+ShxUxBU=; h=Date:From:Subject:To:Cc:From; b=EEHetHTJ7DbxKhBsrhn8r8T7bT8QgJ7ZKZ7ZK4sF6ylHR0+ksk0gADmji86+Fd/eY /KVn5SRMs0ZN55uOsLA+ZbJsAVtuP3QcCOe752fL/umu8I5hCTiZ6JANi3+ctf3gG7 bU7qpZE6ZyXuDrsnNCWygMwe7EYNp144X3vlwF/aFCj0/lxD9uUzysXWNDar3q0TZg QhArgDAon/l5BhgvE+V9meMhCrPjCQynYsW07XsU958FQp4y+D9Y9vWGwcitkU8SDr 6VDBbkDHjTvPv5ZjsNMqtlbXeq55oyNZQ3+XdO+5MvXtvgZH7/96aBCAgD+jc6AFye 3vHyOuunG5G0A== Received: from te-lab16 (nanobot.internal.synopsys.com [10.10.186.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mailhost.synopsys.com (Postfix) with ESMTPSA id C847EA007C; Tue, 31 Mar 2020 08:40:35 +0000 (UTC) Received: by te-lab16 (sSMTP sendmail emulation); Tue, 31 Mar 2020 01:40:35 -0700 Date: Tue, 31 Mar 2020 01:40:35 -0700 Message-Id: From: Thinh Nguyen Subject: [PATCH v2 1/2] usb: dwc3: gadget: Fix request completion check To: Felipe Balbi , Greg Kroah-Hartman , linux-usb@vger.kernel.org Cc: John Youn , Thinh Nguyen , stable@vger.kernel.org Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org A request may not be completed because not all the TRBs are prepared for it. This happens when we run out of available TRBs. When some TRBs are completed, the driver needs to prepare the rest of the TRBs for the request. The check dwc3_gadget_ep_request_completed() shouldn't be checking the amount of data received but rather the number of pending TRBs. Revise this request completion check. Cc: stable@vger.kernel.org Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling") Signed-off-by: Thinh Nguyen --- Changes in v2: - Add Cc: stable tag drivers/usb/dwc3/gadget.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 1a4fc03742aa..c45853b14cff 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2550,14 +2550,7 @@ static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep, static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req) { - /* - * For OUT direction, host may send less than the setup - * length. Return true for all OUT requests. - */ - if (!req->direction) - return true; - - return req->request.actual == req->request.length; + return req->num_pending_sgs == 0; } static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, @@ -2581,8 +2574,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, req->request.actual = req->request.length - req->remaining; - if (!dwc3_gadget_ep_request_completed(req) || - req->num_pending_sgs) { + if (!dwc3_gadget_ep_request_completed(req)) { __dwc3_gadget_kick_transfer(dep); goto out; } From patchwork Tue Mar 31 08:40:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thinh Nguyen X-Patchwork-Id: 11466967 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F28ED15AB for ; Tue, 31 Mar 2020 08:40:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D0E4720B80 for ; Tue, 31 Mar 2020 08:40:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=synopsys.com header.i=@synopsys.com header.b="CcSaew1J" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730131AbgCaIko (ORCPT ); Tue, 31 Mar 2020 04:40:44 -0400 Received: from smtprelay-out1.synopsys.com ([149.117.73.133]:33664 "EHLO smtprelay-out1.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726488AbgCaIko (ORCPT ); Tue, 31 Mar 2020 04:40:44 -0400 Received: from mailhost.synopsys.com (sv2-mailhost2.synopsys.com [10.205.2.134]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtprelay-out1.synopsys.com (Postfix) with ESMTPS id AB76C401AB; Tue, 31 Mar 2020 08:40:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1585644043; bh=orwox/7oEKwbKl44skozLhJL5crpioMAIG9/u5SFNTw=; h=Date:In-Reply-To:References:From:Subject:To:Cc:From; b=CcSaew1JkJ4v1+pWQwkhskpA8EzVGMe4bJ2d0l1uyiyv2sauKf4D+OA2T/rGgu6En h9H4dryxZkpP4Z/n/JbpEb2v1GmP2RMLaZEBA+UNXtTmZp2ibTHViutJmWOq1aJwCd HhS/xQmjlRLIjXnfuZsnazqzLTtqwLpjzd44UvDuFZXFLm5/aJ2lsIR8t/xG41+nnG Z2bvyisQhbP1BCpo/zDYSZiP/RGFk3dkBiZpmx+USWDYaFYWd5QNhAvv2HjWMcxugd yw+7NVDxZJC2WhsNBLwAK/VTpaXzHzxu4TXR0kPN3GzqdaSOl6KFqjQm6U/v4cwhwZ Odaytl0tcs1hw== Received: from te-lab16 (nanobot.internal.synopsys.com [10.10.186.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mailhost.synopsys.com (Postfix) with ESMTPSA id 56F32A007B; Tue, 31 Mar 2020 08:40:42 +0000 (UTC) Received: by te-lab16 (sSMTP sendmail emulation); Tue, 31 Mar 2020 01:40:42 -0700 Date: Tue, 31 Mar 2020 01:40:42 -0700 Message-Id: In-Reply-To: References: From: Thinh Nguyen Subject: [PATCH v2 2/2] usb: dwc3: gadget: Continue to process pending requests To: Felipe Balbi , Greg Kroah-Hartman , linux-usb@vger.kernel.org Cc: John Youn , Thinh Nguyen Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org If there are still pending requests because no TRB was available, prepare more when started requests are completed. Introduce dwc3_gadget_ep_should_continue() to check for incomplete and pending requests to resume updating new TRBs to the controller's TRB cache. Signed-off-by: Thinh Nguyen --- Changes in v2: - None drivers/usb/dwc3/gadget.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index c45853b14cff..3c4024d34434 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2574,10 +2574,8 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, req->request.actual = req->request.length - req->remaining; - if (!dwc3_gadget_ep_request_completed(req)) { - __dwc3_gadget_kick_transfer(dep); + if (!dwc3_gadget_ep_request_completed(req)) goto out; - } dwc3_gadget_giveback(dep, req, status); @@ -2601,6 +2599,24 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep, } } +static bool dwc3_gadget_ep_should_continue(struct dwc3_ep *dep) +{ + struct dwc3_request *req; + + if (!list_empty(&dep->pending_list)) + return true; + + /* + * We only need to check the first entry of the started list. We can + * assume the completed requests are removed from the started list. + */ + req = next_request(&dep->started_list); + if (!req) + return false; + + return !dwc3_gadget_ep_request_completed(req); +} + static void dwc3_gadget_endpoint_frame_from_event(struct dwc3_ep *dep, const struct dwc3_event_depevt *event) { @@ -2630,6 +2646,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep, if (stop) dwc3_stop_active_transfer(dep, true, true); + else if (dwc3_gadget_ep_should_continue(dep)) + __dwc3_gadget_kick_transfer(dep); /* * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.