diff mbox series

[v2] usb: host: xhci-plat: keep runtime active when remove host

Message ID 1589449416-2245-1-git-send-email-jun.li@nxp.com (mailing list archive)
State Mainlined
Commit 1449cb2c2253d37d998c3714aa9b95416d16d379
Headers show
Series [v2] usb: host: xhci-plat: keep runtime active when remove host | expand

Commit Message

Jun Li May 14, 2020, 9:43 a.m. UTC
While remove host(e.g. for USB role switch from host to device), if
runtime pm is enabled by user, below oops are occurs at dwc3
and cdns3 platform. Keep the xhci-plat device being active during
remove host fixes them.

oops1:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000240
Mem abort info:
  ESR = 0x96000004
xhci-hcd xhci-hcd.1.auto: // Halt the HC
xhci-hcd xhci-hcd.1.auto: // Reset the HC
xhci-hcd xhci-hcd.1.auto: Wait for controller to be ready for doorbell rings
  EC = 0x25: DABT (current EL), IL = 32 bits
  SET = 0, FnV = 0
  EA = 0, S1PTW = 0
Data abort info:
  ISV = 0, ISS = 0x00000004
xhci-hcd xhci-hcd.1.auto: // Disabling event ring interrupts
  CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000001b7b18000
xhci-hcd xhci-hcd.1.auto: cleaning up memory
xhci-hcd xhci-hcd.1.auto: Freed event ring
xhci-hcd xhci-hcd.1.auto: Freed command ring
[0000000000000240] pgd=0000000000000000
Internal error: Oops: 96000004 [#1] PREEMPT SMP
Modules linked in:
CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.4.3-00107-g64d454a-dirty #1219
Hardware name: FSL i.MX8MP EVK (DT)
Workqueue: pm pm_runtime_work
pstate: 60000005 (nZCv daif -PAN -UAO)
pc : xhci_suspend+0x34/0x698
lr : xhci_plat_runtime_suspend+0x2c/0x38
sp : ffff800011ddbbc0
x29: ffff800011ddbbc0 x28: 0000000000000000
x27: 0000000000000008 x26: ffff800011b28000
x25: ffff80001012b328 x24: ffff800011ddbd48
x23: 0000000000000000 x22: ffff80001076ed78
x21: ffff000177896000 x20: ffff0001714ebce4
x19: ffff000177896000 x18: ffffffffffffffff
x17: 0000000000000000 x16: 0000000000000000
x15: ffff800011b288c8 x14: 0000000000000261
x13: 0000000000000001 x12: 0000000000000001
x11: 0000000000000000 x10: 00000000000009c0
x9 : ffff800011ddbd40 x8 : fefefefefefefeff
x7 : 0000000000000000 x6 : 000000003ca92688
x5 : 00ffffffffffffff x4 : 001b6b0b00000000
x3 : ffff0001714ebc10 x2 : 0000000000000000
x1 : 0000000000000001 x0 : ffff000177896250
Call trace:
 xhci_suspend+0x34/0x698
 xhci_plat_runtime_suspend+0x2c/0x38
 pm_generic_runtime_suspend+0x28/0x40
 __rpm_callback+0xd8/0x138
 rpm_callback+0x24/0x98
 rpm_suspend+0xe0/0x448
 rpm_idle+0x124/0x140
 pm_runtime_work+0xa0/0xf8
 process_one_work+0x1dc/0x370
 worker_thread+0x48/0x468
 kthread+0xf0/0x120
 ret_from_fork+0x10/0x1c

oops2:
usb 2-1: USB disconnect, device number 2
xhci-hcd xhci-hcd.1.auto: remove, state 4
usb usb2: USB disconnect, device number 1
xhci-hcd xhci-hcd.1.auto: USB bus 2 deregistered
xhci-hcd xhci-hcd.1.auto: remove, state 4
usb usb1: USB disconnect, device number 1
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000138
Mem abort info:
  ESR = 0x96000004
  EC = 0x25: DABT (current EL), IL = 32 bits
  SET = 0, FnV = 0
  EA = 0, S1PTW = 0
Data abort info:
  ISV = 0, ISS = 0x00000004
  CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000008b05e8000
[0000000000000138] pgd=0000000000000000, p4d=0000000000000000
Internal error: Oops: 96000004 [#1] PREEMPT SMP
Modules linked in:
CPU: 2 PID: 7 Comm: kworker/u8:0 Not tainted 5.6.0-rc4-next-20200304-03578-gd6235ff42e2b #101
Hardware name: Freescale i.MX8QXP MEK (DT)
Workqueue: 1-0050 tcpm_state_machine_work
pstate: 20000005 (nzCv daif -PAN -UAO)
pc : xhci_free_dev+0x214/0x270
lr : xhci_plat_runtime_resume+0x78/0x88
sp : ffff80001006b5b0
x29: ffff80001006b5b0 x28: 0000000000000002
x27: ffff00083b74fd48 x26: ffff00083a365580
x25: ffff800010141458 x24: 0000000000000000
x23: 0000000000000000 x22: ffff000837e58138
x21: 0000000000000004 x20: ffff000837e58000
x19: ffff000837e58250 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000001
x15: 0000000000000004 x14: ffffffffffffffff
x13: 0000000000004ed8 x12: ffff8000123d1000
x11: ffff800012158000 x10: ffff8000123d1360
x9 : ffff800010c74b00 x8 : 0000000000000007
x7 : 00000000000012c2 x6 : ffff8000123d1000
x5 : 0000000000000001 x4 : 0000000000000000
x3 : 0000000000000000 x2 : 0000000000000138
x1 : 0000000000000000 x0 : 0000000000000138
Call trace:
 xhci_free_dev+0x214/0x270
 xhci_plat_runtime_resume+0x78/0x88
 pm_generic_runtime_resume+0x30/0x48
 __rpm_callback+0x90/0x148
 rpm_callback+0x28/0x88
 rpm_resume+0x568/0x758
 rpm_resume+0x260/0x758
 rpm_resume+0x260/0x758
 __pm_runtime_resume+0x40/0x88
 device_release_driver_internal+0xa0/0x1c8
 device_release_driver+0x1c/0x28
 bus_remove_device+0xd4/0x158
 device_del+0x15c/0x3a0
 usb_disable_device+0xb0/0x268
 usb_disconnect+0xcc/0x300
 usb_remove_hcd+0xf4/0x1dc
 xhci_plat_remove+0x78/0xe0
 platform_drv_remove+0x30/0x50
 device_release_driver_internal+0xfc/0x1c8
 device_release_driver+0x1c/0x28
 bus_remove_device+0xd4/0x158
 device_del+0x15c/0x3a0
 platform_device_del.part.0+0x20/0x90
 platform_device_unregister+0x28/0x40
 cdns3_host_exit+0x20/0x40
 cdns3_role_stop+0x60/0x90
 cdns3_role_set+0x64/0xd8
 usb_role_switch_set_role.part.0+0x3c/0x68
 usb_role_switch_set_role+0x20/0x30
 tcpm_mux_set+0x60/0xf8
 tcpm_reset_port+0xa4/0xf0
 tcpm_detach.part.0+0x28/0x50
 tcpm_state_machine_work+0x12ac/0x2360
 process_one_work+0x1c8/0x470
 worker_thread+0x50/0x428
 kthread+0xfc/0x128
 ret_from_fork+0x10/0x18
Code: c8037c02 35ffffa3 17ffe7c3 f9800011 (c85f7c01)
---[ end trace 45b1a173d2679e44 ]---

Cc: Baolin Wang <baolin.wang@linaro.org>
Cc: Mathias Nyman <mathias.nyman@linux.intel.com>
Cc: <stable@vger.kernel.org>
Fixes: b0c69b4bace3 ("usb: host: plat: Enable xHCI plat runtime PM")
Reviewed-by: Peter Chen <peter.chen@nxp.com>
Tested-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
changes for v2:
- Add pm_runtime_put_noidle() to balance pm_runtime_get_sync().
- Move pm_runtime_set_suspended() to be after pm_runtime_disable().

 drivers/usb/host/xhci-plat.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Mathias Nyman May 14, 2020, 10:45 a.m. UTC | #1
On 14.5.2020 12.43, Li Jun wrote:
> While remove host(e.g. for USB role switch from host to device), if
> runtime pm is enabled by user, below oops are occurs at dwc3
> and cdns3 platform. Keep the xhci-plat device being active during
> remove host fixes them.
> 
> oops1:
> Unable to handle kernel NULL pointer dereference at virtual address 0000000000000240
> Mem abort info:
>   ESR = 0x96000004
> xhci-hcd xhci-hcd.1.auto: // Halt the HC
> xhci-hcd xhci-hcd.1.auto: // Reset the HC
> xhci-hcd xhci-hcd.1.auto: Wait for controller to be ready for doorbell rings
>   EC = 0x25: DABT (current EL), IL = 32 bits
>   SET = 0, FnV = 0
>   EA = 0, S1PTW = 0
> Data abort info:
>   ISV = 0, ISS = 0x00000004
> xhci-hcd xhci-hcd.1.auto: // Disabling event ring interrupts
>   CM = 0, WnR = 0
> user pgtable: 4k pages, 48-bit VAs, pgdp=00000001b7b18000
> xhci-hcd xhci-hcd.1.auto: cleaning up memory
> xhci-hcd xhci-hcd.1.auto: Freed event ring
> xhci-hcd xhci-hcd.1.auto: Freed command ring
> [0000000000000240] pgd=0000000000000000
> Internal error: Oops: 96000004 [#1] PREEMPT SMP
> Modules linked in:
> CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.4.3-00107-g64d454a-dirty #1219
> Hardware name: FSL i.MX8MP EVK (DT)
> Workqueue: pm pm_runtime_work
> pstate: 60000005 (nZCv daif -PAN -UAO)
> pc : xhci_suspend+0x34/0x698
> lr : xhci_plat_runtime_suspend+0x2c/0x38
> sp : ffff800011ddbbc0
> x29: ffff800011ddbbc0 x28: 0000000000000000
> x27: 0000000000000008 x26: ffff800011b28000
> x25: ffff80001012b328 x24: ffff800011ddbd48
> x23: 0000000000000000 x22: ffff80001076ed78
> x21: ffff000177896000 x20: ffff0001714ebce4
> x19: ffff000177896000 x18: ffffffffffffffff
> x17: 0000000000000000 x16: 0000000000000000
> x15: ffff800011b288c8 x14: 0000000000000261
> x13: 0000000000000001 x12: 0000000000000001
> x11: 0000000000000000 x10: 00000000000009c0
> x9 : ffff800011ddbd40 x8 : fefefefefefefeff
> x7 : 0000000000000000 x6 : 000000003ca92688
> x5 : 00ffffffffffffff x4 : 001b6b0b00000000
> x3 : ffff0001714ebc10 x2 : 0000000000000000
> x1 : 0000000000000001 x0 : ffff000177896250
> Call trace:
>  xhci_suspend+0x34/0x698
>  xhci_plat_runtime_suspend+0x2c/0x38
>  pm_generic_runtime_suspend+0x28/0x40
>  __rpm_callback+0xd8/0x138
>  rpm_callback+0x24/0x98
>  rpm_suspend+0xe0/0x448
>  rpm_idle+0x124/0x140
>  pm_runtime_work+0xa0/0xf8
>  process_one_work+0x1dc/0x370
>  worker_thread+0x48/0x468
>  kthread+0xf0/0x120
>  ret_from_fork+0x10/0x1c
> 
> oops2:
> usb 2-1: USB disconnect, device number 2
> xhci-hcd xhci-hcd.1.auto: remove, state 4
> usb usb2: USB disconnect, device number 1
> xhci-hcd xhci-hcd.1.auto: USB bus 2 deregistered
> xhci-hcd xhci-hcd.1.auto: remove, state 4
> usb usb1: USB disconnect, device number 1
> Unable to handle kernel NULL pointer dereference at virtual address 0000000000000138
> Mem abort info:
>   ESR = 0x96000004
>   EC = 0x25: DABT (current EL), IL = 32 bits
>   SET = 0, FnV = 0
>   EA = 0, S1PTW = 0
> Data abort info:
>   ISV = 0, ISS = 0x00000004
>   CM = 0, WnR = 0
> user pgtable: 4k pages, 48-bit VAs, pgdp=00000008b05e8000
> [0000000000000138] pgd=0000000000000000, p4d=0000000000000000
> Internal error: Oops: 96000004 [#1] PREEMPT SMP
> Modules linked in:
> CPU: 2 PID: 7 Comm: kworker/u8:0 Not tainted 5.6.0-rc4-next-20200304-03578-gd6235ff42e2b #101
> Hardware name: Freescale i.MX8QXP MEK (DT)
> Workqueue: 1-0050 tcpm_state_machine_work
> pstate: 20000005 (nzCv daif -PAN -UAO)
> pc : xhci_free_dev+0x214/0x270
> lr : xhci_plat_runtime_resume+0x78/0x88
> sp : ffff80001006b5b0
> x29: ffff80001006b5b0 x28: 0000000000000002
> x27: ffff00083b74fd48 x26: ffff00083a365580
> x25: ffff800010141458 x24: 0000000000000000
> x23: 0000000000000000 x22: ffff000837e58138
> x21: 0000000000000004 x20: ffff000837e58000
> x19: ffff000837e58250 x18: 0000000000000000
> x17: 0000000000000000 x16: 0000000000000001
> x15: 0000000000000004 x14: ffffffffffffffff
> x13: 0000000000004ed8 x12: ffff8000123d1000
> x11: ffff800012158000 x10: ffff8000123d1360
> x9 : ffff800010c74b00 x8 : 0000000000000007
> x7 : 00000000000012c2 x6 : ffff8000123d1000
> x5 : 0000000000000001 x4 : 0000000000000000
> x3 : 0000000000000000 x2 : 0000000000000138
> x1 : 0000000000000000 x0 : 0000000000000138
> Call trace:
>  xhci_free_dev+0x214/0x270
>  xhci_plat_runtime_resume+0x78/0x88
>  pm_generic_runtime_resume+0x30/0x48
>  __rpm_callback+0x90/0x148
>  rpm_callback+0x28/0x88
>  rpm_resume+0x568/0x758
>  rpm_resume+0x260/0x758
>  rpm_resume+0x260/0x758
>  __pm_runtime_resume+0x40/0x88
>  device_release_driver_internal+0xa0/0x1c8
>  device_release_driver+0x1c/0x28
>  bus_remove_device+0xd4/0x158
>  device_del+0x15c/0x3a0
>  usb_disable_device+0xb0/0x268
>  usb_disconnect+0xcc/0x300
>  usb_remove_hcd+0xf4/0x1dc
>  xhci_plat_remove+0x78/0xe0
>  platform_drv_remove+0x30/0x50
>  device_release_driver_internal+0xfc/0x1c8
>  device_release_driver+0x1c/0x28
>  bus_remove_device+0xd4/0x158
>  device_del+0x15c/0x3a0
>  platform_device_del.part.0+0x20/0x90
>  platform_device_unregister+0x28/0x40
>  cdns3_host_exit+0x20/0x40
>  cdns3_role_stop+0x60/0x90
>  cdns3_role_set+0x64/0xd8
>  usb_role_switch_set_role.part.0+0x3c/0x68
>  usb_role_switch_set_role+0x20/0x30
>  tcpm_mux_set+0x60/0xf8
>  tcpm_reset_port+0xa4/0xf0
>  tcpm_detach.part.0+0x28/0x50
>  tcpm_state_machine_work+0x12ac/0x2360
>  process_one_work+0x1c8/0x470
>  worker_thread+0x50/0x428
>  kthread+0xfc/0x128
>  ret_from_fork+0x10/0x18
> Code: c8037c02 35ffffa3 17ffe7c3 f9800011 (c85f7c01)
> ---[ end trace 45b1a173d2679e44 ]---
> 
> Cc: Baolin Wang <baolin.wang@linaro.org>
> Cc: Mathias Nyman <mathias.nyman@linux.intel.com>
> Cc: <stable@vger.kernel.org>
> Fixes: b0c69b4bace3 ("usb: host: plat: Enable xHCI plat runtime PM")
> Reviewed-by: Peter Chen <peter.chen@nxp.com>
> Tested-by: Peter Chen <peter.chen@nxp.com>
> Signed-off-by: Li Jun <jun.li@nxp.com>
> ---
> changes for v2:
> - Add pm_runtime_put_noidle() to balance pm_runtime_get_sync().
> - Move pm_runtime_set_suspended() to be after pm_runtime_disable().

Thanks, added to queue.
did some minor modification to the commit message at the same time.

-Mathias
diff mbox series

Patch

diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 1d4f6f8..ea460b9 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -362,6 +362,7 @@  static int xhci_plat_remove(struct platform_device *dev)
 	struct clk *reg_clk = xhci->reg_clk;
 	struct usb_hcd *shared_hcd = xhci->shared_hcd;
 
+	pm_runtime_get_sync(&dev->dev);
 	xhci->xhc_state |= XHCI_STATE_REMOVING;
 
 	usb_remove_hcd(shared_hcd);
@@ -375,8 +376,9 @@  static int xhci_plat_remove(struct platform_device *dev)
 	clk_disable_unprepare(reg_clk);
 	usb_put_hcd(hcd);
 
-	pm_runtime_set_suspended(&dev->dev);
 	pm_runtime_disable(&dev->dev);
+	pm_runtime_put_noidle(&dev->dev);
+	pm_runtime_set_suspended(&dev->dev);
 
 	return 0;
 }