From patchwork Thu Jun 27 20:52: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: 167986 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp2821975ilk; Thu, 27 Jun 2019 13:52:53 -0700 (PDT) X-Google-Smtp-Source: APXvYqwfGr2R+VeqOgkIDDP0t7WuCoN/ZOja8VnTDc08tco3pE9WvUYdC1+72pgWbUtf7WXcJFc8 X-Received: by 2002:a17:902:9b81:: with SMTP id y1mr7314231plp.194.1561668772986; Thu, 27 Jun 2019 13:52:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561668772; cv=none; d=google.com; s=arc-20160816; b=Xl37cuFWryi9Umq2p0LqrAYxsi+L3i44REW0qv3ZDJrZP/F0hg535HkWXJIQ/q6zHM 44GOA/+V8DBbmONJNX1Spq8OT+XS8iNDH0cOjMEQTrA9hCPEp1NGsTbxtx5ZSTfmFwit cFVkLFQFoGj6CloSZV7OwlYEWFrnL/qv1LwPMFDhxH/wMHy1+kjDZZPh4JyyvEfrDWNO 6UDV3GorY3cuDeYCHZUMtlmL/hpl6/B/Yptf6/0OI9Qhn2TQ10W7CAX87v4XN+U2Q9Vs SXAK18H3XYcqT7HJr7T/sy+NLjoYu2Ea6HKqvV++EliWJVGtyS26PFuiib3HboYIXBCb 32LA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=x0T4yaPnaskEaM5/BDitZIdztqXyQmXKds/Qu7Ooum4=; b=URUd12QXDvmklck65bPdms5D2OyifsWkXiOvchFZnnbpkeRCz7Rl6cJvwrOGhRlxH+ PVxL1ps5Vu3I+FcI2Q0ksKOuygI3Wr+9Uu1H0jPMlX7zQjtcaICfvTK8EkjJlejFXbXV 72n9BBS20KCzDzTETOzFVFOW1qweOgb4loOt4+Ey6pCQ49qlrFl+HRmTlbhc2f0OmY3s aLhVMf46+x3hGNJ0H+ufW3r6tZ08TdcQNjwbxnoWe4F1usUL+Cd7+LXOx3psj7bwpkpf EuGZZlc2rHpmkEUBM2o21Bm0xQNXG1vmgX5UVNFhbM8rIQ2FxZR++6WscEY2Y4mrfhYi i50Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="UXhD5+/r"; spf=pass (google.com: best guess record for domain of linux-usb-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-usb-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. [209.132.180.67]) by mx.google.com with ESMTP id b69si44360pjc.104.2019.06.27.13.52.52; Thu, 27 Jun 2019 13:52:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-usb-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=@linaro.org header.s=google header.b="UXhD5+/r"; spf=pass (google.com: best guess record for domain of linux-usb-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-usb-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 S1726514AbfF0Uwv (ORCPT + 5 others); Thu, 27 Jun 2019 16:52:51 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:40169 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726505AbfF0Uwv (ORCPT ); Thu, 27 Jun 2019 16:52:51 -0400 Received: by mail-pf1-f196.google.com with SMTP id p184so1809944pfp.7 for ; Thu, 27 Jun 2019 13:52:51 -0700 (PDT) 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=x0T4yaPnaskEaM5/BDitZIdztqXyQmXKds/Qu7Ooum4=; b=UXhD5+/rbf+0Ef2XiMOaD9wCyvl3rZCSpx1VoptGkl6ryBZo1q+GfzSeOEJULx0nCa +gR/ZcO6K7lQG9MjfnnYIcMdVoWYO/uL2ogdcCAmQyVXTdP2wcgmd2GE6v4JOr9BlkAp E+GRzA7URfEX8++kQS4hD0hJ2X181NlZE57h6nkmuSaJ3iJAxWcojAALoA1MVNxAw3eL kd94qFDKj7mm9/zOo8RCY50KU56Ts3sf2Kim/dvI91i6RPwHPhyQTjwX27i77boJGSmR 8EcsZ6avuizzAIh3YT07I7f2YEDDn3/AfMgTE/x3MTcpXo3H32iQbhpp989SPBBqfX4u 1WNg== 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=x0T4yaPnaskEaM5/BDitZIdztqXyQmXKds/Qu7Ooum4=; b=YNhS+9c0L8d6pbCp9o8kB+FuXFdDWx4B0/n0AzILrxPY1iFVpJQMYDzYGMlqQe7kPQ CaJQs8Oyl12rNZDJL+tFQ0BEH9WVzSZXu9HtlKT1om1kBMrpaRFUMxth01xvoG/waNaH FyLqB5z9nIJpy2Veo578qAMgciAu5n2V4rxRZUh4k67j0m1tyYmGe9oaIsL/Eq9+/mfj PmS4kXKeiaIUNJReJ1EtEbN7ct3VnzYvxV3zwxYLSYgO4NEl/ninUzQ5w1+sT+wQtFsq b6FM47asiKUp6bidDs9XeRIoZtlr6QkfJJ8Q51voC7tof8rwRL2kKM56sY7LQrv9zVbS JJGw== X-Gm-Message-State: APjAAAWV1XKCWrqPZZuAuRO0clxpBXazljalC+fnAUdv09DzvEHOHRBH Ap+HIH+7rxHiqnUvyK0QiEh0wg== X-Received: by 2002:a17:90a:1c17:: with SMTP id s23mr8537488pjs.108.1561668770524; Thu, 27 Jun 2019 13:52:50 -0700 (PDT) Received: from localhost.localdomain ([2601:1c2:680:1319:692:26ff:feda:3a81]) by smtp.gmail.com with ESMTPSA id 2sm3674083pff.174.2019.06.27.13.52.49 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Thu, 27 Jun 2019 13:52:49 -0700 (PDT) From: John Stultz To: stable@vger.kernel.org Cc: Felipe Balbi , Fei Yang , Sam Protsenko , Felipe Balbi , linux-usb@vger.kernel.org, John Stultz Subject: [PATCH 4.19.y 4/9] usb: dwc3: gadget: extract dwc3_gadget_ep_skip_trbs() Date: Thu, 27 Jun 2019 20:52:35 +0000 Message-Id: <20190627205240.38366-5-john.stultz@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190627205240.38366-1-john.stultz@linaro.org> References: <20190627205240.38366-1-john.stultz@linaro.org> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org From: Felipe Balbi commit 7746a8dfb3f9c91b3a0b63a1d5c2664410e6498d upstream Extract the logic for skipping over TRBs to its own function. This makes the code slightly more readable and makes it easier to move this call to its final resting place as a following patch. Cc: Fei Yang Cc: Sam Protsenko Cc: Felipe Balbi Cc: linux-usb@vger.kernel.org Cc: stable@vger.kernel.org # 4.19.y Signed-off-by: Felipe Balbi (cherry picked from commit 7746a8dfb3f9c91b3a0b63a1d5c2664410e6498d) Signed-off-by: John Stultz --- drivers/usb/dwc3/gadget.c | 61 +++++++++++++++------------------------ 1 file changed, 24 insertions(+), 37 deletions(-) -- 2.17.1 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index cb6dfea5d5e7..f0c3b08ff7c6 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1343,6 +1343,29 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, return ret; } +static void dwc3_gadget_ep_skip_trbs(struct dwc3_ep *dep, struct dwc3_request *req) +{ + int i; + + /* + * If request was already started, this means we had to + * stop the transfer. With that we also need to ignore + * all TRBs used by the request, however TRBs can only + * be modified after completion of END_TRANSFER + * command. So what we do here is that we wait for + * END_TRANSFER completion and only after that, we jump + * over TRBs by clearing HWO and incrementing dequeue + * pointer. + */ + for (i = 0; i < req->num_trbs; i++) { + struct dwc3_trb *trb; + + trb = req->trb + i; + trb->ctrl &= ~DWC3_TRB_CTRL_HWO; + dwc3_ep_inc_deq(dep); + } +} + static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, struct usb_request *request) { @@ -1370,38 +1393,8 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, break; } if (r == req) { - int i; - /* wait until it is processed */ dwc3_stop_active_transfer(dep, true); - - /* - * If request was already started, this means we had to - * stop the transfer. With that we also need to ignore - * all TRBs used by the request, however TRBs can only - * be modified after completion of END_TRANSFER - * command. So what we do here is that we wait for - * END_TRANSFER completion and only after that, we jump - * over TRBs by clearing HWO and incrementing dequeue - * pointer. - * - * Note that we have 2 possible types of transfers here: - * - * i) Linear buffer request - * ii) SG-list based request - * - * SG-list based requests will have r->num_pending_sgs - * set to a valid number (> 0). Linear requests, - * normally use a single TRB. - * - * For each of these two cases, if r->unaligned flag is - * set, one extra TRB has been used to align transfer - * size to wMaxPacketSize. - * - * All of these cases need to be taken into - * consideration so we don't mess up our TRB ring - * pointers. - */ wait_event_lock_irq(dep->wait_end_transfer, !(dep->flags & DWC3_EP_END_TRANSFER_PENDING), dwc->lock); @@ -1409,13 +1402,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, if (!r->trb) goto out0; - for (i = 0; i < r->num_trbs; i++) { - struct dwc3_trb *trb; - - trb = r->trb + i; - trb->ctrl &= ~DWC3_TRB_CTRL_HWO; - dwc3_ep_inc_deq(dep); - } + dwc3_gadget_ep_skip_trbs(dep, r); goto out1; } dev_err(dwc->dev, "request %pK was not queued to %s\n",