[linux-yocto] [PATCH 13/15] drivers/pci: Axxia Hardware Work Around

Daniel Dragomir daniel.dragomir at windriver.com
Wed Aug 2 05:46:48 PDT 2017


From: John Jacques <john.jacques at intel.com>

The Axxia pci controller has the wrong class code.  This
commit updates the code each time the controller gets
reset.

Signed-off-by: John Jacques <john.jacques at intel.com>
---
 drivers/pci/host/pcie-axxia.c | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/drivers/pci/host/pcie-axxia.c b/drivers/pci/host/pcie-axxia.c
index 1109cf5..99c9020 100644
--- a/drivers/pci/host/pcie-axxia.c
+++ b/drivers/pci/host/pcie-axxia.c
@@ -913,6 +913,20 @@ axxia_pcie_los_wa(struct pcie_port *pp, unsigned int max_width)
 	return rc;
 }
 
+static void pci_axxia_program_rc_class(struct pcie_port *pp)
+{
+	u32 dbi_ro_wr_en;
+	/* program correct class for RC */
+	axxia_pcie_readl_rc(pp, 0x8bc, &dbi_ro_wr_en);
+	/* DBI_RO_WR_EN */
+	if (!(dbi_ro_wr_en & 0x1))
+		axxia_pcie_writel_rc(pp, (dbi_ro_wr_en | 0x1), 0x8bc);
+	axxia_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
+	/* DBI_RO_WR_EN */
+	if (!(dbi_ro_wr_en & 0x1))
+		axxia_pcie_writel_rc(pp, dbi_ro_wr_en, 0x8bc);
+}
+
 void axxia_pcie_setup_rc(struct pcie_port *pp)
 {
 	u32 val;
@@ -926,6 +940,9 @@ void axxia_pcie_setup_rc(struct pcie_port *pp)
 		return;
 
 	for (;;) {
+		/* program correct class for RC */
+		pci_axxia_program_rc_class(pp);
+
 		/*
 		  To work around a hardware problem, set
 		  PCIE_LINK_WIDTH_SPEED_CONTROL to 1 lane in all cases.
@@ -1038,20 +1055,6 @@ static int axxia_pcie_establish_link(struct pcie_port *pp)
 	return 0;
 }
 
-static void pci_axxia_program_rc_class(struct pcie_port *pp)
-{
-	u32 dbi_ro_wr_en;
-	/* program correct class for RC */
-	axxia_pcie_readl_rc(pp, 0x8bc, &dbi_ro_wr_en);
-	/* DBI_RO_WR_EN */
-	if (!(dbi_ro_wr_en & 0x1))
-		axxia_pcie_writel_rc(pp, (dbi_ro_wr_en | 0x1), 0x8bc);
-	axxia_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
-	/* DBI_RO_WR_EN */
-	if (!(dbi_ro_wr_en & 0x1))
-		axxia_pcie_writel_rc(pp, dbi_ro_wr_en, 0x8bc);
-}
-
 static irqreturn_t axxia_pcie_irq_handler(int irq, void *arg)
 {
 	struct pcie_port *pp = arg;
@@ -1399,9 +1402,6 @@ int axxia_pcie_host_init(struct pcie_port *pp)
 		return -EINVAL;
 	}
 
-	/* program correct class for RC */
-	pci_axxia_program_rc_class(pp);
-
 	if (axxia_pcie_establish_link(pp))
 		dev_warn(pp->dev, "axxia_pcie_establish_link failed\n");
 
-- 
2.7.4



More information about the linux-yocto mailing list