[Intel-wired-lan] [next PATCH S81-V3 8/9] i40e: Fix for NUP NVM image downgrade failure

Keller, Jacob E jacob.e.keller at intel.com
Mon Oct 30 22:44:14 UTC 2017


ACK

> -----Original Message-----
> From: Michael, Alice
> Sent: Friday, October 27, 2017 8:07 AM
> To: Michael, Alice <alice.michael at intel.com>; intel-wired-lan at lists.osuosl.org
> Cc: Keller, Jacob E <jacob.e.keller at intel.com>
> Subject: [next PATCH S81-V3 8/9] i40e: Fix for NUP NVM image downgrade
> failure
> 
> From: Jacob Keller <jacob.e.keller at intel.com>
> 
> Since commit 96a39aed25e6 ("i40e: Acquire NVM lock before
> reads on all devices") we've used the NVM lock
> to synchronize NVM reads even on devices which don't strictly
> need the lock.
> 
> Doing so can cause a regression on older firmware prior to 1.5,
> especially when downgrading the firmware.
> 
> Fix this by only grabbing the lock if we're running on an X722
> device (which requires the lock as it uses the AdminQ to read
> the NVM), or if we're currently running 1.5 or newer firmware.
> 
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> ---
>  drivers/net/ethernet/intel/i40e/i40e_adminq.c | 6 ++++++
>  drivers/net/ethernet/intel/i40e/i40e_common.c | 3 ++-
>  drivers/net/ethernet/intel/i40e/i40e_nvm.c    | 8 +++++---
>  drivers/net/ethernet/intel/i40e/i40e_type.h   | 1 +
>  4 files changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c
> b/drivers/net/ethernet/intel/i40e/i40e_adminq.c
> index 9dcb2a9..9af7425 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c
> @@ -613,6 +613,12 @@ i40e_status i40e_init_adminq(struct i40e_hw *hw)
>  		hw->flags |= I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE;
>  	}
> 
> +	/* Newer versions of firmware require lock when reading the NVM */
> +	if (hw->aq.api_maj_ver > 1 ||
> +	    (hw->aq.api_maj_ver == 1 &&
> +	     hw->aq.api_min_ver >= 5))
> +		hw->flags |= I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK;
> +
>  	/* The ability to RX (not drop) 802.1ad frames was added in API 1.7 */
>  	if (hw->aq.api_maj_ver > 1 ||
>  	    (hw->aq.api_maj_ver == 1 &&
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c
> b/drivers/net/ethernet/intel/i40e/i40e_common.c
> index 0203665..13c7946 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_common.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
> @@ -948,7 +948,8 @@ i40e_status i40e_init_shared_code(struct i40e_hw *hw)
>  		hw->pf_id = (u8)(func_rid & 0x7);
> 
>  	if (hw->mac.type == I40E_MAC_X722)
> -		hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE;
> +		hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE |
> +			     I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK;
> 
>  	status = i40e_init_nvm(hw);
>  	return status;
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_nvm.c
> b/drivers/net/ethernet/intel/i40e/i40e_nvm.c
> index 0ccab0a..7689c2e 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_nvm.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_nvm.c
> @@ -328,15 +328,17 @@ static i40e_status __i40e_read_nvm_word(struct
> i40e_hw *hw,
>  i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset,
>  			       u16 *data)
>  {
> -	i40e_status ret_code;
> +	i40e_status ret_code = 0;
> 
> -	ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
> +	if (hw->flags & I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK)
> +		ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
>  	if (ret_code)
>  		return ret_code;
> 
>  	ret_code = __i40e_read_nvm_word(hw, offset, data);
> 
> -	i40e_release_nvm(hw);
> +	if (hw->flags & I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK)
> +		i40e_release_nvm(hw);
> 
>  	return ret_code;
>  }
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h
> b/drivers/net/ethernet/intel/i40e/i40e_type.h
> index 00d4833..0e85687 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_type.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
> @@ -629,6 +629,7 @@ struct i40e_hw {
>  #define I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE BIT_ULL(0)
>  #define I40E_HW_FLAG_802_1AD_CAPABLE        BIT_ULL(1)
>  #define I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE  BIT_ULL(2)
> +#define I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK BIT_ULL(3)
>  	u64 flags;
> 
>  	/* Used in set switch config AQ command */
> --
> 2.9.5



More information about the Intel-wired-lan mailing list