| From ffb80fc672c3a7b6afd0cefcb1524fb99917b2f3 Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Date: Thu, 19 Jan 2017 13:38:42 +0200 |
| Subject: usb: dwc3: gadget: skip Set/Clear Halt when invalid |
| |
| From: Felipe Balbi <felipe.balbi@linux.intel.com> |
| |
| commit ffb80fc672c3a7b6afd0cefcb1524fb99917b2f3 upstream. |
| |
| At least macOS seems to be sending |
| ClearFeature(ENDPOINT_HALT) to endpoints which |
| aren't Halted. This makes DWC3's CLEARSTALL command |
| time out which causes several issues for the driver. |
| |
| Instead, let's just return 0 and bail out early. |
| |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/dwc3/gadget.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -1335,6 +1335,9 @@ int __dwc3_gadget_ep_set_halt(struct dwc |
| unsigned transfer_in_flight; |
| unsigned started; |
| |
| + if (dep->flags & DWC3_EP_STALL) |
| + return 0; |
| + |
| if (dep->number > 1) |
| trb = dwc3_ep_prev_trb(dep, dep->trb_enqueue); |
| else |
| @@ -1356,6 +1359,8 @@ int __dwc3_gadget_ep_set_halt(struct dwc |
| else |
| dep->flags |= DWC3_EP_STALL; |
| } else { |
| + if (!(dep->flags & DWC3_EP_STALL)) |
| + return 0; |
| |
| ret = dwc3_send_clear_stall_ep_cmd(dep); |
| if (ret) |