Re: [PATCH] usb:cdns3: Fix for CV CH9 running with g_zero driver.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Peter,

On 08/10/2019 11:44, Peter Chen wrote:
Endpoint can defer transition to Halted state if endpoint has pending
requests.

The implementation of halt handling is a little complicated, you may
consider return -EAGAIN for functional stall through usb_ep_set_halt
>from function driver if the requests are pending, it doesn't need to
defer such kinds of functional stall.

Yes, I remember your suggestion regarding using EAGAIN, but f_mass_storage
Driver simple check the status and try to stall endpoint again after 100 ms.

What if Command Verifier ask for endpoint status before this time, or if the transfer
will not be finished on time ? Then the CV test may fail.

So solution from this patch should be more certain.


Your description is reasonable, since I have not met this issue, I would like
to know more about it:
It occurs at CV9 or MSC test? For CV9 test, it may not try to stall non-ep0.
Which test case was failed?

Since g_zero was used it would be CV9.

cheers,
-roger


Peter


Peter
Patch add additional condition that allows to return correct endpoint
status during Get Endpoint Status request even if the halting
endpoint is in progress.

Reported-by: Rahul Kumar <kurahul@xxxxxxxxxxx>
Signed-off-by: Rahul Kumar <kurahul@xxxxxxxxxxx>
Signed-off-by: Pawel Laszczak <pawell@xxxxxxxxxxx>
Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
---
  drivers/usb/cdns3/ep0.c | 10 ++++++++--
  1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/cdns3/ep0.c b/drivers/usb/cdns3/ep0.c index
44f652e8b5a2..10ae03430f34 100644
--- a/drivers/usb/cdns3/ep0.c
+++ b/drivers/usb/cdns3/ep0.c
@@ -234,9 +234,11 @@ static int cdns3_req_ep0_set_address(struct
cdns3_device *priv_dev,  static int cdns3_req_ep0_get_status(struct
cdns3_device *priv_dev,
  				    struct usb_ctrlrequest *ctrl)  {
+	struct cdns3_endpoint *priv_ep;
  	__le16 *response_pkt;
  	u16 usb_status = 0;
  	u32 recip;
+	u8 index;

  	recip = ctrl->bRequestType & USB_RECIP_MASK;

@@ -262,9 +264,13 @@ static int cdns3_req_ep0_get_status(struct
cdns3_device *priv_dev,
  	case USB_RECIP_INTERFACE:
  		return cdns3_ep0_delegate_req(priv_dev, ctrl);
  	case USB_RECIP_ENDPOINT:
-		/* check if endpoint is stalled */
+		index = cdns3_ep_addr_to_index(ctrl->wIndex);
+		priv_ep = priv_dev->eps[index];
+
+		/* check if endpoint is stalled or stall is pending */
  		cdns3_select_ep(priv_dev, ctrl->wIndex);
-		if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)))
+		if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) ||
+		    (priv_ep->flags & EP_STALL_PENDING))
  			usb_status =  BIT(USB_ENDPOINT_HALT);
  		break;
  	default:
--
2.17.1


--

Thanks,
Peter Chen

Regards,
Pawel

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux