[PATCH 1/2] PCI PM: Split PCI Express port suspend-resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Rafael J. Wysocki <rjw@xxxxxxx>

Suspend-resume of PCI Express ports has recently been moved into

_suspend_late() and _resume_early() callbacks, but some functions

executed from there should not be called with interrupts disabled,

eg. pci_enable_device(). For this reason, split the suspend-resume

of PCI Express ports into parts to be executed with interrupts

disabled and with interrupts enabled.

Signed-off-by: Rafael J. Wysocki <rjw@xxxxxxx>

---

drivers/pci/pcie/portdrv_pci.c | 23 +++++++++++++++++------

1 file changed, 17 insertions(+), 6 deletions(-)

Index: linux-2.6/drivers/pci/pcie/portdrv_pci.c

===================================================================

--- linux-2.6.orig/drivers/pci/pcie/portdrv_pci.c

+++ linux-2.6/drivers/pci/pcie/portdrv_pci.c

@@ -41,7 +41,6 @@ static int pcie_portdrv_restore_config(s

{

int retval;

- pci_restore_state(dev);

retval = pci_enable_device(dev);

if (retval)

return retval;

@@ -50,23 +49,32 @@ static int pcie_portdrv_restore_config(s

}

#ifdef CONFIG_PM

-static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)

+static int pcie_portdrv_suspend(struct pci_dev *dev, pm_message_t state)

{

- int ret = pcie_port_device_suspend(dev, state);

+ return pcie_port_device_suspend(dev, state);

+

+}

- if (!ret)

- ret = pcie_portdrv_save_config(dev);

- return ret;

+static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)

+{

+ return pci_save_state(dev);

}

static int pcie_portdrv_resume_early(struct pci_dev *dev)

{

+ return pci_restore_state(dev);

+}

+

+static int pcie_portdrv_resume(struct pci_dev *dev)

+{

pcie_portdrv_restore_config(dev);

return pcie_port_device_resume(dev);

}

#else

+#define pcie_portdrv_suspend NULL

#define pcie_portdrv_suspend_late NULL

#define pcie_portdrv_resume_early NULL

+#define pcie_portdrv_resume NULL

#endif

/*

@@ -221,6 +229,7 @@ static pci_ers_result_t pcie_portdrv_slo

/* If fatal, restore cfg space for possible link reset at upstream */

if (dev->error_state == pci_channel_io_frozen) {

+ pci_restore_state(dev);

pcie_portdrv_restore_config(dev);

pci_enable_pcie_error_reporting(dev);

}

@@ -282,8 +291,10 @@ static struct pci_driver pcie_portdriver

.probe = pcie_portdrv_probe,

.remove = pcie_portdrv_remove,

+ .suspend = pcie_portdrv_suspend,

.suspend_late = pcie_portdrv_suspend_late,

.resume_early = pcie_portdrv_resume_early,

+ .resume = pcie_portdrv_resume,

.err_handler = &pcie_portdrv_err_handler,

};

_______________________________________________
linux-pm mailing list
linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/linux-pm

[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux