|
@@ -1706,11 +1706,19 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
|
|
|
dep = dwc->eps[epnum];
|
|
|
if (!dep)
|
|
|
continue;
|
|
|
-
|
|
|
- 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);
|
|
|
}
|