Commit 609ca228 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Felipe Balbi

usb: gadget: clean the ep in autoconf before returning it.

Since commit 72c973dd aka ("usb: gadget: add usb_endpoint_descriptor to
struct usb_ep) the descriptor is part of the ep. Most gadgets like
g_zero or masstorage call config_ep_by_speed() to grab an available
endpoint which may be used for FS/HS/SS bulk/iso/intr and in a second
they assign the proper descriptor by calling config_ep_by_speed(). This
is good so far. A few of them like ncm call config_ep_by_speed() only if
ep->desc not assigned earlier. That means ep->desc is never assigned if
the endpoint was used by another gadget before it was removed.

Some of those gadgets also assign ep->driver_data to NULL on reset or
ep_disable part _but_ keep a reference to this endpoint. At ep_enable
time they assign driver_data to their private data. This probably needs
a clean up of its own.
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 637b78eb
...@@ -275,24 +275,24 @@ struct usb_ep *usb_ep_autoconfig_ss( ...@@ -275,24 +275,24 @@ struct usb_ep *usb_ep_autoconfig_ss(
/* ep-e, ep-f are PIO with only 64 byte fifos */ /* ep-e, ep-f are PIO with only 64 byte fifos */
ep = find_ep (gadget, "ep-e"); ep = find_ep (gadget, "ep-e");
if (ep && ep_matches(gadget, ep, desc, ep_comp)) if (ep && ep_matches(gadget, ep, desc, ep_comp))
return ep; goto found_ep;
ep = find_ep (gadget, "ep-f"); ep = find_ep (gadget, "ep-f");
if (ep && ep_matches(gadget, ep, desc, ep_comp)) if (ep && ep_matches(gadget, ep, desc, ep_comp))
return ep; goto found_ep;
} else if (gadget_is_goku (gadget)) { } else if (gadget_is_goku (gadget)) {
if (USB_ENDPOINT_XFER_INT == type) { if (USB_ENDPOINT_XFER_INT == type) {
/* single buffering is enough */ /* single buffering is enough */
ep = find_ep(gadget, "ep3-bulk"); ep = find_ep(gadget, "ep3-bulk");
if (ep && ep_matches(gadget, ep, desc, ep_comp)) if (ep && ep_matches(gadget, ep, desc, ep_comp))
return ep; goto found_ep;
} else if (USB_ENDPOINT_XFER_BULK == type } else if (USB_ENDPOINT_XFER_BULK == type
&& (USB_DIR_IN & desc->bEndpointAddress)) { && (USB_DIR_IN & desc->bEndpointAddress)) {
/* DMA may be available */ /* DMA may be available */
ep = find_ep(gadget, "ep2-bulk"); ep = find_ep(gadget, "ep2-bulk");
if (ep && ep_matches(gadget, ep, desc, if (ep && ep_matches(gadget, ep, desc,
ep_comp)) ep_comp))
return ep; goto found_ep;
} }
#ifdef CONFIG_BLACKFIN #ifdef CONFIG_BLACKFIN
...@@ -311,18 +311,22 @@ struct usb_ep *usb_ep_autoconfig_ss( ...@@ -311,18 +311,22 @@ struct usb_ep *usb_ep_autoconfig_ss(
} else } else
ep = NULL; ep = NULL;
if (ep && ep_matches(gadget, ep, desc, ep_comp)) if (ep && ep_matches(gadget, ep, desc, ep_comp))
return ep; goto found_ep;
#endif #endif
} }
/* Second, look at endpoints until an unclaimed one looks usable */ /* Second, look at endpoints until an unclaimed one looks usable */
list_for_each_entry (ep, &gadget->ep_list, ep_list) { list_for_each_entry (ep, &gadget->ep_list, ep_list) {
if (ep_matches(gadget, ep, desc, ep_comp)) if (ep_matches(gadget, ep, desc, ep_comp))
return ep; goto found_ep;
} }
/* Fail */ /* Fail */
return NULL; return NULL;
found_ep:
ep->desc = NULL;
ep->comp_desc = NULL;
return ep;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment