diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_adminq.c')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_adminq.c | 71 | 
1 files changed, 58 insertions, 13 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c index 72c04881d290..9f0a4e92a231 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c @@ -508,6 +508,59 @@ shutdown_arq_out:  }  /** + *  i40e_set_hw_flags - set HW flags + *  @hw: pointer to the hardware structure + **/ +static void i40e_set_hw_flags(struct i40e_hw *hw) +{ +	struct i40e_adminq_info *aq = &hw->aq; + +	hw->flags = 0; + +	switch (hw->mac.type) { +	case I40E_MAC_XL710: +		if (aq->api_maj_ver > 1 || +		    (aq->api_maj_ver == 1 && +		     aq->api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_XL710)) { +			hw->flags |= I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE; +			hw->flags |= I40E_HW_FLAG_FW_LLDP_STOPPABLE; +			/* The ability to RX (not drop) 802.1ad frames */ +			hw->flags |= I40E_HW_FLAG_802_1AD_CAPABLE; +		} +		break; +	case I40E_MAC_X722: +		hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE | +			     I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK; + +		if (aq->api_maj_ver > 1 || +		    (aq->api_maj_ver == 1 && +		     aq->api_min_ver >= I40E_MINOR_VER_FW_LLDP_STOPPABLE_X722)) +			hw->flags |= I40E_HW_FLAG_FW_LLDP_STOPPABLE; +		/* fall through */ +	default: +		break; +	} + +	/* Newer versions of firmware require lock when reading the NVM */ +	if (aq->api_maj_ver > 1 || +	    (aq->api_maj_ver == 1 && +	     aq->api_min_ver >= 5)) +		hw->flags |= I40E_HW_FLAG_NVM_READ_REQUIRES_LOCK; + +	if (aq->api_maj_ver > 1 || +	    (aq->api_maj_ver == 1 && +	     aq->api_min_ver >= 8)) { +		hw->flags |= I40E_HW_FLAG_FW_LLDP_PERSISTENT; +		hw->flags |= I40E_HW_FLAG_DROP_MODE; +	} + +	if (aq->api_maj_ver > 1 || +	    (aq->api_maj_ver == 1 && +	     aq->api_min_ver >= 9)) +		hw->flags |= I40E_HW_FLAG_AQ_PHY_ACCESS_EXTENDED; +} + +/**   *  i40e_init_adminq - main initialization routine for Admin Queue   *  @hw: pointer to the hardware structure   * @@ -571,6 +624,11 @@ i40e_status i40e_init_adminq(struct i40e_hw *hw)  	if (ret_code != I40E_SUCCESS)  		goto init_adminq_free_arq; +	/* Some features were introduced in different FW API version +	 * for different MAC type. +	 */ +	i40e_set_hw_flags(hw); +  	/* get the NVM version info */  	i40e_read_nvm_word(hw, I40E_SR_NVM_DEV_STARTER_VERSION,  			   &hw->nvm.version); @@ -596,25 +654,12 @@ i40e_status i40e_init_adminq(struct i40e_hw *hw)  		hw->flags |= I40E_HW_FLAG_FW_LLDP_STOPPABLE;  	} -	/* 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 &&  	     hw->aq.api_min_ver >= 7))  		hw->flags |= I40E_HW_FLAG_802_1AD_CAPABLE; -	if (hw->aq.api_maj_ver > 1 || -	    (hw->aq.api_maj_ver == 1 && -	     hw->aq.api_min_ver >= 8)) { -		hw->flags |= I40E_HW_FLAG_FW_LLDP_PERSISTENT; -		hw->flags |= I40E_HW_FLAG_DROP_MODE; -	} -  	if (hw->aq.api_maj_ver > I40E_FW_API_VERSION_MAJOR) {  		ret_code = I40E_ERR_FIRMWARE_API_VERSION;  		goto init_adminq_free_arq;  |