| From 26a0ef033ea706ca618538fc92ea11b7675d474d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 21 Apr 2022 10:39:27 -0700 |
| Subject: USB: hcd-pci: Fully suspend across freeze/thaw cycle |
| |
| From: Evan Green <evgreen@chromium.org> |
| |
| [ Upstream commit 63acaa8e9c65dc34dc249440216f8e977f5d2748 ] |
| |
| The documentation for the freeze() method says that it "should quiesce |
| the device so that it doesn't generate IRQs or DMA". The unspoken |
| consequence of not doing this is that MSIs aimed at non-boot CPUs may |
| get fully lost if they're sent during the period where the target CPU is |
| offline. |
| |
| The current callbacks for USB HCD do not fully quiesce interrupts, |
| specifically on XHCI. Change to use the full suspend/resume flow for |
| freeze/thaw to ensure interrupts are fully quiesced. This fixes issues |
| where USB devices fail to thaw during hibernation because XHCI misses |
| its interrupt and cannot recover. |
| |
| Acked-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Evan Green <evgreen@chromium.org> |
| Link: https://lore.kernel.org/r/20220421103751.v3.2.I8226c7fdae88329ef70957b96a39b346c69a914e@changeid |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/core/hcd-pci.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c |
| index 7af23b215254..a416eea9a366 100644 |
| --- a/drivers/usb/core/hcd-pci.c |
| +++ b/drivers/usb/core/hcd-pci.c |
| @@ -637,10 +637,10 @@ const struct dev_pm_ops usb_hcd_pci_pm_ops = { |
| .suspend_noirq = hcd_pci_suspend_noirq, |
| .resume_noirq = hcd_pci_resume_noirq, |
| .resume = hcd_pci_resume, |
| - .freeze = check_root_hub_suspended, |
| + .freeze = hcd_pci_suspend, |
| .freeze_noirq = check_root_hub_suspended, |
| .thaw_noirq = NULL, |
| - .thaw = NULL, |
| + .thaw = hcd_pci_resume, |
| .poweroff = hcd_pci_suspend, |
| .poweroff_noirq = hcd_pci_suspend_noirq, |
| .restore_noirq = hcd_pci_resume_noirq, |
| -- |
| 2.35.1 |
| |