Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp671060ybh; Tue, 10 Mar 2020 06:13:19 -0700 (PDT) X-Google-Smtp-Source: ADFU+vuVFF2IBkdhALS1CYHcXs8Mv01rhTTGRh4Xlh6M2rQN8hQ/odm1hYFSpxWQgHrw43iWjyw+ X-Received: by 2002:a9d:4d85:: with SMTP id u5mr8546062otk.128.1583845999263; Tue, 10 Mar 2020 06:13:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583845999; cv=none; d=google.com; s=arc-20160816; b=bgJa9KVBeMMvcOUG5oCK0XwhJG971BjmZyaXCk4QzJG3xQX/5W3/8VT2s++Zmg/ywY Voa/Ff/y1lNPYphH+6LuCSONw0kWoj6FOQ84zcc4qTiq07v0UopTXV2p5yz+U7KyyS9p 9bztk+PnLLdJRhOXy2PwhEiX9fFpSuL4NFub2yhJHScTwX9zQRgyjyaerAm2nKPvGAQ1 DGqEbAigv9J9HYGG2aKxP/n2R76P1F3ifh1bQHfy852/xrMpjuAOsEUTHYGBuPlhqWdT IJnonkYXZhbtCKiX3G4hPJBE3bmOvsdl7QgafYKIWmnTYlNHErWixDmSR0fvOoCKkG2C yomg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=s2/TfxR+qZzNsPNbMy1DJ7iUmSXnZDRAAK6xh3hOscg=; b=g3kQvQ9klVDpd3EfkoadRPkbLme8Q/xZlgDa1dMgu5JNXQOoyGQRu1hnEYZ/bTOMbF hkEuytuyWz4LAkH8WCMO+A0yc5+KYCGqb55FWhs5RmZQs3E47VdBVS4Z1dG27uqamuKI WjFyYFv9q2tTUztDVu7mT776b3OTltgMhsb31b5gQetyeBmo7foJSbXLhtP5dUUfUxKM hmanvI1NKTuYIJnrpqavf1quTm2GKMH2JGWAkNsWqlNQz7t45Y+VqdFaOsPpoxqdYzxN Esbzc8xEn9OmcX7LY+7pm3DgpuXyUvkVqm9l6q4+oGa7pNb1ivT44Mi/vUot1wwYGeLW xuGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="SfppA/nV"; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m11si7957585otp.174.2020.03.10.06.13.06; Tue, 10 Mar 2020 06:13:19 -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=@kernel.org header.s=default header.b="SfppA/nV"; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731244AbgCJNMm (ORCPT + 99 others); Tue, 10 Mar 2020 09:12:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:34996 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731601AbgCJNMl (ORCPT ); Tue, 10 Mar 2020 09:12:41 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B142B208E4; Tue, 10 Mar 2020 13:12:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583845960; bh=2vTm2EgbOlV6dJ8DaEGheINocA8X5eMIbRU+KHS7Zv0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SfppA/nVcTbk8HxcLl65grjsDWV44W5EDsWVL0BOobM7DT7jDli5c3kpXDF1XIDeS Q4E8oTUIvZ9lXBQvemhySTN6/NMgVrdIOYrncAmm30GvqvuRecvMp5tNtXXeNpvsJO Iz5d4pKUWxWeY78lbBtLyOo/tTff2e6iOAuelgTw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Felipe Balbi , Yang Fei , Thinh Nguyen , Tejas Joglekar , Andrzej Pietrasiewicz , Jack Pham , Todd Kjos , Linux USB List , Pratham Pratap , John Stultz Subject: [PATCH 4.19 37/86] usb: dwc3: gadget: Update chain bit correctly when using sg list Date: Tue, 10 Mar 2020 13:45:01 +0100 Message-Id: <20200310124532.786158804@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200310124530.808338541@linuxfoundation.org> References: <20200310124530.808338541@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pratham Pratap commit dad2aff3e827b112f27fa5e6f2bf87a110067c3f upstream. If scatter-gather operation is allowed, a large USB request is split into multiple TRBs. For preparing TRBs for sg list, driver iterates over the list and creates TRB for each sg and mark the chain bit to false for the last sg. The current IOMMU driver is clubbing the list of sgs which shares a page boundary into one and giving it to USB driver. With this the number of sgs mapped it not equal to the the number of sgs passed. Because of this USB driver is not marking the chain bit to false since it couldn't iterate to the last sg. This patch addresses this issue by marking the chain bit to false if it is the last mapped sg. At a practical level, this patch resolves USB transfer stalls seen with adb on dwc3 based db845c, pixel3 and other qcom hardware after functionfs gadget added scatter-gather support around v4.20. Credit also to Anurag Kumar Vulisha who implemented a very similar fix to this issue. Cc: Felipe Balbi Cc: Yang Fei Cc: Thinh Nguyen Cc: Tejas Joglekar Cc: Andrzej Pietrasiewicz Cc: Jack Pham Cc: Todd Kjos Cc: Greg KH Cc: Linux USB List Cc: stable #4.20+ Signed-off-by: Pratham Pratap [jstultz: Slight tweak to remove sg_is_last() usage, reworked commit message, minor comment tweak] Signed-off-by: John Stultz Link: https://lore.kernel.org/r/20200302214443.55783-1-john.stultz@linaro.org Signed-off-by: Greg Kroah-Hartman --- drivers/usb/dwc3/gadget.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1067,7 +1067,14 @@ static void dwc3_prepare_one_trb_sg(stru unsigned int rem = length % maxp; unsigned chain = true; - if (sg_is_last(s)) + /* + * IOMMU driver is coalescing the list of sgs which shares a + * page boundary into one and giving it to USB driver. With + * this the number of sgs mapped is not equal to the number of + * sgs passed. So mark the chain bit to false if it isthe last + * mapped sg. + */ + if (i == remaining - 1) chain = false; if (rem && usb_endpoint_dir_out(dep->endpoint.desc) && !chain) {