aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/host
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2013-12-12 16:49:59 -0500
committerBjorn Helgaas <bhelgaas@google.com>2013-12-19 12:45:17 -0500
commit7f9f40c01cce0c0e0ced34af2a2fd8353cc606c3 (patch)
tree98292e24e4b7e36151c68d49c50afebf3b5db7c0 /drivers/pci/host
parentc28f8a1f2b5ed24d48ca6827d0ae499c2e48e8c9 (diff)
PCI: imx6: Report "link up" only after link training completes
While waiting for the PHY to report the PCIe link is up, we might hit a situation where the link training is still in progress, while the PHY already reports the link is up. Add additional check for this condition. Signed-off-by: Marek Vasut <marex@denx.de> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Shawn Guo <shawn.guo@linaro.org> Cc: Frank Li <lznuaa@gmail.com> Cc: Harro Haan <hrhaan@gmail.com> Cc: Jingoo Han <jg1.han@samsung.com> Cc: Mohit KUMAR <Mohit.KUMAR@st.com> Cc: Pratyush Anand <pratyush.anand@st.com> Cc: Richard Zhu <r65037@freescale.com> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Sean Cross <xobs@kosagi.com> Cc: Siva Reddy Kallam <siva.kallam@samsung.com> Cc: Srikanth T Shivanand <ts.srikanth@samsung.com> Cc: Tim Harvey <tharvey@gateworks.com> Cc: Troy Kisky <troy.kisky@boundarydevices.com> Cc: Yinghai Lu <yinghai@kernel.org>
Diffstat (limited to 'drivers/pci/host')
-rw-r--r--drivers/pci/host/pci-imx6.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 1176bddee1cc..5634a33ea642 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -48,6 +48,8 @@ struct imx6_pcie {
48#define PL_OFFSET 0x700 48#define PL_OFFSET 0x700
49#define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28) 49#define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28)
50#define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c) 50#define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c)
51#define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29)
52#define PCIE_PHY_DEBUG_R1_XMLH_LINK_UP (1 << 4)
51 53
52#define PCIE_PHY_CTRL (PL_OFFSET + 0x114) 54#define PCIE_PHY_CTRL (PL_OFFSET + 0x114)
53#define PCIE_PHY_CTRL_DATA_LOC 0 55#define PCIE_PHY_CTRL_DATA_LOC 0
@@ -338,10 +340,17 @@ static int imx6_pcie_link_up(struct pcie_port *pp)
338{ 340{
339 u32 rc, ltssm, rx_valid, temp; 341 u32 rc, ltssm, rx_valid, temp;
340 342
341 /* link is debug bit 36, debug register 1 starts at bit 32 */ 343 /*
342 rc = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1) & (0x1 << (36 - 32)); 344 * Test if the PHY reports that the link is up and also that
343 if (rc) 345 * the link training finished. It might happen that the PHY
344 return -EAGAIN; 346 * reports the link is already up, but the link training bit
347 * is still set, so make sure to check the training is done
348 * as well here.
349 */
350 rc = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1);
351 if ((rc & PCIE_PHY_DEBUG_R1_XMLH_LINK_UP) &&
352 !(rc & PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING))
353 return 1;
345 354
346 /* 355 /*
347 * From L0, initiate MAC entry to gen2 if EP/RC supports gen2. 356 * From L0, initiate MAC entry to gen2 if EP/RC supports gen2.