Currently ixgbe driver is notified of overheating events
via internal IXGBE_ERR_OVERTEMP erorr code.

Change the approach to use is_overhaet variable
which set when such event occurs.

Reviewed-by: Przemek Kitszel <[email protected]>
Signed-off-by: Jedrzej Jagielski <[email protected]>
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 12 +++++++-----
 drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c  |  7 +++++--
 drivers/net/ethernet/intel/ixgbe/ixgbe_type.h |  2 +-
 drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 19 +++++++++----------
 4 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 1726297f2e0d..78fbfc768f57 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -2790,14 +2790,14 @@ static void ixgbe_check_overtemp_subtask(struct 
ixgbe_adapter *adapter)
                }
 
                /* Check if this is not due to overtemp */
-               if (hw->phy.ops.check_overtemp(hw) != IXGBE_ERR_OVERTEMP)
+               if (hw->phy.ops.check_overtemp(hw) != -EIO && !hw->is_overtemp)
                        return;
 
                break;
        case IXGBE_DEV_ID_X550EM_A_1G_T:
        case IXGBE_DEV_ID_X550EM_A_1G_T_L:
                rc = hw->phy.ops.check_overtemp(hw);
-               if (rc != IXGBE_ERR_OVERTEMP)
+               if (rc != -EIO && !hw->is_overtemp)
                        return;
                break;
        default:
@@ -2807,6 +2807,8 @@ static void ixgbe_check_overtemp_subtask(struct 
ixgbe_adapter *adapter)
                        return;
                break;
        }
+
+       hw->is_overtemp = false;
        e_crit(drv, "%s\n", ixgbe_overheat_msg);
 
        adapter->interrupt_event = 0;
@@ -7938,7 +7940,6 @@ static void ixgbe_service_timer(struct timer_list *t)
 static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)
 {
        struct ixgbe_hw *hw = &adapter->hw;
-       u32 status;
 
        if (!(adapter->flags2 & IXGBE_FLAG2_PHY_INTERRUPT))
                return;
@@ -7948,10 +7949,11 @@ static void ixgbe_phy_interrupt_subtask(struct 
ixgbe_adapter *adapter)
        if (!hw->phy.ops.handle_lasi)
                return;
 
-       status = hw->phy.ops.handle_lasi(&adapter->hw);
-       if (status != IXGBE_ERR_OVERTEMP)
+       hw->phy.ops.handle_lasi(&adapter->hw);
+       if (!hw->is_overtemp)
                return;
 
+       hw->is_overtemp = false;
        e_crit(drv, "%s\n", ixgbe_overheat_msg);
 }
 
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
index 689470c1e8ad..2c99b644aeb7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
@@ -409,8 +409,10 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
 
        /* Don't reset PHY if it's shut down due to overtemp. */
        if (!hw->phy.reset_if_overtemp &&
-           (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
+           hw->phy.ops.check_overtemp(hw) == -EIO && hw->is_overtemp) {
+               hw->is_overtemp = false;
                return 0;
+       }
 
        /* Blocked by MNG FW so bail */
        if (ixgbe_check_reset_blocked(hw))
@@ -2763,7 +2765,8 @@ s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
        if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
                return 0;
 
-       return IXGBE_ERR_OVERTEMP;
+       hw->is_overtemp = true;
+       return -EIO;
 }
 
 /** ixgbe_set_copper_phy_power - Control power for copper phy
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
index 2b00db92b08f..f69cfaae9c36 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
@@ -3652,6 +3652,7 @@ struct ixgbe_hw {
        bool                            allow_unsupported_sfp;
        bool                            wol_enabled;
        bool                            need_crosstalk_fix;
+       bool                            is_overtemp;
 };
 
 struct ixgbe_info {
@@ -3692,7 +3693,6 @@ struct ixgbe_info {
 #define IXGBE_ERR_FDIR_REINIT_FAILED            -23
 #define IXGBE_ERR_EEPROM_VERSION                -24
 #define IXGBE_ERR_NO_SPACE                      -25
-#define IXGBE_ERR_OVERTEMP                      -26
 #define IXGBE_ERR_FC_NOT_NEGOTIATED             -27
 #define IXGBE_ERR_FC_NOT_SUPPORTED              -28
 #define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE        -30
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
index aa4bf6c9a2f7..cf2274d3c4d6 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
@@ -600,8 +600,10 @@ static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
        rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup);
        if (rc)
                return rc;
+
        if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN)
-               return IXGBE_ERR_OVERTEMP;
+               return -EIO;
+
        return 0;
 }
 
@@ -2372,9 +2374,6 @@ static s32 ixgbe_get_link_capabilities_X550em(struct 
ixgbe_hw *hw,
  *
  * Determime if external Base T PHY interrupt cause is high temperature
  * failure alarm or link status change.
- *
- * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
- * failure alarm, else return PHY access status.
  **/
 static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
 {
@@ -2412,7 +2411,8 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw 
*hw, bool *lsc)
        if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
                /* power down the PHY in case the PHY FW didn't already */
                ixgbe_set_copper_phy_power(hw, false);
-               return IXGBE_ERR_OVERTEMP;
+               hw->is_overtemp = true;
+               return -EIO;
        }
        if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
                /*  device fault alarm triggered */
@@ -2426,7 +2426,8 @@ static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw 
*hw, bool *lsc)
                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;
+                       hw->is_overtemp = true;
+                       return -EIO;
                }
        }
 
@@ -2550,9 +2551,6 @@ static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw 
*hw)
  * Handle external Base T PHY interrupt. If high temperature
  * failure alarm then return error, else if link status change
  * then setup internal/external PHY link
- *
- * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
- * failure alarm, else return PHY access status.
  **/
 static s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
 {
@@ -3199,7 +3197,8 @@ static s32 ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
 
        if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) {
                ixgbe_shutdown_fw_phy(hw);
-               return IXGBE_ERR_OVERTEMP;
+               hw->is_overtemp = true;
+               return -EIO;
        }
        return 0;
 }
-- 
2.31.1

_______________________________________________
Intel-wired-lan mailing list
[email protected]
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan

Reply via email to