mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 06:24:53 +08:00
usb: renesas_usbhs: don't re-allocation pipe buffer
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@renesas.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
45e13e6e0a
commit
409ba9e7c0
@ -787,12 +787,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
|
||||
@ -809,6 +815,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);
|
||||
|
||||
@ -1045,6 +1058,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);
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user