Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4724088pxj; Wed, 12 May 2021 11:45:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxseMJp1Sn3Py7uQYrDrY+KSTL2bfNTVF0GrUCzgU428I1W+qTPo9YSAi2q2zlE/luyyNUM X-Received: by 2002:a05:6402:1357:: with SMTP id y23mr46940735edw.235.1620845155595; Wed, 12 May 2021 11:45:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620845155; cv=none; d=google.com; s=arc-20160816; b=BnKUtAiKNJJFeN7auIuqvYNrHeRPu2kuHDtItMJrTT7vfHXXwUHoal/Rxrq4SGfWqB /7cGcYS2wOW4rCrXZjS3qyoRQxUWHb+s/tmCwguWOq+tFY31BumXEaKs+8YxCOt0tKcc jPwwoMumiY4P5osxpidIOJWl+1OCsp1iqKPUfse+ORZAbnD9r0o1XMEwWlNjo8sC1sDW RfCgul8PIt1c3r9vLZQKrbQ9xsU7rcmD0QJi13vAXrHu9LSsFIzzeVdlXx6s/9rzN4Y1 2h/dvGC/sYrjoYcdE2+/j4B9kLnu1D/4RCFZgzieeyR+uUneP2502De8pIV1nZWshtyW zp6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=TtdLTf5j4cKgfxAOLwkNwyXWh23nioGPkl6U6dRySt8=; b=nwvHU1M9vqbiKouZwF91eTLXEukuio5tmzUXWqsOvn0EZkH15pKh3kV9+MMocY4cDO CQ4olNtdpi1BTJNstGKk2v24m3iUratPzKD4H+1QVvwR1JAlH/fFyMfGkjRoVCBHF+fn 4T/K7E5VYerjSObh4JAaqWf/tcgiTCApk3GjlDXZlz0uwfdEg0QNaYXb7o0WSmY/DZIo yUQr4blG95oOGEIYz6LyDOWj97zJ8Cut/nZ5JD8O8xy/QpBEUbl6W2SVG+ftmYKvekhm +NNRxW9YEcEoz5xSeTHhvmTVrC3JN0vescVosKjJkxFjOhLJF/iW3oQ4IgccNdNNAU8w 0G4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Z24z9kTO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b17si444868edu.223.2021.05.12.11.45.32; Wed, 12 May 2021 11:45:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Z24z9kTO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1357336AbhELSiZ (ORCPT + 99 others); Wed, 12 May 2021 14:38:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:57016 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243318AbhELQhL (ORCPT ); Wed, 12 May 2021 12:37:11 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1D0BE61E2E; Wed, 12 May 2021 16:02:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620835351; bh=cjSIBgXnGPl+m0Usvm4nsW9hGyWmcBsvGR5V/xHOjkY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z24z9kTOsv+j1DMM8YdPmR8ryrFarbqfYeS+txkf0QGyAHATzPFpFfc7/v8KzTF84 L1QQQx7A6oLN0pZDG3iA+LlYz9JhoKl4nrfvVvXKqJfLSPNq1szWV7xvJr5sfCvRto SVWlpaYFQclNjp9z/YsQqNGs0NeRap+OHZpjJMbk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pawel Laszczak , Peter Chen , Sasha Levin Subject: [PATCH 5.12 310/677] usb: cdnsp: Fixes issue with Configure Endpoint command Date: Wed, 12 May 2021 16:45:56 +0200 Message-Id: <20210512144847.511437660@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210512144837.204217980@linuxfoundation.org> References: <20210512144837.204217980@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pawel Laszczak [ Upstream commit 10076de33b5ed5b1e049593a611d2fd9eba60565 ] Patch adds flag EP_UNCONFIGURED to detect whether endpoint was unconfigured. This flag is set in cdnsp_reset_device after Reset Device command. Among others this command disables all non control endpoints. Flag is used in cdnsp_gadget_ep_disable to protect controller against invoking Configure Endpoint command on disabled endpoint. Lack of this protection in some cases caused that Configure Endpoint command completed with Context State Error code completion. Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver") Signed-off-by: Pawel Laszczak Signed-off-by: Peter Chen Signed-off-by: Sasha Levin --- drivers/usb/cdns3/cdnsp-gadget.c | 17 ++++++++++++----- drivers/usb/cdns3/cdnsp-gadget.h | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gadget.c index d7d4bdd57f46..56707b6b0f57 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -727,7 +727,7 @@ int cdnsp_reset_device(struct cdnsp_device *pdev) * are in Disabled state. */ for (i = 1; i < CDNSP_ENDPOINTS_NUM; ++i) - pdev->eps[i].ep_state |= EP_STOPPED; + pdev->eps[i].ep_state |= EP_STOPPED | EP_UNCONFIGURED; trace_cdnsp_handle_cmd_reset_dev(slot_ctx); @@ -942,6 +942,7 @@ static int cdnsp_gadget_ep_enable(struct usb_ep *ep, pep = to_cdnsp_ep(ep); pdev = pep->pdev; + pep->ep_state &= ~EP_UNCONFIGURED; if (dev_WARN_ONCE(pdev->dev, pep->ep_state & EP_ENABLED, "%s is already enabled\n", pep->name)) @@ -1023,9 +1024,13 @@ static int cdnsp_gadget_ep_disable(struct usb_ep *ep) goto finish; } - cdnsp_cmd_stop_ep(pdev, pep); pep->ep_state |= EP_DIS_IN_RROGRESS; - cdnsp_cmd_flush_ep(pdev, pep); + + /* Endpoint was unconfigured by Reset Device command. */ + if (!(pep->ep_state & EP_UNCONFIGURED)) { + cdnsp_cmd_stop_ep(pdev, pep); + cdnsp_cmd_flush_ep(pdev, pep); + } /* Remove all queued USB requests. */ while (!list_empty(&pep->pending_list)) { @@ -1043,10 +1048,12 @@ static int cdnsp_gadget_ep_disable(struct usb_ep *ep) cdnsp_endpoint_zero(pdev, pep); - ret = cdnsp_update_eps_configuration(pdev, pep); + if (!(pep->ep_state & EP_UNCONFIGURED)) + ret = cdnsp_update_eps_configuration(pdev, pep); + cdnsp_free_endpoint_rings(pdev, pep); - pep->ep_state &= ~EP_ENABLED; + pep->ep_state &= ~(EP_ENABLED | EP_UNCONFIGURED); pep->ep_state |= EP_STOPPED; finish: diff --git a/drivers/usb/cdns3/cdnsp-gadget.h b/drivers/usb/cdns3/cdnsp-gadget.h index 6bbb26548c04..783ca8ffde00 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.h +++ b/drivers/usb/cdns3/cdnsp-gadget.h @@ -835,6 +835,7 @@ struct cdnsp_ep { #define EP_WEDGE BIT(4) #define EP0_HALTED_STATUS BIT(5) #define EP_HAS_STREAMS BIT(6) +#define EP_UNCONFIGURED BIT(7) bool skip; }; -- 2.30.2