From patchwork Tue Jan 7 07:14:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ran Wang X-Patchwork-Id: 11320509 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 15C9C138D for ; Tue, 7 Jan 2020 07:16:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F23E8207FF for ; Tue, 7 Jan 2020 07:16:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727192AbgAGHQ2 (ORCPT ); Tue, 7 Jan 2020 02:16:28 -0500 Received: from inva020.nxp.com ([92.121.34.13]:58024 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725781AbgAGHQ1 (ORCPT ); Tue, 7 Jan 2020 02:16:27 -0500 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 2C06C1A0837; Tue, 7 Jan 2020 08:16:26 +0100 (CET) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 87DDE1A00D2; Tue, 7 Jan 2020 08:16:21 +0100 (CET) Received: from localhost.localdomain (mega.ap.freescale.net [10.192.208.232]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 09236402C7; Tue, 7 Jan 2020 15:16:15 +0800 (SGT) From: Ran Wang To: Felipe Balbi , Greg Kroah-Hartman , Tejas Joglekar , Jun Li , Peter Chen Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Ran Wang , stable@vger.kernel.org Subject: [PATCH] usb: dwc3: gadget: Fix controller get stuck when kicking extra transfer in wrong case Date: Tue, 7 Jan 2020 15:14:41 +0800 Message-Id: <20200107071441.480-1-ran.wang_1@nxp.com> X-Mailer: git-send-email 2.17.1 X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org According to original commit c96e6725db9d6a ("usb: dwc3: gadget: Correct the logic for queuing sgs"), we would only kick off another transfer in case of req->num_pending_sgs > 0. However, current logic will do this as long as req->remaining > 0, this will include the case of non-sgs (both dwc3_gadget_ep_request_completed(req) and req->num_pending_sgs are 0) that we did not want to. Without this fix, we observed dwc3 got stuck on Layerscape plaftorms (such as LS1088ARDB) when enabling gadget (mass storage function) as below: [ 27.923959] Mass Storage Function, version: 2009/09/11 [ 27.929115] LUN: removable file: (no medium) [ 27.933432] LUN: file: /run/media/sda1/419/test [ 27.937963] Number of LUNs=1 [ 27.941042] g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11 [ 27.948019] g_mass_storage gadget: userspace failed to provide iSerialNumber [ 27.955069] g_mass_storage gadget: g_mass_storage ready [ 28.411188] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 48.319766] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 68.320794] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 88.319898] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 108.320808] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 128.323419] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 148.320857] g_mass_storage gadget: super-speed config #1: Linux File-Backed Storage [ 148.362023] g_mass_storage gadget: super-speed config #0: unconfigured Fixes: 8c7d4b7b3d43 ("usb: dwc3: gadget: Fix logical condition") Cc: stable@vger.kernel.org Signed-off-by: Ran Wang --- drivers/usb/dwc3/gadget.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 0c960a9..5b0f02f 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2491,7 +2491,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) || + if (!dwc3_gadget_ep_request_completed(req) && req->num_pending_sgs) { __dwc3_gadget_kick_transfer(dep); goto out;