[linux-pm] ehci_hcd related S3 lockup on ASUS laptops, again
Andrey Rahmatullin
wrar at wrar.name
Mon Apr 16 21:19:43 UTC 2012
On Mon, Apr 16, 2012 at 04:07:10PM -0400, Alan Stern wrote:
> This is my next attempt to make the driver-bound and driver-unbound
> suspend paths as similar as possible. Apply this to a vanilla kernel;
> it is based on 3.4-rc2 plus a few unrelated changes. See what happens
> when you suspend without unbinding ehci-hcd -- and be sure to include
> "no_console_suspend" on the boot command line beforehand.
It suspends and resumes but the screen is not enabled after resume and the
network doesn't seem to work either.
> These changes will prevent the driver from working after resume
> (assuming the computer survives that long). That's all right; all I
> care about is whether the computer _does_ resume.
>
> Alan Stern
>
>
>
>
> Index: usb-3.4/drivers/pci/pci-driver.c
> ===================================================================
> --- usb-3.4.orig/drivers/pci/pci-driver.c
> +++ usb-3.4/drivers/pci/pci-driver.c
> @@ -713,6 +713,8 @@ static int pci_pm_suspend_noirq(struct d
>
> if (!pm) {
> pci_save_state(pci_dev);
> + pci_prepare_to_sleep(pci_dev);
> + pci_pm_set_unknown_state(pci_dev);
> return 0;
> }
>
> Index: usb-3.4/drivers/pci/pci.c
> ===================================================================
> --- usb-3.4.orig/drivers/pci/pci.c
> +++ usb-3.4/drivers/pci/pci.c
> @@ -1348,6 +1348,7 @@ void pci_disable_enabled_device(struct p
> if (pci_is_enabled(dev))
> do_pci_disable_device(dev);
> }
> +EXPORT_SYMBOL(pci_disable_enabled_device);
>
> /**
> * pci_disable_device - Disable PCI device after use
> @@ -1710,6 +1711,7 @@ pci_power_t pci_target_state(struct pci_
> */
> int pci_prepare_to_sleep(struct pci_dev *dev)
> {
> + pci_power_t cur_state = dev->current_state;
> pci_power_t target_state = pci_target_state(dev);
> int error;
>
> @@ -1723,6 +1725,8 @@ int pci_prepare_to_sleep(struct pci_dev
> if (error)
> pci_enable_wake(dev, target_state, false);
>
> + dev_info(&dev->dev, "cur %d target %d error %d\n", cur_state,
> + target_state, error);
> return error;
> }
>
> Index: usb-3.4/drivers/usb/core/hcd-pci.c
> ===================================================================
> --- usb-3.4.orig/drivers/usb/core/hcd-pci.c
> +++ usb-3.4/drivers/usb/core/hcd-pci.c
> @@ -381,6 +381,8 @@ static int check_root_hub_suspended(stru
> }
>
> #if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME)
> +extern void pci_disable_enabled_device(struct pci_dev *);
> +
> static int suspend_common(struct device *dev, bool do_wakeup)
> {
> struct pci_dev *pci_dev = to_pci_dev(dev);
> @@ -427,12 +429,17 @@ static int suspend_common(struct device
> if (!hcd->msix_enabled)
> synchronize_irq(pci_dev->irq);
>
> + free_irq(hcd->irq, hcd);
> + iounmap(hcd->regs);
> + pci_disable_device(pci_dev);
> +
> /* Downstream ports from this root hub should already be quiesced, so
> * there will be no DMA activity. Now we can shut down the upstream
> * link (except maybe for PME# resume signaling). We'll enter a
> * low power state during suspend_noirq, if the hardware allows.
> */
> - pci_disable_device(pci_dev);
> + pci_disable_enabled_device(pci_dev);
> + pci_dev->current_state = PCI_UNKNOWN;
> return retval;
> }
>
> Index: usb-3.4/drivers/usb/host/ehci-pci.c
> ===================================================================
> --- usb-3.4.orig/drivers/usb/host/ehci-pci.c
> +++ usb-3.4/drivers/usb/host/ehci-pci.c
> @@ -342,7 +342,6 @@ static int ehci_pci_suspend(struct usb_h
> * mark HW unaccessible. The PM and USB cores make sure that
> * the root hub is either suspended or stopped.
> */
> - ehci_prepare_ports_for_controller_suspend(ehci, do_wakeup);
> spin_lock_irqsave (&ehci->lock, flags);
> ehci_writel(ehci, 0, &ehci->regs->intr_enable);
> (void)ehci_readl(ehci, &ehci->regs->intr_enable);
> @@ -350,6 +349,9 @@ static int ehci_pci_suspend(struct usb_h
> clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
> spin_unlock_irqrestore (&ehci->lock, flags);
>
> + ehci_silence_controller(ehci);
> + ehci_reset(ehci);
> +
> // could save FLADJ in case of Vaux power loss
> // ... we'd only use it to handle clock skew
>
>
>
--
WBR, wRAR
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.linuxfoundation.org/pipermail/linux-pm/attachments/20120417/50325e20/attachment.sig>
More information about the linux-pm
mailing list