| From 5bf8fae33d14cc5c3c53a926f9079f92c8b082b0 Mon Sep 17 00:00:00 2001 |
| From: George Cherian <george.cherian@ti.com> |
| Date: Mon, 27 May 2013 14:35:49 +0530 |
| Subject: usb: dwc3: gadget: free trb pool only from epnum 2 |
| |
| From: George Cherian <george.cherian@ti.com> |
| |
| commit 5bf8fae33d14cc5c3c53a926f9079f92c8b082b0 upstream. |
| |
| we never allocate a TRB pool for physical endpoints |
| 0 and 1 so trying to free it (a invalid TRB pool pointer) |
| will lead us in a warning while removing dwc3.ko module. |
| |
| In order to fix the situation, all we have to do is skip |
| dwc3_free_trb_pool() for physical endpoints 0 and 1 just |
| as we while deleting endpoints from the endpoints list. |
| |
| Signed-off-by: George Cherian <george.cherian@ti.com> |
| Signed-off-by: Felipe Balbi <balbi@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| drivers/usb/dwc3/gadget.c | 14 ++++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -1637,10 +1637,20 @@ static void dwc3_gadget_free_endpoints(s |
| |
| for (epnum = 0; epnum < DWC3_ENDPOINTS_NUM; epnum++) { |
| dep = dwc->eps[epnum]; |
| - dwc3_free_trb_pool(dep); |
| |
| - if (epnum != 0 && epnum != 1) |
| + /* |
| + * Physical endpoints 0 and 1 are special; they form the |
| + * bi-directional USB endpoint 0. |
| + * |
| + * For those two physical endpoints, we don't allocate a TRB |
| + * pool nor do we add them the endpoints list. Due to that, we |
| + * shouldn't do these two operations otherwise we would end up |
| + * with all sorts of bugs when removing dwc3.ko. |
| + */ |
| + if (epnum != 0 && epnum != 1) { |
| + dwc3_free_trb_pool(dep); |
| list_del(&dep->endpoint.ep_list); |
| + } |
| |
| kfree(dep); |
| } |