Patch "usb: renesas_usbhs: gadget: disable all eps when the driver stops" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
usb: renesas_usbhs: gadget: disable all eps when the driver stops
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
usb-renesas_usbhs-gadget-disable-all-eps-when-the-driver-stops.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b8b9c974afee685789fcbb191b52d1790be3608cMon Sep 17 00:00:00 2001
From: Yoshihiro Shimoda <[email protected]>
Date: Wed, 19 Jul 2017 16:16:55 +0900
Subject: usb: renesas_usbhs: gadget: disable all eps when the driver stops
From: Yoshihiro Shimoda <[email protected]>
commit b8b9c974afee685789fcbb191b52d1790be3608c upstream.
A gadget driver will not disable eps immediately when ->disconnect() is called. But, since this driver assumes all eps stop after the ->disconnect(), unexpected behavior happens (especially in system suspend).
So, this patch disables all eps in usbhsg_try_stop(). After disabling eps by renesas_usbhs driver, since some functions will be called by both a gadget and renesas_usbhs driver, renesas_usbhs driver should protect uep->pipe. To protect uep->pipe easily, this patch adds a new lock in struct usbhsg_uep.
--- drivers/usb/renesas_usbhs/mod_gadget.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-)
drivers/usb/renesas_usbhs/mod_gadget.c +24 -7
@@ -37,6 +37,7 @@ struct usbhsg_gpriv;struct usbhsg_uep {struct usb_ep ep;struct usbhs_pipe *pipe; +spinlock_t lock;/* protect the pipe */ char ep_name[EP_NAME_SIZE ];
@@ -636,10 +637,16 @@ usbhsg_ep_enable_end:static int usbhsg_ep_disable (struct usb_ep *ep) {struct usbhsg_uep *uep =usbhsg_ep_to_uep (ep); -struct usbhs_pipe *pipe =usbhsg_uep_to_pipe (uep); +struct usbhs_pipe *pipe; +unsigned long flags; +int ret =0 ; -if (!pipe) -return -EINVAL ; +spin_lock_irqsave (&uep->lock, flags); + pipe =usbhsg_uep_to_pipe (uep); +if (!pipe) { + ret = -EINVAL ; + goto out; + }usbhsg_pipe_disable (uep);usbhs_pipe_free (pipe);
@@ -647,6 +654,9 @@ static int usbhsg_ep_disable(struct usb_ uep->pipe->mod_private =NULL ; uep->pipe =NULL ; +out: +spin_unlock_irqrestore (&uep->lock, flags); +return 0 ; }
@@ -696,8 +706,11 @@ static int usbhsg_ep_dequeue(struct usb_ {struct usbhsg_uep *uep =usbhsg_ep_to_uep (ep);struct usbhsg_request *ureq =usbhsg_req_to_ureq (req); -struct usbhs_pipe *pipe =usbhsg_uep_to_pipe (uep); +struct usbhs_pipe *pipe; +unsigned long flags; +spin_lock_irqsave (&uep->lock, flags); + pipe =usbhsg_uep_to_pipe (uep);if (pipe)usbhs_pkt_pop (pipe,usbhsg_ureq_to_pkt (ureq));
@@ -706,6 +719,7 @@ static int usbhsg_ep_dequeue(struct usb_* even if the pipe is NULL. */ usbhsg_queue_pop (uep, ureq, -ECONNRESET ); +spin_unlock_irqrestore (&uep->lock, flags);return 0 ; }
@@ -852,10 +866,10 @@ static int usbhsg_try_stop(struct usbhs_ {struct usbhsg_gpriv *gpriv =usbhsg_priv_to_gpriv (priv);struct usbhs_mod *mod =usbhs_mod_get_current (priv); -struct usbhsg_uep *dcp =usbhsg_gpriv_to_dcp (gpriv); +struct usbhsg_uep *uep;struct device *dev =usbhs_priv_to_dev (priv);unsigned long flags; -int ret =0 ; +int ret =0 , i;/******************** spin lock ********************/ usbhs_lock (priv, flags);
@@ -887,7 +901,9 @@ static int usbhsg_try_stop(struct usbhs_usbhs_sys_set_test_mode (priv,0 );usbhs_sys_function_ctrl (priv,0 ); -usbhsg_ep_disable (&dcp->ep); +/* disable all eps */ +usbhsg_for_each_uep_with_dcp (uep, gpriv, i) +usbhsg_ep_disable (&uep->ep);dev_dbg (dev,"stop gadget\n" );
@@ -1069,6 +1085,7 @@ int usbhs_mod_gadget_probe(struct usbhs_ ret = -ENOMEM ; goto usbhs_mod_gadget_probe_err_gpriv; } +spin_lock_init (&uep->lock); gpriv->transceiver =usb_get_phy (USB_PHY_TYPE_UNDEFINED ); dev_info(dev, "%stransceiver found\n",
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/usb-renesas_usbhs-fix-usbhsc_resume-for-usbhsf_runtime_pwctrl.patch queue-4.9/usb-renesas_usbhs-gadget-disable-all-eps-when-the-driver-stops.patch