thunderbolt: Add device links only when software connection manager is used
authorMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 24 May 2021 14:57:32 +0000 (17:57 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Fri, 11 Jun 2021 08:42:54 +0000 (11:42 +0300)
We only need to set up the device links when software connection manager
path is used. The firmware connection manager does not need them and if
they are present they may even cause problems.

Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/nhi.c
drivers/thunderbolt/tb.c

index a0386d1..478bf67 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/property.h>
-#include <linux/platform_data/x86/apple.h>
 
 #include "nhi.h"
 #include "nhi_regs.h"
@@ -1127,69 +1126,6 @@ static bool nhi_imr_valid(struct pci_dev *pdev)
        return true;
 }
 
-/*
- * During suspend the Thunderbolt controller is reset and all PCIe
- * tunnels are lost. The NHI driver will try to reestablish all tunnels
- * during resume. This adds device links between the tunneled PCIe
- * downstream ports and the NHI so that the device core will make sure
- * NHI is resumed first before the rest.
- */
-static void tb_apple_add_links(struct tb_nhi *nhi)
-{
-       struct pci_dev *upstream, *pdev;
-
-       if (!x86_apple_machine)
-               return;
-
-       switch (nhi->pdev->device) {
-       case PCI_DEVICE_ID_INTEL_LIGHT_RIDGE:
-       case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C:
-       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_NHI:
-       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI:
-               break;
-       default:
-               return;
-       }
-
-       upstream = pci_upstream_bridge(nhi->pdev);
-       while (upstream) {
-               if (!pci_is_pcie(upstream))
-                       return;
-               if (pci_pcie_type(upstream) == PCI_EXP_TYPE_UPSTREAM)
-                       break;
-               upstream = pci_upstream_bridge(upstream);
-       }
-
-       if (!upstream)
-               return;
-
-       /*
-        * For each hotplug downstream port, create add device link
-        * back to NHI so that PCIe tunnels can be re-established after
-        * sleep.
-        */
-       for_each_pci_bridge(pdev, upstream->subordinate) {
-               const struct device_link *link;
-
-               if (!pci_is_pcie(pdev))
-                       continue;
-               if (pci_pcie_type(pdev) != PCI_EXP_TYPE_DOWNSTREAM ||
-                   !pdev->is_hotplug_bridge)
-                       continue;
-
-               link = device_link_add(&pdev->dev, &nhi->pdev->dev,
-                                      DL_FLAG_AUTOREMOVE_SUPPLIER |
-                                      DL_FLAG_PM_RUNTIME);
-               if (link) {
-                       dev_dbg(&nhi->pdev->dev, "created link from %s\n",
-                               dev_name(&pdev->dev));
-               } else {
-                       dev_warn(&nhi->pdev->dev, "device link creation from %s failed\n",
-                                dev_name(&pdev->dev));
-               }
-       }
-}
-
 static struct tb *nhi_select_cm(struct tb_nhi *nhi)
 {
        struct tb *tb;
@@ -1278,9 +1214,6 @@ static int nhi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                        return res;
        }
 
-       tb_apple_add_links(nhi);
-       tb_acpi_add_links(nhi);
-
        tb = nhi_select_cm(nhi);
        if (!tb) {
                dev_err(&nhi->pdev->dev,
index bc6d568..2897a77 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/pm_runtime.h>
+#include <linux/platform_data/x86/apple.h>
 
 #include "tb.h"
 #include "tb_regs.h"
@@ -1571,6 +1572,69 @@ static const struct tb_cm_ops tb_cm_ops = {
        .disconnect_xdomain_paths = tb_disconnect_xdomain_paths,
 };
 
+/*
+ * During suspend the Thunderbolt controller is reset and all PCIe
+ * tunnels are lost. The NHI driver will try to reestablish all tunnels
+ * during resume. This adds device links between the tunneled PCIe
+ * downstream ports and the NHI so that the device core will make sure
+ * NHI is resumed first before the rest.
+ */
+static void tb_apple_add_links(struct tb_nhi *nhi)
+{
+       struct pci_dev *upstream, *pdev;
+
+       if (!x86_apple_machine)
+               return;
+
+       switch (nhi->pdev->device) {
+       case PCI_DEVICE_ID_INTEL_LIGHT_RIDGE:
+       case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C:
+       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_NHI:
+       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI:
+               break;
+       default:
+               return;
+       }
+
+       upstream = pci_upstream_bridge(nhi->pdev);
+       while (upstream) {
+               if (!pci_is_pcie(upstream))
+                       return;
+               if (pci_pcie_type(upstream) == PCI_EXP_TYPE_UPSTREAM)
+                       break;
+               upstream = pci_upstream_bridge(upstream);
+       }
+
+       if (!upstream)
+               return;
+
+       /*
+        * For each hotplug downstream port, create add device link
+        * back to NHI so that PCIe tunnels can be re-established after
+        * sleep.
+        */
+       for_each_pci_bridge(pdev, upstream->subordinate) {
+               const struct device_link *link;
+
+               if (!pci_is_pcie(pdev))
+                       continue;
+               if (pci_pcie_type(pdev) != PCI_EXP_TYPE_DOWNSTREAM ||
+                   !pdev->is_hotplug_bridge)
+                       continue;
+
+               link = device_link_add(&pdev->dev, &nhi->pdev->dev,
+                                      DL_FLAG_AUTOREMOVE_SUPPLIER |
+                                      DL_FLAG_PM_RUNTIME);
+               if (link) {
+                       dev_dbg(&nhi->pdev->dev, "created link from %s\n",
+                               dev_name(&pdev->dev));
+               } else {
+                       dev_warn(&nhi->pdev->dev, "device link creation from %s failed\n",
+                                dev_name(&pdev->dev));
+               }
+       }
+}
+
 struct tb *tb_probe(struct tb_nhi *nhi)
 {
        struct tb_cm *tcm;
@@ -1594,5 +1658,8 @@ struct tb *tb_probe(struct tb_nhi *nhi)
 
        tb_dbg(tb, "using software connection manager\n");
 
+       tb_apple_add_links(nhi);
+       tb_acpi_add_links(nhi);
+
        return tb;
 }