[Skiboot] [PATCH 16/16] hw/phb3: Disable ECRC on Broadcom adapter behind PMC switch
Gavin Shan
gwshan at linux.vnet.ibm.com
Fri Sep 16 15:05:23 AEST 2016
The ECRC generation and check can't be enabled on Broadcom's NIC
(vdid: 14e4:168a) when it seats behind PMC PCIe switch downstream
port (vdid: 11f8:8546). Otherwise, the NIC's config space can't
be accessed and returns 0xFF's on read because of EEH error even
after the EEH error is cleared. The issue is found on Firestone.
0001:06:00.0 Ethernet controller: Broadcom Corporation \
NetXtreme II BCM57800 10 Gigabit Ethernet (rev 10)
This disables ECRC generation and check on Broadcom's NIC when it
seats behind PMC PCIe switch downstream port.
Reported-by: Li Meng <shlimeng at cn.ibm.com>
Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
---
hw/phb3.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/hw/phb3.c b/hw/phb3.c
index 050c69b..2d198ac 100644
--- a/hw/phb3.c
+++ b/hw/phb3.c
@@ -436,6 +436,21 @@ static void phb3_switch_port_init(struct phb *phb,
pci_cfg_write32(phb, bdfn, aercap + PCIECAP_AER_CAPCTL, val32);
}
+static inline bool phb3_endpoint_report_ecrc(struct pci_device *pd)
+{
+ /* No ECRC generation and check on Broadcom ethernet adapter
+ * when it seats behind a PMC's PCIe switch downstream port.
+ * Otherwise, the Broadcom ethernet adapter's config space
+ * can't be accessed because of frozen PE error even after
+ * the frozen PE error is cleared.
+ */
+ if (pd && pd->vdid == 0x168a14e4 &&
+ pd->parent && pd->parent->vdid == 0x854611f8)
+ return false;
+
+ return true;
+}
+
static void phb3_endpoint_init(struct phb *phb,
struct pci_device *dev,
int ecap, int aercap)
@@ -473,8 +488,12 @@ static void phb3_endpoint_init(struct phb *phb,
/* Enable ECRC generation and check */
pci_cfg_read32(phb, bdfn, aercap + PCIECAP_AER_CAPCTL, &val32);
- val32 |= (PCIECAP_AER_CAPCTL_ECRCG_EN |
- PCIECAP_AER_CAPCTL_ECRCC_EN);
+ if (phb3_endpoint_report_ecrc(dev))
+ val32 |= (PCIECAP_AER_CAPCTL_ECRCG_EN |
+ PCIECAP_AER_CAPCTL_ECRCC_EN);
+ else
+ val32 &= ~(PCIECAP_AER_CAPCTL_ECRCG_EN |
+ PCIECAP_AER_CAPCTL_ECRCC_EN);
pci_cfg_write32(phb, bdfn, aercap + PCIECAP_AER_CAPCTL, val32);
}
--
2.1.0
More information about the Skiboot
mailing list