|
@@ -300,8 +300,6 @@ static irqreturn_t pcie_pme_irq(int irq, void *context)
|
|
*/
|
|
*/
|
|
static int pcie_pme_set_native(struct pci_dev *dev, void *ign)
|
|
static int pcie_pme_set_native(struct pci_dev *dev, void *ign)
|
|
{
|
|
{
|
|
- dev_info(&dev->dev, "Signaling PME through PCIe PME interrupt\n");
|
|
|
|
-
|
|
|
|
device_set_run_wake(&dev->dev, true);
|
|
device_set_run_wake(&dev->dev, true);
|
|
dev->pme_interrupt = true;
|
|
dev->pme_interrupt = true;
|
|
return 0;
|
|
return 0;
|
|
@@ -319,23 +317,8 @@ static int pcie_pme_set_native(struct pci_dev *dev, void *ign)
|
|
static void pcie_pme_mark_devices(struct pci_dev *port)
|
|
static void pcie_pme_mark_devices(struct pci_dev *port)
|
|
{
|
|
{
|
|
pcie_pme_set_native(port, NULL);
|
|
pcie_pme_set_native(port, NULL);
|
|
- if (port->subordinate) {
|
|
|
|
|
|
+ if (port->subordinate)
|
|
pci_walk_bus(port->subordinate, pcie_pme_set_native, NULL);
|
|
pci_walk_bus(port->subordinate, pcie_pme_set_native, NULL);
|
|
- } else {
|
|
|
|
- struct pci_bus *bus = port->bus;
|
|
|
|
- struct pci_dev *dev;
|
|
|
|
-
|
|
|
|
- /* Check if this is a root port event collector. */
|
|
|
|
- if (pci_pcie_type(port) != PCI_EXP_TYPE_RC_EC || !bus)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- down_read(&pci_bus_sem);
|
|
|
|
- list_for_each_entry(dev, &bus->devices, bus_list)
|
|
|
|
- if (pci_is_pcie(dev)
|
|
|
|
- && pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END)
|
|
|
|
- pcie_pme_set_native(dev, NULL);
|
|
|
|
- up_read(&pci_bus_sem);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -364,12 +347,14 @@ static int pcie_pme_probe(struct pcie_device *srv)
|
|
ret = request_irq(srv->irq, pcie_pme_irq, IRQF_SHARED, "PCIe PME", srv);
|
|
ret = request_irq(srv->irq, pcie_pme_irq, IRQF_SHARED, "PCIe PME", srv);
|
|
if (ret) {
|
|
if (ret) {
|
|
kfree(data);
|
|
kfree(data);
|
|
- } else {
|
|
|
|
- pcie_pme_mark_devices(port);
|
|
|
|
- pcie_pme_interrupt_enable(port, true);
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- return ret;
|
|
|
|
|
|
+ dev_info(&port->dev, "Signaling PME with IRQ %d\n", srv->irq);
|
|
|
|
+
|
|
|
|
+ pcie_pme_mark_devices(port);
|
|
|
|
+ pcie_pme_interrupt_enable(port, true);
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static bool pcie_pme_check_wakeup(struct pci_bus *bus)
|
|
static bool pcie_pme_check_wakeup(struct pci_bus *bus)
|