| From f61f2360f24c22046ccc91179036ef3c2cffb106 Mon Sep 17 00:00:00 2001 |
| From: Trent Piepho <tpiepho@impinj.com> |
| Date: Mon, 5 Nov 2018 18:11:36 +0000 |
| Subject: PCI: imx6: Fix link training status detection in link up check |
| |
| [ Upstream commit 68bc10bf992180f269816ff3d22eb30383138577 ] |
| |
| This bug was introduced in the interaction for two commits on either |
| branch of the merge commit 562df5c8521e ("Merge branch |
| 'pci/host-designware' into next"). |
| |
| Commit 4d107d3b5a68 ("PCI: imx6: Move link up check into |
| imx6_pcie_wait_for_link()"), changed imx6_pcie_wait_for_link() to poll |
| the link status register directly, checking for link up and not |
| training, and made imx6_pcie_link_up() only check the link up bit (once, |
| not a polling loop). |
| |
| While commit 886bc5ceb5cc ("PCI: designware: Add generic |
| dw_pcie_wait_for_link()"), replaced the loop in |
| imx6_pcie_wait_for_link() with a call to a new dwc core function, which |
| polled imx6_pcie_link_up(), which still checked both link up and not |
| training in a loop. |
| |
| When these two commits were merged, the version of |
| imx6_pcie_wait_for_link() from 886bc5ceb5cc was kept, which eliminated |
| the link training check placed there by 4d107d3b5a68. However, the |
| version of imx6_pcie_link_up() from 4d107d3b5a68 was kept, which |
| eliminated the link training check that had been there and was moved to |
| imx6_pcie_wait_for_link(). |
| |
| The result was the link training check got lost for the imx6 driver. |
| |
| Eliminate imx6_pcie_link_up() so that the default handler, |
| dw_pcie_link_up(), is used instead. The default handler has the correct |
| code, which checks for link up and also that it still is not training, |
| fixing the regression. |
| |
| Fixes: 562df5c8521e ("Merge branch 'pci/host-designware' into next") |
| Signed-off-by: Trent Piepho <tpiepho@impinj.com> |
| [lorenzo.pieralisi@arm.com: rewrote the commit log] |
| Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| Reviewed-by: Lucas Stach <l.stach@pengutronix.de> |
| Cc: Bjorn Helgaas <bhelgaas@google.com> |
| Cc: Joao Pinto <Joao.Pinto@synopsys.com> |
| Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| Cc: Richard Zhu <hongxing.zhu@nxp.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pci/dwc/pci-imx6.c | 10 +--------- |
| 1 file changed, 1 insertion(+), 9 deletions(-) |
| |
| diff --git a/drivers/pci/dwc/pci-imx6.c b/drivers/pci/dwc/pci-imx6.c |
| index b73483534a5b..1f1069b70e45 100644 |
| --- a/drivers/pci/dwc/pci-imx6.c |
| +++ b/drivers/pci/dwc/pci-imx6.c |
| @@ -83,8 +83,6 @@ struct imx6_pcie { |
| #define PCIE_PL_PFLR_FORCE_LINK (1 << 15) |
| #define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28) |
| #define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c) |
| -#define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29) |
| -#define PCIE_PHY_DEBUG_R1_XMLH_LINK_UP (1 << 4) |
| |
| #define PCIE_PHY_CTRL (PL_OFFSET + 0x114) |
| #define PCIE_PHY_CTRL_DATA_LOC 0 |
| @@ -653,12 +651,6 @@ static int imx6_pcie_host_init(struct pcie_port *pp) |
| return 0; |
| } |
| |
| -static int imx6_pcie_link_up(struct dw_pcie *pci) |
| -{ |
| - return dw_pcie_readl_dbi(pci, PCIE_PHY_DEBUG_R1) & |
| - PCIE_PHY_DEBUG_R1_XMLH_LINK_UP; |
| -} |
| - |
| static const struct dw_pcie_host_ops imx6_pcie_host_ops = { |
| .host_init = imx6_pcie_host_init, |
| }; |
| @@ -701,7 +693,7 @@ static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, |
| } |
| |
| static const struct dw_pcie_ops dw_pcie_ops = { |
| - .link_up = imx6_pcie_link_up, |
| + /* No special ops needed, but pcie-designware still expects this struct */ |
| }; |
| |
| static int imx6_pcie_probe(struct platform_device *pdev) |
| -- |
| 2.19.1 |
| |