Message ID | 20221101044433.5627-1-3090101217@zju.edu.cn (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2] usb: cdnsp: Fix wrong transmission direction of EP0 | expand |
On Tue, Nov 01, 2022 at 12:44:33PM +0800, Jing Leng wrote: > EP0 transfer is bi-directional, but in the cdnsp gadget, the > transmission direction of EP0 is not changed after it is > initialized to IN, so the OUT data from EP0 received by the host > is invalid. > > The value of ep0_expect_in will change according to the value of > bRequestType in the SETUP transaction of control transfer, so we > can use it as the transmission direction of EP0. > > Signed-off-by: Jing Leng <3090101217@zju.edu.cn> > Signed-off-by: Jing Leng <jleng@ambarella.com> > --- > ChangeLog v1->v2: > - Rebase the patch. > - Make email addresses ('From' and 'Signed-off-by') consistent. That didn't happen. You list yourself twice, and the last one does not match the From: line on the patch. Also the verification did not even work showing that this is an invalid email from 3090101217@zju.edu.cn, so I can't trust it at all. Please fix up your email system to properly send email from ambarella.com with the correct verification. thanks, greg k-h
diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gadget.c index c67715f6f756..526f80651d35 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -345,6 +345,7 @@ int cdnsp_ep_enqueue(struct cdnsp_ep *pep, struct cdnsp_request *preq) { struct cdnsp_device *pdev = pep->pdev; struct usb_request *request; + u8 direction; int ret; if (preq->epnum == 0 && !list_empty(&pep->pending_list)) { @@ -355,11 +356,14 @@ int cdnsp_ep_enqueue(struct cdnsp_ep *pep, struct cdnsp_request *preq) request = &preq->request; request->actual = 0; request->status = -EINPROGRESS; - preq->direction = pep->direction; + + direction = usb_endpoint_xfer_control(pep->endpoint.desc) ? + pdev->ep0_expect_in : pep->direction; + preq->direction = direction; preq->epnum = pep->number; preq->td.drbl = 0; - ret = usb_gadget_map_request_by_dev(pdev->dev, request, pep->direction); + ret = usb_gadget_map_request_by_dev(pdev->dev, request, direction); if (ret) { trace_cdnsp_request_enqueue_error(preq); return ret; @@ -387,8 +391,7 @@ int cdnsp_ep_enqueue(struct cdnsp_ep *pep, struct cdnsp_request *preq) return 0; unmap: - usb_gadget_unmap_request_by_dev(pdev->dev, &preq->request, - pep->direction); + usb_gadget_unmap_request_by_dev(pdev->dev, &preq->request, direction); list_del(&preq->list); trace_cdnsp_request_enqueue_error(preq);