| From 9a31535859bfd8d1c3ed391f5e9247cd87bb7909 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 1 Oct 2019 10:49:06 +0200 |
| Subject: USB: usblp: fix runtime PM after driver unbind |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit 9a31535859bfd8d1c3ed391f5e9247cd87bb7909 upstream. |
| |
| Since commit c2b71462d294 ("USB: core: Fix bug caused by duplicate |
| interface PM usage counter") USB drivers must always balance their |
| runtime PM gets and puts, including when the driver has already been |
| unbound from the interface. |
| |
| Leaving the interface with a positive PM usage counter would prevent a |
| later bound driver from suspending the device. |
| |
| Fixes: c2b71462d294 ("USB: core: Fix bug caused by duplicate interface PM usage counter") |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Link: https://lore.kernel.org/r/20191001084908.2003-3-johan@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/class/usblp.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/usb/class/usblp.c |
| +++ b/drivers/usb/class/usblp.c |
| @@ -474,10 +474,12 @@ static int usblp_release(struct inode *i |
| |
| mutex_lock(&usblp_mutex); |
| usblp->used = 0; |
| - if (usblp->present) { |
| + if (usblp->present) |
| usblp_unlink_urbs(usblp); |
| - usb_autopm_put_interface(usblp->intf); |
| - } else /* finish cleanup from disconnect */ |
| + |
| + usb_autopm_put_interface(usblp->intf); |
| + |
| + if (!usblp->present) /* finish cleanup from disconnect */ |
| usblp_cleanup(usblp); |
| mutex_unlock(&usblp_mutex); |
| return 0; |