> +static int pci_dev_check_d3cold(struct pci_dev *pdev, void *data) { > + bool *d3cold_ok = data; > + > + /* > + * The device needs to be allowed to go D3cold and if it is wake > + * capable to do so from D3cold. > + */ > + if (pdev->no_d3cold || !pdev->d3cold_allowed) > + *d3cold_ok = false; > + if (device_may_wakeup(&pdev->dev) && !pci_pme_capable(pdev, PCI_D3cold)) > + *d3cold_ok = false; > + > + return !*d3cold_ok; >+} How about the pme_poll? IMHO, if the pme_poll is set for some device, the PCIe port couldn't go to sleep as well. > +void pci_bridge_pm_update(struct pci_dev *pdev, bool remove) { > + struct pci_dev *bridge; > + bool d3cold_ok = true; > + > + bridge = pci_upstream_bridge(pdev); > + if (!bridge || !pci_bridge_d3_possible(bridge)) > + return; > + > + pci_dev_get(bridge); > + if (!remove) > + pci_dev_check_d3cold(pdev, &d3cold_ok); > + > + if (d3cold_ok) { > + /* > + * We need to go through all children to find out if all of > + * them can still go to D3cold. > + */ > + pci_walk_bus(bridge->subordinate, pci_dev_check_d3cold, > + &d3cold_ok); > + } > + bridge->bridge_d3 = d3cold_ok; > + pci_dev_put(bridge); > +} IMHO, the PCIe port can go to sleep if all the devices behind it are already in D3, not they have the capability to enter D3. Besides, why the devices should in D3cold? Why D3hot can't? Thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html