| From 56eb90447f11dbeaa35556c4ceed12c365c72e9a 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: [PATCH] usb: dwc3: gadget: skip Set/Clear Halt when invalid |
| |
| 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. |
| |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
| index 86dffc04e1c3..cdb78d2b3513 100644 |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -1328,6 +1328,9 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) |
| 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 |
| @@ -1352,6 +1355,8 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol) |
| 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) |
| -- |
| 2.12.0 |
| |