|
@@ -2093,7 +2093,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|
|
|
|
|
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
sky2_pci_write16(hw, PCI_STATUS,
|
|
sky2_pci_write16(hw, PCI_STATUS,
|
|
- pci_err | PCI_STATUS_ERROR_BITS);
|
|
|
|
|
|
+ pci_err | PCI_STATUS_ERROR_BITS);
|
|
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2101,7 +2101,8 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|
/* PCI-Express uncorrectable Error occurred */
|
|
/* PCI-Express uncorrectable Error occurred */
|
|
u32 pex_err;
|
|
u32 pex_err;
|
|
|
|
|
|
- pex_err = sky2_pci_read32(hw, PEX_UNC_ERR_STAT);
|
|
|
|
|
|
+ pex_err = sky2_pci_read32(hw,
|
|
|
|
+ hw->err_cap + PCI_ERR_UNCOR_STATUS);
|
|
|
|
|
|
if (net_ratelimit())
|
|
if (net_ratelimit())
|
|
printk(KERN_ERR PFX "%s: pci express error (0x%x)\n",
|
|
printk(KERN_ERR PFX "%s: pci express error (0x%x)\n",
|
|
@@ -2109,15 +2110,20 @@ static void sky2_hw_intr(struct sky2_hw *hw)
|
|
|
|
|
|
/* clear the interrupt */
|
|
/* clear the interrupt */
|
|
sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
|
|
- sky2_pci_write32(hw, PEX_UNC_ERR_STAT,
|
|
|
|
- 0xffffffffUL);
|
|
|
|
|
|
+ sky2_pci_write32(hw,
|
|
|
|
+ hw->err_cap + PCI_ERR_UNCOR_STATUS,
|
|
|
|
+ 0xffffffffUL);
|
|
sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
|
|
|
|
|
|
- if (pex_err & PEX_FATAL_ERRORS) {
|
|
|
|
|
|
+
|
|
|
|
+ /* In case of fatal error mask off to keep from getting stuck */
|
|
|
|
+ if (pex_err & (PCI_ERR_UNC_POISON_TLP | PCI_ERR_UNC_FCP
|
|
|
|
+ | PCI_ERR_UNC_DLP)) {
|
|
u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK);
|
|
u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK);
|
|
hwmsk &= ~Y2_IS_PCI_EXP;
|
|
hwmsk &= ~Y2_IS_PCI_EXP;
|
|
sky2_write32(hw, B0_HWE_IMSK, hwmsk);
|
|
sky2_write32(hw, B0_HWE_IMSK, hwmsk);
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
if (status & Y2_HWE_L1_MASK)
|
|
if (status & Y2_HWE_L1_MASK)
|
|
@@ -2298,6 +2304,7 @@ static int sky2_reset(struct sky2_hw *hw)
|
|
u16 status;
|
|
u16 status;
|
|
u8 t8;
|
|
u8 t8;
|
|
int i;
|
|
int i;
|
|
|
|
+ u32 msk;
|
|
|
|
|
|
sky2_write8(hw, B0_CTST, CS_RST_CLR);
|
|
sky2_write8(hw, B0_CTST, CS_RST_CLR);
|
|
|
|
|
|
@@ -2338,9 +2345,13 @@ static int sky2_reset(struct sky2_hw *hw)
|
|
sky2_write8(hw, B0_CTST, CS_MRST_CLR);
|
|
sky2_write8(hw, B0_CTST, CS_MRST_CLR);
|
|
|
|
|
|
/* clear any PEX errors */
|
|
/* clear any PEX errors */
|
|
- if (pci_find_capability(hw->pdev, PCI_CAP_ID_EXP))
|
|
|
|
- sky2_pci_write32(hw, PEX_UNC_ERR_STAT, 0xffffffffUL);
|
|
|
|
-
|
|
|
|
|
|
+ if (pci_find_capability(hw->pdev, PCI_CAP_ID_EXP)) {
|
|
|
|
+ hw->err_cap = pci_find_ext_capability(hw->pdev, PCI_EXT_CAP_ID_ERR);
|
|
|
|
+ if (hw->err_cap)
|
|
|
|
+ sky2_pci_write32(hw,
|
|
|
|
+ hw->err_cap + PCI_ERR_UNCOR_STATUS,
|
|
|
|
+ 0xffffffffUL);
|
|
|
|
+ }
|
|
|
|
|
|
hw->pmd_type = sky2_read8(hw, B2_PMD_TYP);
|
|
hw->pmd_type = sky2_read8(hw, B2_PMD_TYP);
|
|
hw->ports = 1;
|
|
hw->ports = 1;
|
|
@@ -2397,7 +2408,10 @@ static int sky2_reset(struct sky2_hw *hw)
|
|
sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53);
|
|
sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53);
|
|
}
|
|
}
|
|
|
|
|
|
- sky2_write32(hw, B0_HWE_IMSK, Y2_HWE_ALL_MASK);
|
|
|
|
|
|
+ msk = Y2_HWE_ALL_MASK;
|
|
|
|
+ if (!hw->err_cap)
|
|
|
|
+ msk &= ~Y2_IS_PCI_EXP;
|
|
|
|
+ sky2_write32(hw, B0_HWE_IMSK, msk);
|
|
|
|
|
|
for (i = 0; i < hw->ports; i++)
|
|
for (i = 0; i < hw->ports; i++)
|
|
sky2_gmac_reset(hw, i);
|
|
sky2_gmac_reset(hw, i);
|