| From aebda618718157a69c0dc0adb978d69bc2b8723c Mon Sep 17 00:00:00 2001 |
| From: John Youn <John.Youn@synopsys.com> |
| Date: Mon, 17 Sep 2001 00:00:00 -0700 |
| Subject: usb: dwc3: Reset the transfer resource index on SET_INTERFACE |
| |
| commit aebda618718157a69c0dc0adb978d69bc2b8723c upstream. |
| |
| This fixes an issue introduced in commit b23c843992b6 (usb: dwc3: |
| gadget: fix DEPSTARTCFG for non-EP0 EPs) that made sure we would |
| only use DEPSTARTCFG once per SetConfig. |
| |
| The trick is that we should use one DEPSTARTCFG per SetConfig *OR* |
| SetInterface. SetInterface was completely missed from the original |
| patch. |
| |
| This problem became aparent after commit 76e838c9f776 (usb: dwc3: |
| gadget: return error if command sent to DEPCMD register fails) |
| added checking of the return status of device endpoint commands. |
| |
| 'Set Endpoint Transfer Resource' command was caught failing |
| occasionally. This is because the Transfer Resource |
| Index was not getting reset during a SET_INTERFACE request. |
| |
| Finally, to fix the issue, was we have to do is make sure that |
| our start_config_issued flag gets reset whenever we receive a |
| SetInterface request. |
| |
| To verify the problem (and its fix), all we have to do is run |
| test 9 from testusb with 'testusb -t 9 -s 2048 -a -c 5000'. |
| |
| Tested-by: Huang Rui <ray.huang@amd.com> |
| Tested-by: Subbaraya Sundeep Bhatta <subbaraya.sundeep.bhatta@xilinx.com> |
| Fixes: b23c843992b6 (usb: dwc3: gadget: fix DEPSTARTCFG for non-EP0 EPs) |
| Signed-off-by: John Youn <johnyoun@synopsys.com> |
| Signed-off-by: Felipe Balbi <balbi@ti.com> |
| [lizf: Backported to 3.4: use dev_vdbg() instead of dwc3_trace()] |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| drivers/usb/dwc3/ep0.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/usb/dwc3/ep0.c |
| +++ b/drivers/usb/dwc3/ep0.c |
| @@ -496,6 +496,10 @@ static int dwc3_ep0_std_request(struct d |
| dev_vdbg(dwc->dev, "USB_REQ_SET_CONFIGURATION\n"); |
| ret = dwc3_ep0_set_config(dwc, ctrl); |
| break; |
| + case USB_REQ_SET_INTERFACE: |
| + dev_vdbg(dwc->dev ,"USB_REQ_SET_INTERFACE"); |
| + dwc->start_config_issued = false; |
| + /* Fall through */ |
| default: |
| dev_vdbg(dwc->dev, "Forwarding to gadget driver\n"); |
| ret = dwc3_ep0_delegate_req(dwc, ctrl); |