Jiri Slaby 7a187a
From: Pawel Laszczak <pawell@cadence.com>
Jiri Slaby 7a187a
Date: Tue, 7 Mar 2023 06:14:20 -0500
Jiri Slaby 7a187a
Subject: [PATCH] usb: cdnsp: Fixes issue with redundant Status Stage
Jiri Slaby 7a187a
References: bsc#1012628
Jiri Slaby 7a187a
Patch-mainline: 6.2.9
Jiri Slaby 7a187a
Git-commit: 5bc38d33a5a1209fd4de65101d1ae8255ea12c6e
Jiri Slaby 7a187a
Jiri Slaby 7a187a
commit 5bc38d33a5a1209fd4de65101d1ae8255ea12c6e upstream.
Jiri Slaby 7a187a
Jiri Slaby 7a187a
In some cases, driver trees to send Status Stage twice.
Jiri Slaby 7a187a
The first one from upper layer of gadget usb subsystem and
Jiri Slaby 7a187a
second time from controller driver.
Jiri Slaby 7a187a
This patch fixes this issue and remove tricky handling of
Jiri Slaby 7a187a
SET_INTERFACE from controller driver which is no longer
Jiri Slaby 7a187a
needed.
Jiri Slaby 7a187a
Jiri Slaby 7a187a
cc: <stable@vger.kernel.org>
Jiri Slaby 7a187a
Fixes: 3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver")
Jiri Slaby 7a187a
Signed-off-by: Pawel Laszczak <pawell@cadence.com>
Jiri Slaby 7a187a
Link: https://lore.kernel.org/r/20230307111420.376056-1-pawell@cadence.com
Jiri Slaby 7a187a
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jiri Slaby 7a187a
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jiri Slaby 7a187a
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby 7a187a
---
Jiri Slaby 7a187a
 drivers/usb/cdns3/cdnsp-ep0.c | 19 +------------------
Jiri Slaby 7a187a
 1 file changed, 1 insertion(+), 18 deletions(-)
Jiri Slaby 7a187a
Jiri Slaby 7a187a
diff --git a/drivers/usb/cdns3/cdnsp-ep0.c b/drivers/usb/cdns3/cdnsp-ep0.c
Jiri Slaby 7a187a
index 9b8325f8..d63d5d92 100644
Jiri Slaby 7a187a
--- a/drivers/usb/cdns3/cdnsp-ep0.c
Jiri Slaby 7a187a
+++ b/drivers/usb/cdns3/cdnsp-ep0.c
Jiri Slaby 7a187a
@@ -403,20 +403,6 @@ static int cdnsp_ep0_std_request(struct cdnsp_device *pdev,
Jiri Slaby 7a187a
 	case USB_REQ_SET_ISOCH_DELAY:
Jiri Slaby 7a187a
 		ret = cdnsp_ep0_set_isoch_delay(pdev, ctrl);
Jiri Slaby 7a187a
 		break;
Jiri Slaby 7a187a
-	case USB_REQ_SET_INTERFACE:
Jiri Slaby 7a187a
-		/*
Jiri Slaby 7a187a
-		 * Add request into pending list to block sending status stage
Jiri Slaby 7a187a
-		 * by libcomposite.
Jiri Slaby 7a187a
-		 */
Jiri Slaby 7a187a
-		list_add_tail(&pdev->ep0_preq.list,
Jiri Slaby 7a187a
-			      &pdev->ep0_preq.pep->pending_list);
Jiri Slaby 7a187a
-
Jiri Slaby 7a187a
-		ret = cdnsp_ep0_delegate_req(pdev, ctrl);
Jiri Slaby 7a187a
-		if (ret == -EBUSY)
Jiri Slaby 7a187a
-			ret = 0;
Jiri Slaby 7a187a
-
Jiri Slaby 7a187a
-		list_del(&pdev->ep0_preq.list);
Jiri Slaby 7a187a
-		break;
Jiri Slaby 7a187a
 	default:
Jiri Slaby 7a187a
 		ret = cdnsp_ep0_delegate_req(pdev, ctrl);
Jiri Slaby 7a187a
 		break;
Jiri Slaby 7a187a
@@ -474,9 +460,6 @@ void cdnsp_setup_analyze(struct cdnsp_device *pdev)
Jiri Slaby 7a187a
 	else
Jiri Slaby 7a187a
 		ret = cdnsp_ep0_delegate_req(pdev, ctrl);
Jiri Slaby 7a187a
 
Jiri Slaby 7a187a
-	if (!len)
Jiri Slaby 7a187a
-		pdev->ep0_stage = CDNSP_STATUS_STAGE;
Jiri Slaby 7a187a
-
Jiri Slaby 7a187a
 	if (ret == USB_GADGET_DELAYED_STATUS) {
Jiri Slaby 7a187a
 		trace_cdnsp_ep0_status_stage("delayed");
Jiri Slaby 7a187a
 		return;
Jiri Slaby 7a187a
@@ -484,6 +467,6 @@ void cdnsp_setup_analyze(struct cdnsp_device *pdev)
Jiri Slaby 7a187a
 out:
Jiri Slaby 7a187a
 	if (ret < 0)
Jiri Slaby 7a187a
 		cdnsp_ep0_stall(pdev);
Jiri Slaby 7a187a
-	else if (pdev->ep0_stage == CDNSP_STATUS_STAGE)
Jiri Slaby 7a187a
+	else if (!len && pdev->ep0_stage != CDNSP_STATUS_STAGE)
Jiri Slaby 7a187a
 		cdnsp_status_stage(pdev);
Jiri Slaby 7a187a
 }
Jiri Slaby 7a187a
-- 
Jiri Slaby 7a187a
2.35.3
Jiri Slaby 7a187a