case PCI_EXP_TYPE_DOWNSTREAM:
                if (pci_bridge_d3_disable)
                        return false;
+
+               /*
+                * Hotplug interrupts cannot be delivered if the link is down,
+                * so parents of a hotplug port must stay awake. In addition,
+                * hotplug ports handled by firmware in System Management Mode
+                * may not be put into D3 by the OS (Thunderbolt on non-Macs).
+                * For simplicity, disallow in general for now.
+                */
+               if (bridge->is_hotplug_bridge)
+                       return false;
+
                if (pci_bridge_d3_force)
                        return true;
 
 
 
        pci_save_state(dev);
 
-       /*
-        * Prevent runtime PM if the port is advertising support for PCIe
-        * hotplug.  Otherwise the BIOS hotplug SMI code might not be able
-        * to enumerate devices behind this port properly (the port is
-        * powered down preventing all config space accesses to the
-        * subordinate devices).  We can't be sure for native PCIe hotplug
-        * either so prevent that as well.
-        */
-       if (pci_bridge_d3_possible(dev) && !dev->is_hotplug_bridge) {
+       if (pci_bridge_d3_possible(dev)) {
                /*
                 * Keep the port resumed 100ms to make sure things like
                 * config space accesses from userspace (lspci) will not
 
 static void pcie_portdrv_remove(struct pci_dev *dev)
 {
-       if (pci_bridge_d3_possible(dev) && !dev->is_hotplug_bridge) {
+       if (pci_bridge_d3_possible(dev)) {
                pm_runtime_forbid(&dev->dev);
                pm_runtime_get_noresume(&dev->dev);
                pm_runtime_dont_use_autosuspend(&dev->dev);