[Intel-wired-lan] [PATCH iwl-next v1 1/2] ixgbe: Refactor overtemp event handling

Tony Nguyen anthony.l.nguyen at intel.com
Thu Nov 16 23:35:59 UTC 2023


On 11/14/2023 1:10 AM, Jedrzej Jagielski wrote:
> 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.

I'll likely have more questions/comments, but an initial question. Is 
this variable intended to hold the state of the PHY as overheated or is 
this just communicating at the time of the check that it's overheated?

> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel at intel.com>
> Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski at intel.com>
> ---
>   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;
>   }


More information about the Intel-wired-lan mailing list