|
@@ -1444,7 +1444,7 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
|
|
|
IXGBE_MDIO_GLOBAL_ALARM_1_INT)))
|
|
|
return status;
|
|
|
|
|
|
- /* High temperature failure alarm triggered */
|
|
|
+ /* Global alarm triggered */
|
|
|
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_ALARM_1,
|
|
|
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
|
|
|
®);
|
|
@@ -1458,6 +1458,21 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
|
|
|
ixgbe_set_copper_phy_power(hw, false);
|
|
|
return IXGBE_ERR_OVERTEMP;
|
|
|
}
|
|
|
+ if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
|
|
|
+ /* device fault alarm triggered */
|
|
|
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_FAULT_MSG,
|
|
|
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
|
|
|
+ ®);
|
|
|
+ if (status)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ /* if device fault was due to high temp alarm handle and exit */
|
|
|
+ if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) {
|
|
|
+ /* power down the PHY in case the PHY FW didn't */
|
|
|
+ ixgbe_set_copper_phy_power(hw, false);
|
|
|
+ return IXGBE_ERR_OVERTEMP;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/* Vendor alarm 2 triggered */
|
|
|
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
|
|
@@ -1511,14 +1526,15 @@ static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
|
|
|
if (status)
|
|
|
return status;
|
|
|
|
|
|
- /* Enables high temperature failure alarm */
|
|
|
+ /* Enable high temperature failure and global fault alarms */
|
|
|
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
|
|
|
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
|
|
|
®);
|
|
|
if (status)
|
|
|
return status;
|
|
|
|
|
|
- reg |= IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN;
|
|
|
+ reg |= (IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN |
|
|
|
+ IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN);
|
|
|
|
|
|
status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
|
|
|
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
|