ixgbe/base: support new thermal alarm
authorWenzhuo Lu <wenzhuo.lu@intel.com>
Fri, 20 Nov 2015 07:17:54 +0000 (15:17 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 14 Jan 2016 08:43:21 +0000 (09:43 +0100)
This patch adds support for the new thermal sensor alarms indication.

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
drivers/net/ixgbe/base/ixgbe_type.h
drivers/net/ixgbe/base/ixgbe_x550.c

index 395f534..d6a6a7e 100644 (file)
@@ -1495,13 +1495,17 @@ struct ixgbe_dmac_config {
 #define IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK    0xFF01 /* int chip-wide mask */
 #define IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG    0xFC01 /* int chip-wide mask */
 #define IXGBE_MDIO_GLOBAL_ALARM_1              0xCC00 /* Global alarm 1 */
+#define IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT      0x0010 /* device fault */
 #define IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL    0x4000 /* high temp failure */
+#define IXGBE_MDIO_GLOBAL_FAULT_MSG    0xC850 /* Global Fault Message */
+#define IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP     0x8007 /* high temp failure */
 #define IXGBE_MDIO_GLOBAL_INT_MASK             0xD400 /* Global int mask */
 #define IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN    0x1000 /* autoneg vendor alarm int enable */
 #define IXGBE_MDIO_GLOBAL_ALARM_1_INT          0x4 /* int in Global alarm 1 */
 #define IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN       0x1 /* vendor alarm int enable */
 #define IXGBE_MDIO_GLOBAL_STD_ALM2_INT         0x200 /* vendor alarm2 int mask */
 #define IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN       0x4000 /* int high temp enable */
+#define IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN 0x0010 /* int dev fault enable */
 #define IXGBE_MDIO_PMA_PMD_CONTROL_ADDR        0x0000 /* PMA/PMD Control Reg */
 #define IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR        0xC30A /* PHY_XS SDA/SCL Addr Reg */
 #define IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA        0xC30B /* PHY_XS SDA/SCL Data Reg */
index 3469260..915a8f4 100644 (file)
@@ -1267,7 +1267,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,
                                      &reg);
@@ -1280,6 +1280,21 @@ STATIC s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
                /* power down the PHY in case the PHY FW didn't already */
                ixgbe_set_copper_phy_power(hw, false);
                return IXGBE_ERR_OVERTEMP;
+       } else 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,
+                                         &reg);
+
+               if (status != IXGBE_SUCCESS)
+                       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 */
@@ -1337,7 +1352,7 @@ STATIC s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
        if (status != IXGBE_SUCCESS)
                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,
                                      &reg);
@@ -1345,7 +1360,8 @@ STATIC s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
        if (status != IXGBE_SUCCESS)
                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,