diff options
Diffstat (limited to 'drivers/net/sky2.c')
| -rw-r--r-- | drivers/net/sky2.c | 32 | 
1 files changed, 23 insertions, 9 deletions
| diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 3ff2f426fd63..d3174ed8e454 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -2093,7 +2093,7 @@ static void sky2_hw_intr(struct sky2_hw *hw) | |||
| 2093 | 2093 | ||
| 2094 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); | 2094 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); | 
| 2095 | sky2_pci_write16(hw, PCI_STATUS, | 2095 | sky2_pci_write16(hw, PCI_STATUS, | 
| 2096 | pci_err | PCI_STATUS_ERROR_BITS); | 2096 | pci_err | PCI_STATUS_ERROR_BITS); | 
| 2097 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | 2097 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | 
| 2098 | } | 2098 | } | 
| 2099 | 2099 | ||
| @@ -2101,7 +2101,8 @@ static void sky2_hw_intr(struct sky2_hw *hw) | |||
| 2101 | /* PCI-Express uncorrectable Error occurred */ | 2101 | /* PCI-Express uncorrectable Error occurred */ | 
| 2102 | u32 pex_err; | 2102 | u32 pex_err; | 
| 2103 | 2103 | ||
| 2104 | pex_err = sky2_pci_read32(hw, PEX_UNC_ERR_STAT); | 2104 | pex_err = sky2_pci_read32(hw, | 
| 2105 | hw->err_cap + PCI_ERR_UNCOR_STATUS); | ||
| 2105 | 2106 | ||
| 2106 | if (net_ratelimit()) | 2107 | if (net_ratelimit()) | 
| 2107 | printk(KERN_ERR PFX "%s: pci express error (0x%x)\n", | 2108 | printk(KERN_ERR PFX "%s: pci express error (0x%x)\n", | 
| @@ -2109,15 +2110,20 @@ static void sky2_hw_intr(struct sky2_hw *hw) | |||
| 2109 | 2110 | ||
| 2110 | /* clear the interrupt */ | 2111 | /* clear the interrupt */ | 
| 2111 | sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); | 2112 | sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); | 
| 2112 | sky2_pci_write32(hw, PEX_UNC_ERR_STAT, | 2113 | sky2_pci_write32(hw, | 
| 2113 | 0xffffffffUL); | 2114 | hw->err_cap + PCI_ERR_UNCOR_STATUS, | 
| 2115 | 0xffffffffUL); | ||
| 2114 | sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | 2116 | sky2_write32(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | 
| 2115 | 2117 | ||
| 2116 | if (pex_err & PEX_FATAL_ERRORS) { | 2118 | |
| 2119 | /* In case of fatal error mask off to keep from getting stuck */ | ||
| 2120 | if (pex_err & (PCI_ERR_UNC_POISON_TLP | PCI_ERR_UNC_FCP | ||
| 2121 | | PCI_ERR_UNC_DLP)) { | ||
| 2117 | u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK); | 2122 | u32 hwmsk = sky2_read32(hw, B0_HWE_IMSK); | 
| 2118 | hwmsk &= ~Y2_IS_PCI_EXP; | 2123 | hwmsk &= ~Y2_IS_PCI_EXP; | 
| 2119 | sky2_write32(hw, B0_HWE_IMSK, hwmsk); | 2124 | sky2_write32(hw, B0_HWE_IMSK, hwmsk); | 
| 2120 | } | 2125 | } | 
| 2126 | |||
| 2121 | } | 2127 | } | 
| 2122 | 2128 | ||
| 2123 | if (status & Y2_HWE_L1_MASK) | 2129 | if (status & Y2_HWE_L1_MASK) | 
| @@ -2298,6 +2304,7 @@ static int sky2_reset(struct sky2_hw *hw) | |||
| 2298 | u16 status; | 2304 | u16 status; | 
| 2299 | u8 t8; | 2305 | u8 t8; | 
| 2300 | int i; | 2306 | int i; | 
| 2307 | u32 msk; | ||
| 2301 | 2308 | ||
| 2302 | sky2_write8(hw, B0_CTST, CS_RST_CLR); | 2309 | sky2_write8(hw, B0_CTST, CS_RST_CLR); | 
| 2303 | 2310 | ||
| @@ -2338,9 +2345,13 @@ static int sky2_reset(struct sky2_hw *hw) | |||
| 2338 | sky2_write8(hw, B0_CTST, CS_MRST_CLR); | 2345 | sky2_write8(hw, B0_CTST, CS_MRST_CLR); | 
| 2339 | 2346 | ||
| 2340 | /* clear any PEX errors */ | 2347 | /* clear any PEX errors */ | 
| 2341 | if (pci_find_capability(hw->pdev, PCI_CAP_ID_EXP)) | 2348 | if (pci_find_capability(hw->pdev, PCI_CAP_ID_EXP)) { | 
| 2342 | sky2_pci_write32(hw, PEX_UNC_ERR_STAT, 0xffffffffUL); | 2349 | hw->err_cap = pci_find_ext_capability(hw->pdev, PCI_EXT_CAP_ID_ERR); | 
| 2343 | 2350 | if (hw->err_cap) | |
| 2351 | sky2_pci_write32(hw, | ||
| 2352 | hw->err_cap + PCI_ERR_UNCOR_STATUS, | ||
| 2353 | 0xffffffffUL); | ||
| 2354 | } | ||
| 2344 | 2355 | ||
| 2345 | hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); | 2356 | hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); | 
| 2346 | hw->ports = 1; | 2357 | hw->ports = 1; | 
| @@ -2397,7 +2408,10 @@ static int sky2_reset(struct sky2_hw *hw) | |||
| 2397 | sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53); | 2408 | sky2_write8(hw, RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53); | 
| 2398 | } | 2409 | } | 
| 2399 | 2410 | ||
| 2400 | sky2_write32(hw, B0_HWE_IMSK, Y2_HWE_ALL_MASK); | 2411 | msk = Y2_HWE_ALL_MASK; | 
| 2412 | if (!hw->err_cap) | ||
| 2413 | msk &= ~Y2_IS_PCI_EXP; | ||
| 2414 | sky2_write32(hw, B0_HWE_IMSK, msk); | ||
| 2401 | 2415 | ||
| 2402 | for (i = 0; i < hw->ports; i++) | 2416 | for (i = 0; i < hw->ports; i++) | 
| 2403 | sky2_gmac_reset(hw, i); | 2417 | sky2_gmac_reset(hw, i); | 
