2018-06-25 05:21:14

by Kai-Heng Feng

[permalink] [raw]
Subject: [PATCH] usb: xhci: dbc: Don't decrement runtime PM counter if DBC is not started

pm_runtime_put_sync() gets called everytime in xhci_dbc_stop().

If dbc is not started, this makes the runtime PM counter incorrectly
becomes 0, and calls autosuspend function. Then we'll keep seeing this:
[54664.762220] xhci_hcd 0000:00:14.0: Root hub is not suspended

So only calls pm_runtime_put_sync() when dbc was started.

Signed-off-by: Kai-Heng Feng <[email protected]>
---
drivers/usb/host/xhci-dbgcap.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/host/xhci-dbgcap.c b/drivers/usb/host/xhci-dbgcap.c
index 1fbfd89d0a0f..387f124a8334 100644
--- a/drivers/usb/host/xhci-dbgcap.c
+++ b/drivers/usb/host/xhci-dbgcap.c
@@ -508,16 +508,18 @@ static int xhci_do_dbc_start(struct xhci_hcd *xhci)
return 0;
}

-static void xhci_do_dbc_stop(struct xhci_hcd *xhci)
+static int xhci_do_dbc_stop(struct xhci_hcd *xhci)
{
struct xhci_dbc *dbc = xhci->dbc;

if (dbc->state == DS_DISABLED)
- return;
+ return -1;

writel(0, &dbc->regs->control);
xhci_dbc_mem_cleanup(xhci);
dbc->state = DS_DISABLED;
+
+ return 0;
}

static int xhci_dbc_start(struct xhci_hcd *xhci)
@@ -544,6 +546,7 @@ static int xhci_dbc_start(struct xhci_hcd *xhci)

static void xhci_dbc_stop(struct xhci_hcd *xhci)
{
+ int ret;
unsigned long flags;
struct xhci_dbc *dbc = xhci->dbc;
struct dbc_port *port = &dbc->port;
@@ -556,10 +559,11 @@ static void xhci_dbc_stop(struct xhci_hcd *xhci)
xhci_dbc_tty_unregister_device(xhci);

spin_lock_irqsave(&dbc->lock, flags);
- xhci_do_dbc_stop(xhci);
+ ret = xhci_do_dbc_stop(xhci);
spin_unlock_irqrestore(&dbc->lock, flags);

- pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller);
+ if (!ret)
+ pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller);
}

static void
--
2.17.0



2018-06-25 08:24:15

by Mathias Nyman

[permalink] [raw]
Subject: Re: [PATCH] usb: xhci: dbc: Don't decrement runtime PM counter if DBC is not started

On 25.06.2018 08:20, Kai-Heng Feng wrote:
> pm_runtime_put_sync() gets called everytime in xhci_dbc_stop().
>
> If dbc is not started, this makes the runtime PM counter incorrectly
> becomes 0, and calls autosuspend function. Then we'll keep seeing this:
> [54664.762220] xhci_hcd 0000:00:14.0: Root hub is not suspended
>
> So only calls pm_runtime_put_sync() when dbc was started.
>
> Signed-off-by: Kai-Heng Feng <[email protected]>

Thanks, nice catch.
Adding to queue

-Mathias