Thread (5 messages) flat view 5 messages, 2 authors, 2021-06-29

Re: [PATCH] usb: cdns3: Fixed incorrect gadget state

From: Peter Chen <peter.chen@kernel.org>
Date: 2021-06-29 01:15:06
Also in: lkml, stable

On 21-06-28 03:46:38, Pawel Laszczak wrote:
quoted
On 21-06-23 09:02:47, Pawel Laszczak wrote:
quoted
From: Pawel Laszczak <pawell@cadence.com>

For delayed status phase, the usb_gadget->state was set
to USB_STATE_ADDRESS and it has never been updated to
USB_STATE_CONFIGURED.
Patch updates the gadget state to correct USB_STATE_CONFIGURED.
As a result of this bug the controller was not able to enter to
Test Mode while using MSC function.
Pawel, would you please describe more about this issue? I remember the cdns3
controller at i.mx series SoC could enter test mode by using current
code.
The issue occurs only for MSC class. MSC class has delayed status stage, so
after returning from cdns3_req_ep0_set_configuration function called 
for Set Configuration driver remains in USB_STATE_ADDRESS.

In order to enter to test mode driver needs meet the condition included in 
cdns3_ep0_feature_handle_device function:
		if (state != USB_STATE_CONFIGURED || speed > USB_SPEED_HIGH)
			return -EINVAL;

But it is still in USB_STATE_ADDRESS, because there was delayed status stage.
To fix issue driver state must be updated to USB_STATE_CONFIGURED before 
or after  finishing status stage.
I am wondering if the cdns3 driver set gadget state as USB_STATE_ADDRESS
is correct for delayed status stage, since the composite core has already
set it as USB_STATE_CONFIGURED at function set_config.

Peter
quoted
quoted
Cc: <redacted>
Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
Signed-off-by: Pawel Laszczak <pawell@cadence.com>
---
 drivers/usb/cdns3/cdns3-ep0.c | 1 +
 1 file changed, 1 insertion(+)
diff --git a/drivers/usb/cdns3/cdns3-ep0.c b/drivers/usb/cdns3/cdns3-ep0.c
index 9a17802275d5..ec5bfd8944c3 100644
--- a/drivers/usb/cdns3/cdns3-ep0.c
+++ b/drivers/usb/cdns3/cdns3-ep0.c
@@ -731,6 +731,7 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep,
 		request->actual = 0;
 		priv_dev->status_completion_no_call = true;
 		priv_dev->pending_status_request = request;
+		usb_gadget_set_state(&priv_dev->gadget, USB_STATE_CONFIGURED);
 		spin_unlock_irqrestore(&priv_dev->lock, flags);

 		/*
--
2.25.1
--

Thanks,
Pawel Laszczak
-- 

Thanks,
Peter Chen
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help