Because pipe buffer allocation is very picky and difficult, current renesas_usbhs driver is not caring pipe re-allocation. In this situation, driver will create new pipe without caring old pipe if "usbhsg_ep_enable" is called after "usbhsg_ep_disable" on current driver. This mean the limited pipe and buffer will be used as waste. But it is possible to re-use same buffer to same pipe. By this patch, driver will initialize pipe when it detected new connection or new gadget, and doesn't try re-allocation for same pipe in above case. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx> --- v1 -> v2 - modify multi comment style drivers/usb/renesas_usbhs/mod_gadget.c | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 318ecde..a35728d 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c @@ -788,12 +788,18 @@ static int usbhsg_pipe_disable(struct usbhsg_uep *uep) usbhsg_queue_pop(uep, ureq, -ECONNRESET); } - uep->pipe->mod_private = NULL; - uep->pipe = NULL; - return 0; } +static void usbhsg_uep_init(struct usbhsg_gpriv *gpriv) +{ + int i; + struct usbhsg_uep *uep; + + usbhsg_for_each_uep_with_dcp(uep, gpriv, i) + uep->pipe = NULL; +} + /* * * usb_ep_ops @@ -810,6 +816,13 @@ static int usbhsg_ep_enable(struct usb_ep *ep, unsigned long flags; int ret = -EIO; + /* + * if it already have pipe, + * nothing to do + */ + if (uep->pipe) + return 0; + /******************** spin lock ********************/ spin_lock_irqsave(lock, flags); @@ -1046,6 +1059,7 @@ static int usbhsg_try_start(struct usbhs_priv *priv, u32 status) * pipe initialize and enable DCP */ usbhs_pipe_init(priv); + usbhsg_uep_init(gpriv); usbhsg_dcp_enable(dcp); /* -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html