If we are rebooting (e.g. via kexec) then the PCI RC link may
already be up.  In that case, we don't want to do the software
fixup to force the link up, since that can degrade it to Gen1.

Signed-off-by: Chris Metcalf <cmetc...@tilera.com>
---
 arch/tile/kernel/pci_gx.c | 41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index e99809e..2cc3e64 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -674,10 +674,33 @@ int __init pcibios_init(void)
                        continue;
                }
 
-               ret = gxio_trio_force_rc_link_up(trio_context, mac);
-               if (ret < 0)
-                       pr_err("PCI: PCIE_FORCE_LINK_UP failure, "
-                               "MAC %d on TRIO %d\n", mac, trio_index);
+               /*
+                * Check for PCIe link-up status to decide if we need
+                * to force the link to come up.
+                */
+               reg_offset =
+                       (TRIO_PCIE_INTFC_PORT_STATUS <<
+                               TRIO_CFG_REGION_ADDR__REG_SHIFT) |
+                       (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE <<
+                               TRIO_CFG_REGION_ADDR__INTFC_SHIFT) |
+                       (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
+
+               port_status.word =
+                       __gxio_mmio_read(trio_context->mmio_base_mac +
+                                        reg_offset);
+               if (!port_status.dl_up) {
+                       if (rc_delay[trio_index][mac]) {
+                               pr_info("Delaying PCIe RC TRIO init %d sec"
+                                       " on MAC %d on TRIO %d\n",
+                                       rc_delay[trio_index][mac], mac,
+                                       trio_index);
+                               msleep(rc_delay[trio_index][mac] * 1000);
+                       }
+                       ret = gxio_trio_force_rc_link_up(trio_context, mac);
+                       if (ret < 0)
+                               pr_err("PCI: PCIE_FORCE_LINK_UP failure, "
+                                       "MAC %d on TRIO %d\n", mac, trio_index);
+               }
 
                pr_info("PCI: Found PCI controller #%d on TRIO %d MAC %d\n", i,
                        trio_index, controller->mac);
@@ -700,16 +723,8 @@ int __init pcibios_init(void)
                }
 
                /*
-                * Check for PCIe link-up status.
+                * Check for PCIe link-up status again.
                 */
-
-               reg_offset =
-                       (TRIO_PCIE_INTFC_PORT_STATUS <<
-                               TRIO_CFG_REGION_ADDR__REG_SHIFT) |
-                       (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE <<
-                               TRIO_CFG_REGION_ADDR__INTFC_SHIFT ) |
-                       (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
-
                port_status.word =
                        __gxio_mmio_read(trio_context->mmio_base_mac +
                                         reg_offset);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to