diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40evf')
20 files changed, 17091 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/i40evf/Makefile b/drivers/net/ethernet/intel/i40evf/Makefile new file mode 100644 index 00000000000..3a423836a56 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/Makefile @@ -0,0 +1,36 @@ +################################################################################ +# +# Intel Ethernet Controller XL710 Family Linux Virtual Function Driver +# Copyright(c) 2013 - 2014 Intel Corporation. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms and conditions of the GNU General Public License, +# version 2, as published by the Free Software Foundation. +# +# This program is distributed in the hope it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program.  If not, see <http://www.gnu.org/licenses/>. +# +# The full GNU General Public License is included in this distribution in +# the file called "COPYING". +# +# Contact Information: +# e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> +# Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 +# +################################################################################ + +# +## Makefile for the Intel(R) 40GbE VF driver +# +# + +obj-$(CONFIG_I40EVF) += i40evf.o + +i40evf-objs :=	i40evf_main.o i40evf_ethtool.o i40evf_virtchnl.o \ +		i40e_txrx.o i40e_common.o i40e_adminq.o + diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c new file mode 100644 index 00000000000..eb67cce3e8f --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c @@ -0,0 +1,978 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#include "i40e_status.h" +#include "i40e_type.h" +#include "i40e_register.h" +#include "i40e_adminq.h" +#include "i40e_prototype.h" + +/** + * i40e_is_nvm_update_op - return true if this is an NVM update operation + * @desc: API request descriptor + **/ +static inline bool i40e_is_nvm_update_op(struct i40e_aq_desc *desc) +{ +	return (desc->opcode == i40e_aqc_opc_nvm_erase) || +	       (desc->opcode == i40e_aqc_opc_nvm_update); +} + +/** + *  i40e_adminq_init_regs - Initialize AdminQ registers + *  @hw: pointer to the hardware structure + * + *  This assumes the alloc_asq and alloc_arq functions have already been called + **/ +static void i40e_adminq_init_regs(struct i40e_hw *hw) +{ +	/* set head and tail registers in our local struct */ +	if (hw->mac.type == I40E_MAC_VF) { +		hw->aq.asq.tail = I40E_VF_ATQT1; +		hw->aq.asq.head = I40E_VF_ATQH1; +		hw->aq.asq.len  = I40E_VF_ATQLEN1; +		hw->aq.arq.tail = I40E_VF_ARQT1; +		hw->aq.arq.head = I40E_VF_ARQH1; +		hw->aq.arq.len  = I40E_VF_ARQLEN1; +	} else { +		hw->aq.asq.tail = I40E_PF_ATQT; +		hw->aq.asq.head = I40E_PF_ATQH; +		hw->aq.asq.len  = I40E_PF_ATQLEN; +		hw->aq.arq.tail = I40E_PF_ARQT; +		hw->aq.arq.head = I40E_PF_ARQH; +		hw->aq.arq.len  = I40E_PF_ARQLEN; +	} +} + +/** + *  i40e_alloc_adminq_asq_ring - Allocate Admin Queue send rings + *  @hw: pointer to the hardware structure + **/ +static i40e_status i40e_alloc_adminq_asq_ring(struct i40e_hw *hw) +{ +	i40e_status ret_code; + +	ret_code = i40e_allocate_dma_mem(hw, &hw->aq.asq.desc_buf, +					 i40e_mem_atq_ring, +					 (hw->aq.num_asq_entries * +					 sizeof(struct i40e_aq_desc)), +					 I40E_ADMINQ_DESC_ALIGNMENT); +	if (ret_code) +		return ret_code; + +	ret_code = i40e_allocate_virt_mem(hw, &hw->aq.asq.cmd_buf, +					  (hw->aq.num_asq_entries * +					  sizeof(struct i40e_asq_cmd_details))); +	if (ret_code) { +		i40e_free_dma_mem(hw, &hw->aq.asq.desc_buf); +		return ret_code; +	} + +	return ret_code; +} + +/** + *  i40e_alloc_adminq_arq_ring - Allocate Admin Queue receive rings + *  @hw: pointer to the hardware structure + **/ +static i40e_status i40e_alloc_adminq_arq_ring(struct i40e_hw *hw) +{ +	i40e_status ret_code; + +	ret_code = i40e_allocate_dma_mem(hw, &hw->aq.arq.desc_buf, +					 i40e_mem_arq_ring, +					 (hw->aq.num_arq_entries * +					 sizeof(struct i40e_aq_desc)), +					 I40E_ADMINQ_DESC_ALIGNMENT); + +	return ret_code; +} + +/** + *  i40e_free_adminq_asq - Free Admin Queue send rings + *  @hw: pointer to the hardware structure + * + *  This assumes the posted send buffers have already been cleaned + *  and de-allocated + **/ +static void i40e_free_adminq_asq(struct i40e_hw *hw) +{ +	i40e_free_dma_mem(hw, &hw->aq.asq.desc_buf); +} + +/** + *  i40e_free_adminq_arq - Free Admin Queue receive rings + *  @hw: pointer to the hardware structure + * + *  This assumes the posted receive buffers have already been cleaned + *  and de-allocated + **/ +static void i40e_free_adminq_arq(struct i40e_hw *hw) +{ +	i40e_free_dma_mem(hw, &hw->aq.arq.desc_buf); +} + +/** + *  i40e_alloc_arq_bufs - Allocate pre-posted buffers for the receive queue + *  @hw: pointer to the hardware structure + **/ +static i40e_status i40e_alloc_arq_bufs(struct i40e_hw *hw) +{ +	i40e_status ret_code; +	struct i40e_aq_desc *desc; +	struct i40e_dma_mem *bi; +	int i; + +	/* We'll be allocating the buffer info memory first, then we can +	 * allocate the mapped buffers for the event processing +	 */ + +	/* buffer_info structures do not need alignment */ +	ret_code = i40e_allocate_virt_mem(hw, &hw->aq.arq.dma_head, +		(hw->aq.num_arq_entries * sizeof(struct i40e_dma_mem))); +	if (ret_code) +		goto alloc_arq_bufs; +	hw->aq.arq.r.arq_bi = (struct i40e_dma_mem *)hw->aq.arq.dma_head.va; + +	/* allocate the mapped buffers */ +	for (i = 0; i < hw->aq.num_arq_entries; i++) { +		bi = &hw->aq.arq.r.arq_bi[i]; +		ret_code = i40e_allocate_dma_mem(hw, bi, +						 i40e_mem_arq_buf, +						 hw->aq.arq_buf_size, +						 I40E_ADMINQ_DESC_ALIGNMENT); +		if (ret_code) +			goto unwind_alloc_arq_bufs; + +		/* now configure the descriptors for use */ +		desc = I40E_ADMINQ_DESC(hw->aq.arq, i); + +		desc->flags = cpu_to_le16(I40E_AQ_FLAG_BUF); +		if (hw->aq.arq_buf_size > I40E_AQ_LARGE_BUF) +			desc->flags |= cpu_to_le16(I40E_AQ_FLAG_LB); +		desc->opcode = 0; +		/* This is in accordance with Admin queue design, there is no +		 * register for buffer size configuration +		 */ +		desc->datalen = cpu_to_le16((u16)bi->size); +		desc->retval = 0; +		desc->cookie_high = 0; +		desc->cookie_low = 0; +		desc->params.external.addr_high = +			cpu_to_le32(upper_32_bits(bi->pa)); +		desc->params.external.addr_low = +			cpu_to_le32(lower_32_bits(bi->pa)); +		desc->params.external.param0 = 0; +		desc->params.external.param1 = 0; +	} + +alloc_arq_bufs: +	return ret_code; + +unwind_alloc_arq_bufs: +	/* don't try to free the one that failed... */ +	i--; +	for (; i >= 0; i--) +		i40e_free_dma_mem(hw, &hw->aq.arq.r.arq_bi[i]); +	i40e_free_virt_mem(hw, &hw->aq.arq.dma_head); + +	return ret_code; +} + +/** + *  i40e_alloc_asq_bufs - Allocate empty buffer structs for the send queue + *  @hw: pointer to the hardware structure + **/ +static i40e_status i40e_alloc_asq_bufs(struct i40e_hw *hw) +{ +	i40e_status ret_code; +	struct i40e_dma_mem *bi; +	int i; + +	/* No mapped memory needed yet, just the buffer info structures */ +	ret_code = i40e_allocate_virt_mem(hw, &hw->aq.asq.dma_head, +		(hw->aq.num_asq_entries * sizeof(struct i40e_dma_mem))); +	if (ret_code) +		goto alloc_asq_bufs; +	hw->aq.asq.r.asq_bi = (struct i40e_dma_mem *)hw->aq.asq.dma_head.va; + +	/* allocate the mapped buffers */ +	for (i = 0; i < hw->aq.num_asq_entries; i++) { +		bi = &hw->aq.asq.r.asq_bi[i]; +		ret_code = i40e_allocate_dma_mem(hw, bi, +						 i40e_mem_asq_buf, +						 hw->aq.asq_buf_size, +						 I40E_ADMINQ_DESC_ALIGNMENT); +		if (ret_code) +			goto unwind_alloc_asq_bufs; +	} +alloc_asq_bufs: +	return ret_code; + +unwind_alloc_asq_bufs: +	/* don't try to free the one that failed... */ +	i--; +	for (; i >= 0; i--) +		i40e_free_dma_mem(hw, &hw->aq.asq.r.asq_bi[i]); +	i40e_free_virt_mem(hw, &hw->aq.asq.dma_head); + +	return ret_code; +} + +/** + *  i40e_free_arq_bufs - Free receive queue buffer info elements + *  @hw: pointer to the hardware structure + **/ +static void i40e_free_arq_bufs(struct i40e_hw *hw) +{ +	int i; + +	/* free descriptors */ +	for (i = 0; i < hw->aq.num_arq_entries; i++) +		i40e_free_dma_mem(hw, &hw->aq.arq.r.arq_bi[i]); + +	/* free the descriptor memory */ +	i40e_free_dma_mem(hw, &hw->aq.arq.desc_buf); + +	/* free the dma header */ +	i40e_free_virt_mem(hw, &hw->aq.arq.dma_head); +} + +/** + *  i40e_free_asq_bufs - Free send queue buffer info elements + *  @hw: pointer to the hardware structure + **/ +static void i40e_free_asq_bufs(struct i40e_hw *hw) +{ +	int i; + +	/* only unmap if the address is non-NULL */ +	for (i = 0; i < hw->aq.num_asq_entries; i++) +		if (hw->aq.asq.r.asq_bi[i].pa) +			i40e_free_dma_mem(hw, &hw->aq.asq.r.asq_bi[i]); + +	/* free the buffer info list */ +	i40e_free_virt_mem(hw, &hw->aq.asq.cmd_buf); + +	/* free the descriptor memory */ +	i40e_free_dma_mem(hw, &hw->aq.asq.desc_buf); + +	/* free the dma header */ +	i40e_free_virt_mem(hw, &hw->aq.asq.dma_head); +} + +/** + *  i40e_config_asq_regs - configure ASQ registers + *  @hw: pointer to the hardware structure + * + *  Configure base address and length registers for the transmit queue + **/ +static i40e_status i40e_config_asq_regs(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; +	u32 reg = 0; + +	if (hw->mac.type == I40E_MAC_VF) { +		/* configure the transmit queue */ +		wr32(hw, I40E_VF_ATQBAH1, +		    upper_32_bits(hw->aq.asq.desc_buf.pa)); +		wr32(hw, I40E_VF_ATQBAL1, +		    lower_32_bits(hw->aq.asq.desc_buf.pa)); +		wr32(hw, I40E_VF_ATQLEN1, (hw->aq.num_asq_entries | +					  I40E_VF_ATQLEN1_ATQENABLE_MASK)); +		reg = rd32(hw, I40E_VF_ATQBAL1); +	} else { +		/* configure the transmit queue */ +		wr32(hw, I40E_PF_ATQBAH, +		    upper_32_bits(hw->aq.asq.desc_buf.pa)); +		wr32(hw, I40E_PF_ATQBAL, +		    lower_32_bits(hw->aq.asq.desc_buf.pa)); +		wr32(hw, I40E_PF_ATQLEN, (hw->aq.num_asq_entries | +					  I40E_PF_ATQLEN_ATQENABLE_MASK)); +		reg = rd32(hw, I40E_PF_ATQBAL); +	} + +	/* Check one register to verify that config was applied */ +	if (reg != lower_32_bits(hw->aq.asq.desc_buf.pa)) +		ret_code = I40E_ERR_ADMIN_QUEUE_ERROR; + +	return ret_code; +} + +/** + *  i40e_config_arq_regs - ARQ register configuration + *  @hw: pointer to the hardware structure + * + * Configure base address and length registers for the receive (event queue) + **/ +static i40e_status i40e_config_arq_regs(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; +	u32 reg = 0; + +	if (hw->mac.type == I40E_MAC_VF) { +		/* configure the receive queue */ +		wr32(hw, I40E_VF_ARQBAH1, +		    upper_32_bits(hw->aq.arq.desc_buf.pa)); +		wr32(hw, I40E_VF_ARQBAL1, +		    lower_32_bits(hw->aq.arq.desc_buf.pa)); +		wr32(hw, I40E_VF_ARQLEN1, (hw->aq.num_arq_entries | +					  I40E_VF_ARQLEN1_ARQENABLE_MASK)); +		reg = rd32(hw, I40E_VF_ARQBAL1); +	} else { +		/* configure the receive queue */ +		wr32(hw, I40E_PF_ARQBAH, +		    upper_32_bits(hw->aq.arq.desc_buf.pa)); +		wr32(hw, I40E_PF_ARQBAL, +		    lower_32_bits(hw->aq.arq.desc_buf.pa)); +		wr32(hw, I40E_PF_ARQLEN, (hw->aq.num_arq_entries | +					  I40E_PF_ARQLEN_ARQENABLE_MASK)); +		reg = rd32(hw, I40E_PF_ARQBAL); +	} + +	/* Update tail in the HW to post pre-allocated buffers */ +	wr32(hw, hw->aq.arq.tail, hw->aq.num_arq_entries - 1); + +	/* Check one register to verify that config was applied */ +	if (reg != lower_32_bits(hw->aq.arq.desc_buf.pa)) +		ret_code = I40E_ERR_ADMIN_QUEUE_ERROR; + +	return ret_code; +} + +/** + *  i40e_init_asq - main initialization routine for ASQ + *  @hw: pointer to the hardware structure + * + *  This is the main initialization routine for the Admin Send Queue + *  Prior to calling this function, drivers *MUST* set the following fields + *  in the hw->aq structure: + *     - hw->aq.num_asq_entries + *     - hw->aq.arq_buf_size + * + *  Do *NOT* hold the lock when calling this as the memory allocation routines + *  called are not going to be atomic context safe + **/ +static i40e_status i40e_init_asq(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; + +	if (hw->aq.asq.count > 0) { +		/* queue already initialized */ +		ret_code = I40E_ERR_NOT_READY; +		goto init_adminq_exit; +	} + +	/* verify input for valid configuration */ +	if ((hw->aq.num_asq_entries == 0) || +	    (hw->aq.asq_buf_size == 0)) { +		ret_code = I40E_ERR_CONFIG; +		goto init_adminq_exit; +	} + +	hw->aq.asq.next_to_use = 0; +	hw->aq.asq.next_to_clean = 0; +	hw->aq.asq.count = hw->aq.num_asq_entries; + +	/* allocate the ring memory */ +	ret_code = i40e_alloc_adminq_asq_ring(hw); +	if (ret_code) +		goto init_adminq_exit; + +	/* allocate buffers in the rings */ +	ret_code = i40e_alloc_asq_bufs(hw); +	if (ret_code) +		goto init_adminq_free_rings; + +	/* initialize base registers */ +	ret_code = i40e_config_asq_regs(hw); +	if (ret_code) +		goto init_adminq_free_rings; + +	/* success! */ +	goto init_adminq_exit; + +init_adminq_free_rings: +	i40e_free_adminq_asq(hw); + +init_adminq_exit: +	return ret_code; +} + +/** + *  i40e_init_arq - initialize ARQ + *  @hw: pointer to the hardware structure + * + *  The main initialization routine for the Admin Receive (Event) Queue. + *  Prior to calling this function, drivers *MUST* set the following fields + *  in the hw->aq structure: + *     - hw->aq.num_asq_entries + *     - hw->aq.arq_buf_size + * + *  Do *NOT* hold the lock when calling this as the memory allocation routines + *  called are not going to be atomic context safe + **/ +static i40e_status i40e_init_arq(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; + +	if (hw->aq.arq.count > 0) { +		/* queue already initialized */ +		ret_code = I40E_ERR_NOT_READY; +		goto init_adminq_exit; +	} + +	/* verify input for valid configuration */ +	if ((hw->aq.num_arq_entries == 0) || +	    (hw->aq.arq_buf_size == 0)) { +		ret_code = I40E_ERR_CONFIG; +		goto init_adminq_exit; +	} + +	hw->aq.arq.next_to_use = 0; +	hw->aq.arq.next_to_clean = 0; +	hw->aq.arq.count = hw->aq.num_arq_entries; + +	/* allocate the ring memory */ +	ret_code = i40e_alloc_adminq_arq_ring(hw); +	if (ret_code) +		goto init_adminq_exit; + +	/* allocate buffers in the rings */ +	ret_code = i40e_alloc_arq_bufs(hw); +	if (ret_code) +		goto init_adminq_free_rings; + +	/* initialize base registers */ +	ret_code = i40e_config_arq_regs(hw); +	if (ret_code) +		goto init_adminq_free_rings; + +	/* success! */ +	goto init_adminq_exit; + +init_adminq_free_rings: +	i40e_free_adminq_arq(hw); + +init_adminq_exit: +	return ret_code; +} + +/** + *  i40e_shutdown_asq - shutdown the ASQ + *  @hw: pointer to the hardware structure + * + *  The main shutdown routine for the Admin Send Queue + **/ +static i40e_status i40e_shutdown_asq(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; + +	if (hw->aq.asq.count == 0) +		return I40E_ERR_NOT_READY; + +	/* Stop firmware AdminQ processing */ +	wr32(hw, hw->aq.asq.head, 0); +	wr32(hw, hw->aq.asq.tail, 0); +	wr32(hw, hw->aq.asq.len, 0); + +	/* make sure lock is available */ +	mutex_lock(&hw->aq.asq_mutex); + +	hw->aq.asq.count = 0; /* to indicate uninitialized queue */ + +	/* free ring buffers */ +	i40e_free_asq_bufs(hw); + +	mutex_unlock(&hw->aq.asq_mutex); + +	return ret_code; +} + +/** + *  i40e_shutdown_arq - shutdown ARQ + *  @hw: pointer to the hardware structure + * + *  The main shutdown routine for the Admin Receive Queue + **/ +static i40e_status i40e_shutdown_arq(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; + +	if (hw->aq.arq.count == 0) +		return I40E_ERR_NOT_READY; + +	/* Stop firmware AdminQ processing */ +	wr32(hw, hw->aq.arq.head, 0); +	wr32(hw, hw->aq.arq.tail, 0); +	wr32(hw, hw->aq.arq.len, 0); + +	/* make sure lock is available */ +	mutex_lock(&hw->aq.arq_mutex); + +	hw->aq.arq.count = 0; /* to indicate uninitialized queue */ + +	/* free ring buffers */ +	i40e_free_arq_bufs(hw); + +	mutex_unlock(&hw->aq.arq_mutex); + +	return ret_code; +} + +/** + *  i40evf_init_adminq - main initialization routine for Admin Queue + *  @hw: pointer to the hardware structure + * + *  Prior to calling this function, drivers *MUST* set the following fields + *  in the hw->aq structure: + *     - hw->aq.num_asq_entries + *     - hw->aq.num_arq_entries + *     - hw->aq.arq_buf_size + *     - hw->aq.asq_buf_size + **/ +i40e_status i40evf_init_adminq(struct i40e_hw *hw) +{ +	i40e_status ret_code; + +	/* verify input for valid configuration */ +	if ((hw->aq.num_arq_entries == 0) || +	    (hw->aq.num_asq_entries == 0) || +	    (hw->aq.arq_buf_size == 0) || +	    (hw->aq.asq_buf_size == 0)) { +		ret_code = I40E_ERR_CONFIG; +		goto init_adminq_exit; +	} + +	/* initialize locks */ +	mutex_init(&hw->aq.asq_mutex); +	mutex_init(&hw->aq.arq_mutex); + +	/* Set up register offsets */ +	i40e_adminq_init_regs(hw); + +	/* allocate the ASQ */ +	ret_code = i40e_init_asq(hw); +	if (ret_code) +		goto init_adminq_destroy_locks; + +	/* allocate the ARQ */ +	ret_code = i40e_init_arq(hw); +	if (ret_code) +		goto init_adminq_free_asq; + +	/* success! */ +	goto init_adminq_exit; + +init_adminq_free_asq: +	i40e_shutdown_asq(hw); +init_adminq_destroy_locks: + +init_adminq_exit: +	return ret_code; +} + +/** + *  i40evf_shutdown_adminq - shutdown routine for the Admin Queue + *  @hw: pointer to the hardware structure + **/ +i40e_status i40evf_shutdown_adminq(struct i40e_hw *hw) +{ +	i40e_status ret_code = 0; + +	if (i40evf_check_asq_alive(hw)) +		i40evf_aq_queue_shutdown(hw, true); + +	i40e_shutdown_asq(hw); +	i40e_shutdown_arq(hw); + +	/* destroy the locks */ + +	return ret_code; +} + +/** + *  i40e_clean_asq - cleans Admin send queue + *  @hw: pointer to the hardware structure + * + *  returns the number of free desc + **/ +static u16 i40e_clean_asq(struct i40e_hw *hw) +{ +	struct i40e_adminq_ring *asq = &(hw->aq.asq); +	struct i40e_asq_cmd_details *details; +	u16 ntc = asq->next_to_clean; +	struct i40e_aq_desc desc_cb; +	struct i40e_aq_desc *desc; + +	desc = I40E_ADMINQ_DESC(*asq, ntc); +	details = I40E_ADMINQ_DETAILS(*asq, ntc); +	while (rd32(hw, hw->aq.asq.head) != ntc) { +		if (details->callback) { +			I40E_ADMINQ_CALLBACK cb_func = +					(I40E_ADMINQ_CALLBACK)details->callback; +			desc_cb = *desc; +			cb_func(hw, &desc_cb); +		} +		memset((void *)desc, 0, sizeof(struct i40e_aq_desc)); +		memset((void *)details, 0, +		       sizeof(struct i40e_asq_cmd_details)); +		ntc++; +		if (ntc == asq->count) +			ntc = 0; +		desc = I40E_ADMINQ_DESC(*asq, ntc); +		details = I40E_ADMINQ_DETAILS(*asq, ntc); +	} + +	asq->next_to_clean = ntc; + +	return I40E_DESC_UNUSED(asq); +} + +/** + *  i40evf_asq_done - check if FW has processed the Admin Send Queue + *  @hw: pointer to the hw struct + * + *  Returns true if the firmware has processed all descriptors on the + *  admin send queue. Returns false if there are still requests pending. + **/ +bool i40evf_asq_done(struct i40e_hw *hw) +{ +	/* AQ designers suggest use of head for better +	 * timing reliability than DD bit +	 */ +	return rd32(hw, hw->aq.asq.head) == hw->aq.asq.next_to_use; + +} + +/** + *  i40evf_asq_send_command - send command to Admin Queue + *  @hw: pointer to the hw struct + *  @desc: prefilled descriptor describing the command (non DMA mem) + *  @buff: buffer to use for indirect commands + *  @buff_size: size of buffer for indirect commands + *  @cmd_details: pointer to command details structure + * + *  This is the main send command driver routine for the Admin Queue send + *  queue.  It runs the queue, cleans the queue, etc + **/ +i40e_status i40evf_asq_send_command(struct i40e_hw *hw, +				struct i40e_aq_desc *desc, +				void *buff, /* can be NULL */ +				u16  buff_size, +				struct i40e_asq_cmd_details *cmd_details) +{ +	i40e_status status = 0; +	struct i40e_dma_mem *dma_buff = NULL; +	struct i40e_asq_cmd_details *details; +	struct i40e_aq_desc *desc_on_ring; +	bool cmd_completed = false; +	u16  retval = 0; + +	if (hw->aq.asq.count == 0) { +		i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, +			   "AQTX: Admin queue not initialized.\n"); +		status = I40E_ERR_QUEUE_EMPTY; +		goto asq_send_command_exit; +	} + +	if (i40e_is_nvm_update_op(desc) && hw->aq.nvm_busy) { +		i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: NVM busy.\n"); +		status = I40E_ERR_NVM; +		goto asq_send_command_exit; +	} + +	details = I40E_ADMINQ_DETAILS(hw->aq.asq, hw->aq.asq.next_to_use); +	if (cmd_details) { +		*details = *cmd_details; + +		/* If the cmd_details are defined copy the cookie.  The +		 * cpu_to_le32 is not needed here because the data is ignored +		 * by the FW, only used by the driver +		 */ +		if (details->cookie) { +			desc->cookie_high = +				cpu_to_le32(upper_32_bits(details->cookie)); +			desc->cookie_low = +				cpu_to_le32(lower_32_bits(details->cookie)); +		} +	} else { +		memset(details, 0, sizeof(struct i40e_asq_cmd_details)); +	} + +	/* clear requested flags and then set additional flags if defined */ +	desc->flags &= ~cpu_to_le16(details->flags_dis); +	desc->flags |= cpu_to_le16(details->flags_ena); + +	mutex_lock(&hw->aq.asq_mutex); + +	if (buff_size > hw->aq.asq_buf_size) { +		i40e_debug(hw, +			   I40E_DEBUG_AQ_MESSAGE, +			   "AQTX: Invalid buffer size: %d.\n", +			   buff_size); +		status = I40E_ERR_INVALID_SIZE; +		goto asq_send_command_error; +	} + +	if (details->postpone && !details->async) { +		i40e_debug(hw, +			   I40E_DEBUG_AQ_MESSAGE, +			   "AQTX: Async flag not set along with postpone flag"); +		status = I40E_ERR_PARAM; +		goto asq_send_command_error; +	} + +	/* call clean and check queue available function to reclaim the +	 * descriptors that were processed by FW, the function returns the +	 * number of desc available +	 */ +	/* the clean function called here could be called in a separate thread +	 * in case of asynchronous completions +	 */ +	if (i40e_clean_asq(hw) == 0) { +		i40e_debug(hw, +			   I40E_DEBUG_AQ_MESSAGE, +			   "AQTX: Error queue is full.\n"); +		status = I40E_ERR_ADMIN_QUEUE_FULL; +		goto asq_send_command_error; +	} + +	/* initialize the temp desc pointer with the right desc */ +	desc_on_ring = I40E_ADMINQ_DESC(hw->aq.asq, hw->aq.asq.next_to_use); + +	/* if the desc is available copy the temp desc to the right place */ +	*desc_on_ring = *desc; + +	/* if buff is not NULL assume indirect command */ +	if (buff != NULL) { +		dma_buff = &(hw->aq.asq.r.asq_bi[hw->aq.asq.next_to_use]); +		/* copy the user buff into the respective DMA buff */ +		memcpy(dma_buff->va, buff, buff_size); +		desc_on_ring->datalen = cpu_to_le16(buff_size); + +		/* Update the address values in the desc with the pa value +		 * for respective buffer +		 */ +		desc_on_ring->params.external.addr_high = +				cpu_to_le32(upper_32_bits(dma_buff->pa)); +		desc_on_ring->params.external.addr_low = +				cpu_to_le32(lower_32_bits(dma_buff->pa)); +	} + +	/* bump the tail */ +	i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc_on_ring, buff); +	(hw->aq.asq.next_to_use)++; +	if (hw->aq.asq.next_to_use == hw->aq.asq.count) +		hw->aq.asq.next_to_use = 0; +	if (!details->postpone) +		wr32(hw, hw->aq.asq.tail, hw->aq.asq.next_to_use); + +	/* if cmd_details are not defined or async flag is not set, +	 * we need to wait for desc write back +	 */ +	if (!details->async && !details->postpone) { +		u32 total_delay = 0; +		u32 delay_len = 10; + +		do { +			/* AQ designers suggest use of head for better +			 * timing reliability than DD bit +			 */ +			if (i40evf_asq_done(hw)) +				break; +			/* ugh! delay while spin_lock */ +			udelay(delay_len); +			total_delay += delay_len; +		} while (total_delay <  I40E_ASQ_CMD_TIMEOUT); +	} + +	/* if ready, copy the desc back to temp */ +	if (i40evf_asq_done(hw)) { +		*desc = *desc_on_ring; +		if (buff != NULL) +			memcpy(buff, dma_buff->va, buff_size); +		retval = le16_to_cpu(desc->retval); +		if (retval != 0) { +			i40e_debug(hw, +				   I40E_DEBUG_AQ_MESSAGE, +				   "AQTX: Command completed with error 0x%X.\n", +				   retval); +			/* strip off FW internal code */ +			retval &= 0xff; +		} +		cmd_completed = true; +		if ((enum i40e_admin_queue_err)retval == I40E_AQ_RC_OK) +			status = 0; +		else +			status = I40E_ERR_ADMIN_QUEUE_ERROR; +		hw->aq.asq_last_status = (enum i40e_admin_queue_err)retval; +	} + +	if (i40e_is_nvm_update_op(desc)) +		hw->aq.nvm_busy = true; + +	/* update the error if time out occurred */ +	if ((!cmd_completed) && +	    (!details->async && !details->postpone)) { +		i40e_debug(hw, +			   I40E_DEBUG_AQ_MESSAGE, +			   "AQTX: Writeback timeout.\n"); +		status = I40E_ERR_ADMIN_QUEUE_TIMEOUT; +	} + +asq_send_command_error: +	mutex_unlock(&hw->aq.asq_mutex); +asq_send_command_exit: +	return status; +} + +/** + *  i40evf_fill_default_direct_cmd_desc - AQ descriptor helper function + *  @desc:     pointer to the temp descriptor (non DMA mem) + *  @opcode:   the opcode can be used to decide which flags to turn off or on + * + *  Fill the desc with default values + **/ +void i40evf_fill_default_direct_cmd_desc(struct i40e_aq_desc *desc, +				       u16 opcode) +{ +	/* zero out the desc */ +	memset((void *)desc, 0, sizeof(struct i40e_aq_desc)); +	desc->opcode = cpu_to_le16(opcode); +	desc->flags = cpu_to_le16(I40E_AQ_FLAG_SI); +} + +/** + *  i40evf_clean_arq_element + *  @hw: pointer to the hw struct + *  @e: event info from the receive descriptor, includes any buffers + *  @pending: number of events that could be left to process + * + *  This function cleans one Admin Receive Queue element and returns + *  the contents through e.  It can also return how many events are + *  left to process through 'pending' + **/ +i40e_status i40evf_clean_arq_element(struct i40e_hw *hw, +					     struct i40e_arq_event_info *e, +					     u16 *pending) +{ +	i40e_status ret_code = 0; +	u16 ntc = hw->aq.arq.next_to_clean; +	struct i40e_aq_desc *desc; +	struct i40e_dma_mem *bi; +	u16 desc_idx; +	u16 datalen; +	u16 flags; +	u16 ntu; + +	/* take the lock before we start messing with the ring */ +	mutex_lock(&hw->aq.arq_mutex); + +	/* set next_to_use to head */ +	ntu = (rd32(hw, hw->aq.arq.head) & I40E_PF_ARQH_ARQH_MASK); +	if (ntu == ntc) { +		/* nothing to do - shouldn't need to update ring's values */ +		i40e_debug(hw, +			   I40E_DEBUG_AQ_MESSAGE, +			   "AQRX: Queue is empty.\n"); +		ret_code = I40E_ERR_ADMIN_QUEUE_NO_WORK; +		goto clean_arq_element_out; +	} + +	/* now clean the next descriptor */ +	desc = I40E_ADMINQ_DESC(hw->aq.arq, ntc); +	desc_idx = ntc; +	i40evf_debug_aq(hw, +		      I40E_DEBUG_AQ_COMMAND, +		      (void *)desc, +		      hw->aq.arq.r.arq_bi[desc_idx].va); + +	flags = le16_to_cpu(desc->flags); +	if (flags & I40E_AQ_FLAG_ERR) { +		ret_code = I40E_ERR_ADMIN_QUEUE_ERROR; +		hw->aq.arq_last_status = +			(enum i40e_admin_queue_err)le16_to_cpu(desc->retval); +		i40e_debug(hw, +			   I40E_DEBUG_AQ_MESSAGE, +			   "AQRX: Event received with error 0x%X.\n", +			   hw->aq.arq_last_status); +	} else { +		e->desc = *desc; +		datalen = le16_to_cpu(desc->datalen); +		e->msg_size = min(datalen, e->msg_size); +		if (e->msg_buf != NULL && (e->msg_size != 0)) +			memcpy(e->msg_buf, hw->aq.arq.r.arq_bi[desc_idx].va, +			       e->msg_size); +	} + +	if (i40e_is_nvm_update_op(&e->desc)) +		hw->aq.nvm_busy = false; + +	/* Restore the original datalen and buffer address in the desc, +	 * FW updates datalen to indicate the event message +	 * size +	 */ +	bi = &hw->aq.arq.r.arq_bi[ntc]; +	memset((void *)desc, 0, sizeof(struct i40e_aq_desc)); + +	desc->flags = cpu_to_le16(I40E_AQ_FLAG_BUF); +	if (hw->aq.arq_buf_size > I40E_AQ_LARGE_BUF) +		desc->flags |= cpu_to_le16(I40E_AQ_FLAG_LB); +	desc->datalen = cpu_to_le16((u16)bi->size); +	desc->params.external.addr_high = cpu_to_le32(upper_32_bits(bi->pa)); +	desc->params.external.addr_low = cpu_to_le32(lower_32_bits(bi->pa)); + +	/* set tail = the last cleaned desc index. */ +	wr32(hw, hw->aq.arq.tail, ntc); +	/* ntc is updated to tail + 1 */ +	ntc++; +	if (ntc == hw->aq.num_arq_entries) +		ntc = 0; +	hw->aq.arq.next_to_clean = ntc; +	hw->aq.arq.next_to_use = ntu; + +clean_arq_element_out: +	/* Set pending if needed, unlock and return */ +	if (pending != NULL) +		*pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc); +	mutex_unlock(&hw->aq.arq_mutex); + +	return ret_code; +} + +void i40evf_resume_aq(struct i40e_hw *hw) +{ +	/* Registers are reset after PF reset */ +	hw->aq.asq.next_to_use = 0; +	hw->aq.asq.next_to_clean = 0; + +	i40e_config_asq_regs(hw); + +	hw->aq.arq.next_to_use = 0; +	hw->aq.arq.next_to_clean = 0; + +	i40e_config_arq_regs(hw); +} diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq.h b/drivers/net/ethernet/intel/i40evf/i40e_adminq.h new file mode 100644 index 00000000000..e3472c62e15 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq.h @@ -0,0 +1,110 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_ADMINQ_H_ +#define _I40E_ADMINQ_H_ + +#include "i40e_osdep.h" +#include "i40e_adminq_cmd.h" + +#define I40E_ADMINQ_DESC(R, i)   \ +	(&(((struct i40e_aq_desc *)((R).desc_buf.va))[i])) + +#define I40E_ADMINQ_DESC_ALIGNMENT 4096 + +struct i40e_adminq_ring { +	struct i40e_virt_mem dma_head;	/* space for dma structures */ +	struct i40e_dma_mem desc_buf;	/* descriptor ring memory */ +	struct i40e_virt_mem cmd_buf;	/* command buffer memory */ + +	union { +		struct i40e_dma_mem *asq_bi; +		struct i40e_dma_mem *arq_bi; +	} r; + +	u16 count;		/* Number of descriptors */ +	u16 rx_buf_len;		/* Admin Receive Queue buffer length */ + +	/* used for interrupt processing */ +	u16 next_to_use; +	u16 next_to_clean; + +	/* used for queue tracking */ +	u32 head; +	u32 tail; +	u32 len; +}; + +/* ASQ transaction details */ +struct i40e_asq_cmd_details { +	void *callback; /* cast from type I40E_ADMINQ_CALLBACK */ +	u64 cookie; +	u16 flags_ena; +	u16 flags_dis; +	bool async; +	bool postpone; +}; + +#define I40E_ADMINQ_DETAILS(R, i)   \ +	(&(((struct i40e_asq_cmd_details *)((R).cmd_buf.va))[i])) + +/* ARQ event information */ +struct i40e_arq_event_info { +	struct i40e_aq_desc desc; +	u16 msg_size; +	u8 *msg_buf; +}; + +/* Admin Queue information */ +struct i40e_adminq_info { +	struct i40e_adminq_ring arq;    /* receive queue */ +	struct i40e_adminq_ring asq;    /* send queue */ +	u16 num_arq_entries;            /* receive queue depth */ +	u16 num_asq_entries;            /* send queue depth */ +	u16 arq_buf_size;               /* receive queue buffer size */ +	u16 asq_buf_size;               /* send queue buffer size */ +	u16 fw_maj_ver;                 /* firmware major version */ +	u16 fw_min_ver;                 /* firmware minor version */ +	u16 api_maj_ver;                /* api major version */ +	u16 api_min_ver;                /* api minor version */ +	bool nvm_busy; + +	struct mutex asq_mutex; /* Send queue lock */ +	struct mutex arq_mutex; /* Receive queue lock */ + +	/* last status values on send and receive queues */ +	enum i40e_admin_queue_err asq_last_status; +	enum i40e_admin_queue_err arq_last_status; +}; + +/* general information */ +#define I40E_AQ_LARGE_BUF	512 +#define I40E_ASQ_CMD_TIMEOUT	100000  /* usecs */ + +void i40evf_fill_default_direct_cmd_desc(struct i40e_aq_desc *desc, +				       u16 opcode); + +#endif /* _I40E_ADMINQ_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h new file mode 100644 index 00000000000..e656ea7a792 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h @@ -0,0 +1,2197 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_ADMINQ_CMD_H_ +#define _I40E_ADMINQ_CMD_H_ + +/* This header file defines the i40e Admin Queue commands and is shared between + * i40e Firmware and Software. + * + * This file needs to comply with the Linux Kernel coding style. + */ + +#define I40E_FW_API_VERSION_MAJOR  0x0001 +#define I40E_FW_API_VERSION_MINOR  0x0002 +#define I40E_FW_API_VERSION_A0_MINOR  0x0000 + +struct i40e_aq_desc { +	__le16 flags; +	__le16 opcode; +	__le16 datalen; +	__le16 retval; +	__le32 cookie_high; +	__le32 cookie_low; +	union { +		struct { +			__le32 param0; +			__le32 param1; +			__le32 param2; +			__le32 param3; +		} internal; +		struct { +			__le32 param0; +			__le32 param1; +			__le32 addr_high; +			__le32 addr_low; +		} external; +		u8 raw[16]; +	} params; +}; + +/* Flags sub-structure + * |0  |1  |2  |3  |4  |5  |6  |7  |8  |9  |10 |11 |12 |13 |14 |15 | + * |DD |CMP|ERR|VFE| * *  RESERVED * * |LB |RD |VFC|BUF|SI |EI |FE | + */ + +/* command flags and offsets*/ +#define I40E_AQ_FLAG_DD_SHIFT  0 +#define I40E_AQ_FLAG_CMP_SHIFT 1 +#define I40E_AQ_FLAG_ERR_SHIFT 2 +#define I40E_AQ_FLAG_VFE_SHIFT 3 +#define I40E_AQ_FLAG_LB_SHIFT  9 +#define I40E_AQ_FLAG_RD_SHIFT  10 +#define I40E_AQ_FLAG_VFC_SHIFT 11 +#define I40E_AQ_FLAG_BUF_SHIFT 12 +#define I40E_AQ_FLAG_SI_SHIFT  13 +#define I40E_AQ_FLAG_EI_SHIFT  14 +#define I40E_AQ_FLAG_FE_SHIFT  15 + +#define I40E_AQ_FLAG_DD  (1 << I40E_AQ_FLAG_DD_SHIFT)  /* 0x1    */ +#define I40E_AQ_FLAG_CMP (1 << I40E_AQ_FLAG_CMP_SHIFT) /* 0x2    */ +#define I40E_AQ_FLAG_ERR (1 << I40E_AQ_FLAG_ERR_SHIFT) /* 0x4    */ +#define I40E_AQ_FLAG_VFE (1 << I40E_AQ_FLAG_VFE_SHIFT) /* 0x8    */ +#define I40E_AQ_FLAG_LB  (1 << I40E_AQ_FLAG_LB_SHIFT)  /* 0x200  */ +#define I40E_AQ_FLAG_RD  (1 << I40E_AQ_FLAG_RD_SHIFT)  /* 0x400  */ +#define I40E_AQ_FLAG_VFC (1 << I40E_AQ_FLAG_VFC_SHIFT) /* 0x800  */ +#define I40E_AQ_FLAG_BUF (1 << I40E_AQ_FLAG_BUF_SHIFT) /* 0x1000 */ +#define I40E_AQ_FLAG_SI  (1 << I40E_AQ_FLAG_SI_SHIFT)  /* 0x2000 */ +#define I40E_AQ_FLAG_EI  (1 << I40E_AQ_FLAG_EI_SHIFT)  /* 0x4000 */ +#define I40E_AQ_FLAG_FE  (1 << I40E_AQ_FLAG_FE_SHIFT)  /* 0x8000 */ + +/* error codes */ +enum i40e_admin_queue_err { +	I40E_AQ_RC_OK       = 0,    /* success */ +	I40E_AQ_RC_EPERM    = 1,    /* Operation not permitted */ +	I40E_AQ_RC_ENOENT   = 2,    /* No such element */ +	I40E_AQ_RC_ESRCH    = 3,    /* Bad opcode */ +	I40E_AQ_RC_EINTR    = 4,    /* operation interrupted */ +	I40E_AQ_RC_EIO      = 5,    /* I/O error */ +	I40E_AQ_RC_ENXIO    = 6,    /* No such resource */ +	I40E_AQ_RC_E2BIG    = 7,    /* Arg too long */ +	I40E_AQ_RC_EAGAIN   = 8,    /* Try again */ +	I40E_AQ_RC_ENOMEM   = 9,    /* Out of memory */ +	I40E_AQ_RC_EACCES   = 10,   /* Permission denied */ +	I40E_AQ_RC_EFAULT   = 11,   /* Bad address */ +	I40E_AQ_RC_EBUSY    = 12,   /* Device or resource busy */ +	I40E_AQ_RC_EEXIST   = 13,   /* object already exists */ +	I40E_AQ_RC_EINVAL   = 14,   /* Invalid argument */ +	I40E_AQ_RC_ENOTTY   = 15,   /* Not a typewriter */ +	I40E_AQ_RC_ENOSPC   = 16,   /* No space left or alloc failure */ +	I40E_AQ_RC_ENOSYS   = 17,   /* Function not implemented */ +	I40E_AQ_RC_ERANGE   = 18,   /* Parameter out of range */ +	I40E_AQ_RC_EFLUSHED = 19,   /* Cmd flushed because of prev cmd error */ +	I40E_AQ_RC_BAD_ADDR = 20,   /* Descriptor contains a bad pointer */ +	I40E_AQ_RC_EMODE    = 21,   /* Op not allowed in current dev mode */ +	I40E_AQ_RC_EFBIG    = 22,   /* File too large */ +}; + +/* Admin Queue command opcodes */ +enum i40e_admin_queue_opc { +	/* aq commands */ +	i40e_aqc_opc_get_version      = 0x0001, +	i40e_aqc_opc_driver_version   = 0x0002, +	i40e_aqc_opc_queue_shutdown   = 0x0003, +	i40e_aqc_opc_set_pf_context   = 0x0004, + +	/* resource ownership */ +	i40e_aqc_opc_request_resource = 0x0008, +	i40e_aqc_opc_release_resource = 0x0009, + +	i40e_aqc_opc_list_func_capabilities = 0x000A, +	i40e_aqc_opc_list_dev_capabilities  = 0x000B, + +	i40e_aqc_opc_set_cppm_configuration = 0x0103, +	i40e_aqc_opc_set_arp_proxy_entry    = 0x0104, +	i40e_aqc_opc_set_ns_proxy_entry     = 0x0105, + +	/* LAA */ +	i40e_aqc_opc_mng_laa                = 0x0106,   /* AQ obsolete */ +	i40e_aqc_opc_mac_address_read       = 0x0107, +	i40e_aqc_opc_mac_address_write      = 0x0108, + +	/* PXE */ +	i40e_aqc_opc_clear_pxe_mode         = 0x0110, + +	/* internal switch commands */ +	i40e_aqc_opc_get_switch_config         = 0x0200, +	i40e_aqc_opc_add_statistics            = 0x0201, +	i40e_aqc_opc_remove_statistics         = 0x0202, +	i40e_aqc_opc_set_port_parameters       = 0x0203, +	i40e_aqc_opc_get_switch_resource_alloc = 0x0204, + +	i40e_aqc_opc_add_vsi                = 0x0210, +	i40e_aqc_opc_update_vsi_parameters  = 0x0211, +	i40e_aqc_opc_get_vsi_parameters     = 0x0212, + +	i40e_aqc_opc_add_pv                = 0x0220, +	i40e_aqc_opc_update_pv_parameters  = 0x0221, +	i40e_aqc_opc_get_pv_parameters     = 0x0222, + +	i40e_aqc_opc_add_veb               = 0x0230, +	i40e_aqc_opc_update_veb_parameters = 0x0231, +	i40e_aqc_opc_get_veb_parameters    = 0x0232, + +	i40e_aqc_opc_delete_element  = 0x0243, + +	i40e_aqc_opc_add_macvlan                  = 0x0250, +	i40e_aqc_opc_remove_macvlan               = 0x0251, +	i40e_aqc_opc_add_vlan                     = 0x0252, +	i40e_aqc_opc_remove_vlan                  = 0x0253, +	i40e_aqc_opc_set_vsi_promiscuous_modes    = 0x0254, +	i40e_aqc_opc_add_tag                      = 0x0255, +	i40e_aqc_opc_remove_tag                   = 0x0256, +	i40e_aqc_opc_add_multicast_etag           = 0x0257, +	i40e_aqc_opc_remove_multicast_etag        = 0x0258, +	i40e_aqc_opc_update_tag                   = 0x0259, +	i40e_aqc_opc_add_control_packet_filter    = 0x025A, +	i40e_aqc_opc_remove_control_packet_filter = 0x025B, +	i40e_aqc_opc_add_cloud_filters            = 0x025C, +	i40e_aqc_opc_remove_cloud_filters         = 0x025D, + +	i40e_aqc_opc_add_mirror_rule    = 0x0260, +	i40e_aqc_opc_delete_mirror_rule = 0x0261, + +	/* DCB commands */ +	i40e_aqc_opc_dcb_ignore_pfc = 0x0301, +	i40e_aqc_opc_dcb_updated    = 0x0302, + +	/* TX scheduler */ +	i40e_aqc_opc_configure_vsi_bw_limit            = 0x0400, +	i40e_aqc_opc_configure_vsi_ets_sla_bw_limit    = 0x0406, +	i40e_aqc_opc_configure_vsi_tc_bw               = 0x0407, +	i40e_aqc_opc_query_vsi_bw_config               = 0x0408, +	i40e_aqc_opc_query_vsi_ets_sla_config          = 0x040A, +	i40e_aqc_opc_configure_switching_comp_bw_limit = 0x0410, + +	i40e_aqc_opc_enable_switching_comp_ets             = 0x0413, +	i40e_aqc_opc_modify_switching_comp_ets             = 0x0414, +	i40e_aqc_opc_disable_switching_comp_ets            = 0x0415, +	i40e_aqc_opc_configure_switching_comp_ets_bw_limit = 0x0416, +	i40e_aqc_opc_configure_switching_comp_bw_config    = 0x0417, +	i40e_aqc_opc_query_switching_comp_ets_config       = 0x0418, +	i40e_aqc_opc_query_port_ets_config                 = 0x0419, +	i40e_aqc_opc_query_switching_comp_bw_config        = 0x041A, +	i40e_aqc_opc_suspend_port_tx                       = 0x041B, +	i40e_aqc_opc_resume_port_tx                        = 0x041C, +	i40e_aqc_opc_configure_partition_bw                = 0x041D, + +	/* hmc */ +	i40e_aqc_opc_query_hmc_resource_profile = 0x0500, +	i40e_aqc_opc_set_hmc_resource_profile   = 0x0501, + +	/* phy commands*/ +	i40e_aqc_opc_get_phy_abilities   = 0x0600, +	i40e_aqc_opc_set_phy_config      = 0x0601, +	i40e_aqc_opc_set_mac_config      = 0x0603, +	i40e_aqc_opc_set_link_restart_an = 0x0605, +	i40e_aqc_opc_get_link_status     = 0x0607, +	i40e_aqc_opc_set_phy_int_mask    = 0x0613, +	i40e_aqc_opc_get_local_advt_reg  = 0x0614, +	i40e_aqc_opc_set_local_advt_reg  = 0x0615, +	i40e_aqc_opc_get_partner_advt    = 0x0616, +	i40e_aqc_opc_set_lb_modes        = 0x0618, +	i40e_aqc_opc_get_phy_wol_caps    = 0x0621, +	i40e_aqc_opc_set_phy_debug	 = 0x0622, +	i40e_aqc_opc_upload_ext_phy_fm   = 0x0625, + +	/* NVM commands */ +	i40e_aqc_opc_nvm_read         = 0x0701, +	i40e_aqc_opc_nvm_erase        = 0x0702, +	i40e_aqc_opc_nvm_update       = 0x0703, +	i40e_aqc_opc_nvm_config_read  = 0x0704, +	i40e_aqc_opc_nvm_config_write = 0x0705, + +	/* virtualization commands */ +	i40e_aqc_opc_send_msg_to_pf   = 0x0801, +	i40e_aqc_opc_send_msg_to_vf   = 0x0802, +	i40e_aqc_opc_send_msg_to_peer = 0x0803, + +	/* alternate structure */ +	i40e_aqc_opc_alternate_write          = 0x0900, +	i40e_aqc_opc_alternate_write_indirect = 0x0901, +	i40e_aqc_opc_alternate_read           = 0x0902, +	i40e_aqc_opc_alternate_read_indirect  = 0x0903, +	i40e_aqc_opc_alternate_write_done     = 0x0904, +	i40e_aqc_opc_alternate_set_mode       = 0x0905, +	i40e_aqc_opc_alternate_clear_port     = 0x0906, + +	/* LLDP commands */ +	i40e_aqc_opc_lldp_get_mib    = 0x0A00, +	i40e_aqc_opc_lldp_update_mib = 0x0A01, +	i40e_aqc_opc_lldp_add_tlv    = 0x0A02, +	i40e_aqc_opc_lldp_update_tlv = 0x0A03, +	i40e_aqc_opc_lldp_delete_tlv = 0x0A04, +	i40e_aqc_opc_lldp_stop       = 0x0A05, +	i40e_aqc_opc_lldp_start      = 0x0A06, + +	/* Tunnel commands */ +	i40e_aqc_opc_add_udp_tunnel       = 0x0B00, +	i40e_aqc_opc_del_udp_tunnel       = 0x0B01, +	i40e_aqc_opc_tunnel_key_structure = 0x0B10, + +	/* Async Events */ +	i40e_aqc_opc_event_lan_overflow = 0x1001, + +	/* OEM commands */ +	i40e_aqc_opc_oem_parameter_change     = 0xFE00, +	i40e_aqc_opc_oem_device_status_change = 0xFE01, + +	/* debug commands */ +	i40e_aqc_opc_debug_get_deviceid     = 0xFF00, +	i40e_aqc_opc_debug_set_mode         = 0xFF01, +	i40e_aqc_opc_debug_read_reg         = 0xFF03, +	i40e_aqc_opc_debug_write_reg        = 0xFF04, +	i40e_aqc_opc_debug_modify_reg       = 0xFF07, +	i40e_aqc_opc_debug_dump_internals   = 0xFF08, +	i40e_aqc_opc_debug_modify_internals = 0xFF09, +}; + +/* command structures and indirect data structures */ + +/* Structure naming conventions: + * - no suffix for direct command descriptor structures + * - _data for indirect sent data + * - _resp for indirect return data (data which is both will use _data) + * - _completion for direct return data + * - _element_ for repeated elements (may also be _data or _resp) + * + * Command structures are expected to overlay the params.raw member of the basic + * descriptor, and as such cannot exceed 16 bytes in length. + */ + +/* This macro is used to generate a compilation error if a structure + * is not exactly the correct length. It gives a divide by zero error if the + * structure is not of the correct size, otherwise it creates an enum that is + * never used. + */ +#define I40E_CHECK_STRUCT_LEN(n, X) enum i40e_static_assert_enum_##X \ +	{ i40e_static_assert_##X = (n)/((sizeof(struct X) == (n)) ? 1 : 0) } + +/* This macro is used extensively to ensure that command structures are 16 + * bytes in length as they have to map to the raw array of that size. + */ +#define I40E_CHECK_CMD_LENGTH(X) I40E_CHECK_STRUCT_LEN(16, X) + +/* internal (0x00XX) commands */ + +/* Get version (direct 0x0001) */ +struct i40e_aqc_get_version { +	__le32 rom_ver; +	__le32 fw_build; +	__le16 fw_major; +	__le16 fw_minor; +	__le16 api_major; +	__le16 api_minor; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_get_version); + +/* Send driver version (indirect 0x0002) */ +struct i40e_aqc_driver_version { +	u8     driver_major_ver; +	u8     driver_minor_ver; +	u8     driver_build_ver; +	u8     driver_subbuild_ver; +	u8     reserved[4]; +	__le32 address_high; +	__le32 address_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_driver_version); + +/* Queue Shutdown (direct 0x0003) */ +struct i40e_aqc_queue_shutdown { +	__le32     driver_unloading; +#define I40E_AQ_DRIVER_UNLOADING    0x1 +	u8     reserved[12]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_queue_shutdown); + +/* Set PF context (0x0004, direct) */ +struct i40e_aqc_set_pf_context { +	u8	pf_id; +	u8	reserved[15]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_pf_context); + +/* Request resource ownership (direct 0x0008) + * Release resource ownership (direct 0x0009) + */ +#define I40E_AQ_RESOURCE_NVM               1 +#define I40E_AQ_RESOURCE_SDP               2 +#define I40E_AQ_RESOURCE_ACCESS_READ       1 +#define I40E_AQ_RESOURCE_ACCESS_WRITE      2 +#define I40E_AQ_RESOURCE_NVM_READ_TIMEOUT  3000 +#define I40E_AQ_RESOURCE_NVM_WRITE_TIMEOUT 180000 + +struct i40e_aqc_request_resource { +	__le16 resource_id; +	__le16 access_type; +	__le32 timeout; +	__le32 resource_number; +	u8     reserved[4]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_request_resource); + +/* Get function capabilities (indirect 0x000A) + * Get device capabilities (indirect 0x000B) + */ +struct i40e_aqc_list_capabilites { +	u8 command_flags; +#define I40E_AQ_LIST_CAP_PF_INDEX_EN     1 +	u8 pf_index; +	u8 reserved[2]; +	__le32 count; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_list_capabilites); + +struct i40e_aqc_list_capabilities_element_resp { +	__le16 id; +	u8     major_rev; +	u8     minor_rev; +	__le32 number; +	__le32 logical_id; +	__le32 phys_id; +	u8     reserved[16]; +}; + +/* list of caps */ + +#define I40E_AQ_CAP_ID_SWITCH_MODE      0x0001 +#define I40E_AQ_CAP_ID_MNG_MODE         0x0002 +#define I40E_AQ_CAP_ID_NPAR_ACTIVE      0x0003 +#define I40E_AQ_CAP_ID_OS2BMC_CAP       0x0004 +#define I40E_AQ_CAP_ID_FUNCTIONS_VALID  0x0005 +#define I40E_AQ_CAP_ID_ALTERNATE_RAM    0x0006 +#define I40E_AQ_CAP_ID_SRIOV            0x0012 +#define I40E_AQ_CAP_ID_VF               0x0013 +#define I40E_AQ_CAP_ID_VMDQ             0x0014 +#define I40E_AQ_CAP_ID_8021QBG          0x0015 +#define I40E_AQ_CAP_ID_8021QBR          0x0016 +#define I40E_AQ_CAP_ID_VSI              0x0017 +#define I40E_AQ_CAP_ID_DCB              0x0018 +#define I40E_AQ_CAP_ID_FCOE             0x0021 +#define I40E_AQ_CAP_ID_RSS              0x0040 +#define I40E_AQ_CAP_ID_RXQ              0x0041 +#define I40E_AQ_CAP_ID_TXQ              0x0042 +#define I40E_AQ_CAP_ID_MSIX             0x0043 +#define I40E_AQ_CAP_ID_VF_MSIX          0x0044 +#define I40E_AQ_CAP_ID_FLOW_DIRECTOR    0x0045 +#define I40E_AQ_CAP_ID_1588             0x0046 +#define I40E_AQ_CAP_ID_IWARP            0x0051 +#define I40E_AQ_CAP_ID_LED              0x0061 +#define I40E_AQ_CAP_ID_SDP              0x0062 +#define I40E_AQ_CAP_ID_MDIO             0x0063 +#define I40E_AQ_CAP_ID_FLEX10           0x00F1 +#define I40E_AQ_CAP_ID_CEM              0x00F2 + +/* Set CPPM Configuration (direct 0x0103) */ +struct i40e_aqc_cppm_configuration { +	__le16 command_flags; +#define I40E_AQ_CPPM_EN_LTRC    0x0800 +#define I40E_AQ_CPPM_EN_DMCTH   0x1000 +#define I40E_AQ_CPPM_EN_DMCTLX  0x2000 +#define I40E_AQ_CPPM_EN_HPTC    0x4000 +#define I40E_AQ_CPPM_EN_DMARC   0x8000 +	__le16 ttlx; +	__le32 dmacr; +	__le16 dmcth; +	u8     hptc; +	u8     reserved; +	__le32 pfltrc; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_cppm_configuration); + +/* Set ARP Proxy command / response (indirect 0x0104) */ +struct i40e_aqc_arp_proxy_data { +	__le16 command_flags; +#define I40E_AQ_ARP_INIT_IPV4           0x0008 +#define I40E_AQ_ARP_UNSUP_CTL           0x0010 +#define I40E_AQ_ARP_ENA                 0x0020 +#define I40E_AQ_ARP_ADD_IPV4            0x0040 +#define I40E_AQ_ARP_DEL_IPV4            0x0080 +	__le16 table_id; +	__le32 pfpm_proxyfc; +	__le32 ip_addr; +	u8     mac_addr[6]; +}; + +/* Set NS Proxy Table Entry Command (indirect 0x0105) */ +struct i40e_aqc_ns_proxy_data { +	__le16 table_idx_mac_addr_0; +	__le16 table_idx_mac_addr_1; +	__le16 table_idx_ipv6_0; +	__le16 table_idx_ipv6_1; +	__le16 control; +#define I40E_AQ_NS_PROXY_ADD_0             0x0100 +#define I40E_AQ_NS_PROXY_DEL_0             0x0200 +#define I40E_AQ_NS_PROXY_ADD_1             0x0400 +#define I40E_AQ_NS_PROXY_DEL_1             0x0800 +#define I40E_AQ_NS_PROXY_ADD_IPV6_0        0x1000 +#define I40E_AQ_NS_PROXY_DEL_IPV6_0        0x2000 +#define I40E_AQ_NS_PROXY_ADD_IPV6_1        0x4000 +#define I40E_AQ_NS_PROXY_DEL_IPV6_1        0x8000 +#define I40E_AQ_NS_PROXY_COMMAND_SEQ       0x0001 +#define I40E_AQ_NS_PROXY_INIT_IPV6_TBL     0x0002 +#define I40E_AQ_NS_PROXY_INIT_MAC_TBL      0x0004 +	u8     mac_addr_0[6]; +	u8     mac_addr_1[6]; +	u8     local_mac_addr[6]; +	u8     ipv6_addr_0[16]; /* Warning! spec specifies BE byte order */ +	u8     ipv6_addr_1[16]; +}; + +/* Manage LAA Command (0x0106) - obsolete */ +struct i40e_aqc_mng_laa { +	__le16	command_flags; +#define I40E_AQ_LAA_FLAG_WR   0x8000 +	u8     reserved[2]; +	__le32 sal; +	__le16 sah; +	u8     reserved2[6]; +}; + +/* Manage MAC Address Read Command (indirect 0x0107) */ +struct i40e_aqc_mac_address_read { +	__le16	command_flags; +#define I40E_AQC_LAN_ADDR_VALID   0x10 +#define I40E_AQC_SAN_ADDR_VALID   0x20 +#define I40E_AQC_PORT_ADDR_VALID  0x40 +#define I40E_AQC_WOL_ADDR_VALID   0x80 +#define I40E_AQC_ADDR_VALID_MASK  0xf0 +	u8     reserved[6]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_mac_address_read); + +struct i40e_aqc_mac_address_read_data { +	u8 pf_lan_mac[6]; +	u8 pf_san_mac[6]; +	u8 port_mac[6]; +	u8 pf_wol_mac[6]; +}; + +I40E_CHECK_STRUCT_LEN(24, i40e_aqc_mac_address_read_data); + +/* Manage MAC Address Write Command (0x0108) */ +struct i40e_aqc_mac_address_write { +	__le16 command_flags; +#define I40E_AQC_WRITE_TYPE_LAA_ONLY    0x0000 +#define I40E_AQC_WRITE_TYPE_LAA_WOL     0x4000 +#define I40E_AQC_WRITE_TYPE_PORT        0x8000 +#define I40E_AQC_WRITE_TYPE_MASK        0xc000 +	__le16 mac_sah; +	__le32 mac_sal; +	u8     reserved[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_mac_address_write); + +/* PXE commands (0x011x) */ + +/* Clear PXE Command and response  (direct 0x0110) */ +struct i40e_aqc_clear_pxe { +	u8	rx_cnt; +	u8	reserved[15]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_clear_pxe); + +/* Switch configuration commands (0x02xx) */ + +/* Used by many indirect commands that only pass an seid and a buffer in the + * command + */ +struct i40e_aqc_switch_seid { +	__le16 seid; +	u8     reserved[6]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_switch_seid); + +/* Get Switch Configuration command (indirect 0x0200) + * uses i40e_aqc_switch_seid for the descriptor + */ +struct i40e_aqc_get_switch_config_header_resp { +	__le16 num_reported; +	__le16 num_total; +	u8     reserved[12]; +}; + +struct i40e_aqc_switch_config_element_resp { +	u8     element_type; +#define I40E_AQ_SW_ELEM_TYPE_MAC        1 +#define I40E_AQ_SW_ELEM_TYPE_PF         2 +#define I40E_AQ_SW_ELEM_TYPE_VF         3 +#define I40E_AQ_SW_ELEM_TYPE_EMP        4 +#define I40E_AQ_SW_ELEM_TYPE_BMC        5 +#define I40E_AQ_SW_ELEM_TYPE_PV         16 +#define I40E_AQ_SW_ELEM_TYPE_VEB        17 +#define I40E_AQ_SW_ELEM_TYPE_PA         18 +#define I40E_AQ_SW_ELEM_TYPE_VSI        19 +	u8     revision; +#define I40E_AQ_SW_ELEM_REV_1           1 +	__le16 seid; +	__le16 uplink_seid; +	__le16 downlink_seid; +	u8     reserved[3]; +	u8     connection_type; +#define I40E_AQ_CONN_TYPE_REGULAR       0x1 +#define I40E_AQ_CONN_TYPE_DEFAULT       0x2 +#define I40E_AQ_CONN_TYPE_CASCADED      0x3 +	__le16 scheduler_id; +	__le16 element_info; +}; + +/* Get Switch Configuration (indirect 0x0200) + *    an array of elements are returned in the response buffer + *    the first in the array is the header, remainder are elements + */ +struct i40e_aqc_get_switch_config_resp { +	struct i40e_aqc_get_switch_config_header_resp header; +	struct i40e_aqc_switch_config_element_resp    element[1]; +}; + +/* Add Statistics (direct 0x0201) + * Remove Statistics (direct 0x0202) + */ +struct i40e_aqc_add_remove_statistics { +	__le16 seid; +	__le16 vlan; +	__le16 stat_index; +	u8     reserved[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_statistics); + +/* Set Port Parameters command (direct 0x0203) */ +struct i40e_aqc_set_port_parameters { +	__le16 command_flags; +#define I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS   1 +#define I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS  2 /* must set! */ +#define I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA    4 +	__le16 bad_frame_vsi; +	__le16 default_seid;        /* reserved for command */ +	u8     reserved[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_port_parameters); + +/* Get Switch Resource Allocation (indirect 0x0204) */ +struct i40e_aqc_get_switch_resource_alloc { +	u8     num_entries;         /* reserved for command */ +	u8     reserved[7]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_get_switch_resource_alloc); + +/* expect an array of these structs in the response buffer */ +struct i40e_aqc_switch_resource_alloc_element_resp { +	u8     resource_type; +#define I40E_AQ_RESOURCE_TYPE_VEB                 0x0 +#define I40E_AQ_RESOURCE_TYPE_VSI                 0x1 +#define I40E_AQ_RESOURCE_TYPE_MACADDR             0x2 +#define I40E_AQ_RESOURCE_TYPE_STAG                0x3 +#define I40E_AQ_RESOURCE_TYPE_ETAG                0x4 +#define I40E_AQ_RESOURCE_TYPE_MULTICAST_HASH      0x5 +#define I40E_AQ_RESOURCE_TYPE_UNICAST_HASH        0x6 +#define I40E_AQ_RESOURCE_TYPE_VLAN                0x7 +#define I40E_AQ_RESOURCE_TYPE_VSI_LIST_ENTRY      0x8 +#define I40E_AQ_RESOURCE_TYPE_ETAG_LIST_ENTRY     0x9 +#define I40E_AQ_RESOURCE_TYPE_VLAN_STAT_POOL      0xA +#define I40E_AQ_RESOURCE_TYPE_MIRROR_RULE         0xB +#define I40E_AQ_RESOURCE_TYPE_QUEUE_SETS          0xC +#define I40E_AQ_RESOURCE_TYPE_VLAN_FILTERS        0xD +#define I40E_AQ_RESOURCE_TYPE_INNER_MAC_FILTERS   0xF +#define I40E_AQ_RESOURCE_TYPE_IP_FILTERS          0x10 +#define I40E_AQ_RESOURCE_TYPE_GRE_VN_KEYS         0x11 +#define I40E_AQ_RESOURCE_TYPE_VN2_KEYS            0x12 +#define I40E_AQ_RESOURCE_TYPE_TUNNEL_PORTS        0x13 +	u8     reserved1; +	__le16 guaranteed; +	__le16 total; +	__le16 used; +	__le16 total_unalloced; +	u8     reserved2[6]; +}; + +/* Add VSI (indirect 0x0210) + *    this indirect command uses struct i40e_aqc_vsi_properties_data + *    as the indirect buffer (128 bytes) + * + * Update VSI (indirect 0x211) + *     uses the same data structure as Add VSI + * + * Get VSI (indirect 0x0212) + *     uses the same completion and data structure as Add VSI + */ +struct i40e_aqc_add_get_update_vsi { +	__le16 uplink_seid; +	u8     connection_type; +#define I40E_AQ_VSI_CONN_TYPE_NORMAL            0x1 +#define I40E_AQ_VSI_CONN_TYPE_DEFAULT           0x2 +#define I40E_AQ_VSI_CONN_TYPE_CASCADED          0x3 +	u8     reserved1; +	u8     vf_id; +	u8     reserved2; +	__le16 vsi_flags; +#define I40E_AQ_VSI_TYPE_SHIFT          0x0 +#define I40E_AQ_VSI_TYPE_MASK           (0x3 << I40E_AQ_VSI_TYPE_SHIFT) +#define I40E_AQ_VSI_TYPE_VF             0x0 +#define I40E_AQ_VSI_TYPE_VMDQ2          0x1 +#define I40E_AQ_VSI_TYPE_PF             0x2 +#define I40E_AQ_VSI_TYPE_EMP_MNG        0x3 +#define I40E_AQ_VSI_FLAG_CASCADED_PV    0x4 +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_get_update_vsi); + +struct i40e_aqc_add_get_update_vsi_completion { +	__le16 seid; +	__le16 vsi_number; +	__le16 vsi_used; +	__le16 vsi_free; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_get_update_vsi_completion); + +struct i40e_aqc_vsi_properties_data { +	/* first 96 byte are written by SW */ +	__le16 valid_sections; +#define I40E_AQ_VSI_PROP_SWITCH_VALID       0x0001 +#define I40E_AQ_VSI_PROP_SECURITY_VALID     0x0002 +#define I40E_AQ_VSI_PROP_VLAN_VALID         0x0004 +#define I40E_AQ_VSI_PROP_CAS_PV_VALID       0x0008 +#define I40E_AQ_VSI_PROP_INGRESS_UP_VALID   0x0010 +#define I40E_AQ_VSI_PROP_EGRESS_UP_VALID    0x0020 +#define I40E_AQ_VSI_PROP_QUEUE_MAP_VALID    0x0040 +#define I40E_AQ_VSI_PROP_QUEUE_OPT_VALID    0x0080 +#define I40E_AQ_VSI_PROP_OUTER_UP_VALID     0x0100 +#define I40E_AQ_VSI_PROP_SCHED_VALID        0x0200 +	/* switch section */ +	__le16 switch_id; /* 12bit id combined with flags below */ +#define I40E_AQ_VSI_SW_ID_SHIFT             0x0000 +#define I40E_AQ_VSI_SW_ID_MASK              (0xFFF << I40E_AQ_VSI_SW_ID_SHIFT) +#define I40E_AQ_VSI_SW_ID_FLAG_NOT_STAG     0x1000 +#define I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB     0x2000 +#define I40E_AQ_VSI_SW_ID_FLAG_LOCAL_LB     0x4000 +	u8     sw_reserved[2]; +	/* security section */ +	u8     sec_flags; +#define I40E_AQ_VSI_SEC_FLAG_ALLOW_DEST_OVRD    0x01 +#define I40E_AQ_VSI_SEC_FLAG_ENABLE_VLAN_CHK    0x02 +#define I40E_AQ_VSI_SEC_FLAG_ENABLE_MAC_CHK     0x04 +	u8     sec_reserved; +	/* VLAN section */ +	__le16 pvid; /* VLANS include priority bits */ +	__le16 fcoe_pvid; +	u8     port_vlan_flags; +#define I40E_AQ_VSI_PVLAN_MODE_SHIFT        0x00 +#define I40E_AQ_VSI_PVLAN_MODE_MASK         (0x03 << \ +						I40E_AQ_VSI_PVLAN_MODE_SHIFT) +#define I40E_AQ_VSI_PVLAN_MODE_TAGGED       0x01 +#define I40E_AQ_VSI_PVLAN_MODE_UNTAGGED     0x02 +#define I40E_AQ_VSI_PVLAN_MODE_ALL          0x03 +#define I40E_AQ_VSI_PVLAN_INSERT_PVID       0x04 +#define I40E_AQ_VSI_PVLAN_EMOD_SHIFT        0x03 +#define I40E_AQ_VSI_PVLAN_EMOD_MASK         (0x3 << \ +					I40E_AQ_VSI_PVLAN_EMOD_SHIFT) +#define I40E_AQ_VSI_PVLAN_EMOD_STR_BOTH     0x0 +#define I40E_AQ_VSI_PVLAN_EMOD_STR_UP       0x08 +#define I40E_AQ_VSI_PVLAN_EMOD_STR          0x10 +#define I40E_AQ_VSI_PVLAN_EMOD_NOTHING      0x18 +	u8     pvlan_reserved[3]; +	/* ingress egress up sections */ +	__le32 ingress_table; /* bitmap, 3 bits per up */ +#define I40E_AQ_VSI_UP_TABLE_UP0_SHIFT      0 +#define I40E_AQ_VSI_UP_TABLE_UP0_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP0_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP1_SHIFT      3 +#define I40E_AQ_VSI_UP_TABLE_UP1_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP1_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP2_SHIFT      6 +#define I40E_AQ_VSI_UP_TABLE_UP2_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP2_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP3_SHIFT      9 +#define I40E_AQ_VSI_UP_TABLE_UP3_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP3_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP4_SHIFT      12 +#define I40E_AQ_VSI_UP_TABLE_UP4_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP4_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP5_SHIFT      15 +#define I40E_AQ_VSI_UP_TABLE_UP5_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP5_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP6_SHIFT      18 +#define I40E_AQ_VSI_UP_TABLE_UP6_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP6_SHIFT) +#define I40E_AQ_VSI_UP_TABLE_UP7_SHIFT      21 +#define I40E_AQ_VSI_UP_TABLE_UP7_MASK       (0x7 << \ +					I40E_AQ_VSI_UP_TABLE_UP7_SHIFT) +	__le32 egress_table;   /* same defines as for ingress table */ +	/* cascaded PV section */ +	__le16 cas_pv_tag; +	u8     cas_pv_flags; +#define I40E_AQ_VSI_CAS_PV_TAGX_SHIFT      0x00 +#define I40E_AQ_VSI_CAS_PV_TAGX_MASK       (0x03 << \ +						I40E_AQ_VSI_CAS_PV_TAGX_SHIFT) +#define I40E_AQ_VSI_CAS_PV_TAGX_LEAVE      0x00 +#define I40E_AQ_VSI_CAS_PV_TAGX_REMOVE     0x01 +#define I40E_AQ_VSI_CAS_PV_TAGX_COPY       0x02 +#define I40E_AQ_VSI_CAS_PV_INSERT_TAG      0x10 +#define I40E_AQ_VSI_CAS_PV_ETAG_PRUNE      0x20 +#define I40E_AQ_VSI_CAS_PV_ACCEPT_HOST_TAG 0x40 +	u8     cas_pv_reserved; +	/* queue mapping section */ +	__le16 mapping_flags; +#define I40E_AQ_VSI_QUE_MAP_CONTIG          0x0 +#define I40E_AQ_VSI_QUE_MAP_NONCONTIG       0x1 +	__le16 queue_mapping[16]; +#define I40E_AQ_VSI_QUEUE_SHIFT             0x0 +#define I40E_AQ_VSI_QUEUE_MASK              (0x7FF << I40E_AQ_VSI_QUEUE_SHIFT) +	__le16 tc_mapping[8]; +#define I40E_AQ_VSI_TC_QUE_OFFSET_SHIFT     0 +#define I40E_AQ_VSI_TC_QUE_OFFSET_MASK      (0x1FF << \ +						I40E_AQ_VSI_TC_QUE_OFFSET_SHIFT) +#define I40E_AQ_VSI_TC_QUE_NUMBER_SHIFT     9 +#define I40E_AQ_VSI_TC_QUE_NUMBER_MASK      (0x7 << \ +						I40E_AQ_VSI_TC_QUE_NUMBER_SHIFT) +	/* queueing option section */ +	u8     queueing_opt_flags; +#define I40E_AQ_VSI_QUE_OPT_TCP_ENA         0x10 +#define I40E_AQ_VSI_QUE_OPT_FCOE_ENA        0x20 +	u8     queueing_opt_reserved[3]; +	/* scheduler section */ +	u8     up_enable_bits; +	u8     sched_reserved; +	/* outer up section */ +	__le32 outer_up_table; /* same structure and defines as ingress table */ +	u8     cmd_reserved[8]; +	/* last 32 bytes are written by FW */ +	__le16 qs_handle[8]; +#define I40E_AQ_VSI_QS_HANDLE_INVALID	0xFFFF +	__le16 stat_counter_idx; +	__le16 sched_id; +	u8     resp_reserved[12]; +}; + +I40E_CHECK_STRUCT_LEN(128, i40e_aqc_vsi_properties_data); + +/* Add Port Virtualizer (direct 0x0220) + * also used for update PV (direct 0x0221) but only flags are used + * (IS_CTRL_PORT only works on add PV) + */ +struct i40e_aqc_add_update_pv { +	__le16 command_flags; +#define I40E_AQC_PV_FLAG_PV_TYPE                0x1 +#define I40E_AQC_PV_FLAG_FWD_UNKNOWN_STAG_EN    0x2 +#define I40E_AQC_PV_FLAG_FWD_UNKNOWN_ETAG_EN    0x4 +#define I40E_AQC_PV_FLAG_IS_CTRL_PORT           0x8 +	__le16 uplink_seid; +	__le16 connected_seid; +	u8     reserved[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_update_pv); + +struct i40e_aqc_add_update_pv_completion { +	/* reserved for update; for add also encodes error if rc == ENOSPC */ +	__le16 pv_seid; +#define I40E_AQC_PV_ERR_FLAG_NO_PV               0x1 +#define I40E_AQC_PV_ERR_FLAG_NO_SCHED            0x2 +#define I40E_AQC_PV_ERR_FLAG_NO_COUNTER          0x4 +#define I40E_AQC_PV_ERR_FLAG_NO_ENTRY            0x8 +	u8     reserved[14]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_update_pv_completion); + +/* Get PV Params (direct 0x0222) + * uses i40e_aqc_switch_seid for the descriptor + */ + +struct i40e_aqc_get_pv_params_completion { +	__le16 seid; +	__le16 default_stag; +	__le16 pv_flags; /* same flags as add_pv */ +#define I40E_AQC_GET_PV_PV_TYPE            0x1 +#define I40E_AQC_GET_PV_FRWD_UNKNOWN_STAG  0x2 +#define I40E_AQC_GET_PV_FRWD_UNKNOWN_ETAG  0x4 +	u8     reserved[8]; +	__le16 default_port_seid; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_get_pv_params_completion); + +/* Add VEB (direct 0x0230) */ +struct i40e_aqc_add_veb { +	__le16 uplink_seid; +	__le16 downlink_seid; +	__le16 veb_flags; +#define I40E_AQC_ADD_VEB_FLOATING           0x1 +#define I40E_AQC_ADD_VEB_PORT_TYPE_SHIFT    1 +#define I40E_AQC_ADD_VEB_PORT_TYPE_MASK     (0x3 << \ +					I40E_AQC_ADD_VEB_PORT_TYPE_SHIFT) +#define I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT  0x2 +#define I40E_AQC_ADD_VEB_PORT_TYPE_DATA     0x4 +#define I40E_AQC_ADD_VEB_ENABLE_L2_FILTER   0x8 +	u8     enable_tcs; +	u8     reserved[9]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_veb); + +struct i40e_aqc_add_veb_completion { +	u8     reserved[6]; +	__le16 switch_seid; +	/* also encodes error if rc == ENOSPC; codes are the same as add_pv */ +	__le16 veb_seid; +#define I40E_AQC_VEB_ERR_FLAG_NO_VEB              0x1 +#define I40E_AQC_VEB_ERR_FLAG_NO_SCHED            0x2 +#define I40E_AQC_VEB_ERR_FLAG_NO_COUNTER          0x4 +#define I40E_AQC_VEB_ERR_FLAG_NO_ENTRY            0x8 +	__le16 statistic_index; +	__le16 vebs_used; +	__le16 vebs_free; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_veb_completion); + +/* Get VEB Parameters (direct 0x0232) + * uses i40e_aqc_switch_seid for the descriptor + */ +struct i40e_aqc_get_veb_parameters_completion { +	__le16 seid; +	__le16 switch_id; +	__le16 veb_flags; /* only the first/last flags from 0x0230 is valid */ +	__le16 statistic_index; +	__le16 vebs_used; +	__le16 vebs_free; +	u8     reserved[4]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_get_veb_parameters_completion); + +/* Delete Element (direct 0x0243) + * uses the generic i40e_aqc_switch_seid + */ + +/* Add MAC-VLAN (indirect 0x0250) */ + +/* used for the command for most vlan commands */ +struct i40e_aqc_macvlan { +	__le16 num_addresses; +	__le16 seid[3]; +#define I40E_AQC_MACVLAN_CMD_SEID_NUM_SHIFT  0 +#define I40E_AQC_MACVLAN_CMD_SEID_NUM_MASK   (0x3FF << \ +					I40E_AQC_MACVLAN_CMD_SEID_NUM_SHIFT) +#define I40E_AQC_MACVLAN_CMD_SEID_VALID      0x8000 +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_macvlan); + +/* indirect data for command and response */ +struct i40e_aqc_add_macvlan_element_data { +	u8     mac_addr[6]; +	__le16 vlan_tag; +	__le16 flags; +#define I40E_AQC_MACVLAN_ADD_PERFECT_MATCH     0x0001 +#define I40E_AQC_MACVLAN_ADD_HASH_MATCH        0x0002 +#define I40E_AQC_MACVLAN_ADD_IGNORE_VLAN       0x0004 +#define I40E_AQC_MACVLAN_ADD_TO_QUEUE          0x0008 +	__le16 queue_number; +#define I40E_AQC_MACVLAN_CMD_QUEUE_SHIFT  0 +#define I40E_AQC_MACVLAN_CMD_QUEUE_MASK   (0x7FF << \ +					I40E_AQC_MACVLAN_CMD_SEID_NUM_SHIFT) +	/* response section */ +	u8     match_method; +#define I40E_AQC_MM_PERFECT_MATCH             0x01 +#define I40E_AQC_MM_HASH_MATCH                0x02 +#define I40E_AQC_MM_ERR_NO_RES                0xFF +	u8     reserved1[3]; +}; + +struct i40e_aqc_add_remove_macvlan_completion { +	__le16 perfect_mac_used; +	__le16 perfect_mac_free; +	__le16 unicast_hash_free; +	__le16 multicast_hash_free; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_macvlan_completion); + +/* Remove MAC-VLAN (indirect 0x0251) + * uses i40e_aqc_macvlan for the descriptor + * data points to an array of num_addresses of elements + */ + +struct i40e_aqc_remove_macvlan_element_data { +	u8     mac_addr[6]; +	__le16 vlan_tag; +	u8     flags; +#define I40E_AQC_MACVLAN_DEL_PERFECT_MATCH      0x01 +#define I40E_AQC_MACVLAN_DEL_HASH_MATCH         0x02 +#define I40E_AQC_MACVLAN_DEL_IGNORE_VLAN        0x08 +#define I40E_AQC_MACVLAN_DEL_ALL_VSIS           0x10 +	u8     reserved[3]; +	/* reply section */ +	u8     error_code; +#define I40E_AQC_REMOVE_MACVLAN_SUCCESS         0x0 +#define I40E_AQC_REMOVE_MACVLAN_FAIL            0xFF +	u8     reply_reserved[3]; +}; + +/* Add VLAN (indirect 0x0252) + * Remove VLAN (indirect 0x0253) + * use the generic i40e_aqc_macvlan for the command + */ +struct i40e_aqc_add_remove_vlan_element_data { +	__le16 vlan_tag; +	u8     vlan_flags; +/* flags for add VLAN */ +#define I40E_AQC_ADD_VLAN_LOCAL             0x1 +#define I40E_AQC_ADD_PVLAN_TYPE_SHIFT       1 +#define I40E_AQC_ADD_PVLAN_TYPE_MASK        (0x3 << \ +						I40E_AQC_ADD_PVLAN_TYPE_SHIFT) +#define I40E_AQC_ADD_PVLAN_TYPE_REGULAR     0x0 +#define I40E_AQC_ADD_PVLAN_TYPE_PRIMARY     0x2 +#define I40E_AQC_ADD_PVLAN_TYPE_SECONDARY   0x4 +#define I40E_AQC_VLAN_PTYPE_SHIFT           3 +#define I40E_AQC_VLAN_PTYPE_MASK            (0x3 << I40E_AQC_VLAN_PTYPE_SHIFT) +#define I40E_AQC_VLAN_PTYPE_REGULAR_VSI     0x0 +#define I40E_AQC_VLAN_PTYPE_PROMISC_VSI     0x8 +#define I40E_AQC_VLAN_PTYPE_COMMUNITY_VSI   0x10 +#define I40E_AQC_VLAN_PTYPE_ISOLATED_VSI    0x18 +/* flags for remove VLAN */ +#define I40E_AQC_REMOVE_VLAN_ALL            0x1 +	u8     reserved; +	u8     result; +/* flags for add VLAN */ +#define I40E_AQC_ADD_VLAN_SUCCESS       0x0 +#define I40E_AQC_ADD_VLAN_FAIL_REQUEST  0xFE +#define I40E_AQC_ADD_VLAN_FAIL_RESOURCE 0xFF +/* flags for remove VLAN */ +#define I40E_AQC_REMOVE_VLAN_SUCCESS    0x0 +#define I40E_AQC_REMOVE_VLAN_FAIL       0xFF +	u8     reserved1[3]; +}; + +struct i40e_aqc_add_remove_vlan_completion { +	u8     reserved[4]; +	__le16 vlans_used; +	__le16 vlans_free; +	__le32 addr_high; +	__le32 addr_low; +}; + +/* Set VSI Promiscuous Modes (direct 0x0254) */ +struct i40e_aqc_set_vsi_promiscuous_modes { +	__le16 promiscuous_flags; +	__le16 valid_flags; +/* flags used for both fields above */ +#define I40E_AQC_SET_VSI_PROMISC_UNICAST     0x01 +#define I40E_AQC_SET_VSI_PROMISC_MULTICAST   0x02 +#define I40E_AQC_SET_VSI_PROMISC_BROADCAST   0x04 +#define I40E_AQC_SET_VSI_DEFAULT             0x08 +#define I40E_AQC_SET_VSI_PROMISC_VLAN        0x10 +	__le16 seid; +#define I40E_AQC_VSI_PROM_CMD_SEID_MASK      0x3FF +	__le16 vlan_tag; +#define I40E_AQC_SET_VSI_VLAN_VALID          0x8000 +	u8     reserved[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_vsi_promiscuous_modes); + +/* Add S/E-tag command (direct 0x0255) + * Uses generic i40e_aqc_add_remove_tag_completion for completion + */ +struct i40e_aqc_add_tag { +	__le16 flags; +#define I40E_AQC_ADD_TAG_FLAG_TO_QUEUE     0x0001 +	__le16 seid; +#define I40E_AQC_ADD_TAG_CMD_SEID_NUM_SHIFT  0 +#define I40E_AQC_ADD_TAG_CMD_SEID_NUM_MASK   (0x3FF << \ +					I40E_AQC_ADD_TAG_CMD_SEID_NUM_SHIFT) +	__le16 tag; +	__le16 queue_number; +	u8     reserved[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_tag); + +struct i40e_aqc_add_remove_tag_completion { +	u8     reserved[12]; +	__le16 tags_used; +	__le16 tags_free; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_tag_completion); + +/* Remove S/E-tag command (direct 0x0256) + * Uses generic i40e_aqc_add_remove_tag_completion for completion + */ +struct i40e_aqc_remove_tag { +	__le16 seid; +#define I40E_AQC_REMOVE_TAG_CMD_SEID_NUM_SHIFT  0 +#define I40E_AQC_REMOVE_TAG_CMD_SEID_NUM_MASK   (0x3FF << \ +					I40E_AQC_REMOVE_TAG_CMD_SEID_NUM_SHIFT) +	__le16 tag; +	u8     reserved[12]; +}; + +/* Add multicast E-Tag (direct 0x0257) + * del multicast E-Tag (direct 0x0258) only uses pv_seid and etag fields + * and no external data + */ +struct i40e_aqc_add_remove_mcast_etag { +	__le16 pv_seid; +	__le16 etag; +	u8     num_unicast_etags; +	u8     reserved[3]; +	__le32 addr_high;          /* address of array of 2-byte s-tags */ +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_mcast_etag); + +struct i40e_aqc_add_remove_mcast_etag_completion { +	u8     reserved[4]; +	__le16 mcast_etags_used; +	__le16 mcast_etags_free; +	__le32 addr_high; +	__le32 addr_low; + +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_mcast_etag_completion); + +/* Update S/E-Tag (direct 0x0259) */ +struct i40e_aqc_update_tag { +	__le16 seid; +#define I40E_AQC_UPDATE_TAG_CMD_SEID_NUM_SHIFT  0 +#define I40E_AQC_UPDATE_TAG_CMD_SEID_NUM_MASK   (0x3FF << \ +					I40E_AQC_UPDATE_TAG_CMD_SEID_NUM_SHIFT) +	__le16 old_tag; +	__le16 new_tag; +	u8     reserved[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_update_tag); + +struct i40e_aqc_update_tag_completion { +	u8     reserved[12]; +	__le16 tags_used; +	__le16 tags_free; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_update_tag_completion); + +/* Add Control Packet filter (direct 0x025A) + * Remove Control Packet filter (direct 0x025B) + * uses the i40e_aqc_add_oveb_cloud, + * and the generic direct completion structure + */ +struct i40e_aqc_add_remove_control_packet_filter { +	u8     mac[6]; +	__le16 etype; +	__le16 flags; +#define I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC    0x0001 +#define I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP          0x0002 +#define I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TO_QUEUE      0x0004 +#define I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX            0x0008 +#define I40E_AQC_ADD_CONTROL_PACKET_FLAGS_RX            0x0000 +	__le16 seid; +#define I40E_AQC_ADD_CONTROL_PACKET_CMD_SEID_NUM_SHIFT  0 +#define I40E_AQC_ADD_CONTROL_PACKET_CMD_SEID_NUM_MASK   (0x3FF << \ +				I40E_AQC_ADD_CONTROL_PACKET_CMD_SEID_NUM_SHIFT) +	__le16 queue; +	u8     reserved[2]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_control_packet_filter); + +struct i40e_aqc_add_remove_control_packet_filter_completion { +	__le16 mac_etype_used; +	__le16 etype_used; +	__le16 mac_etype_free; +	__le16 etype_free; +	u8     reserved[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_control_packet_filter_completion); + +/* Add Cloud filters (indirect 0x025C) + * Remove Cloud filters (indirect 0x025D) + * uses the i40e_aqc_add_remove_cloud_filters, + * and the generic indirect completion structure + */ +struct i40e_aqc_add_remove_cloud_filters { +	u8     num_filters; +	u8     reserved; +	__le16 seid; +#define I40E_AQC_ADD_CLOUD_CMD_SEID_NUM_SHIFT  0 +#define I40E_AQC_ADD_CLOUD_CMD_SEID_NUM_MASK   (0x3FF << \ +					I40E_AQC_ADD_CLOUD_CMD_SEID_NUM_SHIFT) +	u8     reserved2[4]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_remove_cloud_filters); + +struct i40e_aqc_add_remove_cloud_filters_element_data { +	u8     outer_mac[6]; +	u8     inner_mac[6]; +	__le16 inner_vlan; +	union { +		struct { +			u8 reserved[12]; +			u8 data[4]; +		} v4; +		struct { +			u8 data[16]; +		} v6; +	} ipaddr; +	__le16 flags; +#define I40E_AQC_ADD_CLOUD_FILTER_SHIFT                 0 +#define I40E_AQC_ADD_CLOUD_FILTER_MASK                  (0x3F << \ +					I40E_AQC_ADD_CLOUD_FILTER_SHIFT) +#define I40E_AQC_ADD_CLOUD_FILTER_OIP_GRE               0x0002 +#define I40E_AQC_ADD_CLOUD_FILTER_IMAC_IVLAN_GRE        0x0004 +#define I40E_AQC_ADD_CLOUD_FILTER_IMAC_IVLAN_VNL        0x0007 +/* 0x0000 reserved */ +#define I40E_AQC_ADD_CLOUD_FILTER_OIP                   0x0001 +/* 0x0002 reserved */ +#define I40E_AQC_ADD_CLOUD_FILTER_IMAC_IVLAN            0x0003 +#define I40E_AQC_ADD_CLOUD_FILTER_IMAC_IVLAN_TEN_ID     0x0004 +/* 0x0005 reserved */ +#define I40E_AQC_ADD_CLOUD_FILTER_IMAC_TEN_ID           0x0006 +/* 0x0007 reserved */ +/* 0x0008 reserved */ +#define I40E_AQC_ADD_CLOUD_FILTER_OMAC                  0x0009 +#define I40E_AQC_ADD_CLOUD_FILTER_IMAC                  0x000A +#define I40E_AQC_ADD_CLOUD_FILTER_OMAC_TEN_ID_IMAC      0x000B +#define I40E_AQC_ADD_CLOUD_FILTER_IIP                   0x000C + +#define I40E_AQC_ADD_CLOUD_FLAGS_TO_QUEUE               0x0080 +#define I40E_AQC_ADD_CLOUD_VNK_SHIFT                    6 +#define I40E_AQC_ADD_CLOUD_VNK_MASK                     0x00C0 +#define I40E_AQC_ADD_CLOUD_FLAGS_IPV4                   0 +#define I40E_AQC_ADD_CLOUD_FLAGS_IPV6                   0x0100 + +#define I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT               9 +#define I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK                0x1E00 +#define I40E_AQC_ADD_CLOUD_TNL_TYPE_XVLAN               0 +#define I40E_AQC_ADD_CLOUD_TNL_TYPE_NVGRE_OMAC          1 +#define I40E_AQC_ADD_CLOUD_TNL_TYPE_NGE                 2 +#define I40E_AQC_ADD_CLOUD_TNL_TYPE_IP                  3 + +	__le32 tenant_id; +	u8     reserved[4]; +	__le16 queue_number; +#define I40E_AQC_ADD_CLOUD_QUEUE_SHIFT                  0 +#define I40E_AQC_ADD_CLOUD_QUEUE_MASK                   (0x3F << \ +					I40E_AQC_ADD_CLOUD_QUEUE_SHIFT) +	u8     reserved2[14]; +	/* response section */ +	u8     allocation_result; +#define I40E_AQC_ADD_CLOUD_FILTER_SUCCESS         0x0 +#define I40E_AQC_ADD_CLOUD_FILTER_FAIL            0xFF +	u8     response_reserved[7]; +}; + +struct i40e_aqc_remove_cloud_filters_completion { +	__le16 perfect_ovlan_used; +	__le16 perfect_ovlan_free; +	__le16 vlan_used; +	__le16 vlan_free; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_remove_cloud_filters_completion); + +/* Add Mirror Rule (indirect or direct 0x0260) + * Delete Mirror Rule (indirect or direct 0x0261) + * note: some rule types (4,5) do not use an external buffer. + *       take care to set the flags correctly. + */ +struct i40e_aqc_add_delete_mirror_rule { +	__le16 seid; +	__le16 rule_type; +#define I40E_AQC_MIRROR_RULE_TYPE_SHIFT            0 +#define I40E_AQC_MIRROR_RULE_TYPE_MASK             (0x7 << \ +						I40E_AQC_MIRROR_RULE_TYPE_SHIFT) +#define I40E_AQC_MIRROR_RULE_TYPE_VPORT_INGRESS    1 +#define I40E_AQC_MIRROR_RULE_TYPE_VPORT_EGRESS     2 +#define I40E_AQC_MIRROR_RULE_TYPE_VLAN             3 +#define I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS      4 +#define I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS       5 +	__le16 num_entries; +	__le16 destination;  /* VSI for add, rule id for delete */ +	__le32 addr_high;    /* address of array of 2-byte VSI or VLAN ids */ +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_delete_mirror_rule); + +struct i40e_aqc_add_delete_mirror_rule_completion { +	u8     reserved[2]; +	__le16 rule_id;  /* only used on add */ +	__le16 mirror_rules_used; +	__le16 mirror_rules_free; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_delete_mirror_rule_completion); + +/* DCB 0x03xx*/ + +/* PFC Ignore (direct 0x0301) + *    the command and response use the same descriptor structure + */ +struct i40e_aqc_pfc_ignore { +	u8     tc_bitmap; +	u8     command_flags; /* unused on response */ +#define I40E_AQC_PFC_IGNORE_SET    0x80 +#define I40E_AQC_PFC_IGNORE_CLEAR  0x0 +	u8     reserved[14]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_pfc_ignore); + +/* DCB Update (direct 0x0302) uses the i40e_aq_desc structure + * with no parameters + */ + +/* TX scheduler 0x04xx */ + +/* Almost all the indirect commands use + * this generic struct to pass the SEID in param0 + */ +struct i40e_aqc_tx_sched_ind { +	__le16 vsi_seid; +	u8     reserved[6]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_tx_sched_ind); + +/* Several commands respond with a set of queue set handles */ +struct i40e_aqc_qs_handles_resp { +	__le16 qs_handles[8]; +}; + +/* Configure VSI BW limits (direct 0x0400) */ +struct i40e_aqc_configure_vsi_bw_limit { +	__le16 vsi_seid; +	u8     reserved[2]; +	__le16 credit; +	u8     reserved1[2]; +	u8     max_credit; /* 0-3, limit = 2^max */ +	u8     reserved2[7]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_configure_vsi_bw_limit); + +/* Configure VSI Bandwidth Limit per Traffic Type (indirect 0x0406) + *    responds with i40e_aqc_qs_handles_resp + */ +struct i40e_aqc_configure_vsi_ets_sla_bw_data { +	u8     tc_valid_bits; +	u8     reserved[15]; +	__le16 tc_bw_credits[8]; /* FW writesback QS handles here */ + +	/* 4 bits per tc 0-7, 4th bit is reserved, limit = 2^max */ +	__le16 tc_bw_max[2]; +	u8     reserved1[28]; +}; + +/* Configure VSI Bandwidth Allocation per Traffic Type (indirect 0x0407) + *    responds with i40e_aqc_qs_handles_resp + */ +struct i40e_aqc_configure_vsi_tc_bw_data { +	u8     tc_valid_bits; +	u8     reserved[3]; +	u8     tc_bw_credits[8]; +	u8     reserved1[4]; +	__le16 qs_handles[8]; +}; + +/* Query vsi bw configuration (indirect 0x0408) */ +struct i40e_aqc_query_vsi_bw_config_resp { +	u8     tc_valid_bits; +	u8     tc_suspended_bits; +	u8     reserved[14]; +	__le16 qs_handles[8]; +	u8     reserved1[4]; +	__le16 port_bw_limit; +	u8     reserved2[2]; +	u8     max_bw; /* 0-3, limit = 2^max */ +	u8     reserved3[23]; +}; + +/* Query VSI Bandwidth Allocation per Traffic Type (indirect 0x040A) */ +struct i40e_aqc_query_vsi_ets_sla_config_resp { +	u8     tc_valid_bits; +	u8     reserved[3]; +	u8     share_credits[8]; +	__le16 credits[8]; + +	/* 4 bits per tc 0-7, 4th bit is reserved, limit = 2^max */ +	__le16 tc_bw_max[2]; +}; + +/* Configure Switching Component Bandwidth Limit (direct 0x0410) */ +struct i40e_aqc_configure_switching_comp_bw_limit { +	__le16 seid; +	u8     reserved[2]; +	__le16 credit; +	u8     reserved1[2]; +	u8     max_bw; /* 0-3, limit = 2^max */ +	u8     reserved2[7]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_configure_switching_comp_bw_limit); + +/* Enable  Physical Port ETS (indirect 0x0413) + * Modify  Physical Port ETS (indirect 0x0414) + * Disable Physical Port ETS (indirect 0x0415) + */ +struct i40e_aqc_configure_switching_comp_ets_data { +	u8     reserved[4]; +	u8     tc_valid_bits; +	u8     seepage; +#define I40E_AQ_ETS_SEEPAGE_EN_MASK     0x1 +	u8     tc_strict_priority_flags; +	u8     reserved1[17]; +	u8     tc_bw_share_credits[8]; +	u8     reserved2[96]; +}; + +/* Configure Switching Component Bandwidth Limits per Tc (indirect 0x0416) */ +struct i40e_aqc_configure_switching_comp_ets_bw_limit_data { +	u8     tc_valid_bits; +	u8     reserved[15]; +	__le16 tc_bw_credit[8]; + +	/* 4 bits per tc 0-7, 4th bit is reserved, limit = 2^max */ +	__le16 tc_bw_max[2]; +	u8     reserved1[28]; +}; + +/* Configure Switching Component Bandwidth Allocation per Tc + * (indirect 0x0417) + */ +struct i40e_aqc_configure_switching_comp_bw_config_data { +	u8     tc_valid_bits; +	u8     reserved[2]; +	u8     absolute_credits; /* bool */ +	u8     tc_bw_share_credits[8]; +	u8     reserved1[20]; +}; + +/* Query Switching Component Configuration (indirect 0x0418) */ +struct i40e_aqc_query_switching_comp_ets_config_resp { +	u8     tc_valid_bits; +	u8     reserved[35]; +	__le16 port_bw_limit; +	u8     reserved1[2]; +	u8     tc_bw_max; /* 0-3, limit = 2^max */ +	u8     reserved2[23]; +}; + +/* Query PhysicalPort ETS Configuration (indirect 0x0419) */ +struct i40e_aqc_query_port_ets_config_resp { +	u8     reserved[4]; +	u8     tc_valid_bits; +	u8     reserved1; +	u8     tc_strict_priority_bits; +	u8     reserved2; +	u8     tc_bw_share_credits[8]; +	__le16 tc_bw_limits[8]; + +	/* 4 bits per tc 0-7, 4th bit reserved, limit = 2^max */ +	__le16 tc_bw_max[2]; +	u8     reserved3[32]; +}; + +/* Query Switching Component Bandwidth Allocation per Traffic Type + * (indirect 0x041A) + */ +struct i40e_aqc_query_switching_comp_bw_config_resp { +	u8     tc_valid_bits; +	u8     reserved[2]; +	u8     absolute_credits_enable; /* bool */ +	u8     tc_bw_share_credits[8]; +	__le16 tc_bw_limits[8]; + +	/* 4 bits per tc 0-7, 4th bit is reserved, limit = 2^max */ +	__le16 tc_bw_max[2]; +}; + +/* Suspend/resume port TX traffic + * (direct 0x041B and 0x041C) uses the generic SEID struct + */ + +/* Configure partition BW + * (indirect 0x041D) + */ +struct i40e_aqc_configure_partition_bw_data { +	__le16 pf_valid_bits; +	u8     min_bw[16];      /* guaranteed bandwidth */ +	u8     max_bw[16];      /* bandwidth limit */ +}; + +/* Get and set the active HMC resource profile and status. + * (direct 0x0500) and (direct 0x0501) + */ +struct i40e_aq_get_set_hmc_resource_profile { +	u8     pm_profile; +	u8     pe_vf_enabled; +	u8     reserved[14]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aq_get_set_hmc_resource_profile); + +enum i40e_aq_hmc_profile { +	/* I40E_HMC_PROFILE_NO_CHANGE    = 0, reserved */ +	I40E_HMC_PROFILE_DEFAULT     = 1, +	I40E_HMC_PROFILE_FAVOR_VF    = 2, +	I40E_HMC_PROFILE_EQUAL       = 3, +}; + +#define I40E_AQ_GET_HMC_RESOURCE_PROFILE_PM_MASK       0xF +#define I40E_AQ_GET_HMC_RESOURCE_PROFILE_COUNT_MASK    0x3F + +/* Get PHY Abilities (indirect 0x0600) uses the generic indirect struct */ + +/* set in param0 for get phy abilities to report qualified modules */ +#define I40E_AQ_PHY_REPORT_QUALIFIED_MODULES  0x0001 +#define I40E_AQ_PHY_REPORT_INITIAL_VALUES     0x0002 + +enum i40e_aq_phy_type { +	I40E_PHY_TYPE_SGMII			= 0x0, +	I40E_PHY_TYPE_1000BASE_KX		= 0x1, +	I40E_PHY_TYPE_10GBASE_KX4		= 0x2, +	I40E_PHY_TYPE_10GBASE_KR		= 0x3, +	I40E_PHY_TYPE_40GBASE_KR4		= 0x4, +	I40E_PHY_TYPE_XAUI			= 0x5, +	I40E_PHY_TYPE_XFI			= 0x6, +	I40E_PHY_TYPE_SFI			= 0x7, +	I40E_PHY_TYPE_XLAUI			= 0x8, +	I40E_PHY_TYPE_XLPPI			= 0x9, +	I40E_PHY_TYPE_40GBASE_CR4_CU		= 0xA, +	I40E_PHY_TYPE_10GBASE_CR1_CU		= 0xB, +	I40E_PHY_TYPE_10GBASE_AOC		= 0xC, +	I40E_PHY_TYPE_40GBASE_AOC		= 0xD, +	I40E_PHY_TYPE_100BASE_TX		= 0x11, +	I40E_PHY_TYPE_1000BASE_T		= 0x12, +	I40E_PHY_TYPE_10GBASE_T			= 0x13, +	I40E_PHY_TYPE_10GBASE_SR		= 0x14, +	I40E_PHY_TYPE_10GBASE_LR		= 0x15, +	I40E_PHY_TYPE_10GBASE_SFPP_CU		= 0x16, +	I40E_PHY_TYPE_10GBASE_CR1		= 0x17, +	I40E_PHY_TYPE_40GBASE_CR4		= 0x18, +	I40E_PHY_TYPE_40GBASE_SR4		= 0x19, +	I40E_PHY_TYPE_40GBASE_LR4		= 0x1A, +	I40E_PHY_TYPE_1000BASE_SX		= 0x1B, +	I40E_PHY_TYPE_1000BASE_LX		= 0x1C, +	I40E_PHY_TYPE_1000BASE_T_OPTICAL	= 0x1D, +	I40E_PHY_TYPE_20GBASE_KR2		= 0x1E, +	I40E_PHY_TYPE_MAX +}; + +#define I40E_LINK_SPEED_100MB_SHIFT	0x1 +#define I40E_LINK_SPEED_1000MB_SHIFT	0x2 +#define I40E_LINK_SPEED_10GB_SHIFT	0x3 +#define I40E_LINK_SPEED_40GB_SHIFT	0x4 +#define I40E_LINK_SPEED_20GB_SHIFT	0x5 + +enum i40e_aq_link_speed { +	I40E_LINK_SPEED_UNKNOWN	= 0, +	I40E_LINK_SPEED_100MB	= (1 << I40E_LINK_SPEED_100MB_SHIFT), +	I40E_LINK_SPEED_1GB	= (1 << I40E_LINK_SPEED_1000MB_SHIFT), +	I40E_LINK_SPEED_10GB	= (1 << I40E_LINK_SPEED_10GB_SHIFT), +	I40E_LINK_SPEED_40GB	= (1 << I40E_LINK_SPEED_40GB_SHIFT), +	I40E_LINK_SPEED_20GB	= (1 << I40E_LINK_SPEED_20GB_SHIFT) +}; + +struct i40e_aqc_module_desc { +	u8 oui[3]; +	u8 reserved1; +	u8 part_number[16]; +	u8 revision[4]; +	u8 reserved2[8]; +}; + +struct i40e_aq_get_phy_abilities_resp { +	__le32 phy_type;       /* bitmap using the above enum for offsets */ +	u8     link_speed;     /* bitmap using the above enum bit patterns */ +	u8     abilities; +#define I40E_AQ_PHY_FLAG_PAUSE_TX         0x01 +#define I40E_AQ_PHY_FLAG_PAUSE_RX         0x02 +#define I40E_AQ_PHY_FLAG_LOW_POWER        0x04 +#define I40E_AQ_PHY_LINK_ENABLED		  0x08 +#define I40E_AQ_PHY_AN_ENABLED			  0x10 +#define I40E_AQ_PHY_FLAG_MODULE_QUAL      0x20 +	__le16 eee_capability; +#define I40E_AQ_EEE_100BASE_TX       0x0002 +#define I40E_AQ_EEE_1000BASE_T       0x0004 +#define I40E_AQ_EEE_10GBASE_T        0x0008 +#define I40E_AQ_EEE_1000BASE_KX      0x0010 +#define I40E_AQ_EEE_10GBASE_KX4      0x0020 +#define I40E_AQ_EEE_10GBASE_KR       0x0040 +	__le32 eeer_val; +	u8     d3_lpan; +#define I40E_AQ_SET_PHY_D3_LPAN_ENA  0x01 +	u8     reserved[3]; +	u8     phy_id[4]; +	u8     module_type[3]; +	u8     qualified_module_count; +#define I40E_AQ_PHY_MAX_QMS          16 +	struct i40e_aqc_module_desc  qualified_module[I40E_AQ_PHY_MAX_QMS]; +}; + +/* Set PHY Config (direct 0x0601) */ +struct i40e_aq_set_phy_config { /* same bits as above in all */ +	__le32 phy_type; +	u8     link_speed; +	u8     abilities; +/* bits 0-2 use the values from get_phy_abilities_resp */ +#define I40E_AQ_PHY_ENABLE_LINK		0x08 +#define I40E_AQ_PHY_ENABLE_AN		0x10 +#define I40E_AQ_PHY_ENABLE_ATOMIC_LINK	0x20 +	__le16 eee_capability; +	__le32 eeer; +	u8     low_power_ctrl; +	u8     reserved[3]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aq_set_phy_config); + +/* Set MAC Config command data structure (direct 0x0603) */ +struct i40e_aq_set_mac_config { +	__le16 max_frame_size; +	u8     params; +#define I40E_AQ_SET_MAC_CONFIG_CRC_EN           0x04 +#define I40E_AQ_SET_MAC_CONFIG_PACING_MASK      0x78 +#define I40E_AQ_SET_MAC_CONFIG_PACING_SHIFT     3 +#define I40E_AQ_SET_MAC_CONFIG_PACING_NONE      0x0 +#define I40E_AQ_SET_MAC_CONFIG_PACING_1B_13TX   0xF +#define I40E_AQ_SET_MAC_CONFIG_PACING_1DW_9TX   0x9 +#define I40E_AQ_SET_MAC_CONFIG_PACING_1DW_4TX   0x8 +#define I40E_AQ_SET_MAC_CONFIG_PACING_3DW_7TX   0x7 +#define I40E_AQ_SET_MAC_CONFIG_PACING_2DW_3TX   0x6 +#define I40E_AQ_SET_MAC_CONFIG_PACING_1DW_1TX   0x5 +#define I40E_AQ_SET_MAC_CONFIG_PACING_3DW_2TX   0x4 +#define I40E_AQ_SET_MAC_CONFIG_PACING_7DW_3TX   0x3 +#define I40E_AQ_SET_MAC_CONFIG_PACING_4DW_1TX   0x2 +#define I40E_AQ_SET_MAC_CONFIG_PACING_9DW_1TX   0x1 +	u8     tx_timer_priority; /* bitmap */ +	__le16 tx_timer_value; +	__le16 fc_refresh_threshold; +	u8     reserved[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aq_set_mac_config); + +/* Restart Auto-Negotiation (direct 0x605) */ +struct i40e_aqc_set_link_restart_an { +	u8     command; +#define I40E_AQ_PHY_RESTART_AN  0x02 +#define I40E_AQ_PHY_LINK_ENABLE 0x04 +	u8     reserved[15]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_link_restart_an); + +/* Get Link Status cmd & response data structure (direct 0x0607) */ +struct i40e_aqc_get_link_status { +	__le16 command_flags; /* only field set on command */ +#define I40E_AQ_LSE_MASK             0x3 +#define I40E_AQ_LSE_NOP              0x0 +#define I40E_AQ_LSE_DISABLE          0x2 +#define I40E_AQ_LSE_ENABLE           0x3 +/* only response uses this flag */ +#define I40E_AQ_LSE_IS_ENABLED       0x1 +	u8     phy_type;    /* i40e_aq_phy_type   */ +	u8     link_speed;  /* i40e_aq_link_speed */ +	u8     link_info; +#define I40E_AQ_LINK_UP              0x01 +#define I40E_AQ_LINK_FAULT           0x02 +#define I40E_AQ_LINK_FAULT_TX        0x04 +#define I40E_AQ_LINK_FAULT_RX        0x08 +#define I40E_AQ_LINK_FAULT_REMOTE    0x10 +#define I40E_AQ_MEDIA_AVAILABLE      0x40 +#define I40E_AQ_SIGNAL_DETECT        0x80 +	u8     an_info; +#define I40E_AQ_AN_COMPLETED         0x01 +#define I40E_AQ_LP_AN_ABILITY        0x02 +#define I40E_AQ_PD_FAULT             0x04 +#define I40E_AQ_FEC_EN               0x08 +#define I40E_AQ_PHY_LOW_POWER        0x10 +#define I40E_AQ_LINK_PAUSE_TX        0x20 +#define I40E_AQ_LINK_PAUSE_RX        0x40 +#define I40E_AQ_QUALIFIED_MODULE     0x80 +	u8     ext_info; +#define I40E_AQ_LINK_PHY_TEMP_ALARM  0x01 +#define I40E_AQ_LINK_XCESSIVE_ERRORS 0x02 +#define I40E_AQ_LINK_TX_SHIFT        0x02 +#define I40E_AQ_LINK_TX_MASK         (0x03 << I40E_AQ_LINK_TX_SHIFT) +#define I40E_AQ_LINK_TX_ACTIVE       0x00 +#define I40E_AQ_LINK_TX_DRAINED      0x01 +#define I40E_AQ_LINK_TX_FLUSHED      0x03 +#define I40E_AQ_LINK_FORCED_40G      0x10 +	u8     loopback;         /* use defines from i40e_aqc_set_lb_mode */ +	__le16 max_frame_size; +	u8     config; +#define I40E_AQ_CONFIG_CRC_ENA       0x04 +#define I40E_AQ_CONFIG_PACING_MASK   0x78 +	u8     reserved[5]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_get_link_status); + +/* Set event mask command (direct 0x613) */ +struct i40e_aqc_set_phy_int_mask { +	u8     reserved[8]; +	__le16 event_mask; +#define I40E_AQ_EVENT_LINK_UPDOWN       0x0002 +#define I40E_AQ_EVENT_MEDIA_NA          0x0004 +#define I40E_AQ_EVENT_LINK_FAULT        0x0008 +#define I40E_AQ_EVENT_PHY_TEMP_ALARM    0x0010 +#define I40E_AQ_EVENT_EXCESSIVE_ERRORS  0x0020 +#define I40E_AQ_EVENT_SIGNAL_DETECT     0x0040 +#define I40E_AQ_EVENT_AN_COMPLETED      0x0080 +#define I40E_AQ_EVENT_MODULE_QUAL_FAIL  0x0100 +#define I40E_AQ_EVENT_PORT_TX_SUSPENDED 0x0200 +	u8     reserved1[6]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_phy_int_mask); + +/* Get Local AN advt register (direct 0x0614) + * Set Local AN advt register (direct 0x0615) + * Get Link Partner AN advt register (direct 0x0616) + */ +struct i40e_aqc_an_advt_reg { +	__le32 local_an_reg0; +	__le16 local_an_reg1; +	u8     reserved[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_an_advt_reg); + +/* Set Loopback mode (0x0618) */ +struct i40e_aqc_set_lb_mode { +	__le16 lb_mode; +#define I40E_AQ_LB_PHY_LOCAL   0x01 +#define I40E_AQ_LB_PHY_REMOTE  0x02 +#define I40E_AQ_LB_MAC_LOCAL   0x04 +	u8     reserved[14]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_lb_mode); + +/* Set PHY Debug command (0x0622) */ +struct i40e_aqc_set_phy_debug { +	u8     command_flags; +#define I40E_AQ_PHY_DEBUG_RESET_INTERNAL	0x02 +#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_SHIFT	2 +#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_MASK	(0x03 << \ +					I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_SHIFT) +#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_NONE	0x00 +#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_HARD	0x01 +#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_SOFT	0x02 +#define I40E_AQ_PHY_DEBUG_DISABLE_LINK_FW	0x10 +	u8     reserved[15]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_set_phy_debug); + +enum i40e_aq_phy_reg_type { +	I40E_AQC_PHY_REG_INTERNAL         = 0x1, +	I40E_AQC_PHY_REG_EXERNAL_BASET    = 0x2, +	I40E_AQC_PHY_REG_EXERNAL_MODULE   = 0x3 +}; + +/* NVM Read command (indirect 0x0701) + * NVM Erase commands (direct 0x0702) + * NVM Update commands (indirect 0x0703) + */ +struct i40e_aqc_nvm_update { +	u8     command_flags; +#define I40E_AQ_NVM_LAST_CMD    0x01 +#define I40E_AQ_NVM_FLASH_ONLY  0x80 +	u8     module_pointer; +	__le16 length; +	__le32 offset; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_nvm_update); + +/* NVM Config Read (indirect 0x0704) */ +struct i40e_aqc_nvm_config_read { +	__le16 cmd_flags; +#define ANVM_SINGLE_OR_MULTIPLE_FEATURES_MASK	1 +#define ANVM_READ_SINGLE_FEATURE		0 +#define ANVM_READ_MULTIPLE_FEATURES		1 +	__le16 element_count; +	__le16 element_id;		/* Feature/field ID */ +	u8     reserved[2]; +	__le32 address_high; +	__le32 address_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_nvm_config_read); + +/* NVM Config Write (indirect 0x0705) */ +struct i40e_aqc_nvm_config_write { +	__le16 cmd_flags; +	__le16 element_count; +	u8     reserved[4]; +	__le32 address_high; +	__le32 address_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_nvm_config_write); + +struct i40e_aqc_nvm_config_data_feature { +	__le16 feature_id; +	__le16 instance_id; +	__le16 feature_options; +	__le16 feature_selection; +}; + +struct i40e_aqc_nvm_config_data_immediate_field { +#define ANVM_FEATURE_OR_IMMEDIATE_MASK	0x2 +	__le16 field_id; +	__le16 instance_id; +	__le16 field_options; +	__le16 field_value; +}; + +/* Send to PF command (indirect 0x0801) id is only used by PF + * Send to VF command (indirect 0x0802) id is only used by PF + * Send to Peer PF command (indirect 0x0803) + */ +struct i40e_aqc_pf_vf_message { +	__le32 id; +	u8     reserved[4]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_pf_vf_message); + +/* Alternate structure */ + +/* Direct write (direct 0x0900) + * Direct read (direct 0x0902) + */ +struct i40e_aqc_alternate_write { +	__le32 address0; +	__le32 data0; +	__le32 address1; +	__le32 data1; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_alternate_write); + +/* Indirect write (indirect 0x0901) + * Indirect read (indirect 0x0903) + */ + +struct i40e_aqc_alternate_ind_write { +	__le32 address; +	__le32 length; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_alternate_ind_write); + +/* Done alternate write (direct 0x0904) + * uses i40e_aq_desc + */ +struct i40e_aqc_alternate_write_done { +	__le16 cmd_flags; +#define I40E_AQ_ALTERNATE_MODE_BIOS_MASK	1 +#define I40E_AQ_ALTERNATE_MODE_BIOS_LEGACY	0 +#define I40E_AQ_ALTERNATE_MODE_BIOS_UEFI	1 +#define I40E_AQ_ALTERNATE_RESET_NEEDED		2 +	u8     reserved[14]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_alternate_write_done); + +/* Set OEM mode (direct 0x0905) */ +struct i40e_aqc_alternate_set_mode { +	__le32 mode; +#define I40E_AQ_ALTERNATE_MODE_NONE	0 +#define I40E_AQ_ALTERNATE_MODE_OEM	1 +	u8     reserved[12]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_alternate_set_mode); + +/* Clear port Alternate RAM (direct 0x0906) uses i40e_aq_desc */ + +/* async events 0x10xx */ + +/* Lan Queue Overflow Event (direct, 0x1001) */ +struct i40e_aqc_lan_overflow { +	__le32 prtdcb_rupto; +	__le32 otx_ctl; +	u8     reserved[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lan_overflow); + +/* Get LLDP MIB (indirect 0x0A00) */ +struct i40e_aqc_lldp_get_mib { +	u8     type; +	u8     reserved1; +#define I40E_AQ_LLDP_MIB_TYPE_MASK                      0x3 +#define I40E_AQ_LLDP_MIB_LOCAL                          0x0 +#define I40E_AQ_LLDP_MIB_REMOTE                         0x1 +#define I40E_AQ_LLDP_MIB_LOCAL_AND_REMOTE               0x2 +#define I40E_AQ_LLDP_BRIDGE_TYPE_MASK                   0xC +#define I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT                  0x2 +#define I40E_AQ_LLDP_BRIDGE_TYPE_NEAREST_BRIDGE         0x0 +#define I40E_AQ_LLDP_BRIDGE_TYPE_NON_TPMR               0x1 +#define I40E_AQ_LLDP_TX_SHIFT              0x4 +#define I40E_AQ_LLDP_TX_MASK               (0x03 << I40E_AQ_LLDP_TX_SHIFT) +/* TX pause flags use I40E_AQ_LINK_TX_* above */ +	__le16 local_len; +	__le16 remote_len; +	u8     reserved2[2]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lldp_get_mib); + +/* Configure LLDP MIB Change Event (direct 0x0A01) + * also used for the event (with type in the command field) + */ +struct i40e_aqc_lldp_update_mib { +	u8     command; +#define I40E_AQ_LLDP_MIB_UPDATE_ENABLE          0x0 +#define I40E_AQ_LLDP_MIB_UPDATE_DISABLE         0x1 +	u8     reserved[7]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lldp_update_mib); + +/* Add LLDP TLV (indirect 0x0A02) + * Delete LLDP TLV (indirect 0x0A04) + */ +struct i40e_aqc_lldp_add_tlv { +	u8     type; /* only nearest bridge and non-TPMR from 0x0A00 */ +	u8     reserved1[1]; +	__le16 len; +	u8     reserved2[4]; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lldp_add_tlv); + +/* Update LLDP TLV (indirect 0x0A03) */ +struct i40e_aqc_lldp_update_tlv { +	u8     type; /* only nearest bridge and non-TPMR from 0x0A00 */ +	u8     reserved; +	__le16 old_len; +	__le16 new_offset; +	__le16 new_len; +	__le32 addr_high; +	__le32 addr_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lldp_update_tlv); + +/* Stop LLDP (direct 0x0A05) */ +struct i40e_aqc_lldp_stop { +	u8     command; +#define I40E_AQ_LLDP_AGENT_STOP                 0x0 +#define I40E_AQ_LLDP_AGENT_SHUTDOWN             0x1 +	u8     reserved[15]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lldp_stop); + +/* Start LLDP (direct 0x0A06) */ + +struct i40e_aqc_lldp_start { +	u8     command; +#define I40E_AQ_LLDP_AGENT_START                0x1 +	u8     reserved[15]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_lldp_start); + +/* Apply MIB changes (0x0A07) + * uses the generic struc as it contains no data + */ + +/* Add Udp Tunnel command and completion (direct 0x0B00) */ +struct i40e_aqc_add_udp_tunnel { +	__le16 udp_port; +	u8     reserved0[3]; +	u8     protocol_type; +#define I40E_AQC_TUNNEL_TYPE_VXLAN	0x00 +#define I40E_AQC_TUNNEL_TYPE_NGE	0x01 +#define I40E_AQC_TUNNEL_TYPE_TEREDO	0x10 +	u8     reserved1[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_udp_tunnel); + +struct i40e_aqc_add_udp_tunnel_completion { +	__le16 udp_port; +	u8	filter_entry_index; +	u8	multiple_pfs; +#define I40E_AQC_SINGLE_PF				0x0 +#define I40E_AQC_MULTIPLE_PFS			0x1 +	u8	total_filters; +	u8	reserved[11]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_add_udp_tunnel_completion); + +/* remove UDP Tunnel command (0x0B01) */ +struct i40e_aqc_remove_udp_tunnel { +	u8     reserved[2]; +	u8     index; /* 0 to 15 */ +	u8     pf_filters; +	u8     total_filters; +	u8     reserved2[11]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_remove_udp_tunnel); + +struct i40e_aqc_del_udp_tunnel_completion { +	__le16 udp_port; +	u8     index; /* 0 to 15 */ +	u8     multiple_pfs; +	u8     total_filters_used; +	u8     reserved; +	u8     tunnels_free; +	u8     reserved1[9]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_del_udp_tunnel_completion); + +/* tunnel key structure 0x0B10 */ + +struct i40e_aqc_tunnel_key_structure_A0 { +	__le16     key1_off; +	__le16     key1_len; +	__le16     key2_off; +	__le16     key2_len; +	__le16     flags; +#define I40E_AQC_TUNNEL_KEY_STRUCT_OVERRIDE 0x01 +/* response flags */ +#define I40E_AQC_TUNNEL_KEY_STRUCT_SUCCESS    0x01 +#define I40E_AQC_TUNNEL_KEY_STRUCT_MODIFIED   0x02 +#define I40E_AQC_TUNNEL_KEY_STRUCT_OVERRIDDEN 0x03 +	u8         resreved[6]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_tunnel_key_structure_A0); + +struct i40e_aqc_tunnel_key_structure { +	u8	key1_off; +	u8	key2_off; +	u8	key1_len;  /* 0 to 15 */ +	u8	key2_len;  /* 0 to 15 */ +	u8	flags; +#define I40E_AQC_TUNNEL_KEY_STRUCT_OVERRIDE 0x01 +/* response flags */ +#define I40E_AQC_TUNNEL_KEY_STRUCT_SUCCESS    0x01 +#define I40E_AQC_TUNNEL_KEY_STRUCT_MODIFIED   0x02 +#define I40E_AQC_TUNNEL_KEY_STRUCT_OVERRIDDEN 0x03 +	u8	network_key_index; +#define I40E_AQC_NETWORK_KEY_INDEX_VXLAN		0x0 +#define I40E_AQC_NETWORK_KEY_INDEX_NGE			0x1 +#define I40E_AQC_NETWORK_KEY_INDEX_FLEX_MAC_IN_UDP	0x2 +#define I40E_AQC_NETWORK_KEY_INDEX_GRE			0x3 +	u8	reserved[10]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_tunnel_key_structure); + +/* OEM mode commands (direct 0xFE0x) */ +struct i40e_aqc_oem_param_change { +	__le32 param_type; +#define I40E_AQ_OEM_PARAM_TYPE_PF_CTL   0 +#define I40E_AQ_OEM_PARAM_TYPE_BW_CTL   1 +#define I40E_AQ_OEM_PARAM_MAC           2 +	__le32 param_value1; +	u8     param_value2[8]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_oem_param_change); + +struct i40e_aqc_oem_state_change { +	__le32 state; +#define I40E_AQ_OEM_STATE_LINK_DOWN  0x0 +#define I40E_AQ_OEM_STATE_LINK_UP    0x1 +	u8     reserved[12]; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_oem_state_change); + +/* debug commands */ + +/* get device id (0xFF00) uses the generic structure */ + +/* set test more (0xFF01, internal) */ + +struct i40e_acq_set_test_mode { +	u8     mode; +#define I40E_AQ_TEST_PARTIAL    0 +#define I40E_AQ_TEST_FULL       1 +#define I40E_AQ_TEST_NVM        2 +	u8     reserved[3]; +	u8     command; +#define I40E_AQ_TEST_OPEN        0 +#define I40E_AQ_TEST_CLOSE       1 +#define I40E_AQ_TEST_INC         2 +	u8     reserved2[3]; +	__le32 address_high; +	__le32 address_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_acq_set_test_mode); + +/* Debug Read Register command (0xFF03) + * Debug Write Register command (0xFF04) + */ +struct i40e_aqc_debug_reg_read_write { +	__le32 reserved; +	__le32 address; +	__le32 value_high; +	__le32 value_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_debug_reg_read_write); + +/* Scatter/gather Reg Read  (indirect 0xFF05) + * Scatter/gather Reg Write (indirect 0xFF06) + */ + +/* i40e_aq_desc is used for the command */ +struct i40e_aqc_debug_reg_sg_element_data { +	__le32 address; +	__le32 value; +}; + +/* Debug Modify register (direct 0xFF07) */ +struct i40e_aqc_debug_modify_reg { +	__le32 address; +	__le32 value; +	__le32 clear_mask; +	__le32 set_mask; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_debug_modify_reg); + +/* dump internal data (0xFF08, indirect) */ + +#define I40E_AQ_CLUSTER_ID_AUX		0 +#define I40E_AQ_CLUSTER_ID_SWITCH_FLU	1 +#define I40E_AQ_CLUSTER_ID_TXSCHED	2 +#define I40E_AQ_CLUSTER_ID_HMC		3 +#define I40E_AQ_CLUSTER_ID_MAC0		4 +#define I40E_AQ_CLUSTER_ID_MAC1		5 +#define I40E_AQ_CLUSTER_ID_MAC2		6 +#define I40E_AQ_CLUSTER_ID_MAC3		7 +#define I40E_AQ_CLUSTER_ID_DCB		8 +#define I40E_AQ_CLUSTER_ID_EMP_MEM	9 +#define I40E_AQ_CLUSTER_ID_PKT_BUF	10 +#define I40E_AQ_CLUSTER_ID_ALTRAM	11 + +struct i40e_aqc_debug_dump_internals { +	u8     cluster_id; +	u8     table_id; +	__le16 data_size; +	__le32 idx; +	__le32 address_high; +	__le32 address_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_debug_dump_internals); + +struct i40e_aqc_debug_modify_internals { +	u8     cluster_id; +	u8     cluster_specific_params[7]; +	__le32 address_high; +	__le32 address_low; +}; + +I40E_CHECK_CMD_LENGTH(i40e_aqc_debug_modify_internals); + +#endif diff --git a/drivers/net/ethernet/intel/i40evf/i40e_alloc.h b/drivers/net/ethernet/intel/i40evf/i40e_alloc.h new file mode 100644 index 00000000000..8e6a6dd9212 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_alloc.h @@ -0,0 +1,58 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_ALLOC_H_ +#define _I40E_ALLOC_H_ + +struct i40e_hw; + +/* Memory allocation types */ +enum i40e_memory_type { +	i40e_mem_arq_buf = 0,		/* ARQ indirect command buffer */ +	i40e_mem_asq_buf = 1, +	i40e_mem_atq_buf = 2,		/* ATQ indirect command buffer */ +	i40e_mem_arq_ring = 3,		/* ARQ descriptor ring */ +	i40e_mem_atq_ring = 4,		/* ATQ descriptor ring */ +	i40e_mem_pd = 5,		/* Page Descriptor */ +	i40e_mem_bp = 6,		/* Backing Page - 4KB */ +	i40e_mem_bp_jumbo = 7,		/* Backing Page - > 4KB */ +	i40e_mem_reserved +}; + +/* prototype for functions used for dynamic memory allocation */ +i40e_status i40e_allocate_dma_mem(struct i40e_hw *hw, +					    struct i40e_dma_mem *mem, +					    enum i40e_memory_type type, +					    u64 size, u32 alignment); +i40e_status i40e_free_dma_mem(struct i40e_hw *hw, +					struct i40e_dma_mem *mem); +i40e_status i40e_allocate_virt_mem(struct i40e_hw *hw, +					     struct i40e_virt_mem *mem, +					     u32 size); +i40e_status i40e_free_virt_mem(struct i40e_hw *hw, +					 struct i40e_virt_mem *mem); + +#endif /* _I40E_ALLOC_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_common.c b/drivers/net/ethernet/intel/i40evf/i40e_common.c new file mode 100644 index 00000000000..a43155afdbe --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_common.c @@ -0,0 +1,624 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#include "i40e_type.h" +#include "i40e_adminq.h" +#include "i40e_prototype.h" +#include "i40e_virtchnl.h" + +/** + * i40e_set_mac_type - Sets MAC type + * @hw: pointer to the HW structure + * + * This function sets the mac type of the adapter based on the + * vendor ID and device ID stored in the hw structure. + **/ +i40e_status i40e_set_mac_type(struct i40e_hw *hw) +{ +	i40e_status status = 0; + +	if (hw->vendor_id == PCI_VENDOR_ID_INTEL) { +		switch (hw->device_id) { +		case I40E_DEV_ID_SFP_XL710: +		case I40E_DEV_ID_QEMU: +		case I40E_DEV_ID_KX_A: +		case I40E_DEV_ID_KX_B: +		case I40E_DEV_ID_KX_C: +		case I40E_DEV_ID_QSFP_A: +		case I40E_DEV_ID_QSFP_B: +		case I40E_DEV_ID_QSFP_C: +			hw->mac.type = I40E_MAC_XL710; +			break; +		case I40E_DEV_ID_VF: +		case I40E_DEV_ID_VF_HV: +			hw->mac.type = I40E_MAC_VF; +			break; +		default: +			hw->mac.type = I40E_MAC_GENERIC; +			break; +		} +	} else { +		status = I40E_ERR_DEVICE_NOT_SUPPORTED; +	} + +	hw_dbg(hw, "i40e_set_mac_type found mac: %d, returns: %d\n", +		  hw->mac.type, status); +	return status; +} + +/** + * i40evf_debug_aq + * @hw: debug mask related to admin queue + * @mask: debug mask + * @desc: pointer to admin queue descriptor + * @buffer: pointer to command buffer + * + * Dumps debug log about adminq command with descriptor contents. + **/ +void i40evf_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc, +		   void *buffer) +{ +	struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc; +	u8 *aq_buffer = (u8 *)buffer; +	u32 data[4]; +	u32 i = 0; + +	if ((!(mask & hw->debug_mask)) || (desc == NULL)) +		return; + +	i40e_debug(hw, mask, +		   "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n", +		   aq_desc->opcode, aq_desc->flags, aq_desc->datalen, +		   aq_desc->retval); +	i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n", +		   aq_desc->cookie_high, aq_desc->cookie_low); +	i40e_debug(hw, mask, "\tparam (0,1)  0x%08X 0x%08X\n", +		   aq_desc->params.internal.param0, +		   aq_desc->params.internal.param1); +	i40e_debug(hw, mask, "\taddr (h,l)   0x%08X 0x%08X\n", +		   aq_desc->params.external.addr_high, +		   aq_desc->params.external.addr_low); + +	if ((buffer != NULL) && (aq_desc->datalen != 0)) { +		memset(data, 0, sizeof(data)); +		i40e_debug(hw, mask, "AQ CMD Buffer:\n"); +		for (i = 0; i < le16_to_cpu(aq_desc->datalen); i++) { +			data[((i % 16) / 4)] |= +				((u32)aq_buffer[i]) << (8 * (i % 4)); +			if ((i % 16) == 15) { +				i40e_debug(hw, mask, +					   "\t0x%04X  %08X %08X %08X %08X\n", +					   i - 15, data[0], data[1], data[2], +					   data[3]); +				memset(data, 0, sizeof(data)); +			} +		} +		if ((i % 16) != 0) +			i40e_debug(hw, mask, "\t0x%04X  %08X %08X %08X %08X\n", +				   i - (i % 16), data[0], data[1], data[2], +				   data[3]); +	} +} + +/** + * i40evf_check_asq_alive + * @hw: pointer to the hw struct + * + * Returns true if Queue is enabled else false. + **/ +bool i40evf_check_asq_alive(struct i40e_hw *hw) +{ +	if (hw->aq.asq.len) +		return !!(rd32(hw, hw->aq.asq.len) & +			  I40E_PF_ATQLEN_ATQENABLE_MASK); +	else +		return false; +} + +/** + * i40evf_aq_queue_shutdown + * @hw: pointer to the hw struct + * @unloading: is the driver unloading itself + * + * Tell the Firmware that we're shutting down the AdminQ and whether + * or not the driver is unloading as well. + **/ +i40e_status i40evf_aq_queue_shutdown(struct i40e_hw *hw, +					     bool unloading) +{ +	struct i40e_aq_desc desc; +	struct i40e_aqc_queue_shutdown *cmd = +		(struct i40e_aqc_queue_shutdown *)&desc.params.raw; +	i40e_status status; + +	i40evf_fill_default_direct_cmd_desc(&desc, +					  i40e_aqc_opc_queue_shutdown); + +	if (unloading) +		cmd->driver_unloading = cpu_to_le32(I40E_AQ_DRIVER_UNLOADING); +	status = i40evf_asq_send_command(hw, &desc, NULL, 0, NULL); + +	return status; +} + + +/* The i40evf_ptype_lookup table is used to convert from the 8-bit ptype in the + * hardware to a bit-field that can be used by SW to more easily determine the + * packet type. + * + * Macros are used to shorten the table lines and make this table human + * readable. + * + * We store the PTYPE in the top byte of the bit field - this is just so that + * we can check that the table doesn't have a row missing, as the index into + * the table should be the PTYPE. + * + * Typical work flow: + * + * IF NOT i40evf_ptype_lookup[ptype].known + * THEN + *      Packet is unknown + * ELSE IF i40evf_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP + *      Use the rest of the fields to look at the tunnels, inner protocols, etc + * ELSE + *      Use the enum i40e_rx_l2_ptype to decode the packet type + * ENDIF + */ + +/* macro to make the table lines short */ +#define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\ +	{	PTYPE, \ +		1, \ +		I40E_RX_PTYPE_OUTER_##OUTER_IP, \ +		I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \ +		I40E_RX_PTYPE_##OUTER_FRAG, \ +		I40E_RX_PTYPE_TUNNEL_##T, \ +		I40E_RX_PTYPE_TUNNEL_END_##TE, \ +		I40E_RX_PTYPE_##TEF, \ +		I40E_RX_PTYPE_INNER_PROT_##I, \ +		I40E_RX_PTYPE_PAYLOAD_LAYER_##PL } + +#define I40E_PTT_UNUSED_ENTRY(PTYPE) \ +		{ PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +/* shorter macros makes the table fit but are terse */ +#define I40E_RX_PTYPE_NOF		I40E_RX_PTYPE_NOT_FRAG +#define I40E_RX_PTYPE_FRG		I40E_RX_PTYPE_FRAG +#define I40E_RX_PTYPE_INNER_PROT_TS	I40E_RX_PTYPE_INNER_PROT_TIMESYNC + +/* Lookup table mapping the HW PTYPE to the bit field for decoding */ +struct i40e_rx_ptype_decoded i40evf_ptype_lookup[] = { +	/* L2 Packet types */ +	I40E_PTT_UNUSED_ENTRY(0), +	I40E_PTT(1,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), +	I40E_PTT(2,  L2, NONE, NOF, NONE, NONE, NOF, TS,   PAY2), +	I40E_PTT(3,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), +	I40E_PTT_UNUSED_ENTRY(4), +	I40E_PTT_UNUSED_ENTRY(5), +	I40E_PTT(6,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), +	I40E_PTT(7,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), +	I40E_PTT_UNUSED_ENTRY(8), +	I40E_PTT_UNUSED_ENTRY(9), +	I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), +	I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), +	I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), + +	/* Non Tunneled IPv4 */ +	I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(25), +	I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP,  PAY4), +	I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4), +	I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4), + +	/* IPv4 --> IPv4 */ +	I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3), +	I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3), +	I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(32), +	I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), + +	/* IPv4 --> IPv6 */ +	I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3), +	I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3), +	I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(39), +	I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), + +	/* IPv4 --> GRE/NAT */ +	I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), + +	/* IPv4 --> GRE/NAT --> IPv4 */ +	I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), +	I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), +	I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(47), +	I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), + +	/* IPv4 --> GRE/NAT --> IPv6 */ +	I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), +	I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), +	I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(54), +	I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), + +	/* IPv4 --> GRE/NAT --> MAC */ +	I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), + +	/* IPv4 --> GRE/NAT --> MAC --> IPv4 */ +	I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), +	I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), +	I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(62), +	I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), + +	/* IPv4 --> GRE/NAT -> MAC --> IPv6 */ +	I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), +	I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), +	I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(69), +	I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), + +	/* IPv4 --> GRE/NAT --> MAC/VLAN */ +	I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), + +	/* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */ +	I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), +	I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), +	I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(77), +	I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), + +	/* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */ +	I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), +	I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), +	I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(84), +	I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), + +	/* Non Tunneled IPv6 */ +	I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3), +	I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY3), +	I40E_PTT_UNUSED_ENTRY(91), +	I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP,  PAY4), +	I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4), +	I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4), + +	/* IPv6 --> IPv4 */ +	I40E_PTT(95,  IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3), +	I40E_PTT(96,  IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3), +	I40E_PTT(97,  IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(98), +	I40E_PTT(99,  IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), + +	/* IPv6 --> IPv6 */ +	I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3), +	I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3), +	I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(105), +	I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), + +	/* IPv6 --> GRE/NAT */ +	I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), + +	/* IPv6 --> GRE/NAT -> IPv4 */ +	I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), +	I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), +	I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(113), +	I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), + +	/* IPv6 --> GRE/NAT -> IPv6 */ +	I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), +	I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), +	I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(120), +	I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), + +	/* IPv6 --> GRE/NAT -> MAC */ +	I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), + +	/* IPv6 --> GRE/NAT -> MAC -> IPv4 */ +	I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), +	I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), +	I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(128), +	I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), + +	/* IPv6 --> GRE/NAT -> MAC -> IPv6 */ +	I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), +	I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), +	I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(135), +	I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), + +	/* IPv6 --> GRE/NAT -> MAC/VLAN */ +	I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), + +	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */ +	I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), +	I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), +	I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(143), +	I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4), +	I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), +	I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), + +	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */ +	I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), +	I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), +	I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4), +	I40E_PTT_UNUSED_ENTRY(150), +	I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4), +	I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), +	I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), + +	/* unused entries */ +	I40E_PTT_UNUSED_ENTRY(154), +	I40E_PTT_UNUSED_ENTRY(155), +	I40E_PTT_UNUSED_ENTRY(156), +	I40E_PTT_UNUSED_ENTRY(157), +	I40E_PTT_UNUSED_ENTRY(158), +	I40E_PTT_UNUSED_ENTRY(159), + +	I40E_PTT_UNUSED_ENTRY(160), +	I40E_PTT_UNUSED_ENTRY(161), +	I40E_PTT_UNUSED_ENTRY(162), +	I40E_PTT_UNUSED_ENTRY(163), +	I40E_PTT_UNUSED_ENTRY(164), +	I40E_PTT_UNUSED_ENTRY(165), +	I40E_PTT_UNUSED_ENTRY(166), +	I40E_PTT_UNUSED_ENTRY(167), +	I40E_PTT_UNUSED_ENTRY(168), +	I40E_PTT_UNUSED_ENTRY(169), + +	I40E_PTT_UNUSED_ENTRY(170), +	I40E_PTT_UNUSED_ENTRY(171), +	I40E_PTT_UNUSED_ENTRY(172), +	I40E_PTT_UNUSED_ENTRY(173), +	I40E_PTT_UNUSED_ENTRY(174), +	I40E_PTT_UNUSED_ENTRY(175), +	I40E_PTT_UNUSED_ENTRY(176), +	I40E_PTT_UNUSED_ENTRY(177), +	I40E_PTT_UNUSED_ENTRY(178), +	I40E_PTT_UNUSED_ENTRY(179), + +	I40E_PTT_UNUSED_ENTRY(180), +	I40E_PTT_UNUSED_ENTRY(181), +	I40E_PTT_UNUSED_ENTRY(182), +	I40E_PTT_UNUSED_ENTRY(183), +	I40E_PTT_UNUSED_ENTRY(184), +	I40E_PTT_UNUSED_ENTRY(185), +	I40E_PTT_UNUSED_ENTRY(186), +	I40E_PTT_UNUSED_ENTRY(187), +	I40E_PTT_UNUSED_ENTRY(188), +	I40E_PTT_UNUSED_ENTRY(189), + +	I40E_PTT_UNUSED_ENTRY(190), +	I40E_PTT_UNUSED_ENTRY(191), +	I40E_PTT_UNUSED_ENTRY(192), +	I40E_PTT_UNUSED_ENTRY(193), +	I40E_PTT_UNUSED_ENTRY(194), +	I40E_PTT_UNUSED_ENTRY(195), +	I40E_PTT_UNUSED_ENTRY(196), +	I40E_PTT_UNUSED_ENTRY(197), +	I40E_PTT_UNUSED_ENTRY(198), +	I40E_PTT_UNUSED_ENTRY(199), + +	I40E_PTT_UNUSED_ENTRY(200), +	I40E_PTT_UNUSED_ENTRY(201), +	I40E_PTT_UNUSED_ENTRY(202), +	I40E_PTT_UNUSED_ENTRY(203), +	I40E_PTT_UNUSED_ENTRY(204), +	I40E_PTT_UNUSED_ENTRY(205), +	I40E_PTT_UNUSED_ENTRY(206), +	I40E_PTT_UNUSED_ENTRY(207), +	I40E_PTT_UNUSED_ENTRY(208), +	I40E_PTT_UNUSED_ENTRY(209), + +	I40E_PTT_UNUSED_ENTRY(210), +	I40E_PTT_UNUSED_ENTRY(211), +	I40E_PTT_UNUSED_ENTRY(212), +	I40E_PTT_UNUSED_ENTRY(213), +	I40E_PTT_UNUSED_ENTRY(214), +	I40E_PTT_UNUSED_ENTRY(215), +	I40E_PTT_UNUSED_ENTRY(216), +	I40E_PTT_UNUSED_ENTRY(217), +	I40E_PTT_UNUSED_ENTRY(218), +	I40E_PTT_UNUSED_ENTRY(219), + +	I40E_PTT_UNUSED_ENTRY(220), +	I40E_PTT_UNUSED_ENTRY(221), +	I40E_PTT_UNUSED_ENTRY(222), +	I40E_PTT_UNUSED_ENTRY(223), +	I40E_PTT_UNUSED_ENTRY(224), +	I40E_PTT_UNUSED_ENTRY(225), +	I40E_PTT_UNUSED_ENTRY(226), +	I40E_PTT_UNUSED_ENTRY(227), +	I40E_PTT_UNUSED_ENTRY(228), +	I40E_PTT_UNUSED_ENTRY(229), + +	I40E_PTT_UNUSED_ENTRY(230), +	I40E_PTT_UNUSED_ENTRY(231), +	I40E_PTT_UNUSED_ENTRY(232), +	I40E_PTT_UNUSED_ENTRY(233), +	I40E_PTT_UNUSED_ENTRY(234), +	I40E_PTT_UNUSED_ENTRY(235), +	I40E_PTT_UNUSED_ENTRY(236), +	I40E_PTT_UNUSED_ENTRY(237), +	I40E_PTT_UNUSED_ENTRY(238), +	I40E_PTT_UNUSED_ENTRY(239), + +	I40E_PTT_UNUSED_ENTRY(240), +	I40E_PTT_UNUSED_ENTRY(241), +	I40E_PTT_UNUSED_ENTRY(242), +	I40E_PTT_UNUSED_ENTRY(243), +	I40E_PTT_UNUSED_ENTRY(244), +	I40E_PTT_UNUSED_ENTRY(245), +	I40E_PTT_UNUSED_ENTRY(246), +	I40E_PTT_UNUSED_ENTRY(247), +	I40E_PTT_UNUSED_ENTRY(248), +	I40E_PTT_UNUSED_ENTRY(249), + +	I40E_PTT_UNUSED_ENTRY(250), +	I40E_PTT_UNUSED_ENTRY(251), +	I40E_PTT_UNUSED_ENTRY(252), +	I40E_PTT_UNUSED_ENTRY(253), +	I40E_PTT_UNUSED_ENTRY(254), +	I40E_PTT_UNUSED_ENTRY(255) +}; + + +/** + * i40e_aq_send_msg_to_pf + * @hw: pointer to the hardware structure + * @v_opcode: opcodes for VF-PF communication + * @v_retval: return error code + * @msg: pointer to the msg buffer + * @msglen: msg length + * @cmd_details: pointer to command details + * + * Send message to PF driver using admin queue. By default, this message + * is sent asynchronously, i.e. i40evf_asq_send_command() does not wait for + * completion before returning. + **/ +i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, +				enum i40e_virtchnl_ops v_opcode, +				i40e_status v_retval, +				u8 *msg, u16 msglen, +				struct i40e_asq_cmd_details *cmd_details) +{ +	struct i40e_aq_desc desc; +	i40e_status status; + +	i40evf_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf); +	desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_SI); +	desc.cookie_high = cpu_to_le32(v_opcode); +	desc.cookie_low = cpu_to_le32(v_retval); +	if (msglen) { +		desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF +						| I40E_AQ_FLAG_RD)); +		if (msglen > I40E_AQ_LARGE_BUF) +			desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB); +		desc.datalen = cpu_to_le16(msglen); +	} +	if (!cmd_details) { +		struct i40e_asq_cmd_details details; +		memset(&details, 0, sizeof(details)); +		details.async = true; +		cmd_details = &details; +	} +	status = i40evf_asq_send_command(hw, &desc, msg, msglen, cmd_details); +	return status; +} + +/** + * i40e_vf_parse_hw_config + * @hw: pointer to the hardware structure + * @msg: pointer to the virtual channel VF resource structure + * + * Given a VF resource message from the PF, populate the hw struct + * with appropriate information. + **/ +void i40e_vf_parse_hw_config(struct i40e_hw *hw, +			     struct i40e_virtchnl_vf_resource *msg) +{ +	struct i40e_virtchnl_vsi_resource *vsi_res; +	int i; + +	vsi_res = &msg->vsi_res[0]; + +	hw->dev_caps.num_vsis = msg->num_vsis; +	hw->dev_caps.num_rx_qp = msg->num_queue_pairs; +	hw->dev_caps.num_tx_qp = msg->num_queue_pairs; +	hw->dev_caps.num_msix_vectors_vf = msg->max_vectors; +	hw->dev_caps.dcb = msg->vf_offload_flags & +			   I40E_VIRTCHNL_VF_OFFLOAD_L2; +	hw->dev_caps.fcoe = (msg->vf_offload_flags & +			     I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0; +	for (i = 0; i < msg->num_vsis; i++) { +		if (vsi_res->vsi_type == I40E_VSI_SRIOV) { +			memcpy(hw->mac.perm_addr, vsi_res->default_mac_addr, +			       ETH_ALEN); +			memcpy(hw->mac.addr, vsi_res->default_mac_addr, +			       ETH_ALEN); +		} +		vsi_res++; +	} +} + +/** + * i40e_vf_reset + * @hw: pointer to the hardware structure + * + * Send a VF_RESET message to the PF. Does not wait for response from PF + * as none will be forthcoming. Immediately after calling this function, + * the admin queue should be shut down and (optionally) reinitialized. + **/ +i40e_status i40e_vf_reset(struct i40e_hw *hw) +{ +	return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF, +				      0, NULL, 0, NULL); +} diff --git a/drivers/net/ethernet/intel/i40evf/i40e_hmc.h b/drivers/net/ethernet/intel/i40evf/i40e_hmc.h new file mode 100644 index 00000000000..a2ad9a4e399 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_hmc.h @@ -0,0 +1,236 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_HMC_H_ +#define _I40E_HMC_H_ + +#define I40E_HMC_MAX_BP_COUNT 512 + +/* forward-declare the HW struct for the compiler */ +struct i40e_hw; + +#define I40E_HMC_INFO_SIGNATURE		0x484D5347 /* HMSG */ +#define I40E_HMC_PD_CNT_IN_SD		512 +#define I40E_HMC_DIRECT_BP_SIZE		0x200000 /* 2M */ +#define I40E_HMC_PAGED_BP_SIZE		4096 +#define I40E_HMC_PD_BP_BUF_ALIGNMENT	4096 +#define I40E_FIRST_VF_FPM_ID		16 + +struct i40e_hmc_obj_info { +	u64 base;	/* base addr in FPM */ +	u32 max_cnt;	/* max count available for this hmc func */ +	u32 cnt;	/* count of objects driver actually wants to create */ +	u64 size;	/* size in bytes of one object */ +}; + +enum i40e_sd_entry_type { +	I40E_SD_TYPE_INVALID = 0, +	I40E_SD_TYPE_PAGED   = 1, +	I40E_SD_TYPE_DIRECT  = 2 +}; + +struct i40e_hmc_bp { +	enum i40e_sd_entry_type entry_type; +	struct i40e_dma_mem addr; /* populate to be used by hw */ +	u32 sd_pd_index; +	u32 ref_cnt; +}; + +struct i40e_hmc_pd_entry { +	struct i40e_hmc_bp bp; +	u32 sd_index; +	bool valid; +}; + +struct i40e_hmc_pd_table { +	struct i40e_dma_mem pd_page_addr; /* populate to be used by hw */ +	struct i40e_hmc_pd_entry  *pd_entry; /* [512] for sw book keeping */ +	struct i40e_virt_mem pd_entry_virt_mem; /* virt mem for pd_entry */ + +	u32 ref_cnt; +	u32 sd_index; +}; + +struct i40e_hmc_sd_entry { +	enum i40e_sd_entry_type entry_type; +	bool valid; + +	union { +		struct i40e_hmc_pd_table pd_table; +		struct i40e_hmc_bp bp; +	} u; +}; + +struct i40e_hmc_sd_table { +	struct i40e_virt_mem addr; /* used to track sd_entry allocations */ +	u32 sd_cnt; +	u32 ref_cnt; +	struct i40e_hmc_sd_entry *sd_entry; /* (sd_cnt*512) entries max */ +}; + +struct i40e_hmc_info { +	u32 signature; +	/* equals to pci func num for PF and dynamically allocated for VFs */ +	u8 hmc_fn_id; +	u16 first_sd_index; /* index of the first available SD */ + +	/* hmc objects */ +	struct i40e_hmc_obj_info *hmc_obj; +	struct i40e_virt_mem hmc_obj_virt_mem; +	struct i40e_hmc_sd_table sd_table; +}; + +#define I40E_INC_SD_REFCNT(sd_table)	((sd_table)->ref_cnt++) +#define I40E_INC_PD_REFCNT(pd_table)	((pd_table)->ref_cnt++) +#define I40E_INC_BP_REFCNT(bp)		((bp)->ref_cnt++) + +#define I40E_DEC_SD_REFCNT(sd_table)	((sd_table)->ref_cnt--) +#define I40E_DEC_PD_REFCNT(pd_table)	((pd_table)->ref_cnt--) +#define I40E_DEC_BP_REFCNT(bp)		((bp)->ref_cnt--) + +/** + * I40E_SET_PF_SD_ENTRY - marks the sd entry as valid in the hardware + * @hw: pointer to our hw struct + * @pa: pointer to physical address + * @sd_index: segment descriptor index + * @type: if sd entry is direct or paged + **/ +#define I40E_SET_PF_SD_ENTRY(hw, pa, sd_index, type)			\ +{									\ +	u32 val1, val2, val3;						\ +	val1 = (u32)(upper_32_bits(pa));				\ +	val2 = (u32)(pa) | (I40E_HMC_MAX_BP_COUNT <<			\ +		 I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_SHIFT) |		\ +		((((type) == I40E_SD_TYPE_PAGED) ? 0 : 1) <<		\ +		I40E_PFHMC_SDDATALOW_PMSDTYPE_SHIFT) |			\ +		(1 << I40E_PFHMC_SDDATALOW_PMSDVALID_SHIFT);		\ +	val3 = (sd_index) | (1 << I40E_PFHMC_SDCMD_PMSDWR_SHIFT);	\ +	wr32((hw), I40E_PFHMC_SDDATAHIGH, val1);			\ +	wr32((hw), I40E_PFHMC_SDDATALOW, val2);				\ +	wr32((hw), I40E_PFHMC_SDCMD, val3);				\ +} + +/** + * I40E_CLEAR_PF_SD_ENTRY - marks the sd entry as invalid in the hardware + * @hw: pointer to our hw struct + * @sd_index: segment descriptor index + * @type: if sd entry is direct or paged + **/ +#define I40E_CLEAR_PF_SD_ENTRY(hw, sd_index, type)			\ +{									\ +	u32 val2, val3;							\ +	val2 = (I40E_HMC_MAX_BP_COUNT <<				\ +		I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_SHIFT) |		\ +		((((type) == I40E_SD_TYPE_PAGED) ? 0 : 1) <<		\ +		I40E_PFHMC_SDDATALOW_PMSDTYPE_SHIFT);			\ +	val3 = (sd_index) | (1 << I40E_PFHMC_SDCMD_PMSDWR_SHIFT);	\ +	wr32((hw), I40E_PFHMC_SDDATAHIGH, 0);				\ +	wr32((hw), I40E_PFHMC_SDDATALOW, val2);				\ +	wr32((hw), I40E_PFHMC_SDCMD, val3);				\ +} + +/** + * I40E_INVALIDATE_PF_HMC_PD - Invalidates the pd cache in the hardware + * @hw: pointer to our hw struct + * @sd_idx: segment descriptor index + * @pd_idx: page descriptor index + **/ +#define I40E_INVALIDATE_PF_HMC_PD(hw, sd_idx, pd_idx)			\ +	wr32((hw), I40E_PFHMC_PDINV,					\ +	    (((sd_idx) << I40E_PFHMC_PDINV_PMSDIDX_SHIFT) |		\ +	     ((pd_idx) << I40E_PFHMC_PDINV_PMPDIDX_SHIFT))) + +/** + * I40E_FIND_SD_INDEX_LIMIT - finds segment descriptor index limit + * @hmc_info: pointer to the HMC configuration information structure + * @type: type of HMC resources we're searching + * @index: starting index for the object + * @cnt: number of objects we're trying to create + * @sd_idx: pointer to return index of the segment descriptor in question + * @sd_limit: pointer to return the maximum number of segment descriptors + * + * This function calculates the segment descriptor index and index limit + * for the resource defined by i40e_hmc_rsrc_type. + **/ +#define I40E_FIND_SD_INDEX_LIMIT(hmc_info, type, index, cnt, sd_idx, sd_limit)\ +{									\ +	u64 fpm_addr, fpm_limit;					\ +	fpm_addr = (hmc_info)->hmc_obj[(type)].base +			\ +		   (hmc_info)->hmc_obj[(type)].size * (index);		\ +	fpm_limit = fpm_addr + (hmc_info)->hmc_obj[(type)].size * (cnt);\ +	*(sd_idx) = (u32)(fpm_addr / I40E_HMC_DIRECT_BP_SIZE);		\ +	*(sd_limit) = (u32)((fpm_limit - 1) / I40E_HMC_DIRECT_BP_SIZE);	\ +	/* add one more to the limit to correct our range */		\ +	*(sd_limit) += 1;						\ +} + +/** + * I40E_FIND_PD_INDEX_LIMIT - finds page descriptor index limit + * @hmc_info: pointer to the HMC configuration information struct + * @type: HMC resource type we're examining + * @idx: starting index for the object + * @cnt: number of objects we're trying to create + * @pd_index: pointer to return page descriptor index + * @pd_limit: pointer to return page descriptor index limit + * + * Calculates the page descriptor index and index limit for the resource + * defined by i40e_hmc_rsrc_type. + **/ +#define I40E_FIND_PD_INDEX_LIMIT(hmc_info, type, idx, cnt, pd_index, pd_limit)\ +{									\ +	u64 fpm_adr, fpm_limit;						\ +	fpm_adr = (hmc_info)->hmc_obj[(type)].base +			\ +		  (hmc_info)->hmc_obj[(type)].size * (idx);		\ +	fpm_limit = fpm_adr + (hmc_info)->hmc_obj[(type)].size * (cnt);	\ +	*(pd_index) = (u32)(fpm_adr / I40E_HMC_PAGED_BP_SIZE);		\ +	*(pd_limit) = (u32)((fpm_limit - 1) / I40E_HMC_PAGED_BP_SIZE);	\ +	/* add one more to the limit to correct our range */		\ +	*(pd_limit) += 1;						\ +} +i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw, +					      struct i40e_hmc_info *hmc_info, +					      u32 sd_index, +					      enum i40e_sd_entry_type type, +					      u64 direct_mode_sz); + +i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw, +					      struct i40e_hmc_info *hmc_info, +					      u32 pd_index); +i40e_status i40e_remove_pd_bp(struct i40e_hw *hw, +					struct i40e_hmc_info *hmc_info, +					u32 idx); +i40e_status i40e_prep_remove_sd_bp(struct i40e_hmc_info *hmc_info, +					     u32 idx); +i40e_status i40e_remove_sd_bp_new(struct i40e_hw *hw, +					    struct i40e_hmc_info *hmc_info, +					    u32 idx, bool is_pf); +i40e_status i40e_prep_remove_pd_page(struct i40e_hmc_info *hmc_info, +					       u32 idx); +i40e_status i40e_remove_pd_page_new(struct i40e_hw *hw, +					      struct i40e_hmc_info *hmc_info, +					      u32 idx, bool is_pf); + +#endif /* _I40E_HMC_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_lan_hmc.h b/drivers/net/ethernet/intel/i40evf/i40e_lan_hmc.h new file mode 100644 index 00000000000..d6f76224153 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_lan_hmc.h @@ -0,0 +1,169 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_LAN_HMC_H_ +#define _I40E_LAN_HMC_H_ + +/* forward-declare the HW struct for the compiler */ +struct i40e_hw; + +/* HMC element context information */ + +/* Rx queue context data */ +struct i40e_hmc_obj_rxq { +	u16 head; +	u8  cpuid; +	u64 base; +	u16 qlen; +#define I40E_RXQ_CTX_DBUFF_SHIFT 7 +	u8  dbuff; +#define I40E_RXQ_CTX_HBUFF_SHIFT 6 +	u8  hbuff; +	u8  dtype; +	u8  dsize; +	u8  crcstrip; +	u8  fc_ena; +	u8  l2tsel; +	u8  hsplit_0; +	u8  hsplit_1; +	u8  showiv; +	u16 rxmax; +	u8  tphrdesc_ena; +	u8  tphwdesc_ena; +	u8  tphdata_ena; +	u8  tphhead_ena; +	u8  lrxqthresh; +	u8  prefena;	/* NOTE: normally must be set to 1 at init */ +}; + +/* Tx queue context data */ +struct i40e_hmc_obj_txq { +	u16 head; +	u8  new_context; +	u64 base; +	u8  fc_ena; +	u8  timesync_ena; +	u8  fd_ena; +	u8  alt_vlan_ena; +	u16 thead_wb; +	u16 cpuid; +	u8  head_wb_ena; +	u16 qlen; +	u8  tphrdesc_ena; +	u8  tphrpacket_ena; +	u8  tphwdesc_ena; +	u64 head_wb_addr; +	u32 crc; +	u16 rdylist; +	u8  rdylist_act; +}; + +/* for hsplit_0 field of Rx HMC context */ +enum i40e_hmc_obj_rx_hsplit_0 { +	I40E_HMC_OBJ_RX_HSPLIT_0_NO_SPLIT      = 0, +	I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_L2      = 1, +	I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_IP      = 2, +	I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_TCP_UDP = 4, +	I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_SCTP    = 8, +}; + +/* fcoe_cntx and fcoe_filt are for debugging purpose only */ +struct i40e_hmc_obj_fcoe_cntx { +	u32 rsv[32]; +}; + +struct i40e_hmc_obj_fcoe_filt { +	u32 rsv[8]; +}; + +/* Context sizes for LAN objects */ +enum i40e_hmc_lan_object_size { +	I40E_HMC_LAN_OBJ_SZ_8   = 0x3, +	I40E_HMC_LAN_OBJ_SZ_16  = 0x4, +	I40E_HMC_LAN_OBJ_SZ_32  = 0x5, +	I40E_HMC_LAN_OBJ_SZ_64  = 0x6, +	I40E_HMC_LAN_OBJ_SZ_128 = 0x7, +	I40E_HMC_LAN_OBJ_SZ_256 = 0x8, +	I40E_HMC_LAN_OBJ_SZ_512 = 0x9, +}; + +#define I40E_HMC_L2OBJ_BASE_ALIGNMENT 512 +#define I40E_HMC_OBJ_SIZE_TXQ         128 +#define I40E_HMC_OBJ_SIZE_RXQ         32 +#define I40E_HMC_OBJ_SIZE_FCOE_CNTX   128 +#define I40E_HMC_OBJ_SIZE_FCOE_FILT   64 + +enum i40e_hmc_lan_rsrc_type { +	I40E_HMC_LAN_FULL  = 0, +	I40E_HMC_LAN_TX    = 1, +	I40E_HMC_LAN_RX    = 2, +	I40E_HMC_FCOE_CTX  = 3, +	I40E_HMC_FCOE_FILT = 4, +	I40E_HMC_LAN_MAX   = 5 +}; + +enum i40e_hmc_model { +	I40E_HMC_MODEL_DIRECT_PREFERRED = 0, +	I40E_HMC_MODEL_DIRECT_ONLY      = 1, +	I40E_HMC_MODEL_PAGED_ONLY       = 2, +	I40E_HMC_MODEL_UNKNOWN, +}; + +struct i40e_hmc_lan_create_obj_info { +	struct i40e_hmc_info *hmc_info; +	u32 rsrc_type; +	u32 start_idx; +	u32 count; +	enum i40e_sd_entry_type entry_type; +	u64 direct_mode_sz; +}; + +struct i40e_hmc_lan_delete_obj_info { +	struct i40e_hmc_info *hmc_info; +	u32 rsrc_type; +	u32 start_idx; +	u32 count; +}; + +i40e_status i40e_init_lan_hmc(struct i40e_hw *hw, u32 txq_num, +					u32 rxq_num, u32 fcoe_cntx_num, +					u32 fcoe_filt_num); +i40e_status i40e_configure_lan_hmc(struct i40e_hw *hw, +					     enum i40e_hmc_model model); +i40e_status i40e_shutdown_lan_hmc(struct i40e_hw *hw); + +i40e_status i40e_clear_lan_tx_queue_context(struct i40e_hw *hw, +						      u16 queue); +i40e_status i40e_set_lan_tx_queue_context(struct i40e_hw *hw, +						    u16 queue, +						    struct i40e_hmc_obj_txq *s); +i40e_status i40e_clear_lan_rx_queue_context(struct i40e_hw *hw, +						      u16 queue); +i40e_status i40e_set_lan_rx_queue_context(struct i40e_hw *hw, +						    u16 queue, +						    struct i40e_hmc_obj_rxq *s); + +#endif /* _I40E_LAN_HMC_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_osdep.h b/drivers/net/ethernet/intel/i40evf/i40e_osdep.h new file mode 100644 index 00000000000..21a91b14bf8 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_osdep.h @@ -0,0 +1,75 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_OSDEP_H_ +#define _I40E_OSDEP_H_ + +#include <linux/types.h> +#include <linux/if_ether.h> +#include <linux/if_vlan.h> +#include <linux/tcp.h> +#include <linux/pci.h> + +/* get readq/writeq support for 32 bit kernels, use the low-first version */ +#include <asm-generic/io-64-nonatomic-lo-hi.h> + +/* File to be the magic between shared code and + * actual OS primitives + */ + +#define hw_dbg(hw, S, A...)	do {} while (0) + +#define wr32(a, reg, value)	writel((value), ((a)->hw_addr + (reg))) +#define rd32(a, reg)		readl((a)->hw_addr + (reg)) + +#define wr64(a, reg, value)	writeq((value), ((a)->hw_addr + (reg))) +#define rd64(a, reg)		readq((a)->hw_addr + (reg)) +#define i40e_flush(a)		readl((a)->hw_addr + I40E_VFGEN_RSTAT) + +/* memory allocation tracking */ +struct i40e_dma_mem { +	void *va; +	dma_addr_t pa; +	u32 size; +} __packed; + +#define i40e_allocate_dma_mem(h, m, unused, s, a) \ +	i40evf_allocate_dma_mem_d(h, m, s, a) +#define i40e_free_dma_mem(h, m) i40evf_free_dma_mem_d(h, m) + +struct i40e_virt_mem { +	void *va; +	u32 size; +} __packed; +#define i40e_allocate_virt_mem(h, m, s) i40evf_allocate_virt_mem_d(h, m, s) +#define i40e_free_virt_mem(h, m) i40evf_free_virt_mem_d(h, m) + +#define i40e_debug(h, m, s, ...)  i40evf_debug_d(h, m, s, ##__VA_ARGS__) +extern void i40evf_debug_d(void *hw, u32 mask, char *fmt_str, ...) +	__attribute__ ((format(gnu_printf, 3, 4))); + +typedef enum i40e_status_code i40e_status; +#endif /* _I40E_OSDEP_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_prototype.h b/drivers/net/ethernet/intel/i40evf/i40e_prototype.h new file mode 100644 index 00000000000..849edcc2e39 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_prototype.h @@ -0,0 +1,94 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_PROTOTYPE_H_ +#define _I40E_PROTOTYPE_H_ + +#include "i40e_type.h" +#include "i40e_alloc.h" +#include "i40e_virtchnl.h" + +/* Prototypes for shared code functions that are not in + * the standard function pointer structures.  These are + * mostly because they are needed even before the init + * has happened and will assist in the early SW and FW + * setup. + */ + +/* adminq functions */ +i40e_status i40evf_init_adminq(struct i40e_hw *hw); +i40e_status i40evf_shutdown_adminq(struct i40e_hw *hw); +void i40e_adminq_init_ring_data(struct i40e_hw *hw); +i40e_status i40evf_clean_arq_element(struct i40e_hw *hw, +					     struct i40e_arq_event_info *e, +					     u16 *events_pending); +i40e_status i40evf_asq_send_command(struct i40e_hw *hw, +				struct i40e_aq_desc *desc, +				void *buff, /* can be NULL */ +				u16  buff_size, +				struct i40e_asq_cmd_details *cmd_details); +bool i40evf_asq_done(struct i40e_hw *hw); + +/* debug function for adminq */ +void i40evf_debug_aq(struct i40e_hw *hw, +		   enum i40e_debug_mask mask, +		   void *desc, +		   void *buffer); + +void i40e_idle_aq(struct i40e_hw *hw); +void i40evf_resume_aq(struct i40e_hw *hw); +bool i40evf_check_asq_alive(struct i40e_hw *hw); +i40e_status i40evf_aq_queue_shutdown(struct i40e_hw *hw, +					     bool unloading); + +i40e_status i40e_set_mac_type(struct i40e_hw *hw); + +extern struct i40e_rx_ptype_decoded i40evf_ptype_lookup[]; + +static inline struct i40e_rx_ptype_decoded decode_rx_desc_ptype(u8 ptype) +{ +	return i40evf_ptype_lookup[ptype]; +} + +/* prototype for functions used for SW locks */ + +/* i40e_common for VF drivers*/ +void i40e_vf_parse_hw_config(struct i40e_hw *hw, +			     struct i40e_virtchnl_vf_resource *msg); +i40e_status i40e_vf_reset(struct i40e_hw *hw); +i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, +				enum i40e_virtchnl_ops v_opcode, +				i40e_status v_retval, +				u8 *msg, u16 msglen, +				struct i40e_asq_cmd_details *cmd_details); +i40e_status i40e_set_filter_control(struct i40e_hw *hw, +				struct i40e_filter_control_settings *settings); +i40e_status i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw, +				u8 *mac_addr, u16 ethtype, u16 flags, +				u16 vsi_seid, u16 queue, bool is_add, +				struct i40e_control_filter_stats *stats, +				struct i40e_asq_cmd_details *cmd_details); +#endif /* _I40E_PROTOTYPE_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_register.h b/drivers/net/ethernet/intel/i40evf/i40e_register.h new file mode 100644 index 00000000000..36983965581 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_register.h @@ -0,0 +1,4674 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_REGISTER_H_ +#define _I40E_REGISTER_H_ + +#define I40E_GL_GP_FUSE(_i) (0x0009400C + ((_i) * 4)) /* _i=0...28 */ +#define I40E_GL_GP_FUSE_MAX_INDEX 28 +#define I40E_GL_GP_FUSE_GL_GP_FUSE_SHIFT 0 +#define I40E_GL_GP_FUSE_GL_GP_FUSE_MASK (0xFFFFFFFF << I40E_GL_GP_FUSE_GL_GP_FUSE_SHIFT) +#define I40E_GLPCI_PM_MUX_NPQ 0x0009C4F4 +#define I40E_GLPCI_PM_MUX_NPQ_NPQ_NUM_PORT_SEL_SHIFT 0 +#define I40E_GLPCI_PM_MUX_NPQ_NPQ_NUM_PORT_SEL_MASK (0x7 << I40E_GLPCI_PM_MUX_NPQ_NPQ_NUM_PORT_SEL_SHIFT) +#define I40E_GLPCI_PM_MUX_NPQ_INNER_NPQ_SEL_SHIFT 16 +#define I40E_GLPCI_PM_MUX_NPQ_INNER_NPQ_SEL_MASK (0x1F << I40E_GLPCI_PM_MUX_NPQ_INNER_NPQ_SEL_SHIFT) +#define I40E_GLPCI_PM_MUX_PFB 0x0009C4F0 +#define I40E_GLPCI_PM_MUX_PFB_PFB_PORT_SEL_SHIFT 0 +#define I40E_GLPCI_PM_MUX_PFB_PFB_PORT_SEL_MASK (0x1F << I40E_GLPCI_PM_MUX_PFB_PFB_PORT_SEL_SHIFT) +#define I40E_GLPCI_PM_MUX_PFB_INNER_PORT_SEL_SHIFT 16 +#define I40E_GLPCI_PM_MUX_PFB_INNER_PORT_SEL_MASK (0x7 << I40E_GLPCI_PM_MUX_PFB_INNER_PORT_SEL_SHIFT) +#define I40E_GLPCI_PQ_MAX_USED_SPC 0x0009C4EC +#define I40E_GLPCI_PQ_MAX_USED_SPC_GLPCI_PQ_MAX_USED_SPC_12_SHIFT 0 +#define I40E_GLPCI_PQ_MAX_USED_SPC_GLPCI_PQ_MAX_USED_SPC_12_MASK (0xFF << I40E_GLPCI_PQ_MAX_USED_SPC_GLPCI_PQ_MAX_USED_SPC_12_SHIFT) +#define I40E_GLPCI_PQ_MAX_USED_SPC_GLPCI_PQ_MAX_USED_SPC_13_SHIFT 8 +#define I40E_GLPCI_PQ_MAX_USED_SPC_GLPCI_PQ_MAX_USED_SPC_13_MASK (0xFF << I40E_GLPCI_PQ_MAX_USED_SPC_GLPCI_PQ_MAX_USED_SPC_13_SHIFT) +#define I40E_GLPCI_SPARE_BITS_0 0x0009C4F8 +#define I40E_GLPCI_SPARE_BITS_0_SPARE_BITS_SHIFT 0 +#define I40E_GLPCI_SPARE_BITS_0_SPARE_BITS_MASK (0xFFFFFFFF << I40E_GLPCI_SPARE_BITS_0_SPARE_BITS_SHIFT) +#define I40E_GLPCI_SPARE_BITS_1 0x0009C4FC +#define I40E_GLPCI_SPARE_BITS_1_SPARE_BITS_SHIFT 0 +#define I40E_GLPCI_SPARE_BITS_1_SPARE_BITS_MASK (0xFFFFFFFF << I40E_GLPCI_SPARE_BITS_1_SPARE_BITS_SHIFT) +#define I40E_PFPCI_PF_FLUSH_DONE 0x0009C800 +#define I40E_PFPCI_PF_FLUSH_DONE_FLUSH_DONE_SHIFT 0 +#define I40E_PFPCI_PF_FLUSH_DONE_FLUSH_DONE_MASK (0x1 << I40E_PFPCI_PF_FLUSH_DONE_FLUSH_DONE_SHIFT) +#define I40E_PFPCI_VF_FLUSH_DONE 0x0009C600 +#define I40E_PFPCI_VF_FLUSH_DONE_FLUSH_DONE_SHIFT 0 +#define I40E_PFPCI_VF_FLUSH_DONE_FLUSH_DONE_MASK (0x1 << I40E_PFPCI_VF_FLUSH_DONE_FLUSH_DONE_SHIFT) +#define I40E_PFPCI_VF_FLUSH_DONE1(_VF) (0x0009C600 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_PFPCI_VF_FLUSH_DONE1_MAX_INDEX 127 +#define I40E_PFPCI_VF_FLUSH_DONE1_FLUSH_DONE_SHIFT 0 +#define I40E_PFPCI_VF_FLUSH_DONE1_FLUSH_DONE_MASK (0x1 << I40E_PFPCI_VF_FLUSH_DONE1_FLUSH_DONE_SHIFT) +#define I40E_PFPCI_VM_FLUSH_DONE 0x0009C880 +#define I40E_PFPCI_VM_FLUSH_DONE_FLUSH_DONE_SHIFT 0 +#define I40E_PFPCI_VM_FLUSH_DONE_FLUSH_DONE_MASK (0x1 << I40E_PFPCI_VM_FLUSH_DONE_FLUSH_DONE_SHIFT) + +#define I40E_PF_ARQBAH 0x00080180 +#define I40E_PF_ARQBAH_ARQBAH_SHIFT 0 +#define I40E_PF_ARQBAH_ARQBAH_MASK (0xFFFFFFFF << I40E_PF_ARQBAH_ARQBAH_SHIFT) +#define I40E_PF_ARQBAL 0x00080080 +#define I40E_PF_ARQBAL_ARQBAL_SHIFT 0 +#define I40E_PF_ARQBAL_ARQBAL_MASK (0xFFFFFFFF << I40E_PF_ARQBAL_ARQBAL_SHIFT) +#define I40E_PF_ARQH 0x00080380 +#define I40E_PF_ARQH_ARQH_SHIFT 0 +#define I40E_PF_ARQH_ARQH_MASK (0x3FF << I40E_PF_ARQH_ARQH_SHIFT) +#define I40E_PF_ARQLEN 0x00080280 +#define I40E_PF_ARQLEN_ARQLEN_SHIFT 0 +#define I40E_PF_ARQLEN_ARQLEN_MASK (0x3FF << I40E_PF_ARQLEN_ARQLEN_SHIFT) +#define I40E_PF_ARQLEN_ARQVFE_SHIFT 28 +#define I40E_PF_ARQLEN_ARQVFE_MASK (0x1 << I40E_PF_ARQLEN_ARQVFE_SHIFT) +#define I40E_PF_ARQLEN_ARQOVFL_SHIFT 29 +#define I40E_PF_ARQLEN_ARQOVFL_MASK (0x1 << I40E_PF_ARQLEN_ARQOVFL_SHIFT) +#define I40E_PF_ARQLEN_ARQCRIT_SHIFT 30 +#define I40E_PF_ARQLEN_ARQCRIT_MASK (0x1 << I40E_PF_ARQLEN_ARQCRIT_SHIFT) +#define I40E_PF_ARQLEN_ARQENABLE_SHIFT 31 +#define I40E_PF_ARQLEN_ARQENABLE_MASK (0x1 << I40E_PF_ARQLEN_ARQENABLE_SHIFT) +#define I40E_PF_ARQT 0x00080480 +#define I40E_PF_ARQT_ARQT_SHIFT 0 +#define I40E_PF_ARQT_ARQT_MASK (0x3FF << I40E_PF_ARQT_ARQT_SHIFT) +#define I40E_PF_ATQBAH 0x00080100 +#define I40E_PF_ATQBAH_ATQBAH_SHIFT 0 +#define I40E_PF_ATQBAH_ATQBAH_MASK (0xFFFFFFFF << I40E_PF_ATQBAH_ATQBAH_SHIFT) +#define I40E_PF_ATQBAL 0x00080000 +#define I40E_PF_ATQBAL_ATQBAL_SHIFT 0 +#define I40E_PF_ATQBAL_ATQBAL_MASK (0xFFFFFFFF << I40E_PF_ATQBAL_ATQBAL_SHIFT) +#define I40E_PF_ATQH 0x00080300 +#define I40E_PF_ATQH_ATQH_SHIFT 0 +#define I40E_PF_ATQH_ATQH_MASK (0x3FF << I40E_PF_ATQH_ATQH_SHIFT) +#define I40E_PF_ATQLEN 0x00080200 +#define I40E_PF_ATQLEN_ATQLEN_SHIFT 0 +#define I40E_PF_ATQLEN_ATQLEN_MASK (0x3FF << I40E_PF_ATQLEN_ATQLEN_SHIFT) +#define I40E_PF_ATQLEN_ATQVFE_SHIFT 28 +#define I40E_PF_ATQLEN_ATQVFE_MASK (0x1 << I40E_PF_ATQLEN_ATQVFE_SHIFT) +#define I40E_PF_ATQLEN_ATQOVFL_SHIFT 29 +#define I40E_PF_ATQLEN_ATQOVFL_MASK (0x1 << I40E_PF_ATQLEN_ATQOVFL_SHIFT) +#define I40E_PF_ATQLEN_ATQCRIT_SHIFT 30 +#define I40E_PF_ATQLEN_ATQCRIT_MASK (0x1 << I40E_PF_ATQLEN_ATQCRIT_SHIFT) +#define I40E_PF_ATQLEN_ATQENABLE_SHIFT 31 +#define I40E_PF_ATQLEN_ATQENABLE_MASK (0x1 << I40E_PF_ATQLEN_ATQENABLE_SHIFT) +#define I40E_PF_ATQT 0x00080400 +#define I40E_PF_ATQT_ATQT_SHIFT 0 +#define I40E_PF_ATQT_ATQT_MASK (0x3FF << I40E_PF_ATQT_ATQT_SHIFT) +#define I40E_VF_ARQBAH(_VF) (0x00081400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ARQBAH_MAX_INDEX 127 +#define I40E_VF_ARQBAH_ARQBAH_SHIFT 0 +#define I40E_VF_ARQBAH_ARQBAH_MASK (0xFFFFFFFF << I40E_VF_ARQBAH_ARQBAH_SHIFT) +#define I40E_VF_ARQBAL(_VF) (0x00080C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ARQBAL_MAX_INDEX 127 +#define I40E_VF_ARQBAL_ARQBAL_SHIFT 0 +#define I40E_VF_ARQBAL_ARQBAL_MASK (0xFFFFFFFF << I40E_VF_ARQBAL_ARQBAL_SHIFT) +#define I40E_VF_ARQH(_VF) (0x00082400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ARQH_MAX_INDEX 127 +#define I40E_VF_ARQH_ARQH_SHIFT 0 +#define I40E_VF_ARQH_ARQH_MASK (0x3FF << I40E_VF_ARQH_ARQH_SHIFT) +#define I40E_VF_ARQLEN(_VF) (0x00081C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ARQLEN_MAX_INDEX 127 +#define I40E_VF_ARQLEN_ARQLEN_SHIFT 0 +#define I40E_VF_ARQLEN_ARQLEN_MASK (0x3FF << I40E_VF_ARQLEN_ARQLEN_SHIFT) +#define I40E_VF_ARQLEN_ARQVFE_SHIFT 28 +#define I40E_VF_ARQLEN_ARQVFE_MASK (0x1 << I40E_VF_ARQLEN_ARQVFE_SHIFT) +#define I40E_VF_ARQLEN_ARQOVFL_SHIFT 29 +#define I40E_VF_ARQLEN_ARQOVFL_MASK (0x1 << I40E_VF_ARQLEN_ARQOVFL_SHIFT) +#define I40E_VF_ARQLEN_ARQCRIT_SHIFT 30 +#define I40E_VF_ARQLEN_ARQCRIT_MASK (0x1 << I40E_VF_ARQLEN_ARQCRIT_SHIFT) +#define I40E_VF_ARQLEN_ARQENABLE_SHIFT 31 +#define I40E_VF_ARQLEN_ARQENABLE_MASK (0x1 << I40E_VF_ARQLEN_ARQENABLE_SHIFT) +#define I40E_VF_ARQT(_VF) (0x00082C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ARQT_MAX_INDEX 127 +#define I40E_VF_ARQT_ARQT_SHIFT 0 +#define I40E_VF_ARQT_ARQT_MASK (0x3FF << I40E_VF_ARQT_ARQT_SHIFT) +#define I40E_VF_ATQBAH(_VF) (0x00081000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ATQBAH_MAX_INDEX 127 +#define I40E_VF_ATQBAH_ATQBAH_SHIFT 0 +#define I40E_VF_ATQBAH_ATQBAH_MASK (0xFFFFFFFF << I40E_VF_ATQBAH_ATQBAH_SHIFT) +#define I40E_VF_ATQBAL(_VF) (0x00080800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ATQBAL_MAX_INDEX 127 +#define I40E_VF_ATQBAL_ATQBAL_SHIFT 0 +#define I40E_VF_ATQBAL_ATQBAL_MASK (0xFFFFFFFF << I40E_VF_ATQBAL_ATQBAL_SHIFT) +#define I40E_VF_ATQH(_VF) (0x00082000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ATQH_MAX_INDEX 127 +#define I40E_VF_ATQH_ATQH_SHIFT 0 +#define I40E_VF_ATQH_ATQH_MASK (0x3FF << I40E_VF_ATQH_ATQH_SHIFT) +#define I40E_VF_ATQLEN(_VF) (0x00081800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ATQLEN_MAX_INDEX 127 +#define I40E_VF_ATQLEN_ATQLEN_SHIFT 0 +#define I40E_VF_ATQLEN_ATQLEN_MASK (0x3FF << I40E_VF_ATQLEN_ATQLEN_SHIFT) +#define I40E_VF_ATQLEN_ATQVFE_SHIFT 28 +#define I40E_VF_ATQLEN_ATQVFE_MASK (0x1 << I40E_VF_ATQLEN_ATQVFE_SHIFT) +#define I40E_VF_ATQLEN_ATQOVFL_SHIFT 29 +#define I40E_VF_ATQLEN_ATQOVFL_MASK (0x1 << I40E_VF_ATQLEN_ATQOVFL_SHIFT) +#define I40E_VF_ATQLEN_ATQCRIT_SHIFT 30 +#define I40E_VF_ATQLEN_ATQCRIT_MASK (0x1 << I40E_VF_ATQLEN_ATQCRIT_SHIFT) +#define I40E_VF_ATQLEN_ATQENABLE_SHIFT 31 +#define I40E_VF_ATQLEN_ATQENABLE_MASK (0x1 << I40E_VF_ATQLEN_ATQENABLE_SHIFT) +#define I40E_VF_ATQT(_VF) (0x00082800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VF_ATQT_MAX_INDEX 127 +#define I40E_VF_ATQT_ATQT_SHIFT 0 +#define I40E_VF_ATQT_ATQT_MASK (0x3FF << I40E_VF_ATQT_ATQT_SHIFT) +#define I40E_PRT_L2TAGSEN 0x001C0B20 +#define I40E_PRT_L2TAGSEN_ENABLE_SHIFT 0 +#define I40E_PRT_L2TAGSEN_ENABLE_MASK (0xFF << I40E_PRT_L2TAGSEN_ENABLE_SHIFT) +#define I40E_PFCM_LAN_ERRDATA 0x0010C080 +#define I40E_PFCM_LAN_ERRDATA_ERROR_CODE_SHIFT 0 +#define I40E_PFCM_LAN_ERRDATA_ERROR_CODE_MASK (0xF << I40E_PFCM_LAN_ERRDATA_ERROR_CODE_SHIFT) +#define I40E_PFCM_LAN_ERRDATA_Q_TYPE_SHIFT 4 +#define I40E_PFCM_LAN_ERRDATA_Q_TYPE_MASK (0x7 << I40E_PFCM_LAN_ERRDATA_Q_TYPE_SHIFT) +#define I40E_PFCM_LAN_ERRDATA_Q_NUM_SHIFT 8 +#define I40E_PFCM_LAN_ERRDATA_Q_NUM_MASK (0xFFF << I40E_PFCM_LAN_ERRDATA_Q_NUM_SHIFT) +#define I40E_PFCM_LAN_ERRINFO 0x0010C000 +#define I40E_PFCM_LAN_ERRINFO_ERROR_VALID_SHIFT 0 +#define I40E_PFCM_LAN_ERRINFO_ERROR_VALID_MASK (0x1 << I40E_PFCM_LAN_ERRINFO_ERROR_VALID_SHIFT) +#define I40E_PFCM_LAN_ERRINFO_ERROR_INST_SHIFT 4 +#define I40E_PFCM_LAN_ERRINFO_ERROR_INST_MASK (0x7 << I40E_PFCM_LAN_ERRINFO_ERROR_INST_SHIFT) +#define I40E_PFCM_LAN_ERRINFO_DBL_ERROR_CNT_SHIFT 8 +#define I40E_PFCM_LAN_ERRINFO_DBL_ERROR_CNT_MASK (0xFF << I40E_PFCM_LAN_ERRINFO_DBL_ERROR_CNT_SHIFT) +#define I40E_PFCM_LAN_ERRINFO_RLU_ERROR_CNT_SHIFT 16 +#define I40E_PFCM_LAN_ERRINFO_RLU_ERROR_CNT_MASK (0xFF << I40E_PFCM_LAN_ERRINFO_RLU_ERROR_CNT_SHIFT) +#define I40E_PFCM_LAN_ERRINFO_RLS_ERROR_CNT_SHIFT 24 +#define I40E_PFCM_LAN_ERRINFO_RLS_ERROR_CNT_MASK (0xFF << I40E_PFCM_LAN_ERRINFO_RLS_ERROR_CNT_SHIFT) +#define I40E_PFCM_LANCTXCTL(_pf) (0x0010C300 + ((_pf) * 4))/* _pf=0..15 */ +#define I40E_PFCM_LANCTXCTL_QUEUE_NUM_SHIFT 0 +#define I40E_PFCM_LANCTXCTL_QUEUE_NUM_MASK (0xFFF << I40E_PFCM_LANCTXCTL_QUEUE_NUM_SHIFT) +#define I40E_PFCM_LANCTXCTL_SUB_LINE_SHIFT 12 +#define I40E_PFCM_LANCTXCTL_SUB_LINE_MASK (0x7 << I40E_PFCM_LANCTXCTL_SUB_LINE_SHIFT) +#define I40E_PFCM_LANCTXCTL_QUEUE_TYPE_SHIFT 15 +#define I40E_PFCM_LANCTXCTL_QUEUE_TYPE_MASK (0x3 << I40E_PFCM_LANCTXCTL_QUEUE_TYPE_SHIFT) +#define I40E_PFCM_LANCTXCTL_OP_CODE_SHIFT 17 +#define I40E_PFCM_LANCTXCTL_OP_CODE_MASK (0x3 << I40E_PFCM_LANCTXCTL_OP_CODE_SHIFT) +#define I40E_PFCM_LANCTXDATA(_i, _pf) (0x0010C100 + ((_i) * 4) + ((_pf) * 16))/* _i=0...3 _pf=0..15 */ +#define I40E_PFCM_LANCTXDATA_MAX_INDEX 3 +#define I40E_PFCM_LANCTXDATA_DATA_SHIFT 0 +#define I40E_PFCM_LANCTXDATA_DATA_MASK (0xFFFFFFFF << I40E_PFCM_LANCTXDATA_DATA_SHIFT) +#define I40E_PFCM_LANCTXSTAT(_pf) (0x0010C380 + ((_pf) * 4))/* _pf=0..15 */ +#define I40E_PFCM_LANCTXSTAT_CTX_DONE_SHIFT 0 +#define I40E_PFCM_LANCTXSTAT_CTX_DONE_MASK (0x1 << I40E_PFCM_LANCTXSTAT_CTX_DONE_SHIFT) +#define I40E_PFCM_LANCTXSTAT_CTX_MISS_SHIFT 1 +#define I40E_PFCM_LANCTXSTAT_CTX_MISS_MASK (0x1 << I40E_PFCM_LANCTXSTAT_CTX_MISS_SHIFT) +#define I40E_PFCM_PE_ERRDATA 0x00138D00 +#define I40E_PFCM_PE_ERRDATA_ERROR_CODE_SHIFT 0 +#define I40E_PFCM_PE_ERRDATA_ERROR_CODE_MASK (0xF << I40E_PFCM_PE_ERRDATA_ERROR_CODE_SHIFT) +#define I40E_PFCM_PE_ERRDATA_Q_TYPE_SHIFT 4 +#define I40E_PFCM_PE_ERRDATA_Q_TYPE_MASK (0x7 << I40E_PFCM_PE_ERRDATA_Q_TYPE_SHIFT) +#define I40E_PFCM_PE_ERRDATA_Q_NUM_SHIFT 8 +#define I40E_PFCM_PE_ERRDATA_Q_NUM_MASK (0x3FFFF << I40E_PFCM_PE_ERRDATA_Q_NUM_SHIFT) +#define I40E_PFCM_PE_ERRINFO 0x00138C80 +#define I40E_PFCM_PE_ERRINFO_ERROR_VALID_SHIFT 0 +#define I40E_PFCM_PE_ERRINFO_ERROR_VALID_MASK (0x1 << I40E_PFCM_PE_ERRINFO_ERROR_VALID_SHIFT) +#define I40E_PFCM_PE_ERRINFO_ERROR_INST_SHIFT 4 +#define I40E_PFCM_PE_ERRINFO_ERROR_INST_MASK (0x7 << I40E_PFCM_PE_ERRINFO_ERROR_INST_SHIFT) +#define I40E_PFCM_PE_ERRINFO_DBL_ERROR_CNT_SHIFT 8 +#define I40E_PFCM_PE_ERRINFO_DBL_ERROR_CNT_MASK (0xFF << I40E_PFCM_PE_ERRINFO_DBL_ERROR_CNT_SHIFT) +#define I40E_PFCM_PE_ERRINFO_RLU_ERROR_CNT_SHIFT 16 +#define I40E_PFCM_PE_ERRINFO_RLU_ERROR_CNT_MASK (0xFF << I40E_PFCM_PE_ERRINFO_RLU_ERROR_CNT_SHIFT) +#define I40E_PFCM_PE_ERRINFO_RLS_ERROR_CNT_SHIFT 24 +#define I40E_PFCM_PE_ERRINFO_RLS_ERROR_CNT_MASK (0xFF << I40E_PFCM_PE_ERRINFO_RLS_ERROR_CNT_SHIFT) +#define I40E_VFCM_PE_ERRDATA1(_VF) (0x00138800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFCM_PE_ERRDATA1_MAX_INDEX 127 +#define I40E_VFCM_PE_ERRDATA1_ERROR_CODE_SHIFT 0 +#define I40E_VFCM_PE_ERRDATA1_ERROR_CODE_MASK (0xF << I40E_VFCM_PE_ERRDATA1_ERROR_CODE_SHIFT) +#define I40E_VFCM_PE_ERRDATA1_Q_TYPE_SHIFT 4 +#define I40E_VFCM_PE_ERRDATA1_Q_TYPE_MASK (0x7 << I40E_VFCM_PE_ERRDATA1_Q_TYPE_SHIFT) +#define I40E_VFCM_PE_ERRDATA1_Q_NUM_SHIFT 8 +#define I40E_VFCM_PE_ERRDATA1_Q_NUM_MASK (0x3FFFF << I40E_VFCM_PE_ERRDATA1_Q_NUM_SHIFT) +#define I40E_VFCM_PE_ERRINFO1(_VF) (0x00138400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFCM_PE_ERRINFO1_MAX_INDEX 127 +#define I40E_VFCM_PE_ERRINFO1_ERROR_VALID_SHIFT 0 +#define I40E_VFCM_PE_ERRINFO1_ERROR_VALID_MASK (0x1 << I40E_VFCM_PE_ERRINFO1_ERROR_VALID_SHIFT) +#define I40E_VFCM_PE_ERRINFO1_ERROR_INST_SHIFT 4 +#define I40E_VFCM_PE_ERRINFO1_ERROR_INST_MASK (0x7 << I40E_VFCM_PE_ERRINFO1_ERROR_INST_SHIFT) +#define I40E_VFCM_PE_ERRINFO1_DBL_ERROR_CNT_SHIFT 8 +#define I40E_VFCM_PE_ERRINFO1_DBL_ERROR_CNT_MASK (0xFF << I40E_VFCM_PE_ERRINFO1_DBL_ERROR_CNT_SHIFT) +#define I40E_VFCM_PE_ERRINFO1_RLU_ERROR_CNT_SHIFT 16 +#define I40E_VFCM_PE_ERRINFO1_RLU_ERROR_CNT_MASK (0xFF << I40E_VFCM_PE_ERRINFO1_RLU_ERROR_CNT_SHIFT) +#define I40E_VFCM_PE_ERRINFO1_RLS_ERROR_CNT_SHIFT 24 +#define I40E_VFCM_PE_ERRINFO1_RLS_ERROR_CNT_MASK (0xFF << I40E_VFCM_PE_ERRINFO1_RLS_ERROR_CNT_SHIFT) +#define I40E_GLDCB_GENC 0x00083044 +#define I40E_GLDCB_GENC_PCIRTT_SHIFT 0 +#define I40E_GLDCB_GENC_PCIRTT_MASK (0xFFFF << I40E_GLDCB_GENC_PCIRTT_SHIFT) +#define I40E_GLDCB_RUPTI 0x00122618 +#define I40E_GLDCB_RUPTI_PFCTIMEOUT_UP_SHIFT 0 +#define I40E_GLDCB_RUPTI_PFCTIMEOUT_UP_MASK (0xFFFFFFFF << I40E_GLDCB_RUPTI_PFCTIMEOUT_UP_SHIFT) +#define I40E_PRTDCB_FCCFG 0x001E4640 +#define I40E_PRTDCB_FCCFG_TFCE_SHIFT 3 +#define I40E_PRTDCB_FCCFG_TFCE_MASK (0x3 << I40E_PRTDCB_FCCFG_TFCE_SHIFT) +#define I40E_PRTDCB_FCRTV 0x001E4600 +#define I40E_PRTDCB_FCRTV_FC_REFRESH_TH_SHIFT 0 +#define I40E_PRTDCB_FCRTV_FC_REFRESH_TH_MASK (0xFFFF << I40E_PRTDCB_FCRTV_FC_REFRESH_TH_SHIFT) +#define I40E_PRTDCB_FCTTVN(_i) (0x001E4580 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRTDCB_FCTTVN_MAX_INDEX 3 +#define I40E_PRTDCB_FCTTVN_TTV_2N_SHIFT 0 +#define I40E_PRTDCB_FCTTVN_TTV_2N_MASK (0xFFFF << I40E_PRTDCB_FCTTVN_TTV_2N_SHIFT) +#define I40E_PRTDCB_FCTTVN_TTV_2N_P1_SHIFT 16 +#define I40E_PRTDCB_FCTTVN_TTV_2N_P1_MASK (0xFFFF << I40E_PRTDCB_FCTTVN_TTV_2N_P1_SHIFT) +#define I40E_PRTDCB_GENC 0x00083000 +#define I40E_PRTDCB_GENC_RESERVED_1_SHIFT 0 +#define I40E_PRTDCB_GENC_RESERVED_1_MASK (0x3 << I40E_PRTDCB_GENC_RESERVED_1_SHIFT) +#define I40E_PRTDCB_GENC_NUMTC_SHIFT 2 +#define I40E_PRTDCB_GENC_NUMTC_MASK (0xF << I40E_PRTDCB_GENC_NUMTC_SHIFT) +#define I40E_PRTDCB_GENC_FCOEUP_SHIFT 6 +#define I40E_PRTDCB_GENC_FCOEUP_MASK (0x7 << I40E_PRTDCB_GENC_FCOEUP_SHIFT) +#define I40E_PRTDCB_GENC_FCOEUP_VALID_SHIFT 9 +#define I40E_PRTDCB_GENC_FCOEUP_VALID_MASK (0x1 << I40E_PRTDCB_GENC_FCOEUP_VALID_SHIFT) +#define I40E_PRTDCB_GENC_PFCLDA_SHIFT 16 +#define I40E_PRTDCB_GENC_PFCLDA_MASK (0xFFFF << I40E_PRTDCB_GENC_PFCLDA_SHIFT) +#define I40E_PRTDCB_GENS 0x00083020 +#define I40E_PRTDCB_GENS_DCBX_STATUS_SHIFT 0 +#define I40E_PRTDCB_GENS_DCBX_STATUS_MASK (0x7 << I40E_PRTDCB_GENS_DCBX_STATUS_SHIFT) +#define I40E_PRTDCB_MFLCN 0x001E2400 +#define I40E_PRTDCB_MFLCN_PMCF_SHIFT 0 +#define I40E_PRTDCB_MFLCN_PMCF_MASK (0x1 << I40E_PRTDCB_MFLCN_PMCF_SHIFT) +#define I40E_PRTDCB_MFLCN_DPF_SHIFT 1 +#define I40E_PRTDCB_MFLCN_DPF_MASK (0x1 << I40E_PRTDCB_MFLCN_DPF_SHIFT) +#define I40E_PRTDCB_MFLCN_RPFCM_SHIFT 2 +#define I40E_PRTDCB_MFLCN_RPFCM_MASK (0x1 << I40E_PRTDCB_MFLCN_RPFCM_SHIFT) +#define I40E_PRTDCB_MFLCN_RFCE_SHIFT 3 +#define I40E_PRTDCB_MFLCN_RFCE_MASK (0x1 << I40E_PRTDCB_MFLCN_RFCE_SHIFT) +#define I40E_PRTDCB_MFLCN_RPFCE_SHIFT 4 +#define I40E_PRTDCB_MFLCN_RPFCE_MASK (0xFF << I40E_PRTDCB_MFLCN_RPFCE_SHIFT) +#define I40E_PRTDCB_RETSC 0x001223E0 +#define I40E_PRTDCB_RETSC_ETS_MODE_SHIFT 0 +#define I40E_PRTDCB_RETSC_ETS_MODE_MASK (0x1 << I40E_PRTDCB_RETSC_ETS_MODE_SHIFT) +#define I40E_PRTDCB_RETSC_NON_ETS_MODE_SHIFT 1 +#define I40E_PRTDCB_RETSC_NON_ETS_MODE_MASK (0x1 << I40E_PRTDCB_RETSC_NON_ETS_MODE_SHIFT) +#define I40E_PRTDCB_RETSC_ETS_MAX_EXP_SHIFT 2 +#define I40E_PRTDCB_RETSC_ETS_MAX_EXP_MASK (0xF << I40E_PRTDCB_RETSC_ETS_MAX_EXP_SHIFT) +#define I40E_PRTDCB_RETSC_LLTC_SHIFT 8 +#define I40E_PRTDCB_RETSC_LLTC_MASK (0xFF << I40E_PRTDCB_RETSC_LLTC_SHIFT) +#define I40E_PRTDCB_RETSTCC(_i) (0x00122180 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTDCB_RETSTCC_MAX_INDEX 7 +#define I40E_PRTDCB_RETSTCC_BWSHARE_SHIFT 0 +#define I40E_PRTDCB_RETSTCC_BWSHARE_MASK (0x7F << I40E_PRTDCB_RETSTCC_BWSHARE_SHIFT) +#define I40E_PRTDCB_RETSTCC_UPINTC_MODE_SHIFT 30 +#define I40E_PRTDCB_RETSTCC_UPINTC_MODE_MASK (0x1 << I40E_PRTDCB_RETSTCC_UPINTC_MODE_SHIFT) +#define I40E_PRTDCB_RETSTCC_ETSTC_SHIFT 31 +#define I40E_PRTDCB_RETSTCC_ETSTC_MASK (0x1 << I40E_PRTDCB_RETSTCC_ETSTC_SHIFT) +#define I40E_PRTDCB_RPPMC 0x001223A0 +#define I40E_PRTDCB_RPPMC_LANRPPM_SHIFT 0 +#define I40E_PRTDCB_RPPMC_LANRPPM_MASK (0xFF << I40E_PRTDCB_RPPMC_LANRPPM_SHIFT) +#define I40E_PRTDCB_RPPMC_RDMARPPM_SHIFT 8 +#define I40E_PRTDCB_RPPMC_RDMARPPM_MASK (0xFF << I40E_PRTDCB_RPPMC_RDMARPPM_SHIFT) +#define I40E_PRTDCB_RPPMC_RX_FIFO_SIZE_SHIFT 16 +#define I40E_PRTDCB_RPPMC_RX_FIFO_SIZE_MASK (0xFF << I40E_PRTDCB_RPPMC_RX_FIFO_SIZE_SHIFT) +#define I40E_PRTDCB_RUP 0x001C0B00 +#define I40E_PRTDCB_RUP_NOVLANUP_SHIFT 0 +#define I40E_PRTDCB_RUP_NOVLANUP_MASK (0x7 << I40E_PRTDCB_RUP_NOVLANUP_SHIFT) +#define I40E_PRTDCB_RUP2TC 0x001C09A0 +#define I40E_PRTDCB_RUP2TC_UP0TC_SHIFT 0 +#define I40E_PRTDCB_RUP2TC_UP0TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP0TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP1TC_SHIFT 3 +#define I40E_PRTDCB_RUP2TC_UP1TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP1TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP2TC_SHIFT 6 +#define I40E_PRTDCB_RUP2TC_UP2TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP2TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP3TC_SHIFT 9 +#define I40E_PRTDCB_RUP2TC_UP3TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP3TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP4TC_SHIFT 12 +#define I40E_PRTDCB_RUP2TC_UP4TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP4TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP5TC_SHIFT 15 +#define I40E_PRTDCB_RUP2TC_UP5TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP5TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP6TC_SHIFT 18 +#define I40E_PRTDCB_RUP2TC_UP6TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP6TC_SHIFT) +#define I40E_PRTDCB_RUP2TC_UP7TC_SHIFT 21 +#define I40E_PRTDCB_RUP2TC_UP7TC_MASK (0x7 << I40E_PRTDCB_RUP2TC_UP7TC_SHIFT) +#define I40E_PRTDCB_TC2PFC 0x001C0980 +#define I40E_PRTDCB_TC2PFC_TC2PFC_SHIFT 0 +#define I40E_PRTDCB_TC2PFC_TC2PFC_MASK (0xFF << I40E_PRTDCB_TC2PFC_TC2PFC_SHIFT) +#define I40E_PRTDCB_TCPMC 0x000A21A0 +#define I40E_PRTDCB_TCPMC_CPM_SHIFT 0 +#define I40E_PRTDCB_TCPMC_CPM_MASK (0x1FFF << I40E_PRTDCB_TCPMC_CPM_SHIFT) +#define I40E_PRTDCB_TCPMC_LLTC_SHIFT 13 +#define I40E_PRTDCB_TCPMC_LLTC_MASK (0xFF << I40E_PRTDCB_TCPMC_LLTC_SHIFT) +#define I40E_PRTDCB_TCPMC_TCPM_MODE_SHIFT 30 +#define I40E_PRTDCB_TCPMC_TCPM_MODE_MASK (0x1 << I40E_PRTDCB_TCPMC_TCPM_MODE_SHIFT) +#define I40E_PRTDCB_TCWSTC(_i) (0x000A2040 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTDCB_TCWSTC_MAX_INDEX 7 +#define I40E_PRTDCB_TCWSTC_MSTC_SHIFT 0 +#define I40E_PRTDCB_TCWSTC_MSTC_MASK (0xFFFFF << I40E_PRTDCB_TCWSTC_MSTC_SHIFT) +#define I40E_PRTDCB_TDPMC 0x000A0180 +#define I40E_PRTDCB_TDPMC_DPM_SHIFT 0 +#define I40E_PRTDCB_TDPMC_DPM_MASK (0xFF << I40E_PRTDCB_TDPMC_DPM_SHIFT) +#define I40E_PRTDCB_TDPMC_TCPM_MODE_SHIFT 30 +#define I40E_PRTDCB_TDPMC_TCPM_MODE_MASK (0x1 << I40E_PRTDCB_TDPMC_TCPM_MODE_SHIFT) +#define I40E_PRTDCB_TDPUC 0x00044100 +#define I40E_PRTDCB_TDPUC_MAX_TXFRAME_SHIFT 0 +#define I40E_PRTDCB_TDPUC_MAX_TXFRAME_MASK (0xFFFF << I40E_PRTDCB_TDPUC_MAX_TXFRAME_SHIFT) +#define I40E_PRTDCB_TETSC_TCB 0x000AE060 +#define I40E_PRTDCB_TETSC_TCB_EN_LL_STRICT_PRIORITY_SHIFT 0 +#define I40E_PRTDCB_TETSC_TCB_EN_LL_STRICT_PRIORITY_MASK (0x1 << I40E_PRTDCB_TETSC_TCB_EN_LL_STRICT_PRIORITY_SHIFT) +#define I40E_PRTDCB_TETSC_TCB_LLTC_SHIFT 8 +#define I40E_PRTDCB_TETSC_TCB_LLTC_MASK (0xFF << I40E_PRTDCB_TETSC_TCB_LLTC_SHIFT) +#define I40E_PRTDCB_TETSC_TPB 0x00098060 +#define I40E_PRTDCB_TETSC_TPB_EN_LL_STRICT_PRIORITY_SHIFT 0 +#define I40E_PRTDCB_TETSC_TPB_EN_LL_STRICT_PRIORITY_MASK (0x1 << I40E_PRTDCB_TETSC_TPB_EN_LL_STRICT_PRIORITY_SHIFT) +#define I40E_PRTDCB_TETSC_TPB_LLTC_SHIFT 8 +#define I40E_PRTDCB_TETSC_TPB_LLTC_MASK (0xFF << I40E_PRTDCB_TETSC_TPB_LLTC_SHIFT) +#define I40E_PRTDCB_TFCS 0x001E4560 +#define I40E_PRTDCB_TFCS_TXOFF_SHIFT 0 +#define I40E_PRTDCB_TFCS_TXOFF_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF0_SHIFT 8 +#define I40E_PRTDCB_TFCS_TXOFF0_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF0_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF1_SHIFT 9 +#define I40E_PRTDCB_TFCS_TXOFF1_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF1_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF2_SHIFT 10 +#define I40E_PRTDCB_TFCS_TXOFF2_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF2_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF3_SHIFT 11 +#define I40E_PRTDCB_TFCS_TXOFF3_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF3_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF4_SHIFT 12 +#define I40E_PRTDCB_TFCS_TXOFF4_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF4_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF5_SHIFT 13 +#define I40E_PRTDCB_TFCS_TXOFF5_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF5_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF6_SHIFT 14 +#define I40E_PRTDCB_TFCS_TXOFF6_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF6_SHIFT) +#define I40E_PRTDCB_TFCS_TXOFF7_SHIFT 15 +#define I40E_PRTDCB_TFCS_TXOFF7_MASK (0x1 << I40E_PRTDCB_TFCS_TXOFF7_SHIFT) +#define I40E_PRTDCB_TFWSTC(_i) (0x000A0040 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTDCB_TFWSTC_MAX_INDEX 7 +#define I40E_PRTDCB_TFWSTC_MSTC_SHIFT 0 +#define I40E_PRTDCB_TFWSTC_MSTC_MASK (0xFFFFF << I40E_PRTDCB_TFWSTC_MSTC_SHIFT) +#define I40E_PRTDCB_TPFCTS(_i) (0x001E4660 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTDCB_TPFCTS_MAX_INDEX 7 +#define I40E_PRTDCB_TPFCTS_PFCTIMER_SHIFT 0 +#define I40E_PRTDCB_TPFCTS_PFCTIMER_MASK (0x3FFF << I40E_PRTDCB_TPFCTS_PFCTIMER_SHIFT) +#define I40E_GLFCOE_RCTL 0x00269B94 +#define I40E_GLFCOE_RCTL_FCOEVER_SHIFT 0 +#define I40E_GLFCOE_RCTL_FCOEVER_MASK (0xF << I40E_GLFCOE_RCTL_FCOEVER_SHIFT) +#define I40E_GLFCOE_RCTL_SAVBAD_SHIFT 4 +#define I40E_GLFCOE_RCTL_SAVBAD_MASK (0x1 << I40E_GLFCOE_RCTL_SAVBAD_SHIFT) +#define I40E_GLFCOE_RCTL_ICRC_SHIFT 5 +#define I40E_GLFCOE_RCTL_ICRC_MASK (0x1 << I40E_GLFCOE_RCTL_ICRC_SHIFT) +#define I40E_GLFCOE_RCTL_MAX_SIZE_SHIFT 16 +#define I40E_GLFCOE_RCTL_MAX_SIZE_MASK (0x3FFF << I40E_GLFCOE_RCTL_MAX_SIZE_SHIFT) +#define I40E_GL_FWSTS 0x00083048 +#define I40E_GL_FWSTS_FWS0B_SHIFT 0 +#define I40E_GL_FWSTS_FWS0B_MASK (0xFF << I40E_GL_FWSTS_FWS0B_SHIFT) +#define I40E_GL_FWSTS_FWRI_SHIFT 9 +#define I40E_GL_FWSTS_FWRI_MASK (0x1 << I40E_GL_FWSTS_FWRI_SHIFT) +#define I40E_GL_FWSTS_FWS1B_SHIFT 16 +#define I40E_GL_FWSTS_FWS1B_MASK (0xFF << I40E_GL_FWSTS_FWS1B_SHIFT) +#define I40E_GLGEN_CLKSTAT 0x000B8184 +#define I40E_GLGEN_CLKSTAT_CLKMODE_SHIFT 0 +#define I40E_GLGEN_CLKSTAT_CLKMODE_MASK (0x1 << I40E_GLGEN_CLKSTAT_CLKMODE_SHIFT) +#define I40E_GLGEN_CLKSTAT_U_CLK_SPEED_SHIFT 4 +#define I40E_GLGEN_CLKSTAT_U_CLK_SPEED_MASK (0x3 << I40E_GLGEN_CLKSTAT_U_CLK_SPEED_SHIFT) +#define I40E_GLGEN_CLKSTAT_P0_CLK_SPEED_SHIFT 8 +#define I40E_GLGEN_CLKSTAT_P0_CLK_SPEED_MASK (0x7 << I40E_GLGEN_CLKSTAT_P0_CLK_SPEED_SHIFT) +#define I40E_GLGEN_CLKSTAT_P1_CLK_SPEED_SHIFT 12 +#define I40E_GLGEN_CLKSTAT_P1_CLK_SPEED_MASK (0x7 << I40E_GLGEN_CLKSTAT_P1_CLK_SPEED_SHIFT) +#define I40E_GLGEN_CLKSTAT_P2_CLK_SPEED_SHIFT 16 +#define I40E_GLGEN_CLKSTAT_P2_CLK_SPEED_MASK (0x7 << I40E_GLGEN_CLKSTAT_P2_CLK_SPEED_SHIFT) +#define I40E_GLGEN_CLKSTAT_P3_CLK_SPEED_SHIFT 20 +#define I40E_GLGEN_CLKSTAT_P3_CLK_SPEED_MASK (0x7 << I40E_GLGEN_CLKSTAT_P3_CLK_SPEED_SHIFT) +#define I40E_GLGEN_GPIO_CTL(_i) (0x00088100 + ((_i) * 4)) /* _i=0...29 */ +#define I40E_GLGEN_GPIO_CTL_MAX_INDEX 29 +#define I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT 0 +#define I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK (0x3 << I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT) +#define I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_SHIFT 3 +#define I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK (0x1 << I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_SHIFT) +#define I40E_GLGEN_GPIO_CTL_PIN_DIR_SHIFT 4 +#define I40E_GLGEN_GPIO_CTL_PIN_DIR_MASK (0x1 << I40E_GLGEN_GPIO_CTL_PIN_DIR_SHIFT) +#define I40E_GLGEN_GPIO_CTL_TRI_CTL_SHIFT 5 +#define I40E_GLGEN_GPIO_CTL_TRI_CTL_MASK (0x1 << I40E_GLGEN_GPIO_CTL_TRI_CTL_SHIFT) +#define I40E_GLGEN_GPIO_CTL_OUT_CTL_SHIFT 6 +#define I40E_GLGEN_GPIO_CTL_OUT_CTL_MASK (0x1 << I40E_GLGEN_GPIO_CTL_OUT_CTL_SHIFT) +#define I40E_GLGEN_GPIO_CTL_PIN_FUNC_SHIFT 7 +#define I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK (0x7 << I40E_GLGEN_GPIO_CTL_PIN_FUNC_SHIFT) +#define I40E_GLGEN_GPIO_CTL_LED_INVRT_SHIFT 10 +#define I40E_GLGEN_GPIO_CTL_LED_INVRT_MASK (0x1 << I40E_GLGEN_GPIO_CTL_LED_INVRT_SHIFT) +#define I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT 11 +#define I40E_GLGEN_GPIO_CTL_LED_BLINK_MASK (0x1 << I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT) +#define I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT 12 +#define I40E_GLGEN_GPIO_CTL_LED_MODE_MASK (0xF << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) +#define I40E_GLGEN_GPIO_CTL_INT_MODE_SHIFT 17 +#define I40E_GLGEN_GPIO_CTL_INT_MODE_MASK (0x3 << I40E_GLGEN_GPIO_CTL_INT_MODE_SHIFT) +#define I40E_GLGEN_GPIO_CTL_OUT_DEFAULT_SHIFT 19 +#define I40E_GLGEN_GPIO_CTL_OUT_DEFAULT_MASK (0x1 << I40E_GLGEN_GPIO_CTL_OUT_DEFAULT_SHIFT) +#define I40E_GLGEN_GPIO_CTL_PHY_PIN_NAME_SHIFT 20 +#define I40E_GLGEN_GPIO_CTL_PHY_PIN_NAME_MASK (0x3F << I40E_GLGEN_GPIO_CTL_PHY_PIN_NAME_SHIFT) +#define I40E_GLGEN_GPIO_SET 0x00088184 +#define I40E_GLGEN_GPIO_SET_GPIO_INDX_SHIFT 0 +#define I40E_GLGEN_GPIO_SET_GPIO_INDX_MASK (0x1F << I40E_GLGEN_GPIO_SET_GPIO_INDX_SHIFT) +#define I40E_GLGEN_GPIO_SET_SDP_DATA_SHIFT 5 +#define I40E_GLGEN_GPIO_SET_SDP_DATA_MASK (0x1 << I40E_GLGEN_GPIO_SET_SDP_DATA_SHIFT) +#define I40E_GLGEN_GPIO_SET_DRIVE_SDP_SHIFT 6 +#define I40E_GLGEN_GPIO_SET_DRIVE_SDP_MASK (0x1 << I40E_GLGEN_GPIO_SET_DRIVE_SDP_SHIFT) +#define I40E_GLGEN_GPIO_STAT 0x0008817C +#define I40E_GLGEN_GPIO_STAT_GPIO_VALUE_SHIFT 0 +#define I40E_GLGEN_GPIO_STAT_GPIO_VALUE_MASK (0x3FFFFFFF << I40E_GLGEN_GPIO_STAT_GPIO_VALUE_SHIFT) +#define I40E_GLGEN_GPIO_TRANSIT 0x00088180 +#define I40E_GLGEN_GPIO_TRANSIT_GPIO_TRANSITION_SHIFT 0 +#define I40E_GLGEN_GPIO_TRANSIT_GPIO_TRANSITION_MASK (0x3FFFFFFF << I40E_GLGEN_GPIO_TRANSIT_GPIO_TRANSITION_SHIFT) +#define I40E_GLGEN_I2CCMD(_i) (0x000881E0 + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_I2CCMD_MAX_INDEX 3 +#define I40E_GLGEN_I2CCMD_DATA_SHIFT 0 +#define I40E_GLGEN_I2CCMD_DATA_MASK (0xFFFF << I40E_GLGEN_I2CCMD_DATA_SHIFT) +#define I40E_GLGEN_I2CCMD_REGADD_SHIFT 16 +#define I40E_GLGEN_I2CCMD_REGADD_MASK (0xFF << I40E_GLGEN_I2CCMD_REGADD_SHIFT) +#define I40E_GLGEN_I2CCMD_PHYADD_SHIFT 24 +#define I40E_GLGEN_I2CCMD_PHYADD_MASK (0x7 << I40E_GLGEN_I2CCMD_PHYADD_SHIFT) +#define I40E_GLGEN_I2CCMD_OP_SHIFT 27 +#define I40E_GLGEN_I2CCMD_OP_MASK (0x1 << I40E_GLGEN_I2CCMD_OP_SHIFT) +#define I40E_GLGEN_I2CCMD_RESET_SHIFT 28 +#define I40E_GLGEN_I2CCMD_RESET_MASK (0x1 << I40E_GLGEN_I2CCMD_RESET_SHIFT) +#define I40E_GLGEN_I2CCMD_R_SHIFT 29 +#define I40E_GLGEN_I2CCMD_R_MASK (0x1 << I40E_GLGEN_I2CCMD_R_SHIFT) +#define I40E_GLGEN_I2CCMD_E_SHIFT 31 +#define I40E_GLGEN_I2CCMD_E_MASK (0x1 << I40E_GLGEN_I2CCMD_E_SHIFT) +#define I40E_GLGEN_I2CPARAMS(_i) (0x000881AC + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_I2CPARAMS_MAX_INDEX 3 +#define I40E_GLGEN_I2CPARAMS_WRITE_TIME_SHIFT 0 +#define I40E_GLGEN_I2CPARAMS_WRITE_TIME_MASK (0x1F << I40E_GLGEN_I2CPARAMS_WRITE_TIME_SHIFT) +#define I40E_GLGEN_I2CPARAMS_READ_TIME_SHIFT 5 +#define I40E_GLGEN_I2CPARAMS_READ_TIME_MASK (0x7 << I40E_GLGEN_I2CPARAMS_READ_TIME_SHIFT) +#define I40E_GLGEN_I2CPARAMS_I2CBB_EN_SHIFT 8 +#define I40E_GLGEN_I2CPARAMS_I2CBB_EN_MASK (0x1 << I40E_GLGEN_I2CPARAMS_I2CBB_EN_SHIFT) +#define I40E_GLGEN_I2CPARAMS_CLK_SHIFT 9 +#define I40E_GLGEN_I2CPARAMS_CLK_MASK (0x1 << I40E_GLGEN_I2CPARAMS_CLK_SHIFT) +#define I40E_GLGEN_I2CPARAMS_DATA_OUT_SHIFT 10 +#define I40E_GLGEN_I2CPARAMS_DATA_OUT_MASK (0x1 << I40E_GLGEN_I2CPARAMS_DATA_OUT_SHIFT) +#define I40E_GLGEN_I2CPARAMS_DATA_OE_N_SHIFT 11 +#define I40E_GLGEN_I2CPARAMS_DATA_OE_N_MASK (0x1 << I40E_GLGEN_I2CPARAMS_DATA_OE_N_SHIFT) +#define I40E_GLGEN_I2CPARAMS_DATA_IN_SHIFT 12 +#define I40E_GLGEN_I2CPARAMS_DATA_IN_MASK (0x1 << I40E_GLGEN_I2CPARAMS_DATA_IN_SHIFT) +#define I40E_GLGEN_I2CPARAMS_CLK_OE_N_SHIFT 13 +#define I40E_GLGEN_I2CPARAMS_CLK_OE_N_MASK (0x1 << I40E_GLGEN_I2CPARAMS_CLK_OE_N_SHIFT) +#define I40E_GLGEN_I2CPARAMS_CLK_IN_SHIFT 14 +#define I40E_GLGEN_I2CPARAMS_CLK_IN_MASK (0x1 << I40E_GLGEN_I2CPARAMS_CLK_IN_SHIFT) +#define I40E_GLGEN_I2CPARAMS_CLK_STRETCH_DIS_SHIFT 15 +#define I40E_GLGEN_I2CPARAMS_CLK_STRETCH_DIS_MASK (0x1 << I40E_GLGEN_I2CPARAMS_CLK_STRETCH_DIS_SHIFT) +#define I40E_GLGEN_I2CPARAMS_I2C_DATA_ORDER_SHIFT 31 +#define I40E_GLGEN_I2CPARAMS_I2C_DATA_ORDER_MASK (0x1 << I40E_GLGEN_I2CPARAMS_I2C_DATA_ORDER_SHIFT) +#define I40E_GLGEN_LED_CTL 0x00088178 +#define I40E_GLGEN_LED_CTL_GLOBAL_BLINK_MODE_SHIFT 0 +#define I40E_GLGEN_LED_CTL_GLOBAL_BLINK_MODE_MASK (0x1 << I40E_GLGEN_LED_CTL_GLOBAL_BLINK_MODE_SHIFT) +#define I40E_GLGEN_MDIO_CTRL(_i) (0x000881D0 + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_MDIO_CTRL_MAX_INDEX 3 +#define I40E_GLGEN_MDIO_CTRL_LEGACY_RSVD2_SHIFT 0 +#define I40E_GLGEN_MDIO_CTRL_LEGACY_RSVD2_MASK (0x1FFFF << I40E_GLGEN_MDIO_CTRL_LEGACY_RSVD2_SHIFT) +#define I40E_GLGEN_MDIO_CTRL_CONTMDC_SHIFT 17 +#define I40E_GLGEN_MDIO_CTRL_CONTMDC_MASK (0x1 << I40E_GLGEN_MDIO_CTRL_CONTMDC_SHIFT) +#define I40E_GLGEN_MDIO_CTRL_LEGACY_RSVD1_SHIFT 18 +#define I40E_GLGEN_MDIO_CTRL_LEGACY_RSVD1_MASK (0x3FFF << I40E_GLGEN_MDIO_CTRL_LEGACY_RSVD1_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL(_i) (0x000881C0 + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_MDIO_I2C_SEL_MAX_INDEX 3 +#define I40E_GLGEN_MDIO_I2C_SEL_MDIO_I2C_SEL_SHIFT 0 +#define I40E_GLGEN_MDIO_I2C_SEL_MDIO_I2C_SEL_MASK (0x1 << I40E_GLGEN_MDIO_I2C_SEL_MDIO_I2C_SEL_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_PHY_PORT_NUM_SHIFT 1 +#define I40E_GLGEN_MDIO_I2C_SEL_PHY_PORT_NUM_MASK (0xF << I40E_GLGEN_MDIO_I2C_SEL_PHY_PORT_NUM_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_PHY0_ADDRESS_SHIFT 5 +#define I40E_GLGEN_MDIO_I2C_SEL_PHY0_ADDRESS_MASK (0x1F << I40E_GLGEN_MDIO_I2C_SEL_PHY0_ADDRESS_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_PHY1_ADDRESS_SHIFT 10 +#define I40E_GLGEN_MDIO_I2C_SEL_PHY1_ADDRESS_MASK (0x1F << I40E_GLGEN_MDIO_I2C_SEL_PHY1_ADDRESS_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_PHY2_ADDRESS_SHIFT 15 +#define I40E_GLGEN_MDIO_I2C_SEL_PHY2_ADDRESS_MASK (0x1F << I40E_GLGEN_MDIO_I2C_SEL_PHY2_ADDRESS_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_PHY3_ADDRESS_SHIFT 20 +#define I40E_GLGEN_MDIO_I2C_SEL_PHY3_ADDRESS_MASK (0x1F << I40E_GLGEN_MDIO_I2C_SEL_PHY3_ADDRESS_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_MDIO_IF_MODE_SHIFT 25 +#define I40E_GLGEN_MDIO_I2C_SEL_MDIO_IF_MODE_MASK (0xF << I40E_GLGEN_MDIO_I2C_SEL_MDIO_IF_MODE_SHIFT) +#define I40E_GLGEN_MDIO_I2C_SEL_EN_FAST_MODE_SHIFT 31 +#define I40E_GLGEN_MDIO_I2C_SEL_EN_FAST_MODE_MASK (0x1 << I40E_GLGEN_MDIO_I2C_SEL_EN_FAST_MODE_SHIFT) +#define I40E_GLGEN_MSCA(_i) (0x0008818C + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_MSCA_MAX_INDEX 3 +#define I40E_GLGEN_MSCA_MDIADD_SHIFT 0 +#define I40E_GLGEN_MSCA_MDIADD_MASK (0xFFFF << I40E_GLGEN_MSCA_MDIADD_SHIFT) +#define I40E_GLGEN_MSCA_DEVADD_SHIFT 16 +#define I40E_GLGEN_MSCA_DEVADD_MASK (0x1F << I40E_GLGEN_MSCA_DEVADD_SHIFT) +#define I40E_GLGEN_MSCA_PHYADD_SHIFT 21 +#define I40E_GLGEN_MSCA_PHYADD_MASK (0x1F << I40E_GLGEN_MSCA_PHYADD_SHIFT) +#define I40E_GLGEN_MSCA_OPCODE_SHIFT 26 +#define I40E_GLGEN_MSCA_OPCODE_MASK (0x3 << I40E_GLGEN_MSCA_OPCODE_SHIFT) +#define I40E_GLGEN_MSCA_STCODE_SHIFT 28 +#define I40E_GLGEN_MSCA_STCODE_MASK (0x3 << I40E_GLGEN_MSCA_STCODE_SHIFT) +#define I40E_GLGEN_MSCA_MDICMD_SHIFT 30 +#define I40E_GLGEN_MSCA_MDICMD_MASK (0x1 << I40E_GLGEN_MSCA_MDICMD_SHIFT) +#define I40E_GLGEN_MSCA_MDIINPROGEN_SHIFT 31 +#define I40E_GLGEN_MSCA_MDIINPROGEN_MASK (0x1 << I40E_GLGEN_MSCA_MDIINPROGEN_SHIFT) +#define I40E_GLGEN_MSRWD(_i) (0x0008819C + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_MSRWD_MAX_INDEX 3 +#define I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT 0 +#define I40E_GLGEN_MSRWD_MDIWRDATA_MASK (0xFFFF << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT) +#define I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT 16 +#define I40E_GLGEN_MSRWD_MDIRDDATA_MASK (0xFFFF << I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT) +#define I40E_GLGEN_PCIFCNCNT 0x001C0AB4 +#define I40E_GLGEN_PCIFCNCNT_PCIPFCNT_SHIFT 0 +#define I40E_GLGEN_PCIFCNCNT_PCIPFCNT_MASK (0x1F << I40E_GLGEN_PCIFCNCNT_PCIPFCNT_SHIFT) +#define I40E_GLGEN_PCIFCNCNT_PCIVFCNT_SHIFT 16 +#define I40E_GLGEN_PCIFCNCNT_PCIVFCNT_MASK (0xFF << I40E_GLGEN_PCIFCNCNT_PCIVFCNT_SHIFT) +#define I40E_GLGEN_PE_ENA 0x000B81A0 +#define I40E_GLGEN_PE_ENA_PE_ENA_SHIFT 0 +#define I40E_GLGEN_PE_ENA_PE_ENA_MASK (0x1 << I40E_GLGEN_PE_ENA_PE_ENA_SHIFT) +#define I40E_GLGEN_PE_ENA_PE_CLK_SRC_SEL_SHIFT 1 +#define I40E_GLGEN_PE_ENA_PE_CLK_SRC_SEL_MASK (0x3 << I40E_GLGEN_PE_ENA_PE_CLK_SRC_SEL_SHIFT) +#define I40E_GLGEN_RSTAT 0x000B8188 +#define I40E_GLGEN_RSTAT_DEVSTATE_SHIFT 0 +#define I40E_GLGEN_RSTAT_DEVSTATE_MASK (0x3 << I40E_GLGEN_RSTAT_DEVSTATE_SHIFT) +#define I40E_GLGEN_RSTAT_RESET_TYPE_SHIFT 2 +#define I40E_GLGEN_RSTAT_RESET_TYPE_MASK (0x3 << I40E_GLGEN_RSTAT_RESET_TYPE_SHIFT) +#define I40E_GLGEN_RSTAT_CORERCNT_SHIFT 4 +#define I40E_GLGEN_RSTAT_CORERCNT_MASK (0x3 << I40E_GLGEN_RSTAT_CORERCNT_SHIFT) +#define I40E_GLGEN_RSTAT_GLOBRCNT_SHIFT 6 +#define I40E_GLGEN_RSTAT_GLOBRCNT_MASK (0x3 << I40E_GLGEN_RSTAT_GLOBRCNT_SHIFT) +#define I40E_GLGEN_RSTAT_EMPRCNT_SHIFT 8 +#define I40E_GLGEN_RSTAT_EMPRCNT_MASK (0x3 << I40E_GLGEN_RSTAT_EMPRCNT_SHIFT) +#define I40E_GLGEN_RSTAT_TIME_TO_RST_SHIFT 10 +#define I40E_GLGEN_RSTAT_TIME_TO_RST_MASK (0x3F << I40E_GLGEN_RSTAT_TIME_TO_RST_SHIFT) +#define I40E_GLGEN_RSTCTL 0x000B8180 +#define I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT 0 +#define I40E_GLGEN_RSTCTL_GRSTDEL_MASK (0x3F << I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT) +#define I40E_GLGEN_RSTCTL_ECC_RST_ENA_SHIFT 8 +#define I40E_GLGEN_RSTCTL_ECC_RST_ENA_MASK (0x1 << I40E_GLGEN_RSTCTL_ECC_RST_ENA_SHIFT) +#define I40E_GLGEN_RSTENA_EMP 0x000B818C +#define I40E_GLGEN_RSTENA_EMP_EMP_RST_ENA_SHIFT 0 +#define I40E_GLGEN_RSTENA_EMP_EMP_RST_ENA_MASK (0x1 << I40E_GLGEN_RSTENA_EMP_EMP_RST_ENA_SHIFT) +#define I40E_GLGEN_RTRIG 0x000B8190 +#define I40E_GLGEN_RTRIG_CORER_SHIFT 0 +#define I40E_GLGEN_RTRIG_CORER_MASK (0x1 << I40E_GLGEN_RTRIG_CORER_SHIFT) +#define I40E_GLGEN_RTRIG_GLOBR_SHIFT 1 +#define I40E_GLGEN_RTRIG_GLOBR_MASK (0x1 << I40E_GLGEN_RTRIG_GLOBR_SHIFT) +#define I40E_GLGEN_RTRIG_EMPFWR_SHIFT 2 +#define I40E_GLGEN_RTRIG_EMPFWR_MASK (0x1 << I40E_GLGEN_RTRIG_EMPFWR_SHIFT) +#define I40E_GLGEN_STAT 0x000B612C +#define I40E_GLGEN_STAT_HWRSVD0_SHIFT 0 +#define I40E_GLGEN_STAT_HWRSVD0_MASK (0x3 << I40E_GLGEN_STAT_HWRSVD0_SHIFT) +#define I40E_GLGEN_STAT_DCBEN_SHIFT 2 +#define I40E_GLGEN_STAT_DCBEN_MASK (0x1 << I40E_GLGEN_STAT_DCBEN_SHIFT) +#define I40E_GLGEN_STAT_VTEN_SHIFT 3 +#define I40E_GLGEN_STAT_VTEN_MASK (0x1 << I40E_GLGEN_STAT_VTEN_SHIFT) +#define I40E_GLGEN_STAT_FCOEN_SHIFT 4 +#define I40E_GLGEN_STAT_FCOEN_MASK (0x1 << I40E_GLGEN_STAT_FCOEN_SHIFT) +#define I40E_GLGEN_STAT_EVBEN_SHIFT 5 +#define I40E_GLGEN_STAT_EVBEN_MASK (0x1 << I40E_GLGEN_STAT_EVBEN_SHIFT) +#define I40E_GLGEN_STAT_HWRSVD1_SHIFT 6 +#define I40E_GLGEN_STAT_HWRSVD1_MASK (0x3 << I40E_GLGEN_STAT_HWRSVD1_SHIFT) +#define I40E_GLGEN_VFLRSTAT(_i) (0x00092600 + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLGEN_VFLRSTAT_MAX_INDEX 3 +#define I40E_GLGEN_VFLRSTAT_VFLRE_SHIFT 0 +#define I40E_GLGEN_VFLRSTAT_VFLRE_MASK (0xFFFFFFFF << I40E_GLGEN_VFLRSTAT_VFLRE_SHIFT) +#define I40E_GLVFGEN_TIMER 0x000881BC +#define I40E_GLVFGEN_TIMER_GTIME_SHIFT 0 +#define I40E_GLVFGEN_TIMER_GTIME_MASK (0xFFFFFFFF << I40E_GLVFGEN_TIMER_GTIME_SHIFT) +#define I40E_PFGEN_CTRL 0x00092400 +#define I40E_PFGEN_CTRL_PFSWR_SHIFT 0 +#define I40E_PFGEN_CTRL_PFSWR_MASK (0x1 << I40E_PFGEN_CTRL_PFSWR_SHIFT) +#define I40E_PFGEN_DRUN 0x00092500 +#define I40E_PFGEN_DRUN_DRVUNLD_SHIFT 0 +#define I40E_PFGEN_DRUN_DRVUNLD_MASK (0x1 << I40E_PFGEN_DRUN_DRVUNLD_SHIFT) +#define I40E_PFGEN_PORTNUM 0x001C0480 +#define I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT 0 +#define I40E_PFGEN_PORTNUM_PORT_NUM_MASK (0x3 << I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT) +#define I40E_PFGEN_STATE 0x00088000 +#define I40E_PFGEN_STATE_PFPEEN_SHIFT 0 +#define I40E_PFGEN_STATE_PFPEEN_MASK (0x1 << I40E_PFGEN_STATE_PFPEEN_SHIFT) +#define I40E_PFGEN_STATE_PFFCEN_SHIFT 1 +#define I40E_PFGEN_STATE_PFFCEN_MASK (0x1 << I40E_PFGEN_STATE_PFFCEN_SHIFT) +#define I40E_PFGEN_STATE_PFLINKEN_SHIFT 2 +#define I40E_PFGEN_STATE_PFLINKEN_MASK (0x1 << I40E_PFGEN_STATE_PFLINKEN_SHIFT) +#define I40E_PFGEN_STATE_PFSCEN_SHIFT 3 +#define I40E_PFGEN_STATE_PFSCEN_MASK (0x1 << I40E_PFGEN_STATE_PFSCEN_SHIFT) +#define I40E_PRTGEN_CNF 0x000B8120 +#define I40E_PRTGEN_CNF_PORT_DIS_SHIFT 0 +#define I40E_PRTGEN_CNF_PORT_DIS_MASK (0x1 << I40E_PRTGEN_CNF_PORT_DIS_SHIFT) +#define I40E_PRTGEN_CNF_ALLOW_PORT_DIS_SHIFT 1 +#define I40E_PRTGEN_CNF_ALLOW_PORT_DIS_MASK (0x1 << I40E_PRTGEN_CNF_ALLOW_PORT_DIS_SHIFT) +#define I40E_PRTGEN_CNF_EMP_PORT_DIS_SHIFT 2 +#define I40E_PRTGEN_CNF_EMP_PORT_DIS_MASK (0x1 << I40E_PRTGEN_CNF_EMP_PORT_DIS_SHIFT) +#define I40E_PRTGEN_CNF2 0x000B8160 +#define I40E_PRTGEN_CNF2_ACTIVATE_PORT_LINK_SHIFT 0 +#define I40E_PRTGEN_CNF2_ACTIVATE_PORT_LINK_MASK (0x1 << I40E_PRTGEN_CNF2_ACTIVATE_PORT_LINK_SHIFT) +#define I40E_PRTGEN_STATUS 0x000B8100 +#define I40E_PRTGEN_STATUS_PORT_VALID_SHIFT 0 +#define I40E_PRTGEN_STATUS_PORT_VALID_MASK (0x1 << I40E_PRTGEN_STATUS_PORT_VALID_SHIFT) +#define I40E_PRTGEN_STATUS_PORT_ACTIVE_SHIFT 1 +#define I40E_PRTGEN_STATUS_PORT_ACTIVE_MASK (0x1 << I40E_PRTGEN_STATUS_PORT_ACTIVE_SHIFT) +#define I40E_VFGEN_RSTAT1(_VF) (0x00074400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFGEN_RSTAT1_MAX_INDEX 127 +#define I40E_VFGEN_RSTAT1_VFR_STATE_SHIFT 0 +#define I40E_VFGEN_RSTAT1_VFR_STATE_MASK (0x3 << I40E_VFGEN_RSTAT1_VFR_STATE_SHIFT) +#define I40E_VPGEN_VFRSTAT(_VF) (0x00091C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPGEN_VFRSTAT_MAX_INDEX 127 +#define I40E_VPGEN_VFRSTAT_VFRD_SHIFT 0 +#define I40E_VPGEN_VFRSTAT_VFRD_MASK (0x1 << I40E_VPGEN_VFRSTAT_VFRD_SHIFT) +#define I40E_VPGEN_VFRTRIG(_VF) (0x00091800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPGEN_VFRTRIG_MAX_INDEX 127 +#define I40E_VPGEN_VFRTRIG_VFSWR_SHIFT 0 +#define I40E_VPGEN_VFRTRIG_VFSWR_MASK (0x1 << I40E_VPGEN_VFRTRIG_VFSWR_SHIFT) +#define I40E_VSIGEN_RSTAT(_VSI) (0x00090800 + ((_VSI) * 4)) /* _i=0...383 */ +#define I40E_VSIGEN_RSTAT_MAX_INDEX 383 +#define I40E_VSIGEN_RSTAT_VMRD_SHIFT 0 +#define I40E_VSIGEN_RSTAT_VMRD_MASK (0x1 << I40E_VSIGEN_RSTAT_VMRD_SHIFT) +#define I40E_VSIGEN_RTRIG(_VSI) (0x00090000 + ((_VSI) * 4)) /* _i=0...383 */ +#define I40E_VSIGEN_RTRIG_MAX_INDEX 383 +#define I40E_VSIGEN_RTRIG_VMSWR_SHIFT 0 +#define I40E_VSIGEN_RTRIG_VMSWR_MASK (0x1 << I40E_VSIGEN_RTRIG_VMSWR_SHIFT) +#define I40E_GLHMC_APBVTINUSEBASE(_i) (0x000C4a00 + ((_i) * 4)) +#define I40E_GLHMC_APBVTINUSEBASE_MAX_INDEX 15 +#define I40E_GLHMC_APBVTINUSEBASE_FPMAPBINUSEBASE_SHIFT 0 +#define I40E_GLHMC_APBVTINUSEBASE_FPMAPBINUSEBASE_MASK (0xFFFFFF << I40E_GLHMC_APBVTINUSEBASE_FPMAPBINUSEBASE_SHIFT) +#define I40E_GLHMC_CEQPART(_i) (0x001312C0 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_CEQPART_MAX_INDEX 15 +#define I40E_GLHMC_CEQPART_PMCEQBASE_SHIFT 0 +#define I40E_GLHMC_CEQPART_PMCEQBASE_MASK (0xFF << I40E_GLHMC_CEQPART_PMCEQBASE_SHIFT) +#define I40E_GLHMC_CEQPART_PMCEQSIZE_SHIFT 16 +#define I40E_GLHMC_CEQPART_PMCEQSIZE_MASK (0x1FF << I40E_GLHMC_CEQPART_PMCEQSIZE_SHIFT) +#define I40E_GLHMC_DBCQPART(_i) (0x00131240 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_DBCQPART_MAX_INDEX 15 +#define I40E_GLHMC_DBCQPART_PMDBCQBASE_SHIFT 0 +#define I40E_GLHMC_DBCQPART_PMDBCQBASE_MASK (0x3FFF << I40E_GLHMC_DBCQPART_PMDBCQBASE_SHIFT) +#define I40E_GLHMC_DBCQPART_PMDBCQSIZE_SHIFT 16 +#define I40E_GLHMC_DBCQPART_PMDBCQSIZE_MASK (0x7FFF << I40E_GLHMC_DBCQPART_PMDBCQSIZE_SHIFT) +#define I40E_GLHMC_DBQPPART(_i) (0x00138D80 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_DBQPPART_MAX_INDEX 15 +#define I40E_GLHMC_DBQPPART_PMDBQPBASE_SHIFT 0 +#define I40E_GLHMC_DBQPPART_PMDBQPBASE_MASK (0x3FFF << I40E_GLHMC_DBQPPART_PMDBQPBASE_SHIFT) +#define I40E_GLHMC_DBQPPART_PMDBQPSIZE_SHIFT 16 +#define I40E_GLHMC_DBQPPART_PMDBQPSIZE_MASK (0x7FFF << I40E_GLHMC_DBQPPART_PMDBQPSIZE_SHIFT) +#define I40E_GLHMC_FCOEDDPBASE(_i) (0x000C6600 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FCOEDDPBASE_MAX_INDEX 15 +#define I40E_GLHMC_FCOEDDPBASE_FPMFCOEDDPBASE_SHIFT 0 +#define I40E_GLHMC_FCOEDDPBASE_FPMFCOEDDPBASE_MASK (0xFFFFFF << I40E_GLHMC_FCOEDDPBASE_FPMFCOEDDPBASE_SHIFT) +#define I40E_GLHMC_FCOEDDPCNT(_i) (0x000C6700 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FCOEDDPCNT_MAX_INDEX 15 +#define I40E_GLHMC_FCOEDDPCNT_FPMFCOEDDPCNT_SHIFT 0 +#define I40E_GLHMC_FCOEDDPCNT_FPMFCOEDDPCNT_MASK (0xFFFFF << I40E_GLHMC_FCOEDDPCNT_FPMFCOEDDPCNT_SHIFT) +#define I40E_GLHMC_FCOEDDPOBJSZ 0x000C2010 +#define I40E_GLHMC_FCOEDDPOBJSZ_PMFCOEDDPOBJSZ_SHIFT 0 +#define I40E_GLHMC_FCOEDDPOBJSZ_PMFCOEDDPOBJSZ_MASK (0xF << I40E_GLHMC_FCOEDDPOBJSZ_PMFCOEDDPOBJSZ_SHIFT) +#define I40E_GLHMC_FCOEFBASE(_i) (0x000C6800 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FCOEFBASE_MAX_INDEX 15 +#define I40E_GLHMC_FCOEFBASE_FPMFCOEFBASE_SHIFT 0 +#define I40E_GLHMC_FCOEFBASE_FPMFCOEFBASE_MASK (0xFFFFFF << I40E_GLHMC_FCOEFBASE_FPMFCOEFBASE_SHIFT) +#define I40E_GLHMC_FCOEFCNT(_i) (0x000C6900 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FCOEFCNT_MAX_INDEX 15 +#define I40E_GLHMC_FCOEFCNT_FPMFCOEFCNT_SHIFT 0 +#define I40E_GLHMC_FCOEFCNT_FPMFCOEFCNT_MASK (0x7FFFFF << I40E_GLHMC_FCOEFCNT_FPMFCOEFCNT_SHIFT) +#define I40E_GLHMC_FCOEFMAX 0x000C20D0 +#define I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT 0 +#define I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK (0xFFFF << I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT) +#define I40E_GLHMC_FCOEFOBJSZ 0x000C2018 +#define I40E_GLHMC_FCOEFOBJSZ_PMFCOEFOBJSZ_SHIFT 0 +#define I40E_GLHMC_FCOEFOBJSZ_PMFCOEFOBJSZ_MASK (0xF << I40E_GLHMC_FCOEFOBJSZ_PMFCOEFOBJSZ_SHIFT) +#define I40E_GLHMC_FCOEMAX 0x000C2014 +#define I40E_GLHMC_FCOEMAX_PMFCOEMAX_SHIFT 0 +#define I40E_GLHMC_FCOEMAX_PMFCOEMAX_MASK (0x1FFF << I40E_GLHMC_FCOEMAX_PMFCOEMAX_SHIFT) +#define I40E_GLHMC_FSIAVBASE(_i) (0x000C5600 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FSIAVBASE_MAX_INDEX 15 +#define I40E_GLHMC_FSIAVBASE_FPMFSIAVBASE_SHIFT 0 +#define I40E_GLHMC_FSIAVBASE_FPMFSIAVBASE_MASK (0xFFFFFF << I40E_GLHMC_FSIAVBASE_FPMFSIAVBASE_SHIFT) +#define I40E_GLHMC_FSIAVCNT(_i) (0x000C5700 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FSIAVCNT_MAX_INDEX 15 +#define I40E_GLHMC_FSIAVCNT_FPMFSIAVCNT_SHIFT 0 +#define I40E_GLHMC_FSIAVCNT_FPMFSIAVCNT_MASK (0x1FFFFFFF << I40E_GLHMC_FSIAVCNT_FPMFSIAVCNT_SHIFT) +#define I40E_GLHMC_FSIAVCNT_RSVD_SHIFT 29 +#define I40E_GLHMC_FSIAVCNT_RSVD_MASK (0x7 << I40E_GLHMC_FSIAVCNT_RSVD_SHIFT) +#define I40E_GLHMC_FSIAVMAX 0x000C2068 +#define I40E_GLHMC_FSIAVMAX_PMFSIAVMAX_SHIFT 0 +#define I40E_GLHMC_FSIAVMAX_PMFSIAVMAX_MASK (0x1FFFF << I40E_GLHMC_FSIAVMAX_PMFSIAVMAX_SHIFT) +#define I40E_GLHMC_FSIAVOBJSZ 0x000C2064 +#define I40E_GLHMC_FSIAVOBJSZ_PMFSIAVOBJSZ_SHIFT 0 +#define I40E_GLHMC_FSIAVOBJSZ_PMFSIAVOBJSZ_MASK (0xF << I40E_GLHMC_FSIAVOBJSZ_PMFSIAVOBJSZ_SHIFT) +#define I40E_GLHMC_FSIMCBASE(_i) (0x000C6000 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FSIMCBASE_MAX_INDEX 15 +#define I40E_GLHMC_FSIMCBASE_FPMFSIMCBASE_SHIFT 0 +#define I40E_GLHMC_FSIMCBASE_FPMFSIMCBASE_MASK (0xFFFFFF << I40E_GLHMC_FSIMCBASE_FPMFSIMCBASE_SHIFT) +#define I40E_GLHMC_FSIMCCNT(_i) (0x000C6100 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_FSIMCCNT_MAX_INDEX 15 +#define I40E_GLHMC_FSIMCCNT_FPMFSIMCSZ_SHIFT 0 +#define I40E_GLHMC_FSIMCCNT_FPMFSIMCSZ_MASK (0x1FFFFFFF << I40E_GLHMC_FSIMCCNT_FPMFSIMCSZ_SHIFT) +#define I40E_GLHMC_FSIMCMAX 0x000C2060 +#define I40E_GLHMC_FSIMCMAX_PMFSIMCMAX_SHIFT 0 +#define I40E_GLHMC_FSIMCMAX_PMFSIMCMAX_MASK (0x3FFF << I40E_GLHMC_FSIMCMAX_PMFSIMCMAX_SHIFT) +#define I40E_GLHMC_FSIMCOBJSZ 0x000C205c +#define I40E_GLHMC_FSIMCOBJSZ_PMFSIMCOBJSZ_SHIFT 0 +#define I40E_GLHMC_FSIMCOBJSZ_PMFSIMCOBJSZ_MASK (0xF << I40E_GLHMC_FSIMCOBJSZ_PMFSIMCOBJSZ_SHIFT) +#define I40E_GLHMC_LANQMAX 0x000C2008 +#define I40E_GLHMC_LANQMAX_PMLANQMAX_SHIFT 0 +#define I40E_GLHMC_LANQMAX_PMLANQMAX_MASK (0x7FF << I40E_GLHMC_LANQMAX_PMLANQMAX_SHIFT) +#define I40E_GLHMC_LANRXBASE(_i) (0x000C6400 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_LANRXBASE_MAX_INDEX 15 +#define I40E_GLHMC_LANRXBASE_FPMLANRXBASE_SHIFT 0 +#define I40E_GLHMC_LANRXBASE_FPMLANRXBASE_MASK (0xFFFFFF << I40E_GLHMC_LANRXBASE_FPMLANRXBASE_SHIFT) +#define I40E_GLHMC_LANRXCNT(_i) (0x000C6500 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_LANRXCNT_MAX_INDEX 15 +#define I40E_GLHMC_LANRXCNT_FPMLANRXCNT_SHIFT 0 +#define I40E_GLHMC_LANRXCNT_FPMLANRXCNT_MASK (0x7FF << I40E_GLHMC_LANRXCNT_FPMLANRXCNT_SHIFT) +#define I40E_GLHMC_LANRXOBJSZ 0x000C200c +#define I40E_GLHMC_LANRXOBJSZ_PMLANRXOBJSZ_SHIFT 0 +#define I40E_GLHMC_LANRXOBJSZ_PMLANRXOBJSZ_MASK (0xF << I40E_GLHMC_LANRXOBJSZ_PMLANRXOBJSZ_SHIFT) +#define I40E_GLHMC_LANTXBASE(_i) (0x000C6200 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_LANTXBASE_MAX_INDEX 15 +#define I40E_GLHMC_LANTXBASE_FPMLANTXBASE_SHIFT 0 +#define I40E_GLHMC_LANTXBASE_FPMLANTXBASE_MASK (0xFFFFFF << I40E_GLHMC_LANTXBASE_FPMLANTXBASE_SHIFT) +#define I40E_GLHMC_LANTXBASE_RSVD_SHIFT 24 +#define I40E_GLHMC_LANTXBASE_RSVD_MASK (0xFF << I40E_GLHMC_LANTXBASE_RSVD_SHIFT) +#define I40E_GLHMC_LANTXCNT(_i) (0x000C6300 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_LANTXCNT_MAX_INDEX 15 +#define I40E_GLHMC_LANTXCNT_FPMLANTXCNT_SHIFT 0 +#define I40E_GLHMC_LANTXCNT_FPMLANTXCNT_MASK (0x7FF << I40E_GLHMC_LANTXCNT_FPMLANTXCNT_SHIFT) +#define I40E_GLHMC_LANTXOBJSZ 0x000C2004 +#define I40E_GLHMC_LANTXOBJSZ_PMLANTXOBJSZ_SHIFT 0 +#define I40E_GLHMC_LANTXOBJSZ_PMLANTXOBJSZ_MASK (0xF << I40E_GLHMC_LANTXOBJSZ_PMLANTXOBJSZ_SHIFT) +#define I40E_GLHMC_PEARPBASE(_i) (0x000C4800 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEARPBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEARPBASE_FPMPEARPBASE_SHIFT 0 +#define I40E_GLHMC_PEARPBASE_FPMPEARPBASE_MASK (0xFFFFFF << I40E_GLHMC_PEARPBASE_FPMPEARPBASE_SHIFT) +#define I40E_GLHMC_PEARPCNT(_i) (0x000C4900 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEARPCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEARPCNT_FPMPEARPCNT_SHIFT 0 +#define I40E_GLHMC_PEARPCNT_FPMPEARPCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEARPCNT_FPMPEARPCNT_SHIFT) +#define I40E_GLHMC_PEARPMAX 0x000C2038 +#define I40E_GLHMC_PEARPMAX_PMPEARPMAX_SHIFT 0 +#define I40E_GLHMC_PEARPMAX_PMPEARPMAX_MASK (0x1FFFF << I40E_GLHMC_PEARPMAX_PMPEARPMAX_SHIFT) +#define I40E_GLHMC_PEARPOBJSZ 0x000C2034 +#define I40E_GLHMC_PEARPOBJSZ_PMPEARPOBJSZ_SHIFT 0 +#define I40E_GLHMC_PEARPOBJSZ_PMPEARPOBJSZ_MASK (0x7 << I40E_GLHMC_PEARPOBJSZ_PMPEARPOBJSZ_SHIFT) +#define I40E_GLHMC_PECQBASE(_i) (0x000C4200 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PECQBASE_MAX_INDEX 15 +#define I40E_GLHMC_PECQBASE_FPMPECQBASE_SHIFT 0 +#define I40E_GLHMC_PECQBASE_FPMPECQBASE_MASK (0xFFFFFF << I40E_GLHMC_PECQBASE_FPMPECQBASE_SHIFT) +#define I40E_GLHMC_PECQCNT(_i) (0x000C4300 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PECQCNT_MAX_INDEX 15 +#define I40E_GLHMC_PECQCNT_FPMPECQCNT_SHIFT 0 +#define I40E_GLHMC_PECQCNT_FPMPECQCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PECQCNT_FPMPECQCNT_SHIFT) +#define I40E_GLHMC_PECQOBJSZ 0x000C2020 +#define I40E_GLHMC_PECQOBJSZ_PMPECQOBJSZ_SHIFT 0 +#define I40E_GLHMC_PECQOBJSZ_PMPECQOBJSZ_MASK (0xF << I40E_GLHMC_PECQOBJSZ_PMPECQOBJSZ_SHIFT) +#define I40E_GLHMC_PEHTCNT(_i) (0x000C4700 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEHTCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEHTCNT_FPMPEHTCNT_SHIFT 0 +#define I40E_GLHMC_PEHTCNT_FPMPEHTCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEHTCNT_FPMPEHTCNT_SHIFT) +#define I40E_GLHMC_PEHTEBASE(_i) (0x000C4600 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEHTEBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEHTEBASE_FPMPEHTEBASE_SHIFT 0 +#define I40E_GLHMC_PEHTEBASE_FPMPEHTEBASE_MASK (0xFFFFFF << I40E_GLHMC_PEHTEBASE_FPMPEHTEBASE_SHIFT) +#define I40E_GLHMC_PEHTEOBJSZ 0x000C202c +#define I40E_GLHMC_PEHTEOBJSZ_PMPEHTEOBJSZ_SHIFT 0 +#define I40E_GLHMC_PEHTEOBJSZ_PMPEHTEOBJSZ_MASK (0xF << I40E_GLHMC_PEHTEOBJSZ_PMPEHTEOBJSZ_SHIFT) +#define I40E_GLHMC_PEHTMAX 0x000C2030 +#define I40E_GLHMC_PEHTMAX_PMPEHTMAX_SHIFT 0 +#define I40E_GLHMC_PEHTMAX_PMPEHTMAX_MASK (0x1FFFFF << I40E_GLHMC_PEHTMAX_PMPEHTMAX_SHIFT) +#define I40E_GLHMC_PEMRBASE(_i) (0x000C4c00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEMRBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEMRBASE_FPMPEMRBASE_SHIFT 0 +#define I40E_GLHMC_PEMRBASE_FPMPEMRBASE_MASK (0xFFFFFF << I40E_GLHMC_PEMRBASE_FPMPEMRBASE_SHIFT) +#define I40E_GLHMC_PEMRCNT(_i) (0x000C4d00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEMRCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEMRCNT_FPMPEMRSZ_SHIFT 0 +#define I40E_GLHMC_PEMRCNT_FPMPEMRSZ_MASK (0x1FFFFFFF << I40E_GLHMC_PEMRCNT_FPMPEMRSZ_SHIFT) +#define I40E_GLHMC_PEMRMAX 0x000C2040 +#define I40E_GLHMC_PEMRMAX_PMPEMRMAX_SHIFT 0 +#define I40E_GLHMC_PEMRMAX_PMPEMRMAX_MASK (0x7FFFFF << I40E_GLHMC_PEMRMAX_PMPEMRMAX_SHIFT) +#define I40E_GLHMC_PEMROBJSZ 0x000C203c +#define I40E_GLHMC_PEMROBJSZ_PMPEMROBJSZ_SHIFT 0 +#define I40E_GLHMC_PEMROBJSZ_PMPEMROBJSZ_MASK (0xF << I40E_GLHMC_PEMROBJSZ_PMPEMROBJSZ_SHIFT) +#define I40E_GLHMC_PEPBLBASE(_i) (0x000C5800 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEPBLBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEPBLBASE_FPMPEPBLBASE_SHIFT 0 +#define I40E_GLHMC_PEPBLBASE_FPMPEPBLBASE_MASK (0xFFFFFF << I40E_GLHMC_PEPBLBASE_FPMPEPBLBASE_SHIFT) +#define I40E_GLHMC_PEPBLCNT(_i) (0x000C5900 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEPBLCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEPBLCNT_FPMPEPBLCNT_SHIFT 0 +#define I40E_GLHMC_PEPBLCNT_FPMPEPBLCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEPBLCNT_FPMPEPBLCNT_SHIFT) +#define I40E_GLHMC_PEPBLMAX 0x000C206c +#define I40E_GLHMC_PEPBLMAX_PMPEPBLMAX_SHIFT 0 +#define I40E_GLHMC_PEPBLMAX_PMPEPBLMAX_MASK (0x1FFFFFFF << I40E_GLHMC_PEPBLMAX_PMPEPBLMAX_SHIFT) +#define I40E_GLHMC_PEQ1BASE(_i) (0x000C5200 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEQ1BASE_MAX_INDEX 15 +#define I40E_GLHMC_PEQ1BASE_FPMPEQ1BASE_SHIFT 0 +#define I40E_GLHMC_PEQ1BASE_FPMPEQ1BASE_MASK (0xFFFFFF << I40E_GLHMC_PEQ1BASE_FPMPEQ1BASE_SHIFT) +#define I40E_GLHMC_PEQ1CNT(_i) (0x000C5300 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEQ1CNT_MAX_INDEX 15 +#define I40E_GLHMC_PEQ1CNT_FPMPEQ1CNT_SHIFT 0 +#define I40E_GLHMC_PEQ1CNT_FPMPEQ1CNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEQ1CNT_FPMPEQ1CNT_SHIFT) +#define I40E_GLHMC_PEQ1FLBASE(_i) (0x000C5400 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEQ1FLBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEQ1FLBASE_FPMPEQ1FLBASE_SHIFT 0 +#define I40E_GLHMC_PEQ1FLBASE_FPMPEQ1FLBASE_MASK (0xFFFFFF << I40E_GLHMC_PEQ1FLBASE_FPMPEQ1FLBASE_SHIFT) +#define I40E_GLHMC_PEQ1FLCNT(_i) (0x000C5500 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEQ1FLCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEQ1FLCNT_FPMPEQ1FLCNT_SHIFT 0 +#define I40E_GLHMC_PEQ1FLCNT_FPMPEQ1FLCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEQ1FLCNT_FPMPEQ1FLCNT_SHIFT) +#define I40E_GLHMC_PEQ1FLMAX 0x000C2058 +#define I40E_GLHMC_PEQ1FLMAX_PMPEQ1FLMAX_SHIFT 0 +#define I40E_GLHMC_PEQ1FLMAX_PMPEQ1FLMAX_MASK (0x3FFFFFF << I40E_GLHMC_PEQ1FLMAX_PMPEQ1FLMAX_SHIFT) +#define I40E_GLHMC_PEQ1MAX 0x000C2054 +#define I40E_GLHMC_PEQ1MAX_PMPEQ1MAX_SHIFT 0 +#define I40E_GLHMC_PEQ1MAX_PMPEQ1MAX_MASK (0x3FFFFFF << I40E_GLHMC_PEQ1MAX_PMPEQ1MAX_SHIFT) +#define I40E_GLHMC_PEQ1OBJSZ 0x000C2050 +#define I40E_GLHMC_PEQ1OBJSZ_PMPEQ1OBJSZ_SHIFT 0 +#define I40E_GLHMC_PEQ1OBJSZ_PMPEQ1OBJSZ_MASK (0xF << I40E_GLHMC_PEQ1OBJSZ_PMPEQ1OBJSZ_SHIFT) +#define I40E_GLHMC_PEQPBASE(_i) (0x000C4000 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEQPBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEQPBASE_FPMPEQPBASE_SHIFT 0 +#define I40E_GLHMC_PEQPBASE_FPMPEQPBASE_MASK (0xFFFFFF << I40E_GLHMC_PEQPBASE_FPMPEQPBASE_SHIFT) +#define I40E_GLHMC_PEQPCNT(_i) (0x000C4100 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEQPCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEQPCNT_FPMPEQPCNT_SHIFT 0 +#define I40E_GLHMC_PEQPCNT_FPMPEQPCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEQPCNT_FPMPEQPCNT_SHIFT) +#define I40E_GLHMC_PEQPOBJSZ 0x000C201c +#define I40E_GLHMC_PEQPOBJSZ_PMPEQPOBJSZ_SHIFT 0 +#define I40E_GLHMC_PEQPOBJSZ_PMPEQPOBJSZ_MASK (0xF << I40E_GLHMC_PEQPOBJSZ_PMPEQPOBJSZ_SHIFT) +#define I40E_GLHMC_PESRQBASE(_i) (0x000C4400 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PESRQBASE_MAX_INDEX 15 +#define I40E_GLHMC_PESRQBASE_FPMPESRQBASE_SHIFT 0 +#define I40E_GLHMC_PESRQBASE_FPMPESRQBASE_MASK (0xFFFFFF << I40E_GLHMC_PESRQBASE_FPMPESRQBASE_SHIFT) +#define I40E_GLHMC_PESRQCNT(_i) (0x000C4500 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PESRQCNT_MAX_INDEX 15 +#define I40E_GLHMC_PESRQCNT_FPMPESRQCNT_SHIFT 0 +#define I40E_GLHMC_PESRQCNT_FPMPESRQCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PESRQCNT_FPMPESRQCNT_SHIFT) +#define I40E_GLHMC_PESRQMAX 0x000C2028 +#define I40E_GLHMC_PESRQMAX_PMPESRQMAX_SHIFT 0 +#define I40E_GLHMC_PESRQMAX_PMPESRQMAX_MASK (0xFFFF << I40E_GLHMC_PESRQMAX_PMPESRQMAX_SHIFT) +#define I40E_GLHMC_PESRQOBJSZ 0x000C2024 +#define I40E_GLHMC_PESRQOBJSZ_PMPESRQOBJSZ_SHIFT 0 +#define I40E_GLHMC_PESRQOBJSZ_PMPESRQOBJSZ_MASK (0xF << I40E_GLHMC_PESRQOBJSZ_PMPESRQOBJSZ_SHIFT) +#define I40E_GLHMC_PESRQOBJSZ_RSVD_SHIFT 4 +#define I40E_GLHMC_PESRQOBJSZ_RSVD_MASK (0xFFFFFFF << I40E_GLHMC_PESRQOBJSZ_RSVD_SHIFT) +#define I40E_GLHMC_PETIMERBASE(_i) (0x000C5A00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PETIMERBASE_MAX_INDEX 15 +#define I40E_GLHMC_PETIMERBASE_FPMPETIMERBASE_SHIFT 0 +#define I40E_GLHMC_PETIMERBASE_FPMPETIMERBASE_MASK (0xFFFFFF << I40E_GLHMC_PETIMERBASE_FPMPETIMERBASE_SHIFT) +#define I40E_GLHMC_PETIMERCNT(_i) (0x000C5B00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PETIMERCNT_MAX_INDEX 15 +#define I40E_GLHMC_PETIMERCNT_FPMPETIMERCNT_SHIFT 0 +#define I40E_GLHMC_PETIMERCNT_FPMPETIMERCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PETIMERCNT_FPMPETIMERCNT_SHIFT) +#define I40E_GLHMC_PETIMERMAX 0x000C2084 +#define I40E_GLHMC_PETIMERMAX_PMPETIMERMAX_SHIFT 0 +#define I40E_GLHMC_PETIMERMAX_PMPETIMERMAX_MASK (0x1FFFFFFF << I40E_GLHMC_PETIMERMAX_PMPETIMERMAX_SHIFT) +#define I40E_GLHMC_PETIMEROBJSZ 0x000C2080 +#define I40E_GLHMC_PETIMEROBJSZ_PMPETIMEROBJSZ_SHIFT 0 +#define I40E_GLHMC_PETIMEROBJSZ_PMPETIMEROBJSZ_MASK (0xF << I40E_GLHMC_PETIMEROBJSZ_PMPETIMEROBJSZ_SHIFT) +#define I40E_GLHMC_PEXFBASE(_i) (0x000C4e00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEXFBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEXFBASE_FPMPEXFBASE_SHIFT 0 +#define I40E_GLHMC_PEXFBASE_FPMPEXFBASE_MASK (0xFFFFFF << I40E_GLHMC_PEXFBASE_FPMPEXFBASE_SHIFT) +#define I40E_GLHMC_PEXFCNT(_i) (0x000C4f00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEXFCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEXFCNT_FPMPEXFCNT_SHIFT 0 +#define I40E_GLHMC_PEXFCNT_FPMPEXFCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEXFCNT_FPMPEXFCNT_SHIFT) +#define I40E_GLHMC_PEXFFLBASE(_i) (0x000C5000 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEXFFLBASE_MAX_INDEX 15 +#define I40E_GLHMC_PEXFFLBASE_FPMPEXFFLBASE_SHIFT 0 +#define I40E_GLHMC_PEXFFLBASE_FPMPEXFFLBASE_MASK (0xFFFFFF << I40E_GLHMC_PEXFFLBASE_FPMPEXFFLBASE_SHIFT) +#define I40E_GLHMC_PEXFFLCNT(_i) (0x000C5100 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PEXFFLCNT_MAX_INDEX 15 +#define I40E_GLHMC_PEXFFLCNT_FPMPEXFFLCNT_SHIFT 0 +#define I40E_GLHMC_PEXFFLCNT_FPMPEXFFLCNT_MASK (0x1FFFFFFF << I40E_GLHMC_PEXFFLCNT_FPMPEXFFLCNT_SHIFT) +#define I40E_GLHMC_PEXFFLMAX 0x000C204c +#define I40E_GLHMC_PEXFFLMAX_PMPEXFFLMAX_SHIFT 0 +#define I40E_GLHMC_PEXFFLMAX_PMPEXFFLMAX_MASK (0x1FFFFFF << I40E_GLHMC_PEXFFLMAX_PMPEXFFLMAX_SHIFT) +#define I40E_GLHMC_PEXFMAX 0x000C2048 +#define I40E_GLHMC_PEXFMAX_PMPEXFMAX_SHIFT 0 +#define I40E_GLHMC_PEXFMAX_PMPEXFMAX_MASK (0x3FFFFFF << I40E_GLHMC_PEXFMAX_PMPEXFMAX_SHIFT) +#define I40E_GLHMC_PEXFOBJSZ 0x000C2044 +#define I40E_GLHMC_PEXFOBJSZ_PMPEXFOBJSZ_SHIFT 0 +#define I40E_GLHMC_PEXFOBJSZ_PMPEXFOBJSZ_MASK (0xF << I40E_GLHMC_PEXFOBJSZ_PMPEXFOBJSZ_SHIFT) +#define I40E_GLHMC_PEXFOBJSZ_RSVD_SHIFT 4 +#define I40E_GLHMC_PEXFOBJSZ_RSVD_MASK (0xFFFFFFF << I40E_GLHMC_PEXFOBJSZ_RSVD_SHIFT) +#define I40E_GLHMC_PFASSIGN(_i) (0x000C0c00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_PFASSIGN_MAX_INDEX 15 +#define I40E_GLHMC_PFASSIGN_PMFCNPFASSIGN_SHIFT 0 +#define I40E_GLHMC_PFASSIGN_PMFCNPFASSIGN_MASK (0xF << I40E_GLHMC_PFASSIGN_PMFCNPFASSIGN_SHIFT) +#define I40E_GLHMC_SDPART(_i) (0x000C0800 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLHMC_SDPART_MAX_INDEX 15 +#define I40E_GLHMC_SDPART_PMSDBASE_SHIFT 0 +#define I40E_GLHMC_SDPART_PMSDBASE_MASK (0xFFF << I40E_GLHMC_SDPART_PMSDBASE_SHIFT) +#define I40E_GLHMC_SDPART_PMSDSIZE_SHIFT 16 +#define I40E_GLHMC_SDPART_PMSDSIZE_MASK (0x1FFF << I40E_GLHMC_SDPART_PMSDSIZE_SHIFT) +#define I40E_GLHMC_VFAPBVTINUSEBASE(_i) (0x000Cca00 + ((_i) * 4)) +#define I40E_GLHMC_VFAPBVTINUSEBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFAPBVTINUSEBASE_FPMAPBINUSEBASE_SHIFT 0 +#define I40E_GLHMC_VFAPBVTINUSEBASE_FPMAPBINUSEBASE_MASK (0xFFFFFF << I40E_GLHMC_VFAPBVTINUSEBASE_FPMAPBINUSEBASE_SHIFT) +#define I40E_GLHMC_VFCEQPART(_i) (0x00132240 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFCEQPART_MAX_INDEX 31 +#define I40E_GLHMC_VFCEQPART_PMCEQBASE_SHIFT 0 +#define I40E_GLHMC_VFCEQPART_PMCEQBASE_MASK (0xFF << I40E_GLHMC_VFCEQPART_PMCEQBASE_SHIFT) +#define I40E_GLHMC_VFCEQPART_PMCEQSIZE_SHIFT 16 +#define I40E_GLHMC_VFCEQPART_PMCEQSIZE_MASK (0x1FF << I40E_GLHMC_VFCEQPART_PMCEQSIZE_SHIFT) +#define I40E_GLHMC_VFDBCQPART(_i) (0x00132140 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFDBCQPART_MAX_INDEX 31 +#define I40E_GLHMC_VFDBCQPART_PMDBCQBASE_SHIFT 0 +#define I40E_GLHMC_VFDBCQPART_PMDBCQBASE_MASK (0x3FFF << I40E_GLHMC_VFDBCQPART_PMDBCQBASE_SHIFT) +#define I40E_GLHMC_VFDBCQPART_PMDBCQSIZE_SHIFT 16 +#define I40E_GLHMC_VFDBCQPART_PMDBCQSIZE_MASK (0x7FFF << I40E_GLHMC_VFDBCQPART_PMDBCQSIZE_SHIFT) +#define I40E_GLHMC_VFDBQPPART(_i) (0x00138E00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFDBQPPART_MAX_INDEX 31 +#define I40E_GLHMC_VFDBQPPART_PMDBQPBASE_SHIFT 0 +#define I40E_GLHMC_VFDBQPPART_PMDBQPBASE_MASK (0x3FFF << I40E_GLHMC_VFDBQPPART_PMDBQPBASE_SHIFT) +#define I40E_GLHMC_VFDBQPPART_PMDBQPSIZE_SHIFT 16 +#define I40E_GLHMC_VFDBQPPART_PMDBQPSIZE_MASK (0x7FFF << I40E_GLHMC_VFDBQPPART_PMDBQPSIZE_SHIFT) +#define I40E_GLHMC_VFFSIAVBASE(_i) (0x000Cd600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFFSIAVBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFFSIAVBASE_FPMFSIAVBASE_SHIFT 0 +#define I40E_GLHMC_VFFSIAVBASE_FPMFSIAVBASE_MASK (0xFFFFFF << I40E_GLHMC_VFFSIAVBASE_FPMFSIAVBASE_SHIFT) +#define I40E_GLHMC_VFFSIAVCNT(_i) (0x000Cd700 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFFSIAVCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFFSIAVCNT_FPMFSIAVCNT_SHIFT 0 +#define I40E_GLHMC_VFFSIAVCNT_FPMFSIAVCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFFSIAVCNT_FPMFSIAVCNT_SHIFT) +#define I40E_GLHMC_VFFSIAVCNT_RSVD_SHIFT 29 +#define I40E_GLHMC_VFFSIAVCNT_RSVD_MASK (0x7 << I40E_GLHMC_VFFSIAVCNT_RSVD_SHIFT) +#define I40E_GLHMC_VFPDINV(_i) (0x000C8300 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPDINV_MAX_INDEX 31 +#define I40E_GLHMC_VFPDINV_PMSDIDX_SHIFT 0 +#define I40E_GLHMC_VFPDINV_PMSDIDX_MASK (0xFFF << I40E_GLHMC_VFPDINV_PMSDIDX_SHIFT) +#define I40E_GLHMC_VFPDINV_PMPDIDX_SHIFT 16 +#define I40E_GLHMC_VFPDINV_PMPDIDX_MASK (0x1FF << I40E_GLHMC_VFPDINV_PMPDIDX_SHIFT) +#define I40E_GLHMC_VFPEARPBASE(_i) (0x000Cc800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEARPBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEARPBASE_FPMPEARPBASE_SHIFT 0 +#define I40E_GLHMC_VFPEARPBASE_FPMPEARPBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEARPBASE_FPMPEARPBASE_SHIFT) +#define I40E_GLHMC_VFPEARPCNT(_i) (0x000Cc900 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEARPCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEARPCNT_FPMPEARPCNT_SHIFT 0 +#define I40E_GLHMC_VFPEARPCNT_FPMPEARPCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEARPCNT_FPMPEARPCNT_SHIFT) +#define I40E_GLHMC_VFPECQBASE(_i) (0x000Cc200 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPECQBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPECQBASE_FPMPECQBASE_SHIFT 0 +#define I40E_GLHMC_VFPECQBASE_FPMPECQBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPECQBASE_FPMPECQBASE_SHIFT) +#define I40E_GLHMC_VFPECQCNT(_i) (0x000Cc300 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPECQCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPECQCNT_FPMPECQCNT_SHIFT 0 +#define I40E_GLHMC_VFPECQCNT_FPMPECQCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPECQCNT_FPMPECQCNT_SHIFT) +#define I40E_GLHMC_VFPEHTCNT(_i) (0x000Cc700 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEHTCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEHTCNT_FPMPEHTCNT_SHIFT 0 +#define I40E_GLHMC_VFPEHTCNT_FPMPEHTCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEHTCNT_FPMPEHTCNT_SHIFT) +#define I40E_GLHMC_VFPEHTEBASE(_i) (0x000Cc600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEHTEBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEHTEBASE_FPMPEHTEBASE_SHIFT 0 +#define I40E_GLHMC_VFPEHTEBASE_FPMPEHTEBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEHTEBASE_FPMPEHTEBASE_SHIFT) +#define I40E_GLHMC_VFPEMRBASE(_i) (0x000Ccc00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEMRBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEMRBASE_FPMPEMRBASE_SHIFT 0 +#define I40E_GLHMC_VFPEMRBASE_FPMPEMRBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEMRBASE_FPMPEMRBASE_SHIFT) +#define I40E_GLHMC_VFPEMRCNT(_i) (0x000Ccd00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEMRCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEMRCNT_FPMPEMRSZ_SHIFT 0 +#define I40E_GLHMC_VFPEMRCNT_FPMPEMRSZ_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEMRCNT_FPMPEMRSZ_SHIFT) +#define I40E_GLHMC_VFPEPBLBASE(_i) (0x000Cd800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEPBLBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEPBLBASE_FPMPEPBLBASE_SHIFT 0 +#define I40E_GLHMC_VFPEPBLBASE_FPMPEPBLBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEPBLBASE_FPMPEPBLBASE_SHIFT) +#define I40E_GLHMC_VFPEPBLCNT(_i) (0x000Cd900 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEPBLCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEPBLCNT_FPMPEPBLCNT_SHIFT 0 +#define I40E_GLHMC_VFPEPBLCNT_FPMPEPBLCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEPBLCNT_FPMPEPBLCNT_SHIFT) +#define I40E_GLHMC_VFPEQ1BASE(_i) (0x000Cd200 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEQ1BASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEQ1BASE_FPMPEQ1BASE_SHIFT 0 +#define I40E_GLHMC_VFPEQ1BASE_FPMPEQ1BASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEQ1BASE_FPMPEQ1BASE_SHIFT) +#define I40E_GLHMC_VFPEQ1CNT(_i) (0x000Cd300 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEQ1CNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEQ1CNT_FPMPEQ1CNT_SHIFT 0 +#define I40E_GLHMC_VFPEQ1CNT_FPMPEQ1CNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEQ1CNT_FPMPEQ1CNT_SHIFT) +#define I40E_GLHMC_VFPEQ1FLBASE(_i) (0x000Cd400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEQ1FLBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEQ1FLBASE_FPMPEQ1FLBASE_SHIFT 0 +#define I40E_GLHMC_VFPEQ1FLBASE_FPMPEQ1FLBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEQ1FLBASE_FPMPEQ1FLBASE_SHIFT) +#define I40E_GLHMC_VFPEQ1FLCNT(_i) (0x000Cd500 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEQ1FLCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEQ1FLCNT_FPMPEQ1FLCNT_SHIFT 0 +#define I40E_GLHMC_VFPEQ1FLCNT_FPMPEQ1FLCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEQ1FLCNT_FPMPEQ1FLCNT_SHIFT) +#define I40E_GLHMC_VFPEQPBASE(_i) (0x000Cc000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEQPBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEQPBASE_FPMPEQPBASE_SHIFT 0 +#define I40E_GLHMC_VFPEQPBASE_FPMPEQPBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEQPBASE_FPMPEQPBASE_SHIFT) +#define I40E_GLHMC_VFPEQPCNT(_i) (0x000Cc100 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEQPCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEQPCNT_FPMPEQPCNT_SHIFT 0 +#define I40E_GLHMC_VFPEQPCNT_FPMPEQPCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEQPCNT_FPMPEQPCNT_SHIFT) +#define I40E_GLHMC_VFPESRQBASE(_i) (0x000Cc400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPESRQBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPESRQBASE_FPMPESRQBASE_SHIFT 0 +#define I40E_GLHMC_VFPESRQBASE_FPMPESRQBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPESRQBASE_FPMPESRQBASE_SHIFT) +#define I40E_GLHMC_VFPESRQCNT(_i) (0x000Cc500 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPESRQCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPESRQCNT_FPMPESRQCNT_SHIFT 0 +#define I40E_GLHMC_VFPESRQCNT_FPMPESRQCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPESRQCNT_FPMPESRQCNT_SHIFT) +#define I40E_GLHMC_VFPETIMERBASE(_i) (0x000CDA00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPETIMERBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPETIMERBASE_FPMPETIMERBASE_SHIFT 0 +#define I40E_GLHMC_VFPETIMERBASE_FPMPETIMERBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPETIMERBASE_FPMPETIMERBASE_SHIFT) +#define I40E_GLHMC_VFPETIMERCNT(_i) (0x000CDB00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPETIMERCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPETIMERCNT_FPMPETIMERCNT_SHIFT 0 +#define I40E_GLHMC_VFPETIMERCNT_FPMPETIMERCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPETIMERCNT_FPMPETIMERCNT_SHIFT) +#define I40E_GLHMC_VFPEXFBASE(_i) (0x000Cce00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEXFBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEXFBASE_FPMPEXFBASE_SHIFT 0 +#define I40E_GLHMC_VFPEXFBASE_FPMPEXFBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEXFBASE_FPMPEXFBASE_SHIFT) +#define I40E_GLHMC_VFPEXFCNT(_i) (0x000Ccf00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEXFCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEXFCNT_FPMPEXFCNT_SHIFT 0 +#define I40E_GLHMC_VFPEXFCNT_FPMPEXFCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEXFCNT_FPMPEXFCNT_SHIFT) +#define I40E_GLHMC_VFPEXFFLBASE(_i) (0x000Cd000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEXFFLBASE_MAX_INDEX 31 +#define I40E_GLHMC_VFPEXFFLBASE_FPMPEXFFLBASE_SHIFT 0 +#define I40E_GLHMC_VFPEXFFLBASE_FPMPEXFFLBASE_MASK (0xFFFFFF << I40E_GLHMC_VFPEXFFLBASE_FPMPEXFFLBASE_SHIFT) +#define I40E_GLHMC_VFPEXFFLCNT(_i) (0x000Cd100 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFPEXFFLCNT_MAX_INDEX 31 +#define I40E_GLHMC_VFPEXFFLCNT_FPMPEXFFLCNT_SHIFT 0 +#define I40E_GLHMC_VFPEXFFLCNT_FPMPEXFFLCNT_MASK (0x1FFFFFFF << I40E_GLHMC_VFPEXFFLCNT_FPMPEXFFLCNT_SHIFT) +#define I40E_GLHMC_VFSDPART(_i) (0x000C8800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLHMC_VFSDPART_MAX_INDEX 31 +#define I40E_GLHMC_VFSDPART_PMSDBASE_SHIFT 0 +#define I40E_GLHMC_VFSDPART_PMSDBASE_MASK (0xFFF << I40E_GLHMC_VFSDPART_PMSDBASE_SHIFT) +#define I40E_GLHMC_VFSDPART_PMSDSIZE_SHIFT 16 +#define I40E_GLHMC_VFSDPART_PMSDSIZE_MASK (0x1FFF << I40E_GLHMC_VFSDPART_PMSDSIZE_SHIFT) +#define I40E_PFHMC_ERRORDATA 0x000C0500 +#define I40E_PFHMC_ERRORDATA_HMC_ERROR_DATA_SHIFT 0 +#define I40E_PFHMC_ERRORDATA_HMC_ERROR_DATA_MASK (0x3FFFFFFF << I40E_PFHMC_ERRORDATA_HMC_ERROR_DATA_SHIFT) +#define I40E_PFHMC_ERRORINFO 0x000C0400 +#define I40E_PFHMC_ERRORINFO_PMF_INDEX_SHIFT 0 +#define I40E_PFHMC_ERRORINFO_PMF_INDEX_MASK (0x1F << I40E_PFHMC_ERRORINFO_PMF_INDEX_SHIFT) +#define I40E_PFHMC_ERRORINFO_PMF_ISVF_SHIFT 7 +#define I40E_PFHMC_ERRORINFO_PMF_ISVF_MASK (0x1 << I40E_PFHMC_ERRORINFO_PMF_ISVF_SHIFT) +#define I40E_PFHMC_ERRORINFO_HMC_ERROR_TYPE_SHIFT 8 +#define I40E_PFHMC_ERRORINFO_HMC_ERROR_TYPE_MASK (0xF << I40E_PFHMC_ERRORINFO_HMC_ERROR_TYPE_SHIFT) +#define I40E_PFHMC_ERRORINFO_HMC_OBJECT_TYPE_SHIFT 16 +#define I40E_PFHMC_ERRORINFO_HMC_OBJECT_TYPE_MASK (0x1F << I40E_PFHMC_ERRORINFO_HMC_OBJECT_TYPE_SHIFT) +#define I40E_PFHMC_ERRORINFO_ERROR_DETECTED_SHIFT 31 +#define I40E_PFHMC_ERRORINFO_ERROR_DETECTED_MASK (0x1 << I40E_PFHMC_ERRORINFO_ERROR_DETECTED_SHIFT) +#define I40E_PFHMC_PDINV 0x000C0300 +#define I40E_PFHMC_PDINV_PMSDIDX_SHIFT 0 +#define I40E_PFHMC_PDINV_PMSDIDX_MASK (0xFFF << I40E_PFHMC_PDINV_PMSDIDX_SHIFT) +#define I40E_PFHMC_PDINV_PMPDIDX_SHIFT 16 +#define I40E_PFHMC_PDINV_PMPDIDX_MASK (0x1FF << I40E_PFHMC_PDINV_PMPDIDX_SHIFT) +#define I40E_PFHMC_SDCMD 0x000C0000 +#define I40E_PFHMC_SDCMD_PMSDIDX_SHIFT 0 +#define I40E_PFHMC_SDCMD_PMSDIDX_MASK (0xFFF << I40E_PFHMC_SDCMD_PMSDIDX_SHIFT) +#define I40E_PFHMC_SDCMD_PMSDWR_SHIFT 31 +#define I40E_PFHMC_SDCMD_PMSDWR_MASK (0x1 << I40E_PFHMC_SDCMD_PMSDWR_SHIFT) +#define I40E_PFHMC_SDDATAHIGH 0x000C0200 +#define I40E_PFHMC_SDDATAHIGH_PMSDDATAHIGH_SHIFT 0 +#define I40E_PFHMC_SDDATAHIGH_PMSDDATAHIGH_MASK (0xFFFFFFFF << I40E_PFHMC_SDDATAHIGH_PMSDDATAHIGH_SHIFT) +#define I40E_PFHMC_SDDATALOW 0x000C0100 +#define I40E_PFHMC_SDDATALOW_PMSDVALID_SHIFT 0 +#define I40E_PFHMC_SDDATALOW_PMSDVALID_MASK (0x1 << I40E_PFHMC_SDDATALOW_PMSDVALID_SHIFT) +#define I40E_PFHMC_SDDATALOW_PMSDTYPE_SHIFT 1 +#define I40E_PFHMC_SDDATALOW_PMSDTYPE_MASK (0x1 << I40E_PFHMC_SDDATALOW_PMSDTYPE_SHIFT) +#define I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_SHIFT 2 +#define I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_MASK (0x3FF << I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_SHIFT) +#define I40E_PFHMC_SDDATALOW_PMSDDATALOW_SHIFT 12 +#define I40E_PFHMC_SDDATALOW_PMSDDATALOW_MASK (0xFFFFF << I40E_PFHMC_SDDATALOW_PMSDDATALOW_SHIFT) +#define I40E_GL_UFUSE 0x00094008 +#define I40E_GL_UFUSE_FOUR_PORT_ENABLE_SHIFT 1 +#define I40E_GL_UFUSE_FOUR_PORT_ENABLE_MASK (0x1 << I40E_GL_UFUSE_FOUR_PORT_ENABLE_SHIFT) +#define I40E_GL_UFUSE_NIC_ID_SHIFT 2 +#define I40E_GL_UFUSE_NIC_ID_MASK (0x1 << I40E_GL_UFUSE_NIC_ID_SHIFT) +#define I40E_GL_UFUSE_ULT_LOCKOUT_SHIFT 10 +#define I40E_GL_UFUSE_ULT_LOCKOUT_MASK (0x1 << I40E_GL_UFUSE_ULT_LOCKOUT_SHIFT) +#define I40E_GL_UFUSE_CLS_LOCKOUT_SHIFT 11 +#define I40E_GL_UFUSE_CLS_LOCKOUT_MASK (0x1 << I40E_GL_UFUSE_CLS_LOCKOUT_SHIFT) +#define I40E_EMPINT_GPIO_ENA 0x00088188 +#define I40E_EMPINT_GPIO_ENA_GPIO0_ENA_SHIFT 0 +#define I40E_EMPINT_GPIO_ENA_GPIO0_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO0_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO1_ENA_SHIFT 1 +#define I40E_EMPINT_GPIO_ENA_GPIO1_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO1_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO2_ENA_SHIFT 2 +#define I40E_EMPINT_GPIO_ENA_GPIO2_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO2_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO3_ENA_SHIFT 3 +#define I40E_EMPINT_GPIO_ENA_GPIO3_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO3_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO4_ENA_SHIFT 4 +#define I40E_EMPINT_GPIO_ENA_GPIO4_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO4_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO5_ENA_SHIFT 5 +#define I40E_EMPINT_GPIO_ENA_GPIO5_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO5_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO6_ENA_SHIFT 6 +#define I40E_EMPINT_GPIO_ENA_GPIO6_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO6_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO7_ENA_SHIFT 7 +#define I40E_EMPINT_GPIO_ENA_GPIO7_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO7_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO8_ENA_SHIFT 8 +#define I40E_EMPINT_GPIO_ENA_GPIO8_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO8_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO9_ENA_SHIFT 9 +#define I40E_EMPINT_GPIO_ENA_GPIO9_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO9_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO10_ENA_SHIFT 10 +#define I40E_EMPINT_GPIO_ENA_GPIO10_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO10_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO11_ENA_SHIFT 11 +#define I40E_EMPINT_GPIO_ENA_GPIO11_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO11_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO12_ENA_SHIFT 12 +#define I40E_EMPINT_GPIO_ENA_GPIO12_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO12_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO13_ENA_SHIFT 13 +#define I40E_EMPINT_GPIO_ENA_GPIO13_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO13_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO14_ENA_SHIFT 14 +#define I40E_EMPINT_GPIO_ENA_GPIO14_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO14_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO15_ENA_SHIFT 15 +#define I40E_EMPINT_GPIO_ENA_GPIO15_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO15_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO16_ENA_SHIFT 16 +#define I40E_EMPINT_GPIO_ENA_GPIO16_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO16_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO17_ENA_SHIFT 17 +#define I40E_EMPINT_GPIO_ENA_GPIO17_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO17_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO18_ENA_SHIFT 18 +#define I40E_EMPINT_GPIO_ENA_GPIO18_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO18_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO19_ENA_SHIFT 19 +#define I40E_EMPINT_GPIO_ENA_GPIO19_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO19_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO20_ENA_SHIFT 20 +#define I40E_EMPINT_GPIO_ENA_GPIO20_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO20_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO21_ENA_SHIFT 21 +#define I40E_EMPINT_GPIO_ENA_GPIO21_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO21_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO22_ENA_SHIFT 22 +#define I40E_EMPINT_GPIO_ENA_GPIO22_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO22_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO23_ENA_SHIFT 23 +#define I40E_EMPINT_GPIO_ENA_GPIO23_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO23_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO24_ENA_SHIFT 24 +#define I40E_EMPINT_GPIO_ENA_GPIO24_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO24_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO25_ENA_SHIFT 25 +#define I40E_EMPINT_GPIO_ENA_GPIO25_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO25_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO26_ENA_SHIFT 26 +#define I40E_EMPINT_GPIO_ENA_GPIO26_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO26_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO27_ENA_SHIFT 27 +#define I40E_EMPINT_GPIO_ENA_GPIO27_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO27_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO28_ENA_SHIFT 28 +#define I40E_EMPINT_GPIO_ENA_GPIO28_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO28_ENA_SHIFT) +#define I40E_EMPINT_GPIO_ENA_GPIO29_ENA_SHIFT 29 +#define I40E_EMPINT_GPIO_ENA_GPIO29_ENA_MASK (0x1 << I40E_EMPINT_GPIO_ENA_GPIO29_ENA_SHIFT) +#define I40E_PFGEN_PORTMDIO_NUM 0x0003F100 +#define I40E_PFGEN_PORTMDIO_NUM_PORT_NUM_SHIFT 0 +#define I40E_PFGEN_PORTMDIO_NUM_PORT_NUM_MASK (0x3 << I40E_PFGEN_PORTMDIO_NUM_PORT_NUM_SHIFT) +#define I40E_PFGEN_PORTMDIO_NUM_VFLINK_STAT_ENA_SHIFT 4 +#define I40E_PFGEN_PORTMDIO_NUM_VFLINK_STAT_ENA_MASK (0x1 << I40E_PFGEN_PORTMDIO_NUM_VFLINK_STAT_ENA_SHIFT) +#define I40E_PFINT_AEQCTL 0x00038700 +#define I40E_PFINT_AEQCTL_MSIX_INDX_SHIFT 0 +#define I40E_PFINT_AEQCTL_MSIX_INDX_MASK (0xFF << I40E_PFINT_AEQCTL_MSIX_INDX_SHIFT) +#define I40E_PFINT_AEQCTL_ITR_INDX_SHIFT 11 +#define I40E_PFINT_AEQCTL_ITR_INDX_MASK (0x3 << I40E_PFINT_AEQCTL_ITR_INDX_SHIFT) +#define I40E_PFINT_AEQCTL_MSIX0_INDX_SHIFT 13 +#define I40E_PFINT_AEQCTL_MSIX0_INDX_MASK (0x7 << I40E_PFINT_AEQCTL_MSIX0_INDX_SHIFT) +#define I40E_PFINT_AEQCTL_CAUSE_ENA_SHIFT 30 +#define I40E_PFINT_AEQCTL_CAUSE_ENA_MASK (0x1 << I40E_PFINT_AEQCTL_CAUSE_ENA_SHIFT) +#define I40E_PFINT_AEQCTL_INTEVENT_SHIFT 31 +#define I40E_PFINT_AEQCTL_INTEVENT_MASK (0x1 << I40E_PFINT_AEQCTL_INTEVENT_SHIFT) +#define I40E_PFINT_CEQCTL(_INTPF) (0x00036800 + ((_INTPF) * 4)) /* _i=0...511 */ +#define I40E_PFINT_CEQCTL_MAX_INDEX 511 +#define I40E_PFINT_CEQCTL_MSIX_INDX_SHIFT 0 +#define I40E_PFINT_CEQCTL_MSIX_INDX_MASK (0xFF << I40E_PFINT_CEQCTL_MSIX_INDX_SHIFT) +#define I40E_PFINT_CEQCTL_ITR_INDX_SHIFT 11 +#define I40E_PFINT_CEQCTL_ITR_INDX_MASK (0x3 << I40E_PFINT_CEQCTL_ITR_INDX_SHIFT) +#define I40E_PFINT_CEQCTL_MSIX0_INDX_SHIFT 13 +#define I40E_PFINT_CEQCTL_MSIX0_INDX_MASK (0x7 << I40E_PFINT_CEQCTL_MSIX0_INDX_SHIFT) +#define I40E_PFINT_CEQCTL_NEXTQ_INDX_SHIFT 16 +#define I40E_PFINT_CEQCTL_NEXTQ_INDX_MASK (0x7FF << I40E_PFINT_CEQCTL_NEXTQ_INDX_SHIFT) +#define I40E_PFINT_CEQCTL_NEXTQ_TYPE_SHIFT 27 +#define I40E_PFINT_CEQCTL_NEXTQ_TYPE_MASK (0x3 << I40E_PFINT_CEQCTL_NEXTQ_TYPE_SHIFT) +#define I40E_PFINT_CEQCTL_CAUSE_ENA_SHIFT 30 +#define I40E_PFINT_CEQCTL_CAUSE_ENA_MASK (0x1 << I40E_PFINT_CEQCTL_CAUSE_ENA_SHIFT) +#define I40E_PFINT_CEQCTL_INTEVENT_SHIFT 31 +#define I40E_PFINT_CEQCTL_INTEVENT_MASK (0x1 << I40E_PFINT_CEQCTL_INTEVENT_SHIFT) +#define I40E_PFINT_DYN_CTL0 0x00038480 +#define I40E_PFINT_DYN_CTL0_INTENA_SHIFT 0 +#define I40E_PFINT_DYN_CTL0_INTENA_MASK (0x1 << I40E_PFINT_DYN_CTL0_INTENA_SHIFT) +#define I40E_PFINT_DYN_CTL0_CLEARPBA_SHIFT 1 +#define I40E_PFINT_DYN_CTL0_CLEARPBA_MASK (0x1 << I40E_PFINT_DYN_CTL0_CLEARPBA_SHIFT) +#define I40E_PFINT_DYN_CTL0_SWINT_TRIG_SHIFT 2 +#define I40E_PFINT_DYN_CTL0_SWINT_TRIG_MASK (0x1 << I40E_PFINT_DYN_CTL0_SWINT_TRIG_SHIFT) +#define I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT 3 +#define I40E_PFINT_DYN_CTL0_ITR_INDX_MASK (0x3 << I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT) +#define I40E_PFINT_DYN_CTL0_INTERVAL_SHIFT 5 +#define I40E_PFINT_DYN_CTL0_INTERVAL_MASK (0xFFF << I40E_PFINT_DYN_CTL0_INTERVAL_SHIFT) +#define I40E_PFINT_DYN_CTL0_SW_ITR_INDX_ENA_SHIFT 24 +#define I40E_PFINT_DYN_CTL0_SW_ITR_INDX_ENA_MASK (0x1 << I40E_PFINT_DYN_CTL0_SW_ITR_INDX_ENA_SHIFT) +#define I40E_PFINT_DYN_CTL0_SW_ITR_INDX_SHIFT 25 +#define I40E_PFINT_DYN_CTL0_SW_ITR_INDX_MASK (0x3 << I40E_PFINT_DYN_CTL0_SW_ITR_INDX_SHIFT) +#define I40E_PFINT_DYN_CTL0_INTENA_MSK_SHIFT 31 +#define I40E_PFINT_DYN_CTL0_INTENA_MSK_MASK (0x1 << I40E_PFINT_DYN_CTL0_INTENA_MSK_SHIFT) +#define I40E_PFINT_DYN_CTLN(_INTPF) (0x00034800 + ((_INTPF) * 4)) /* _i=0...511 */ +#define I40E_PFINT_DYN_CTLN_MAX_INDEX 511 +#define I40E_PFINT_DYN_CTLN_INTENA_SHIFT 0 +#define I40E_PFINT_DYN_CTLN_INTENA_MASK (0x1 << I40E_PFINT_DYN_CTLN_INTENA_SHIFT) +#define I40E_PFINT_DYN_CTLN_CLEARPBA_SHIFT 1 +#define I40E_PFINT_DYN_CTLN_CLEARPBA_MASK (0x1 << I40E_PFINT_DYN_CTLN_CLEARPBA_SHIFT) +#define I40E_PFINT_DYN_CTLN_SWINT_TRIG_SHIFT 2 +#define I40E_PFINT_DYN_CTLN_SWINT_TRIG_MASK (0x1 << I40E_PFINT_DYN_CTLN_SWINT_TRIG_SHIFT) +#define I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT 3 +#define I40E_PFINT_DYN_CTLN_ITR_INDX_MASK (0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT) +#define I40E_PFINT_DYN_CTLN_INTERVAL_SHIFT 5 +#define I40E_PFINT_DYN_CTLN_INTERVAL_MASK (0xFFF << I40E_PFINT_DYN_CTLN_INTERVAL_SHIFT) +#define I40E_PFINT_DYN_CTLN_SW_ITR_INDX_ENA_SHIFT 24 +#define I40E_PFINT_DYN_CTLN_SW_ITR_INDX_ENA_MASK (0x1 << I40E_PFINT_DYN_CTLN_SW_ITR_INDX_ENA_SHIFT) +#define I40E_PFINT_DYN_CTLN_SW_ITR_INDX_SHIFT 25 +#define I40E_PFINT_DYN_CTLN_SW_ITR_INDX_MASK (0x3 << I40E_PFINT_DYN_CTLN_SW_ITR_INDX_SHIFT) +#define I40E_PFINT_DYN_CTLN_INTENA_MSK_SHIFT 31 +#define I40E_PFINT_DYN_CTLN_INTENA_MSK_MASK (0x1 << I40E_PFINT_DYN_CTLN_INTENA_MSK_SHIFT) +#define I40E_PFINT_GPIO_ENA 0x00088080 +#define I40E_PFINT_GPIO_ENA_GPIO0_ENA_SHIFT 0 +#define I40E_PFINT_GPIO_ENA_GPIO0_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO0_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO1_ENA_SHIFT 1 +#define I40E_PFINT_GPIO_ENA_GPIO1_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO1_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO2_ENA_SHIFT 2 +#define I40E_PFINT_GPIO_ENA_GPIO2_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO2_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO3_ENA_SHIFT 3 +#define I40E_PFINT_GPIO_ENA_GPIO3_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO3_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO4_ENA_SHIFT 4 +#define I40E_PFINT_GPIO_ENA_GPIO4_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO4_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO5_ENA_SHIFT 5 +#define I40E_PFINT_GPIO_ENA_GPIO5_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO5_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO6_ENA_SHIFT 6 +#define I40E_PFINT_GPIO_ENA_GPIO6_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO6_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO7_ENA_SHIFT 7 +#define I40E_PFINT_GPIO_ENA_GPIO7_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO7_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO8_ENA_SHIFT 8 +#define I40E_PFINT_GPIO_ENA_GPIO8_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO8_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO9_ENA_SHIFT 9 +#define I40E_PFINT_GPIO_ENA_GPIO9_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO9_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO10_ENA_SHIFT 10 +#define I40E_PFINT_GPIO_ENA_GPIO10_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO10_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO11_ENA_SHIFT 11 +#define I40E_PFINT_GPIO_ENA_GPIO11_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO11_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO12_ENA_SHIFT 12 +#define I40E_PFINT_GPIO_ENA_GPIO12_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO12_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO13_ENA_SHIFT 13 +#define I40E_PFINT_GPIO_ENA_GPIO13_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO13_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO14_ENA_SHIFT 14 +#define I40E_PFINT_GPIO_ENA_GPIO14_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO14_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO15_ENA_SHIFT 15 +#define I40E_PFINT_GPIO_ENA_GPIO15_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO15_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO16_ENA_SHIFT 16 +#define I40E_PFINT_GPIO_ENA_GPIO16_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO16_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO17_ENA_SHIFT 17 +#define I40E_PFINT_GPIO_ENA_GPIO17_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO17_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO18_ENA_SHIFT 18 +#define I40E_PFINT_GPIO_ENA_GPIO18_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO18_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO19_ENA_SHIFT 19 +#define I40E_PFINT_GPIO_ENA_GPIO19_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO19_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO20_ENA_SHIFT 20 +#define I40E_PFINT_GPIO_ENA_GPIO20_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO20_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO21_ENA_SHIFT 21 +#define I40E_PFINT_GPIO_ENA_GPIO21_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO21_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO22_ENA_SHIFT 22 +#define I40E_PFINT_GPIO_ENA_GPIO22_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO22_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO23_ENA_SHIFT 23 +#define I40E_PFINT_GPIO_ENA_GPIO23_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO23_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO24_ENA_SHIFT 24 +#define I40E_PFINT_GPIO_ENA_GPIO24_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO24_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO25_ENA_SHIFT 25 +#define I40E_PFINT_GPIO_ENA_GPIO25_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO25_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO26_ENA_SHIFT 26 +#define I40E_PFINT_GPIO_ENA_GPIO26_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO26_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO27_ENA_SHIFT 27 +#define I40E_PFINT_GPIO_ENA_GPIO27_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO27_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO28_ENA_SHIFT 28 +#define I40E_PFINT_GPIO_ENA_GPIO28_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO28_ENA_SHIFT) +#define I40E_PFINT_GPIO_ENA_GPIO29_ENA_SHIFT 29 +#define I40E_PFINT_GPIO_ENA_GPIO29_ENA_MASK (0x1 << I40E_PFINT_GPIO_ENA_GPIO29_ENA_SHIFT) +#define I40E_PFINT_ICR0 0x00038780 +#define I40E_PFINT_ICR0_INTEVENT_SHIFT 0 +#define I40E_PFINT_ICR0_INTEVENT_MASK (0x1 << I40E_PFINT_ICR0_INTEVENT_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_0_SHIFT 1 +#define I40E_PFINT_ICR0_QUEUE_0_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_0_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_1_SHIFT 2 +#define I40E_PFINT_ICR0_QUEUE_1_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_1_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_2_SHIFT 3 +#define I40E_PFINT_ICR0_QUEUE_2_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_2_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_3_SHIFT 4 +#define I40E_PFINT_ICR0_QUEUE_3_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_3_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_4_SHIFT 5 +#define I40E_PFINT_ICR0_QUEUE_4_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_4_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_5_SHIFT 6 +#define I40E_PFINT_ICR0_QUEUE_5_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_5_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_6_SHIFT 7 +#define I40E_PFINT_ICR0_QUEUE_6_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_6_SHIFT) +#define I40E_PFINT_ICR0_QUEUE_7_SHIFT 8 +#define I40E_PFINT_ICR0_QUEUE_7_MASK (0x1 << I40E_PFINT_ICR0_QUEUE_7_SHIFT) +#define I40E_PFINT_ICR0_ECC_ERR_SHIFT 16 +#define I40E_PFINT_ICR0_ECC_ERR_MASK (0x1 << I40E_PFINT_ICR0_ECC_ERR_SHIFT) +#define I40E_PFINT_ICR0_MAL_DETECT_SHIFT 19 +#define I40E_PFINT_ICR0_MAL_DETECT_MASK (0x1 << I40E_PFINT_ICR0_MAL_DETECT_SHIFT) +#define I40E_PFINT_ICR0_GRST_SHIFT 20 +#define I40E_PFINT_ICR0_GRST_MASK (0x1 << I40E_PFINT_ICR0_GRST_SHIFT) +#define I40E_PFINT_ICR0_PCI_EXCEPTION_SHIFT 21 +#define I40E_PFINT_ICR0_PCI_EXCEPTION_MASK (0x1 << I40E_PFINT_ICR0_PCI_EXCEPTION_SHIFT) +#define I40E_PFINT_ICR0_GPIO_SHIFT 22 +#define I40E_PFINT_ICR0_GPIO_MASK (0x1 << I40E_PFINT_ICR0_GPIO_SHIFT) +#define I40E_PFINT_ICR0_TIMESYNC_SHIFT 23 +#define I40E_PFINT_ICR0_TIMESYNC_MASK (0x1 << I40E_PFINT_ICR0_TIMESYNC_SHIFT) +#define I40E_PFINT_ICR0_LINK_STAT_CHANGE_SHIFT 25 +#define I40E_PFINT_ICR0_LINK_STAT_CHANGE_MASK (0x1 << I40E_PFINT_ICR0_LINK_STAT_CHANGE_SHIFT) +#define I40E_PFINT_ICR0_HMC_ERR_SHIFT 26 +#define I40E_PFINT_ICR0_HMC_ERR_MASK (0x1 << I40E_PFINT_ICR0_HMC_ERR_SHIFT) +#define I40E_PFINT_ICR0_PE_CRITERR_SHIFT 28 +#define I40E_PFINT_ICR0_PE_CRITERR_MASK (0x1 << I40E_PFINT_ICR0_PE_CRITERR_SHIFT) +#define I40E_PFINT_ICR0_VFLR_SHIFT 29 +#define I40E_PFINT_ICR0_VFLR_MASK (0x1 << I40E_PFINT_ICR0_VFLR_SHIFT) +#define I40E_PFINT_ICR0_ADMINQ_SHIFT 30 +#define I40E_PFINT_ICR0_ADMINQ_MASK (0x1 << I40E_PFINT_ICR0_ADMINQ_SHIFT) +#define I40E_PFINT_ICR0_SWINT_SHIFT 31 +#define I40E_PFINT_ICR0_SWINT_MASK (0x1 << I40E_PFINT_ICR0_SWINT_SHIFT) +#define I40E_PFINT_ICR0_ENA 0x00038800 +#define I40E_PFINT_ICR0_ENA_ECC_ERR_SHIFT 16 +#define I40E_PFINT_ICR0_ENA_ECC_ERR_MASK (0x1 << I40E_PFINT_ICR0_ENA_ECC_ERR_SHIFT) +#define I40E_PFINT_ICR0_ENA_MAL_DETECT_SHIFT 19 +#define I40E_PFINT_ICR0_ENA_MAL_DETECT_MASK (0x1 << I40E_PFINT_ICR0_ENA_MAL_DETECT_SHIFT) +#define I40E_PFINT_ICR0_ENA_GRST_SHIFT 20 +#define I40E_PFINT_ICR0_ENA_GRST_MASK (0x1 << I40E_PFINT_ICR0_ENA_GRST_SHIFT) +#define I40E_PFINT_ICR0_ENA_PCI_EXCEPTION_SHIFT 21 +#define I40E_PFINT_ICR0_ENA_PCI_EXCEPTION_MASK (0x1 << I40E_PFINT_ICR0_ENA_PCI_EXCEPTION_SHIFT) +#define I40E_PFINT_ICR0_ENA_GPIO_SHIFT 22 +#define I40E_PFINT_ICR0_ENA_GPIO_MASK (0x1 << I40E_PFINT_ICR0_ENA_GPIO_SHIFT) +#define I40E_PFINT_ICR0_ENA_TIMESYNC_SHIFT 23 +#define I40E_PFINT_ICR0_ENA_TIMESYNC_MASK (0x1 << I40E_PFINT_ICR0_ENA_TIMESYNC_SHIFT) +#define I40E_PFINT_ICR0_ENA_LINK_STAT_CHANGE_SHIFT 25 +#define I40E_PFINT_ICR0_ENA_LINK_STAT_CHANGE_MASK (0x1 << I40E_PFINT_ICR0_ENA_LINK_STAT_CHANGE_SHIFT) +#define I40E_PFINT_ICR0_ENA_HMC_ERR_SHIFT 26 +#define I40E_PFINT_ICR0_ENA_HMC_ERR_MASK (0x1 << I40E_PFINT_ICR0_ENA_HMC_ERR_SHIFT) +#define I40E_PFINT_ICR0_ENA_PE_CRITERR_SHIFT 28 +#define I40E_PFINT_ICR0_ENA_PE_CRITERR_MASK (0x1 << I40E_PFINT_ICR0_ENA_PE_CRITERR_SHIFT) +#define I40E_PFINT_ICR0_ENA_VFLR_SHIFT 29 +#define I40E_PFINT_ICR0_ENA_VFLR_MASK (0x1 << I40E_PFINT_ICR0_ENA_VFLR_SHIFT) +#define I40E_PFINT_ICR0_ENA_ADMINQ_SHIFT 30 +#define I40E_PFINT_ICR0_ENA_ADMINQ_MASK (0x1 << I40E_PFINT_ICR0_ENA_ADMINQ_SHIFT) +#define I40E_PFINT_ICR0_ENA_RSVD_SHIFT 31 +#define I40E_PFINT_ICR0_ENA_RSVD_MASK (0x1 << I40E_PFINT_ICR0_ENA_RSVD_SHIFT) +#define I40E_PFINT_ITR0(_i) (0x00038000 + ((_i) * 128)) /* _i=0...2 */ +#define I40E_PFINT_ITR0_MAX_INDEX 2 +#define I40E_PFINT_ITR0_INTERVAL_SHIFT 0 +#define I40E_PFINT_ITR0_INTERVAL_MASK (0xFFF << I40E_PFINT_ITR0_INTERVAL_SHIFT) +#define I40E_PFINT_ITRN(_i, _INTPF) (0x00030000 + ((_i) * 2048 + (_INTPF) * 4)) +#define I40E_PFINT_ITRN_MAX_INDEX 2 +#define I40E_PFINT_ITRN_INTERVAL_SHIFT 0 +#define I40E_PFINT_ITRN_INTERVAL_MASK (0xFFF << I40E_PFINT_ITRN_INTERVAL_SHIFT) +#define I40E_PFINT_LNKLST0 0x00038500 +#define I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT 0 +#define I40E_PFINT_LNKLST0_FIRSTQ_INDX_MASK (0x7FF << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT) +#define I40E_PFINT_LNKLST0_FIRSTQ_TYPE_SHIFT 11 +#define I40E_PFINT_LNKLST0_FIRSTQ_TYPE_MASK (0x3 << I40E_PFINT_LNKLST0_FIRSTQ_TYPE_SHIFT) +#define I40E_PFINT_LNKLSTN(_INTPF) (0x00035000 + ((_INTPF) * 4)) /* _i=0...511 */ +#define I40E_PFINT_LNKLSTN_MAX_INDEX 511 +#define I40E_PFINT_LNKLSTN_FIRSTQ_INDX_SHIFT 0 +#define I40E_PFINT_LNKLSTN_FIRSTQ_INDX_MASK (0x7FF << I40E_PFINT_LNKLSTN_FIRSTQ_INDX_SHIFT) +#define I40E_PFINT_LNKLSTN_FIRSTQ_TYPE_SHIFT 11 +#define I40E_PFINT_LNKLSTN_FIRSTQ_TYPE_MASK (0x3 << I40E_PFINT_LNKLSTN_FIRSTQ_TYPE_SHIFT) +#define I40E_PFINT_RATE0 0x00038580 +#define I40E_PFINT_RATE0_INTERVAL_SHIFT 0 +#define I40E_PFINT_RATE0_INTERVAL_MASK (0x3F << I40E_PFINT_RATE0_INTERVAL_SHIFT) +#define I40E_PFINT_RATE0_INTRL_ENA_SHIFT 6 +#define I40E_PFINT_RATE0_INTRL_ENA_MASK (0x1 << I40E_PFINT_RATE0_INTRL_ENA_SHIFT) +#define I40E_PFINT_RATEN(_INTPF) (0x00035800 + ((_INTPF) * 4)) /* _i=0...511 */ +#define I40E_PFINT_RATEN_MAX_INDEX 511 +#define I40E_PFINT_RATEN_INTERVAL_SHIFT 0 +#define I40E_PFINT_RATEN_INTERVAL_MASK (0x3F << I40E_PFINT_RATEN_INTERVAL_SHIFT) +#define I40E_PFINT_RATEN_INTRL_ENA_SHIFT 6 +#define I40E_PFINT_RATEN_INTRL_ENA_MASK (0x1 << I40E_PFINT_RATEN_INTRL_ENA_SHIFT) +#define I40E_PFINT_STAT_CTL0 0x00038400 +#define I40E_PFINT_STAT_CTL0_OTHER_ITR_INDX_SHIFT 2 +#define I40E_PFINT_STAT_CTL0_OTHER_ITR_INDX_MASK (0x3 << I40E_PFINT_STAT_CTL0_OTHER_ITR_INDX_SHIFT) +#define I40E_QINT_RQCTL(_Q) (0x0003A000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QINT_RQCTL_MAX_INDEX 1535 +#define I40E_QINT_RQCTL_MSIX_INDX_SHIFT 0 +#define I40E_QINT_RQCTL_MSIX_INDX_MASK (0xFF << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) +#define I40E_QINT_RQCTL_ITR_INDX_SHIFT 11 +#define I40E_QINT_RQCTL_ITR_INDX_MASK (0x3 << I40E_QINT_RQCTL_ITR_INDX_SHIFT) +#define I40E_QINT_RQCTL_MSIX0_INDX_SHIFT 13 +#define I40E_QINT_RQCTL_MSIX0_INDX_MASK (0x7 << I40E_QINT_RQCTL_MSIX0_INDX_SHIFT) +#define I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT 16 +#define I40E_QINT_RQCTL_NEXTQ_INDX_MASK (0x7FF << I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT) +#define I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT 27 +#define I40E_QINT_RQCTL_NEXTQ_TYPE_MASK (0x3 << I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT) +#define I40E_QINT_RQCTL_CAUSE_ENA_SHIFT 30 +#define I40E_QINT_RQCTL_CAUSE_ENA_MASK (0x1 << I40E_QINT_RQCTL_CAUSE_ENA_SHIFT) +#define I40E_QINT_RQCTL_INTEVENT_SHIFT 31 +#define I40E_QINT_RQCTL_INTEVENT_MASK (0x1 << I40E_QINT_RQCTL_INTEVENT_SHIFT) +#define I40E_QINT_TQCTL(_Q) (0x0003C000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QINT_TQCTL_MAX_INDEX 1535 +#define I40E_QINT_TQCTL_MSIX_INDX_SHIFT 0 +#define I40E_QINT_TQCTL_MSIX_INDX_MASK (0xFF << I40E_QINT_TQCTL_MSIX_INDX_SHIFT) +#define I40E_QINT_TQCTL_ITR_INDX_SHIFT 11 +#define I40E_QINT_TQCTL_ITR_INDX_MASK (0x3 << I40E_QINT_TQCTL_ITR_INDX_SHIFT) +#define I40E_QINT_TQCTL_MSIX0_INDX_SHIFT 13 +#define I40E_QINT_TQCTL_MSIX0_INDX_MASK (0x7 << I40E_QINT_TQCTL_MSIX0_INDX_SHIFT) +#define I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT 16 +#define I40E_QINT_TQCTL_NEXTQ_INDX_MASK (0x7FF << I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT) +#define I40E_QINT_TQCTL_NEXTQ_TYPE_SHIFT 27 +#define I40E_QINT_TQCTL_NEXTQ_TYPE_MASK (0x3 << I40E_QINT_TQCTL_NEXTQ_TYPE_SHIFT) +#define I40E_QINT_TQCTL_CAUSE_ENA_SHIFT 30 +#define I40E_QINT_TQCTL_CAUSE_ENA_MASK (0x1 << I40E_QINT_TQCTL_CAUSE_ENA_SHIFT) +#define I40E_QINT_TQCTL_INTEVENT_SHIFT 31 +#define I40E_QINT_TQCTL_INTEVENT_MASK (0x1 << I40E_QINT_TQCTL_INTEVENT_SHIFT) +#define I40E_VFINT_DYN_CTL0(_VF) (0x0002A400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFINT_DYN_CTL0_MAX_INDEX 127 +#define I40E_VFINT_DYN_CTL0_INTENA_SHIFT 0 +#define I40E_VFINT_DYN_CTL0_INTENA_MASK (0x1 << I40E_VFINT_DYN_CTL0_INTENA_SHIFT) +#define I40E_VFINT_DYN_CTL0_CLEARPBA_SHIFT 1 +#define I40E_VFINT_DYN_CTL0_CLEARPBA_MASK (0x1 << I40E_VFINT_DYN_CTL0_CLEARPBA_SHIFT) +#define I40E_VFINT_DYN_CTL0_SWINT_TRIG_SHIFT 2 +#define I40E_VFINT_DYN_CTL0_SWINT_TRIG_MASK (0x1 << I40E_VFINT_DYN_CTL0_SWINT_TRIG_SHIFT) +#define I40E_VFINT_DYN_CTL0_ITR_INDX_SHIFT 3 +#define I40E_VFINT_DYN_CTL0_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTL0_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTL0_INTERVAL_SHIFT 5 +#define I40E_VFINT_DYN_CTL0_INTERVAL_MASK (0xFFF << I40E_VFINT_DYN_CTL0_INTERVAL_SHIFT) +#define I40E_VFINT_DYN_CTL0_SW_ITR_INDX_ENA_SHIFT 24 +#define I40E_VFINT_DYN_CTL0_SW_ITR_INDX_ENA_MASK (0x1 << I40E_VFINT_DYN_CTL0_SW_ITR_INDX_ENA_SHIFT) +#define I40E_VFINT_DYN_CTL0_SW_ITR_INDX_SHIFT 25 +#define I40E_VFINT_DYN_CTL0_SW_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTL0_SW_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTL0_INTENA_MSK_SHIFT 31 +#define I40E_VFINT_DYN_CTL0_INTENA_MSK_MASK (0x1 << I40E_VFINT_DYN_CTL0_INTENA_MSK_SHIFT) +#define I40E_VFINT_DYN_CTLN(_INTVF) (0x00024800 + ((_INTVF) * 4)) /* _i=0...511 */ +#define I40E_VFINT_DYN_CTLN_MAX_INDEX 511 +#define I40E_VFINT_DYN_CTLN_INTENA_SHIFT 0 +#define I40E_VFINT_DYN_CTLN_INTENA_MASK (0x1 << I40E_VFINT_DYN_CTLN_INTENA_SHIFT) +#define I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT 1 +#define I40E_VFINT_DYN_CTLN_CLEARPBA_MASK (0x1 << I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT) +#define I40E_VFINT_DYN_CTLN_SWINT_TRIG_SHIFT 2 +#define I40E_VFINT_DYN_CTLN_SWINT_TRIG_MASK (0x1 << I40E_VFINT_DYN_CTLN_SWINT_TRIG_SHIFT) +#define I40E_VFINT_DYN_CTLN_ITR_INDX_SHIFT 3 +#define I40E_VFINT_DYN_CTLN_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTLN_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTLN_INTERVAL_SHIFT 5 +#define I40E_VFINT_DYN_CTLN_INTERVAL_MASK (0xFFF << I40E_VFINT_DYN_CTLN_INTERVAL_SHIFT) +#define I40E_VFINT_DYN_CTLN_SW_ITR_INDX_ENA_SHIFT 24 +#define I40E_VFINT_DYN_CTLN_SW_ITR_INDX_ENA_MASK (0x1 << I40E_VFINT_DYN_CTLN_SW_ITR_INDX_ENA_SHIFT) +#define I40E_VFINT_DYN_CTLN_SW_ITR_INDX_SHIFT 25 +#define I40E_VFINT_DYN_CTLN_SW_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTLN_SW_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTLN_INTENA_MSK_SHIFT 31 +#define I40E_VFINT_DYN_CTLN_INTENA_MSK_MASK (0x1 << I40E_VFINT_DYN_CTLN_INTENA_MSK_SHIFT) +#define I40E_VFINT_ICR0(_VF) (0x0002BC00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFINT_ICR0_MAX_INDEX 127 +#define I40E_VFINT_ICR0_INTEVENT_SHIFT 0 +#define I40E_VFINT_ICR0_INTEVENT_MASK (0x1 << I40E_VFINT_ICR0_INTEVENT_SHIFT) +#define I40E_VFINT_ICR0_QUEUE_0_SHIFT 1 +#define I40E_VFINT_ICR0_QUEUE_0_MASK (0x1 << I40E_VFINT_ICR0_QUEUE_0_SHIFT) +#define I40E_VFINT_ICR0_QUEUE_1_SHIFT 2 +#define I40E_VFINT_ICR0_QUEUE_1_MASK (0x1 << I40E_VFINT_ICR0_QUEUE_1_SHIFT) +#define I40E_VFINT_ICR0_QUEUE_2_SHIFT 3 +#define I40E_VFINT_ICR0_QUEUE_2_MASK (0x1 << I40E_VFINT_ICR0_QUEUE_2_SHIFT) +#define I40E_VFINT_ICR0_QUEUE_3_SHIFT 4 +#define I40E_VFINT_ICR0_QUEUE_3_MASK (0x1 << I40E_VFINT_ICR0_QUEUE_3_SHIFT) +#define I40E_VFINT_ICR0_LINK_STAT_CHANGE_SHIFT 25 +#define I40E_VFINT_ICR0_LINK_STAT_CHANGE_MASK (0x1 << I40E_VFINT_ICR0_LINK_STAT_CHANGE_SHIFT) +#define I40E_VFINT_ICR0_ADMINQ_SHIFT 30 +#define I40E_VFINT_ICR0_ADMINQ_MASK (0x1 << I40E_VFINT_ICR0_ADMINQ_SHIFT) +#define I40E_VFINT_ICR0_SWINT_SHIFT 31 +#define I40E_VFINT_ICR0_SWINT_MASK (0x1 << I40E_VFINT_ICR0_SWINT_SHIFT) +#define I40E_VFINT_ICR0_ENA(_VF) (0x0002C000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFINT_ICR0_ENA_MAX_INDEX 127 +#define I40E_VFINT_ICR0_ENA_LINK_STAT_CHANGE_SHIFT 25 +#define I40E_VFINT_ICR0_ENA_LINK_STAT_CHANGE_MASK (0x1 << I40E_VFINT_ICR0_ENA_LINK_STAT_CHANGE_SHIFT) +#define I40E_VFINT_ICR0_ENA_ADMINQ_SHIFT 30 +#define I40E_VFINT_ICR0_ENA_ADMINQ_MASK (0x1 << I40E_VFINT_ICR0_ENA_ADMINQ_SHIFT) +#define I40E_VFINT_ICR0_ENA_RSVD_SHIFT 31 +#define I40E_VFINT_ICR0_ENA_RSVD_MASK (0x1 << I40E_VFINT_ICR0_ENA_RSVD_SHIFT) +#define I40E_VFINT_ITR0(_i, _VF) (0x00028000 + ((_i) * 1024 + (_VF) * 4)) /* _i=0...2, _VF=0...127 */ +#define I40E_VFINT_ITR0_MAX_INDEX 2 +#define I40E_VFINT_ITR0_INTERVAL_SHIFT 0 +#define I40E_VFINT_ITR0_INTERVAL_MASK (0xFFF << I40E_VFINT_ITR0_INTERVAL_SHIFT) +#define I40E_VFINT_ITRN(_i, _INTVF) (0x00020000 + ((_i) * 2048 + (_INTVF) * 4)) +#define I40E_VFINT_ITRN_MAX_INDEX 2 +#define I40E_VFINT_ITRN_INTERVAL_SHIFT 0 +#define I40E_VFINT_ITRN_INTERVAL_MASK (0xFFF << I40E_VFINT_ITRN_INTERVAL_SHIFT) +#define I40E_VFINT_STAT_CTL0(_VF) (0x0002A000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFINT_STAT_CTL0_MAX_INDEX 127 +#define I40E_VFINT_STAT_CTL0_OTHER_ITR_INDX_SHIFT 2 +#define I40E_VFINT_STAT_CTL0_OTHER_ITR_INDX_MASK (0x3 << I40E_VFINT_STAT_CTL0_OTHER_ITR_INDX_SHIFT) +#define I40E_VPINT_AEQCTL(_VF) (0x0002B800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPINT_AEQCTL_MAX_INDEX 127 +#define I40E_VPINT_AEQCTL_MSIX_INDX_SHIFT 0 +#define I40E_VPINT_AEQCTL_MSIX_INDX_MASK (0xFF << I40E_VPINT_AEQCTL_MSIX_INDX_SHIFT) +#define I40E_VPINT_AEQCTL_ITR_INDX_SHIFT 11 +#define I40E_VPINT_AEQCTL_ITR_INDX_MASK (0x3 << I40E_VPINT_AEQCTL_ITR_INDX_SHIFT) +#define I40E_VPINT_AEQCTL_MSIX0_INDX_SHIFT 13 +#define I40E_VPINT_AEQCTL_MSIX0_INDX_MASK (0x7 << I40E_VPINT_AEQCTL_MSIX0_INDX_SHIFT) +#define I40E_VPINT_AEQCTL_CAUSE_ENA_SHIFT 30 +#define I40E_VPINT_AEQCTL_CAUSE_ENA_MASK (0x1 << I40E_VPINT_AEQCTL_CAUSE_ENA_SHIFT) +#define I40E_VPINT_AEQCTL_INTEVENT_SHIFT 31 +#define I40E_VPINT_AEQCTL_INTEVENT_MASK (0x1 << I40E_VPINT_AEQCTL_INTEVENT_SHIFT) +#define I40E_VPINT_CEQCTL(_INTVF) (0x00026800 + ((_INTVF) * 4)) /* _i=0...511 */ +#define I40E_VPINT_CEQCTL_MAX_INDEX 511 +#define I40E_VPINT_CEQCTL_MSIX_INDX_SHIFT 0 +#define I40E_VPINT_CEQCTL_MSIX_INDX_MASK (0xFF << I40E_VPINT_CEQCTL_MSIX_INDX_SHIFT) +#define I40E_VPINT_CEQCTL_ITR_INDX_SHIFT 11 +#define I40E_VPINT_CEQCTL_ITR_INDX_MASK (0x3 << I40E_VPINT_CEQCTL_ITR_INDX_SHIFT) +#define I40E_VPINT_CEQCTL_MSIX0_INDX_SHIFT 13 +#define I40E_VPINT_CEQCTL_MSIX0_INDX_MASK (0x7 << I40E_VPINT_CEQCTL_MSIX0_INDX_SHIFT) +#define I40E_VPINT_CEQCTL_NEXTQ_INDX_SHIFT 16 +#define I40E_VPINT_CEQCTL_NEXTQ_INDX_MASK (0x7FF << I40E_VPINT_CEQCTL_NEXTQ_INDX_SHIFT) +#define I40E_VPINT_CEQCTL_NEXTQ_TYPE_SHIFT 27 +#define I40E_VPINT_CEQCTL_NEXTQ_TYPE_MASK (0x3 << I40E_VPINT_CEQCTL_NEXTQ_TYPE_SHIFT) +#define I40E_VPINT_CEQCTL_CAUSE_ENA_SHIFT 30 +#define I40E_VPINT_CEQCTL_CAUSE_ENA_MASK (0x1 << I40E_VPINT_CEQCTL_CAUSE_ENA_SHIFT) +#define I40E_VPINT_CEQCTL_INTEVENT_SHIFT 31 +#define I40E_VPINT_CEQCTL_INTEVENT_MASK (0x1 << I40E_VPINT_CEQCTL_INTEVENT_SHIFT) +#define I40E_VPINT_LNKLST0(_VF) (0x0002A800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPINT_LNKLST0_MAX_INDEX 127 +#define I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT 0 +#define I40E_VPINT_LNKLST0_FIRSTQ_INDX_MASK (0x7FF << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT) +#define I40E_VPINT_LNKLST0_FIRSTQ_TYPE_SHIFT 11 +#define I40E_VPINT_LNKLST0_FIRSTQ_TYPE_MASK (0x3 << I40E_VPINT_LNKLST0_FIRSTQ_TYPE_SHIFT) +#define I40E_VPINT_LNKLSTN(_INTVF) (0x00025000 + ((_INTVF) * 4)) /* _i=0...511 */ +#define I40E_VPINT_LNKLSTN_MAX_INDEX 511 +#define I40E_VPINT_LNKLSTN_FIRSTQ_INDX_SHIFT 0 +#define I40E_VPINT_LNKLSTN_FIRSTQ_INDX_MASK (0x7FF << I40E_VPINT_LNKLSTN_FIRSTQ_INDX_SHIFT) +#define I40E_VPINT_LNKLSTN_FIRSTQ_TYPE_SHIFT 11 +#define I40E_VPINT_LNKLSTN_FIRSTQ_TYPE_MASK (0x3 << I40E_VPINT_LNKLSTN_FIRSTQ_TYPE_SHIFT) +#define I40E_VPINT_RATE0(_VF) (0x0002AC00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPINT_RATE0_MAX_INDEX 127 +#define I40E_VPINT_RATE0_INTERVAL_SHIFT 0 +#define I40E_VPINT_RATE0_INTERVAL_MASK (0x3F << I40E_VPINT_RATE0_INTERVAL_SHIFT) +#define I40E_VPINT_RATE0_INTRL_ENA_SHIFT 6 +#define I40E_VPINT_RATE0_INTRL_ENA_MASK (0x1 << I40E_VPINT_RATE0_INTRL_ENA_SHIFT) +#define I40E_VPINT_RATEN(_INTVF) (0x00025800 + ((_INTVF) * 4)) /* _i=0...511 */ +#define I40E_VPINT_RATEN_MAX_INDEX 511 +#define I40E_VPINT_RATEN_INTERVAL_SHIFT 0 +#define I40E_VPINT_RATEN_INTERVAL_MASK (0x3F << I40E_VPINT_RATEN_INTERVAL_SHIFT) +#define I40E_VPINT_RATEN_INTRL_ENA_SHIFT 6 +#define I40E_VPINT_RATEN_INTRL_ENA_MASK (0x1 << I40E_VPINT_RATEN_INTRL_ENA_SHIFT) +#define I40E_GL_RDPU_CNTRL 0x00051060 +#define I40E_GL_RDPU_CNTRL_RX_PAD_EN_SHIFT 0 +#define I40E_GL_RDPU_CNTRL_RX_PAD_EN_MASK (0x1 << I40E_GL_RDPU_CNTRL_RX_PAD_EN_SHIFT) +#define I40E_GL_RDPU_CNTRL_ECO_SHIFT 1 +#define I40E_GL_RDPU_CNTRL_ECO_MASK (0x7FFFFFFF << I40E_GL_RDPU_CNTRL_ECO_SHIFT) +#define I40E_GLLAN_RCTL_0 0x0012A500 +#define I40E_GLLAN_RCTL_0_PXE_MODE_SHIFT 0 +#define I40E_GLLAN_RCTL_0_PXE_MODE_MASK (0x1 << I40E_GLLAN_RCTL_0_PXE_MODE_SHIFT) +#define I40E_GLLAN_TSOMSK_F 0x000442D8 +#define I40E_GLLAN_TSOMSK_F_TCPMSKF_SHIFT 0 +#define I40E_GLLAN_TSOMSK_F_TCPMSKF_MASK (0xFFF << I40E_GLLAN_TSOMSK_F_TCPMSKF_SHIFT) +#define I40E_GLLAN_TSOMSK_L 0x000442E0 +#define I40E_GLLAN_TSOMSK_L_TCPMSKL_SHIFT 0 +#define I40E_GLLAN_TSOMSK_L_TCPMSKL_MASK (0xFFF << I40E_GLLAN_TSOMSK_L_TCPMSKL_SHIFT) +#define I40E_GLLAN_TSOMSK_M 0x000442DC +#define I40E_GLLAN_TSOMSK_M_TCPMSKM_SHIFT 0 +#define I40E_GLLAN_TSOMSK_M_TCPMSKM_MASK (0xFFF << I40E_GLLAN_TSOMSK_M_TCPMSKM_SHIFT) +#define I40E_GLLAN_TXPRE_QDIS(_i) (0x000E6500 + ((_i) * 4)) /* i=0..11 */ +#define I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT 0 +#define I40E_GLLAN_TXPRE_QDIS_QINDX_MASK (0x7FF << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT) +#define I40E_GLLAN_TXPRE_QDIS_SET_QDIS_SHIFT 30 +#define I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK (0x1 << I40E_GLLAN_TXPRE_QDIS_SET_QDIS_SHIFT) +#define I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_SHIFT 31 +#define I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK (0x1 << I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_SHIFT) + +#define I40E_PFLAN_QALLOC 0x001C0400 +#define I40E_PFLAN_QALLOC_FIRSTQ_SHIFT 0 +#define I40E_PFLAN_QALLOC_FIRSTQ_MASK (0x7FF << I40E_PFLAN_QALLOC_FIRSTQ_SHIFT) +#define I40E_PFLAN_QALLOC_LASTQ_SHIFT 16 +#define I40E_PFLAN_QALLOC_LASTQ_MASK (0x7FF << I40E_PFLAN_QALLOC_LASTQ_SHIFT) +#define I40E_PFLAN_QALLOC_VALID_SHIFT 31 +#define I40E_PFLAN_QALLOC_VALID_MASK (0x1 << I40E_PFLAN_QALLOC_VALID_SHIFT) +#define I40E_QRX_ENA(_Q) (0x00120000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QRX_ENA_MAX_INDEX 1535 +#define I40E_QRX_ENA_QENA_REQ_SHIFT 0 +#define I40E_QRX_ENA_QENA_REQ_MASK (0x1 << I40E_QRX_ENA_QENA_REQ_SHIFT) +#define I40E_QRX_ENA_FAST_QDIS_SHIFT 1 +#define I40E_QRX_ENA_FAST_QDIS_MASK (0x1 << I40E_QRX_ENA_FAST_QDIS_SHIFT) +#define I40E_QRX_ENA_QENA_STAT_SHIFT 2 +#define I40E_QRX_ENA_QENA_STAT_MASK (0x1 << I40E_QRX_ENA_QENA_STAT_SHIFT) +#define I40E_QRX_TAIL(_Q) (0x00128000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QRX_TAIL_MAX_INDEX 1535 +#define I40E_QRX_TAIL_TAIL_SHIFT 0 +#define I40E_QRX_TAIL_TAIL_MASK (0x1FFF << I40E_QRX_TAIL_TAIL_SHIFT) +#define I40E_QTX_CTL(_Q) (0x00104000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QTX_CTL_MAX_INDEX 1535 +#define I40E_QTX_CTL_PFVF_Q_SHIFT 0 +#define I40E_QTX_CTL_PFVF_Q_MASK (0x3 << I40E_QTX_CTL_PFVF_Q_SHIFT) +#define I40E_QTX_CTL_PF_INDX_SHIFT 2 +#define I40E_QTX_CTL_PF_INDX_MASK (0xF << I40E_QTX_CTL_PF_INDX_SHIFT) +#define I40E_QTX_CTL_VFVM_INDX_SHIFT 7 +#define I40E_QTX_CTL_VFVM_INDX_MASK (0x1FF << I40E_QTX_CTL_VFVM_INDX_SHIFT) +#define I40E_QTX_ENA(_Q) (0x00100000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QTX_ENA_MAX_INDEX 1535 +#define I40E_QTX_ENA_QENA_REQ_SHIFT 0 +#define I40E_QTX_ENA_QENA_REQ_MASK (0x1 << I40E_QTX_ENA_QENA_REQ_SHIFT) +#define I40E_QTX_ENA_FAST_QDIS_SHIFT 1 +#define I40E_QTX_ENA_FAST_QDIS_MASK (0x1 << I40E_QTX_ENA_FAST_QDIS_SHIFT) +#define I40E_QTX_ENA_QENA_STAT_SHIFT 2 +#define I40E_QTX_ENA_QENA_STAT_MASK (0x1 << I40E_QTX_ENA_QENA_STAT_SHIFT) +#define I40E_QTX_HEAD(_Q) (0x000E4000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QTX_HEAD_MAX_INDEX 1535 +#define I40E_QTX_HEAD_HEAD_SHIFT 0 +#define I40E_QTX_HEAD_HEAD_MASK (0x1FFF << I40E_QTX_HEAD_HEAD_SHIFT) +#define I40E_QTX_HEAD_RS_PENDING_SHIFT 16 +#define I40E_QTX_HEAD_RS_PENDING_MASK (0x1 << I40E_QTX_HEAD_RS_PENDING_SHIFT) +#define I40E_QTX_TAIL(_Q) (0x00108000 + ((_Q) * 4)) /* _i=0...1535 */ +#define I40E_QTX_TAIL_MAX_INDEX 1535 +#define I40E_QTX_TAIL_TAIL_SHIFT 0 +#define I40E_QTX_TAIL_TAIL_MASK (0x1FFF << I40E_QTX_TAIL_TAIL_SHIFT) +#define I40E_VPLAN_MAPENA(_VF) (0x00074000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPLAN_MAPENA_MAX_INDEX 127 +#define I40E_VPLAN_MAPENA_TXRX_ENA_SHIFT 0 +#define I40E_VPLAN_MAPENA_TXRX_ENA_MASK (0x1 << I40E_VPLAN_MAPENA_TXRX_ENA_SHIFT) +#define I40E_VPLAN_QTABLE(_i, _VF) (0x00070000 + ((_i) * 1024 + (_VF) * 4)) /* _i=0...15, _VF=0...127 */ +#define I40E_VPLAN_QTABLE_MAX_INDEX 15 +#define I40E_VPLAN_QTABLE_QINDEX_SHIFT 0 +#define I40E_VPLAN_QTABLE_QINDEX_MASK (0x7FF << I40E_VPLAN_QTABLE_QINDEX_SHIFT) +#define I40E_VSILAN_QBASE(_VSI) (0x0020C800 + ((_VSI) * 4)) /* _i=0...383 */ +#define I40E_VSILAN_QBASE_MAX_INDEX 383 +#define I40E_VSILAN_QBASE_VSIBASE_SHIFT 0 +#define I40E_VSILAN_QBASE_VSIBASE_MASK (0x7FF << I40E_VSILAN_QBASE_VSIBASE_SHIFT) +#define I40E_VSILAN_QBASE_VSIQTABLE_ENA_SHIFT 11 +#define I40E_VSILAN_QBASE_VSIQTABLE_ENA_MASK (0x1 << I40E_VSILAN_QBASE_VSIQTABLE_ENA_SHIFT) +#define I40E_VSILAN_QTABLE(_i, _VSI) (0x00200000 + ((_i) * 2048 + (_VSI) * 4)) +#define I40E_VSILAN_QTABLE_MAX_INDEX 7 +#define I40E_VSILAN_QTABLE_QINDEX_0_SHIFT 0 +#define I40E_VSILAN_QTABLE_QINDEX_0_MASK (0x7FF << I40E_VSILAN_QTABLE_QINDEX_0_SHIFT) +#define I40E_VSILAN_QTABLE_QINDEX_1_SHIFT 16 +#define I40E_VSILAN_QTABLE_QINDEX_1_MASK (0x7FF << I40E_VSILAN_QTABLE_QINDEX_1_SHIFT) +#define I40E_PRTGL_SAH 0x001E2140 +#define I40E_PRTGL_SAH_FC_SAH_SHIFT 0 +#define I40E_PRTGL_SAH_FC_SAH_MASK (0xFFFF << I40E_PRTGL_SAH_FC_SAH_SHIFT) +#define I40E_PRTGL_SAH_MFS_SHIFT 16 +#define I40E_PRTGL_SAH_MFS_MASK (0xFFFF << I40E_PRTGL_SAH_MFS_SHIFT) +#define I40E_PRTGL_SAL 0x001E2120 +#define I40E_PRTGL_SAL_FC_SAL_SHIFT 0 +#define I40E_PRTGL_SAL_FC_SAL_MASK (0xFFFFFFFF << I40E_PRTGL_SAL_FC_SAL_SHIFT) +#define I40E_PRTMAC_HLCTLA 0x001E4760 +#define I40E_PRTMAC_HLCTLA_DROP_US_PKTS_SHIFT 0 +#define I40E_PRTMAC_HLCTLA_DROP_US_PKTS_MASK (0x1 << I40E_PRTMAC_HLCTLA_DROP_US_PKTS_SHIFT) +#define I40E_PRTMAC_HLCTLA_RX_FWRD_CTRL_SHIFT 1 +#define I40E_PRTMAC_HLCTLA_RX_FWRD_CTRL_MASK (0x1 << I40E_PRTMAC_HLCTLA_RX_FWRD_CTRL_SHIFT) +#define I40E_PRTMAC_HLCTLA_CHOP_OS_PKT_SHIFT 2 +#define I40E_PRTMAC_HLCTLA_CHOP_OS_PKT_MASK (0x1 << I40E_PRTMAC_HLCTLA_CHOP_OS_PKT_SHIFT) +#define I40E_PRTMAC_HLCTLA_TX_HYSTERESIS_SHIFT 4 +#define I40E_PRTMAC_HLCTLA_TX_HYSTERESIS_MASK (0x7 << I40E_PRTMAC_HLCTLA_TX_HYSTERESIS_SHIFT) +#define I40E_PRTMAC_HLCTLA_HYS_FLUSH_PKT_SHIFT 7 +#define I40E_PRTMAC_HLCTLA_HYS_FLUSH_PKT_MASK (0x1 << I40E_PRTMAC_HLCTLA_HYS_FLUSH_PKT_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GCP 0x001E3130 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GCP_HSEC_CTL_RX_CHECK_SA_GCP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GCP_HSEC_CTL_RX_CHECK_SA_GCP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GCP_HSEC_CTL_RX_CHECK_SA_GCP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GPP 0x001E3290 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GPP_HSEC_CTL_RX_CHECK_SA_GPP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GPP_HSEC_CTL_RX_CHECK_SA_GPP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_GPP_HSEC_CTL_RX_CHECK_SA_GPP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_PPP 0x001E3310 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_PPP_HSEC_CTL_RX_CHECK_SA_PPP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_PPP_HSEC_CTL_RX_CHECK_SA_PPP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_CHECK_SA_PPP_HSEC_CTL_RX_CHECK_SA_PPP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GCP 0x001E3100 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GCP_HSEC_CTL_RX_CHECK_UCAST_GCP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GCP_HSEC_CTL_RX_CHECK_UCAST_GCP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GCP_HSEC_CTL_RX_CHECK_UCAST_GCP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GPP 0x001E3280 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GPP_HSEC_CTL_RX_CHECK_UCAST_GPP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GPP_HSEC_CTL_RX_CHECK_UCAST_GPP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_GPP_HSEC_CTL_RX_CHECK_UCAST_GPP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_PPP 0x001E3300 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_PPP_HSEC_CTL_RX_CHECK_UCAST_PPP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_PPP_HSEC_CTL_RX_CHECK_UCAST_PPP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_CHECK_UCAST_PPP_HSEC_CTL_RX_CHECK_UCAST_PPP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GCP 0x001E30E0 +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GCP_HSEC_CTL_RX_ENABLE_GCP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GCP_HSEC_CTL_RX_ENABLE_GCP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GCP_HSEC_CTL_RX_ENABLE_GCP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GPP 0x001E3260 +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GPP_HSEC_CTL_RX_ENABLE_GPP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GPP_HSEC_CTL_RX_ENABLE_GPP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_ENABLE_GPP_HSEC_CTL_RX_ENABLE_GPP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_PPP 0x001E32E0 +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_PPP_HSEC_CTL_RX_ENABLE_PPP_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_ENABLE_PPP_HSEC_CTL_RX_ENABLE_PPP_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_ENABLE_PPP_HSEC_CTL_RX_ENABLE_PPP_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL 0x001E3360 +#define I40E_PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL_HSEC_CTL_RX_FORWARD_CONTROL_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL_HSEC_CTL_RX_FORWARD_CONTROL_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL_HSEC_CTL_RX_FORWARD_CONTROL_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1 0x001E3110 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_MASK (0xFFFFFFFF << I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2 0x001E3120 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_MASK (0xFFFF << I40E_PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE 0x001E30C0 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_MASK (0x1FF << I40E_PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1 0x001E3140 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1_HSEC_CTL_RX_PAUSE_SA_PART1_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1_HSEC_CTL_RX_PAUSE_SA_PART1_MASK (0xFFFFFFFF << I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1_HSEC_CTL_RX_PAUSE_SA_PART1_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2 0x001E3150 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2_HSEC_CTL_RX_PAUSE_SA_PART2_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2_HSEC_CTL_RX_PAUSE_SA_PART2_MASK (0xFFFF << I40E_PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2_HSEC_CTL_RX_PAUSE_SA_PART2_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_TX_ENABLE 0x001E3000 +#define I40E_PRTMAC_HSEC_CTL_TX_ENABLE_HSEC_CTL_TX_ENABLE_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_TX_ENABLE_HSEC_CTL_TX_ENABLE_MASK (0x1 << I40E_PRTMAC_HSEC_CTL_TX_ENABLE_HSEC_CTL_TX_ENABLE_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE 0x001E30D0 +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE_HSEC_CTL_TX_PAUSE_ENABLE_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE_HSEC_CTL_TX_PAUSE_ENABLE_MASK (0x1FF << I40E_PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE_HSEC_CTL_TX_PAUSE_ENABLE_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA(_i) (0x001E3370 + ((_i) * 16)) +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_MAX_INDEX 8 +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_HSEC_CTL_TX_PAUSE_QUANTA_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_HSEC_CTL_TX_PAUSE_QUANTA_MASK (0xFFFF << I40E_PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_HSEC_CTL_TX_PAUSE_QUANTA_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER(_i) (0x001E3400 + ((_i) * 16)) +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_MAX_INDEX 8 +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_MASK (0xFFFF << I40E_PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_TX_SA_PART1 0x001E34B0 +#define I40E_PRTMAC_HSEC_CTL_TX_SA_PART1_HSEC_CTL_TX_SA_PART1_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_TX_SA_PART1_HSEC_CTL_TX_SA_PART1_MASK (0xFFFFFFFF << I40E_PRTMAC_HSEC_CTL_TX_SA_PART1_HSEC_CTL_TX_SA_PART1_SHIFT) +#define I40E_PRTMAC_HSEC_CTL_TX_SA_PART2 0x001E34C0 +#define I40E_PRTMAC_HSEC_CTL_TX_SA_PART2_HSEC_CTL_TX_SA_PART2_SHIFT 0 +#define I40E_PRTMAC_HSEC_CTL_TX_SA_PART2_HSEC_CTL_TX_SA_PART2_MASK (0xFFFF << I40E_PRTMAC_HSEC_CTL_TX_SA_PART2_HSEC_CTL_TX_SA_PART2_SHIFT) +#define I40E_PRTMAC_HSECTL1 0x001E3560 +#define I40E_PRTMAC_HSECTL1_DROP_US_PKTS_SHIFT 0 +#define I40E_PRTMAC_HSECTL1_DROP_US_PKTS_MASK (0x1 << I40E_PRTMAC_HSECTL1_DROP_US_PKTS_SHIFT) +#define I40E_PRTMAC_HSECTL1_PAD_US_PKT_SHIFT 3 +#define I40E_PRTMAC_HSECTL1_PAD_US_PKT_MASK (0x1 << I40E_PRTMAC_HSECTL1_PAD_US_PKT_SHIFT) +#define I40E_PRTMAC_HSECTL1_TX_HYSTERESIS_SHIFT 4 +#define I40E_PRTMAC_HSECTL1_TX_HYSTERESIS_MASK (0x7 << I40E_PRTMAC_HSECTL1_TX_HYSTERESIS_SHIFT) +#define I40E_PRTMAC_HSECTL1_HYS_FLUSH_PKT_SHIFT 7 +#define I40E_PRTMAC_HSECTL1_HYS_FLUSH_PKT_MASK (0x1 << I40E_PRTMAC_HSECTL1_HYS_FLUSH_PKT_SHIFT) +#define I40E_PRTMAC_HSECTL1_EN_SFD_CHECK_SHIFT 30 +#define I40E_PRTMAC_HSECTL1_EN_SFD_CHECK_MASK (0x1 << I40E_PRTMAC_HSECTL1_EN_SFD_CHECK_SHIFT) +#define I40E_PRTMAC_HSECTL1_EN_PREAMBLE_CHECK_SHIFT 31 +#define I40E_PRTMAC_HSECTL1_EN_PREAMBLE_CHECK_MASK (0x1 << I40E_PRTMAC_HSECTL1_EN_PREAMBLE_CHECK_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A 0x0008C480 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE3_SHIFT 0 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE3_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE3_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE2_SHIFT 2 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE2_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE2_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE1_SHIFT 4 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE1_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE1_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE0_SHIFT 6 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE0_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_TX_LANE0_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE3_SHIFT 8 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE3_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE3_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE2_SHIFT 10 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE2_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE2_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE1_SHIFT 12 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE1_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE1_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE0_SHIFT 14 +#define I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE0_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_A_SWAP_RX_LANE0_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B 0x0008C484 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE3_SHIFT 0 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE3_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE3_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE2_SHIFT 2 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE2_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE2_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE1_SHIFT 4 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE1_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE1_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE0_SHIFT 6 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE0_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_TX_LANE0_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE3_SHIFT 8 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE3_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE3_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE2_SHIFT 10 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE2_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE2_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE1_SHIFT 12 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE1_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE1_SHIFT) +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE0_SHIFT 14 +#define I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE0_MASK (0x3 << I40E_PRTMAC_PCS_XAUI_SWAP_B_SWAP_RX_LANE0_SHIFT) +#define I40E_GL_MNG_FWSM 0x000B6134 +#define I40E_GL_MNG_FWSM_FW_MODES_SHIFT 1 +#define I40E_GL_MNG_FWSM_FW_MODES_MASK (0x7 << I40E_GL_MNG_FWSM_FW_MODES_SHIFT) +#define I40E_GL_MNG_FWSM_EEP_RELOAD_IND_SHIFT 6 +#define I40E_GL_MNG_FWSM_EEP_RELOAD_IND_MASK (0x1 << I40E_GL_MNG_FWSM_EEP_RELOAD_IND_SHIFT) +#define I40E_GL_MNG_FWSM_CRC_ERROR_MODULE_SHIFT 11 +#define I40E_GL_MNG_FWSM_CRC_ERROR_MODULE_MASK (0xF << I40E_GL_MNG_FWSM_CRC_ERROR_MODULE_SHIFT) +#define I40E_GL_MNG_FWSM_FW_STATUS_VALID_SHIFT 15 +#define I40E_GL_MNG_FWSM_FW_STATUS_VALID_MASK (0x1 << I40E_GL_MNG_FWSM_FW_STATUS_VALID_SHIFT) +#define I40E_GL_MNG_FWSM_RESET_CNT_SHIFT 16 +#define I40E_GL_MNG_FWSM_RESET_CNT_MASK (0x7 << I40E_GL_MNG_FWSM_RESET_CNT_SHIFT) +#define I40E_GL_MNG_FWSM_EXT_ERR_IND_SHIFT 19 +#define I40E_GL_MNG_FWSM_EXT_ERR_IND_MASK (0x3F << I40E_GL_MNG_FWSM_EXT_ERR_IND_SHIFT) +#define I40E_GL_MNG_FWSM_RSVD_SHIFT 25 +#define I40E_GL_MNG_FWSM_RSVD_MASK (0x1 << I40E_GL_MNG_FWSM_RSVD_SHIFT) +#define I40E_GL_MNG_FWSM_PHY_SERDES0_CONFIG_ERR_SHIFT 26 +#define I40E_GL_MNG_FWSM_PHY_SERDES0_CONFIG_ERR_MASK (0x1 << I40E_GL_MNG_FWSM_PHY_SERDES0_CONFIG_ERR_SHIFT) +#define I40E_GL_MNG_FWSM_PHY_SERDES1_CONFIG_ERR_SHIFT 27 +#define I40E_GL_MNG_FWSM_PHY_SERDES1_CONFIG_ERR_MASK (0x1 << I40E_GL_MNG_FWSM_PHY_SERDES1_CONFIG_ERR_SHIFT) +#define I40E_GL_MNG_FWSM_PHY_SERDES2_CONFIG_ERR_SHIFT 28 +#define I40E_GL_MNG_FWSM_PHY_SERDES2_CONFIG_ERR_MASK (0x1 << I40E_GL_MNG_FWSM_PHY_SERDES2_CONFIG_ERR_SHIFT) +#define I40E_GL_MNG_FWSM_PHY_SERDES3_CONFIG_ERR_SHIFT 29 +#define I40E_GL_MNG_FWSM_PHY_SERDES3_CONFIG_ERR_MASK (0x1 << I40E_GL_MNG_FWSM_PHY_SERDES3_CONFIG_ERR_SHIFT) +#define I40E_GL_MNG_HWARB_CTRL 0x000B6130 +#define I40E_GL_MNG_HWARB_CTRL_NCSI_ARB_EN_SHIFT 0 +#define I40E_GL_MNG_HWARB_CTRL_NCSI_ARB_EN_MASK (0x1 << I40E_GL_MNG_HWARB_CTRL_NCSI_ARB_EN_SHIFT) +#define I40E_PRT_MNG_FTFT_DATA(_i) (0x000852A0 + ((_i) * 32)) /* _i=0...31 */ +#define I40E_PRT_MNG_FTFT_DATA_MAX_INDEX 31 +#define I40E_PRT_MNG_FTFT_DATA_DWORD_SHIFT 0 +#define I40E_PRT_MNG_FTFT_DATA_DWORD_MASK (0xFFFFFFFF << I40E_PRT_MNG_FTFT_DATA_DWORD_SHIFT) +#define I40E_PRT_MNG_FTFT_LENGTH 0x00085260 +#define I40E_PRT_MNG_FTFT_LENGTH_LENGTH_SHIFT 0 +#define I40E_PRT_MNG_FTFT_LENGTH_LENGTH_MASK (0xFF << I40E_PRT_MNG_FTFT_LENGTH_LENGTH_SHIFT) +#define I40E_PRT_MNG_FTFT_MASK(_i) (0x00085160 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRT_MNG_FTFT_MASK_MAX_INDEX 7 +#define I40E_PRT_MNG_FTFT_MASK_MASK_SHIFT 0 +#define I40E_PRT_MNG_FTFT_MASK_MASK_MASK (0xFFFF << I40E_PRT_MNG_FTFT_MASK_MASK_SHIFT) +#define I40E_PRT_MNG_MANC 0x00256A20 +#define I40E_PRT_MNG_MANC_FLOW_CONTROL_DISCARD_SHIFT 0 +#define I40E_PRT_MNG_MANC_FLOW_CONTROL_DISCARD_MASK (0x1 << I40E_PRT_MNG_MANC_FLOW_CONTROL_DISCARD_SHIFT) +#define I40E_PRT_MNG_MANC_NCSI_DISCARD_SHIFT 1 +#define I40E_PRT_MNG_MANC_NCSI_DISCARD_MASK (0x1 << I40E_PRT_MNG_MANC_NCSI_DISCARD_SHIFT) +#define I40E_PRT_MNG_MANC_RCV_TCO_EN_SHIFT 17 +#define I40E_PRT_MNG_MANC_RCV_TCO_EN_MASK (0x1 << I40E_PRT_MNG_MANC_RCV_TCO_EN_SHIFT) +#define I40E_PRT_MNG_MANC_RCV_ALL_SHIFT 19 +#define I40E_PRT_MNG_MANC_RCV_ALL_MASK (0x1 << I40E_PRT_MNG_MANC_RCV_ALL_SHIFT) +#define I40E_PRT_MNG_MANC_FIXED_NET_TYPE_SHIFT 25 +#define I40E_PRT_MNG_MANC_FIXED_NET_TYPE_MASK (0x1 << I40E_PRT_MNG_MANC_FIXED_NET_TYPE_SHIFT) +#define I40E_PRT_MNG_MANC_NET_TYPE_SHIFT 26 +#define I40E_PRT_MNG_MANC_NET_TYPE_MASK (0x1 << I40E_PRT_MNG_MANC_NET_TYPE_SHIFT) +#define I40E_PRT_MNG_MANC_EN_BMC2OS_SHIFT 28 +#define I40E_PRT_MNG_MANC_EN_BMC2OS_MASK (0x1 << I40E_PRT_MNG_MANC_EN_BMC2OS_SHIFT) +#define I40E_PRT_MNG_MANC_EN_BMC2NET_SHIFT 29 +#define I40E_PRT_MNG_MANC_EN_BMC2NET_MASK (0x1 << I40E_PRT_MNG_MANC_EN_BMC2NET_SHIFT) +#define I40E_PRT_MNG_MAVTV(_i) (0x00255900 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRT_MNG_MAVTV_MAX_INDEX 7 +#define I40E_PRT_MNG_MAVTV_VID_SHIFT 0 +#define I40E_PRT_MNG_MAVTV_VID_MASK (0xFFF << I40E_PRT_MNG_MAVTV_VID_SHIFT) +#define I40E_PRT_MNG_MDEF(_i) (0x00255D00 + ((_i) * 32)) +#define I40E_PRT_MNG_MDEF_MAX_INDEX 7 +#define I40E_PRT_MNG_MDEF_MAC_EXACT_AND_SHIFT 0 +#define I40E_PRT_MNG_MDEF_MAC_EXACT_AND_MASK (0xF << I40E_PRT_MNG_MDEF_MAC_EXACT_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_BROADCAST_AND_SHIFT 4 +#define I40E_PRT_MNG_MDEF_BROADCAST_AND_MASK (0x1 << I40E_PRT_MNG_MDEF_BROADCAST_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_VLAN_AND_SHIFT 5 +#define I40E_PRT_MNG_MDEF_VLAN_AND_MASK (0xFF << I40E_PRT_MNG_MDEF_VLAN_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_IPV4_ADDRESS_AND_SHIFT 13 +#define I40E_PRT_MNG_MDEF_IPV4_ADDRESS_AND_MASK (0xF << I40E_PRT_MNG_MDEF_IPV4_ADDRESS_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_IPV6_ADDRESS_AND_SHIFT 17 +#define I40E_PRT_MNG_MDEF_IPV6_ADDRESS_AND_MASK (0xF << I40E_PRT_MNG_MDEF_IPV6_ADDRESS_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_MAC_EXACT_OR_SHIFT 21 +#define I40E_PRT_MNG_MDEF_MAC_EXACT_OR_MASK (0xF << I40E_PRT_MNG_MDEF_MAC_EXACT_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_BROADCAST_OR_SHIFT 25 +#define I40E_PRT_MNG_MDEF_BROADCAST_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_BROADCAST_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_MULTICAST_AND_SHIFT 26 +#define I40E_PRT_MNG_MDEF_MULTICAST_AND_MASK (0x1 << I40E_PRT_MNG_MDEF_MULTICAST_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_ARP_REQUEST_OR_SHIFT 27 +#define I40E_PRT_MNG_MDEF_ARP_REQUEST_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_ARP_REQUEST_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_ARP_RESPONSE_OR_SHIFT 28 +#define I40E_PRT_MNG_MDEF_ARP_RESPONSE_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_ARP_RESPONSE_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_NEIGHBOR_DISCOVERY_134_OR_SHIFT 29 +#define I40E_PRT_MNG_MDEF_NEIGHBOR_DISCOVERY_134_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_NEIGHBOR_DISCOVERY_134_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_PORT_0X298_OR_SHIFT 30 +#define I40E_PRT_MNG_MDEF_PORT_0X298_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_PORT_0X298_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_PORT_0X26F_OR_SHIFT 31 +#define I40E_PRT_MNG_MDEF_PORT_0X26F_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_PORT_0X26F_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT(_i) (0x00255F00 + ((_i) * 32)) +#define I40E_PRT_MNG_MDEF_EXT_MAX_INDEX 7 +#define I40E_PRT_MNG_MDEF_EXT_L2_ETHERTYPE_AND_SHIFT 0 +#define I40E_PRT_MNG_MDEF_EXT_L2_ETHERTYPE_AND_MASK (0xF << I40E_PRT_MNG_MDEF_EXT_L2_ETHERTYPE_AND_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_L2_ETHERTYPE_OR_SHIFT 4 +#define I40E_PRT_MNG_MDEF_EXT_L2_ETHERTYPE_OR_MASK (0xF << I40E_PRT_MNG_MDEF_EXT_L2_ETHERTYPE_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_FLEX_PORT_OR_SHIFT 8 +#define I40E_PRT_MNG_MDEF_EXT_FLEX_PORT_OR_MASK (0xFFFF << I40E_PRT_MNG_MDEF_EXT_FLEX_PORT_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_FLEX_TCO_SHIFT 24 +#define I40E_PRT_MNG_MDEF_EXT_FLEX_TCO_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_FLEX_TCO_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_135_OR_SHIFT 25 +#define I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_135_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_135_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_136_OR_SHIFT 26 +#define I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_136_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_136_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_137_OR_SHIFT 27 +#define I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_137_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_137_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_ICMP_OR_SHIFT 28 +#define I40E_PRT_MNG_MDEF_EXT_ICMP_OR_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_ICMP_OR_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_MLD_SHIFT 29 +#define I40E_PRT_MNG_MDEF_EXT_MLD_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_MLD_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_APPLY_TO_NETWORK_TRAFFIC_SHIFT 30 +#define I40E_PRT_MNG_MDEF_EXT_APPLY_TO_NETWORK_TRAFFIC_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_APPLY_TO_NETWORK_TRAFFIC_SHIFT) +#define I40E_PRT_MNG_MDEF_EXT_APPLY_TO_HOST_TRAFFIC_SHIFT 31 +#define I40E_PRT_MNG_MDEF_EXT_APPLY_TO_HOST_TRAFFIC_MASK (0x1 << I40E_PRT_MNG_MDEF_EXT_APPLY_TO_HOST_TRAFFIC_SHIFT) +#define I40E_PRT_MNG_MDEFVSI(_i) (0x00256580 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRT_MNG_MDEFVSI_MAX_INDEX 3 +#define I40E_PRT_MNG_MDEFVSI_MDEFVSI_2N_SHIFT 0 +#define I40E_PRT_MNG_MDEFVSI_MDEFVSI_2N_MASK (0xFFFF << I40E_PRT_MNG_MDEFVSI_MDEFVSI_2N_SHIFT) +#define I40E_PRT_MNG_MDEFVSI_MDEFVSI_2NP1_SHIFT 16 +#define I40E_PRT_MNG_MDEFVSI_MDEFVSI_2NP1_MASK (0xFFFF << I40E_PRT_MNG_MDEFVSI_MDEFVSI_2NP1_SHIFT) +#define I40E_PRT_MNG_METF(_i) (0x00256780 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRT_MNG_METF_MAX_INDEX 3 +#define I40E_PRT_MNG_METF_ETYPE_SHIFT 0 +#define I40E_PRT_MNG_METF_ETYPE_MASK (0xFFFF << I40E_PRT_MNG_METF_ETYPE_SHIFT) +#define I40E_PRT_MNG_METF_POLARITY_SHIFT 30 +#define I40E_PRT_MNG_METF_POLARITY_MASK (0x1 << I40E_PRT_MNG_METF_POLARITY_SHIFT) +#define I40E_PRT_MNG_MFUTP(_i) (0x00254E00 + ((_i) * 32)) /* _i=0...15 */ +#define I40E_PRT_MNG_MFUTP_MAX_INDEX 15 +#define I40E_PRT_MNG_MFUTP_MFUTP_N_SHIFT 0 +#define I40E_PRT_MNG_MFUTP_MFUTP_N_MASK (0xFFFF << I40E_PRT_MNG_MFUTP_MFUTP_N_SHIFT) +#define I40E_PRT_MNG_MFUTP_UDP_SHIFT 16 +#define I40E_PRT_MNG_MFUTP_UDP_MASK (0x1 << I40E_PRT_MNG_MFUTP_UDP_SHIFT) +#define I40E_PRT_MNG_MFUTP_TCP_SHIFT 17 +#define I40E_PRT_MNG_MFUTP_TCP_MASK (0x1 << I40E_PRT_MNG_MFUTP_TCP_SHIFT) +#define I40E_PRT_MNG_MFUTP_SOURCE_DESTINATION_SHIFT 18 +#define I40E_PRT_MNG_MFUTP_SOURCE_DESTINATION_MASK (0x1 << I40E_PRT_MNG_MFUTP_SOURCE_DESTINATION_SHIFT) +#define I40E_PRT_MNG_MIPAF4(_i) (0x00256280 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRT_MNG_MIPAF4_MAX_INDEX 3 +#define I40E_PRT_MNG_MIPAF4_MIPAF_SHIFT 0 +#define I40E_PRT_MNG_MIPAF4_MIPAF_MASK (0xFFFFFFFF << I40E_PRT_MNG_MIPAF4_MIPAF_SHIFT) +#define I40E_PRT_MNG_MIPAF6(_i) (0x00254200 + ((_i) * 32)) /* _i=0...15 */ +#define I40E_PRT_MNG_MIPAF6_MAX_INDEX 15 +#define I40E_PRT_MNG_MIPAF6_MIPAF_SHIFT 0 +#define I40E_PRT_MNG_MIPAF6_MIPAF_MASK (0xFFFFFFFF << I40E_PRT_MNG_MIPAF6_MIPAF_SHIFT) +#define I40E_PRT_MNG_MMAH(_i) (0x00256380 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRT_MNG_MMAH_MAX_INDEX 3 +#define I40E_PRT_MNG_MMAH_MMAH_SHIFT 0 +#define I40E_PRT_MNG_MMAH_MMAH_MASK (0xFFFF << I40E_PRT_MNG_MMAH_MMAH_SHIFT) +#define I40E_PRT_MNG_MMAL(_i) (0x00256480 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRT_MNG_MMAL_MAX_INDEX 3 +#define I40E_PRT_MNG_MMAL_MMAL_SHIFT 0 +#define I40E_PRT_MNG_MMAL_MMAL_MASK (0xFFFFFFFF << I40E_PRT_MNG_MMAL_MMAL_SHIFT) +#define I40E_PRT_MNG_MNGONLY 0x00256A60 +#define I40E_PRT_MNG_MNGONLY_EXCLUSIVE_TO_MANAGEABILITY_SHIFT 0 +#define I40E_PRT_MNG_MNGONLY_EXCLUSIVE_TO_MANAGEABILITY_MASK (0xFF << I40E_PRT_MNG_MNGONLY_EXCLUSIVE_TO_MANAGEABILITY_SHIFT) +#define I40E_PRT_MNG_MSFM 0x00256AA0 +#define I40E_PRT_MNG_MSFM_PORT_26F_UDP_SHIFT 0 +#define I40E_PRT_MNG_MSFM_PORT_26F_UDP_MASK (0x1 << I40E_PRT_MNG_MSFM_PORT_26F_UDP_SHIFT) +#define I40E_PRT_MNG_MSFM_PORT_26F_TCP_SHIFT 1 +#define I40E_PRT_MNG_MSFM_PORT_26F_TCP_MASK (0x1 << I40E_PRT_MNG_MSFM_PORT_26F_TCP_SHIFT) +#define I40E_PRT_MNG_MSFM_PORT_298_UDP_SHIFT 2 +#define I40E_PRT_MNG_MSFM_PORT_298_UDP_MASK (0x1 << I40E_PRT_MNG_MSFM_PORT_298_UDP_SHIFT) +#define I40E_PRT_MNG_MSFM_PORT_298_TCP_SHIFT 3 +#define I40E_PRT_MNG_MSFM_PORT_298_TCP_MASK (0x1 << I40E_PRT_MNG_MSFM_PORT_298_TCP_SHIFT) +#define I40E_PRT_MNG_MSFM_IPV6_0_MASK_SHIFT 4 +#define I40E_PRT_MNG_MSFM_IPV6_0_MASK_MASK (0x1 << I40E_PRT_MNG_MSFM_IPV6_0_MASK_SHIFT) +#define I40E_PRT_MNG_MSFM_IPV6_1_MASK_SHIFT 5 +#define I40E_PRT_MNG_MSFM_IPV6_1_MASK_MASK (0x1 << I40E_PRT_MNG_MSFM_IPV6_1_MASK_SHIFT) +#define I40E_PRT_MNG_MSFM_IPV6_2_MASK_SHIFT 6 +#define I40E_PRT_MNG_MSFM_IPV6_2_MASK_MASK (0x1 << I40E_PRT_MNG_MSFM_IPV6_2_MASK_SHIFT) +#define I40E_PRT_MNG_MSFM_IPV6_3_MASK_SHIFT 7 +#define I40E_PRT_MNG_MSFM_IPV6_3_MASK_MASK (0x1 << I40E_PRT_MNG_MSFM_IPV6_3_MASK_SHIFT) +#define I40E_MSIX_PBA(_i) (0x00004900 + ((_i) * 4)) /* _i=0...5 */ +#define I40E_MSIX_PBA_MAX_INDEX 5 +#define I40E_MSIX_PBA_PENBIT_SHIFT 0 +#define I40E_MSIX_PBA_PENBIT_MASK (0xFFFFFFFF << I40E_MSIX_PBA_PENBIT_SHIFT) +#define I40E_MSIX_TADD(_i) (0x00000000 + ((_i) * 16)) /* _i=0...128 */ +#define I40E_MSIX_TADD_MAX_INDEX 128 +#define I40E_MSIX_TADD_MSIXTADD10_SHIFT 0 +#define I40E_MSIX_TADD_MSIXTADD10_MASK (0x3 << I40E_MSIX_TADD_MSIXTADD10_SHIFT) +#define I40E_MSIX_TADD_MSIXTADD_SHIFT 2 +#define I40E_MSIX_TADD_MSIXTADD_MASK (0x3FFFFFFF << I40E_MSIX_TADD_MSIXTADD_SHIFT) +#define I40E_MSIX_TMSG(_i) (0x00000008 + ((_i) * 16)) /* _i=0...128 */ +#define I40E_MSIX_TMSG_MAX_INDEX 128 +#define I40E_MSIX_TMSG_MSIXTMSG_SHIFT 0 +#define I40E_MSIX_TMSG_MSIXTMSG_MASK (0xFFFFFFFF << I40E_MSIX_TMSG_MSIXTMSG_SHIFT) +#define I40E_MSIX_TUADD(_i) (0x00000004 + ((_i) * 16)) /* _i=0...128 */ +#define I40E_MSIX_TUADD_MAX_INDEX 128 +#define I40E_MSIX_TUADD_MSIXTUADD_SHIFT 0 +#define I40E_MSIX_TUADD_MSIXTUADD_MASK (0xFFFFFFFF << I40E_MSIX_TUADD_MSIXTUADD_SHIFT) +#define I40E_MSIX_TVCTRL(_i) (0x0000000C + ((_i) * 16)) /* _i=0...128 */ +#define I40E_MSIX_TVCTRL_MAX_INDEX 128 +#define I40E_MSIX_TVCTRL_MASK_SHIFT 0 +#define I40E_MSIX_TVCTRL_MASK_MASK (0x1 << I40E_MSIX_TVCTRL_MASK_SHIFT) +#define I40E_VFMSIX_PBA1(_i) (0x00004944 + ((_i) * 4)) /* _i=0...19 */ +#define I40E_VFMSIX_PBA1_MAX_INDEX 19 +#define I40E_VFMSIX_PBA1_PENBIT_SHIFT 0 +#define I40E_VFMSIX_PBA1_PENBIT_MASK (0xFFFFFFFF << I40E_VFMSIX_PBA1_PENBIT_SHIFT) +#define I40E_VFMSIX_TADD1(_i) (0x00002100 + ((_i) * 16)) /* _i=0...639 */ +#define I40E_VFMSIX_TADD1_MAX_INDEX 639 +#define I40E_VFMSIX_TADD1_MSIXTADD10_SHIFT 0 +#define I40E_VFMSIX_TADD1_MSIXTADD10_MASK (0x3 << I40E_VFMSIX_TADD1_MSIXTADD10_SHIFT) +#define I40E_VFMSIX_TADD1_MSIXTADD_SHIFT 2 +#define I40E_VFMSIX_TADD1_MSIXTADD_MASK (0x3FFFFFFF << I40E_VFMSIX_TADD1_MSIXTADD_SHIFT) +#define I40E_VFMSIX_TMSG1(_i) (0x00002108 + ((_i) * 16)) /* _i=0...639 */ +#define I40E_VFMSIX_TMSG1_MAX_INDEX 639 +#define I40E_VFMSIX_TMSG1_MSIXTMSG_SHIFT 0 +#define I40E_VFMSIX_TMSG1_MSIXTMSG_MASK (0xFFFFFFFF << I40E_VFMSIX_TMSG1_MSIXTMSG_SHIFT) +#define I40E_VFMSIX_TUADD1(_i) (0x00002104 + ((_i) * 16)) /* _i=0...639 */ +#define I40E_VFMSIX_TUADD1_MAX_INDEX 639 +#define I40E_VFMSIX_TUADD1_MSIXTUADD_SHIFT 0 +#define I40E_VFMSIX_TUADD1_MSIXTUADD_MASK (0xFFFFFFFF << I40E_VFMSIX_TUADD1_MSIXTUADD_SHIFT) +#define I40E_VFMSIX_TVCTRL1(_i) (0x0000210C + ((_i) * 16)) /* _i=0...639 */ +#define I40E_VFMSIX_TVCTRL1_MAX_INDEX 639 +#define I40E_VFMSIX_TVCTRL1_MASK_SHIFT 0 +#define I40E_VFMSIX_TVCTRL1_MASK_MASK (0x1 << I40E_VFMSIX_TVCTRL1_MASK_SHIFT) +#define I40E_GLNVM_FLA 0x000B6108 +#define I40E_GLNVM_FLA_FL_SCK_SHIFT 0 +#define I40E_GLNVM_FLA_FL_SCK_MASK (0x1 << I40E_GLNVM_FLA_FL_SCK_SHIFT) +#define I40E_GLNVM_FLA_FL_CE_SHIFT 1 +#define I40E_GLNVM_FLA_FL_CE_MASK (0x1 << I40E_GLNVM_FLA_FL_CE_SHIFT) +#define I40E_GLNVM_FLA_FL_SI_SHIFT 2 +#define I40E_GLNVM_FLA_FL_SI_MASK (0x1 << I40E_GLNVM_FLA_FL_SI_SHIFT) +#define I40E_GLNVM_FLA_FL_SO_SHIFT 3 +#define I40E_GLNVM_FLA_FL_SO_MASK (0x1 << I40E_GLNVM_FLA_FL_SO_SHIFT) +#define I40E_GLNVM_FLA_FL_REQ_SHIFT 4 +#define I40E_GLNVM_FLA_FL_REQ_MASK (0x1 << I40E_GLNVM_FLA_FL_REQ_SHIFT) +#define I40E_GLNVM_FLA_FL_GNT_SHIFT 5 +#define I40E_GLNVM_FLA_FL_GNT_MASK (0x1 << I40E_GLNVM_FLA_FL_GNT_SHIFT) +#define I40E_GLNVM_FLA_LOCKED_SHIFT 6 +#define I40E_GLNVM_FLA_LOCKED_MASK (0x1 << I40E_GLNVM_FLA_LOCKED_SHIFT) +#define I40E_GLNVM_FLA_FL_SADDR_SHIFT 18 +#define I40E_GLNVM_FLA_FL_SADDR_MASK (0x7FF << I40E_GLNVM_FLA_FL_SADDR_SHIFT) +#define I40E_GLNVM_FLA_FL_BUSY_SHIFT 30 +#define I40E_GLNVM_FLA_FL_BUSY_MASK (0x1 << I40E_GLNVM_FLA_FL_BUSY_SHIFT) +#define I40E_GLNVM_FLA_FL_DER_SHIFT 31 +#define I40E_GLNVM_FLA_FL_DER_MASK (0x1 << I40E_GLNVM_FLA_FL_DER_SHIFT) +#define I40E_GLNVM_FLASHID 0x000B6104 +#define I40E_GLNVM_FLASHID_FLASHID_SHIFT 0 +#define I40E_GLNVM_FLASHID_FLASHID_MASK (0xFFFFFF << I40E_GLNVM_FLASHID_FLASHID_SHIFT) +#define I40E_GLNVM_GENS 0x000B6100 +#define I40E_GLNVM_GENS_NVM_PRES_SHIFT 0 +#define I40E_GLNVM_GENS_NVM_PRES_MASK (0x1 << I40E_GLNVM_GENS_NVM_PRES_SHIFT) +#define I40E_GLNVM_GENS_SR_SIZE_SHIFT 5 +#define I40E_GLNVM_GENS_SR_SIZE_MASK (0x7 << I40E_GLNVM_GENS_SR_SIZE_SHIFT) +#define I40E_GLNVM_GENS_BANK1VAL_SHIFT 8 +#define I40E_GLNVM_GENS_BANK1VAL_MASK (0x1 << I40E_GLNVM_GENS_BANK1VAL_SHIFT) +#define I40E_GLNVM_GENS_ALT_PRST_SHIFT 23 +#define I40E_GLNVM_GENS_ALT_PRST_MASK (0x1 << I40E_GLNVM_GENS_ALT_PRST_SHIFT) +#define I40E_GLNVM_GENS_FL_AUTO_RD_SHIFT 25 +#define I40E_GLNVM_GENS_FL_AUTO_RD_MASK (0x1 << I40E_GLNVM_GENS_FL_AUTO_RD_SHIFT) +#define I40E_GLNVM_PROTCSR(_i) (0x000B6010 + ((_i) * 4)) /* _i=0...59 */ +#define I40E_GLNVM_PROTCSR_MAX_INDEX 59 +#define I40E_GLNVM_PROTCSR_ADDR_BLOCK_SHIFT 0 +#define I40E_GLNVM_PROTCSR_ADDR_BLOCK_MASK (0xFFFFFF << I40E_GLNVM_PROTCSR_ADDR_BLOCK_SHIFT) +#define I40E_GLNVM_SRCTL 0x000B6110 +#define I40E_GLNVM_SRCTL_SRBUSY_SHIFT 0 +#define I40E_GLNVM_SRCTL_SRBUSY_MASK (0x1 << I40E_GLNVM_SRCTL_SRBUSY_SHIFT) +#define I40E_GLNVM_SRCTL_ADDR_SHIFT 14 +#define I40E_GLNVM_SRCTL_ADDR_MASK (0x7FFF << I40E_GLNVM_SRCTL_ADDR_SHIFT) +#define I40E_GLNVM_SRCTL_WRITE_SHIFT 29 +#define I40E_GLNVM_SRCTL_WRITE_MASK (0x1 << I40E_GLNVM_SRCTL_WRITE_SHIFT) +#define I40E_GLNVM_SRCTL_START_SHIFT 30 +#define I40E_GLNVM_SRCTL_START_MASK (0x1 << I40E_GLNVM_SRCTL_START_SHIFT) +#define I40E_GLNVM_SRCTL_DONE_SHIFT 31 +#define I40E_GLNVM_SRCTL_DONE_MASK (0x1 << I40E_GLNVM_SRCTL_DONE_SHIFT) +#define I40E_GLNVM_SRDATA 0x000B6114 +#define I40E_GLNVM_SRDATA_WRDATA_SHIFT 0 +#define I40E_GLNVM_SRDATA_WRDATA_MASK (0xFFFF << I40E_GLNVM_SRDATA_WRDATA_SHIFT) +#define I40E_GLNVM_SRDATA_RDDATA_SHIFT 16 +#define I40E_GLNVM_SRDATA_RDDATA_MASK (0xFFFF << I40E_GLNVM_SRDATA_RDDATA_SHIFT) +#define I40E_GLNVM_ULD 0x000B6008 +#define I40E_GLNVM_ULD_CONF_PCIR_DONE_SHIFT 0 +#define I40E_GLNVM_ULD_CONF_PCIR_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_PCIR_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_PCIRTL_DONE_SHIFT 1 +#define I40E_GLNVM_ULD_CONF_PCIRTL_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_PCIRTL_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_LCB_DONE_SHIFT 2 +#define I40E_GLNVM_ULD_CONF_LCB_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_LCB_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_CORE_DONE_SHIFT 3 +#define I40E_GLNVM_ULD_CONF_CORE_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_CORE_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_GLOBAL_DONE_SHIFT 4 +#define I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_GLOBAL_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_POR_DONE_SHIFT 5 +#define I40E_GLNVM_ULD_CONF_POR_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_POR_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_PCIE_ANA_DONE_SHIFT 6 +#define I40E_GLNVM_ULD_CONF_PCIE_ANA_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_PCIE_ANA_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_PHY_ANA_DONE_SHIFT 7 +#define I40E_GLNVM_ULD_CONF_PHY_ANA_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_PHY_ANA_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_EMP_DONE_SHIFT 8 +#define I40E_GLNVM_ULD_CONF_EMP_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_EMP_DONE_SHIFT) +#define I40E_GLNVM_ULD_CONF_PCIALT_DONE_SHIFT 9 +#define I40E_GLNVM_ULD_CONF_PCIALT_DONE_MASK (0x1 << I40E_GLNVM_ULD_CONF_PCIALT_DONE_SHIFT) + +#define I40E_GLPCI_BYTCTH 0x0009C484 +#define I40E_GLPCI_BYTCTH_PCI_COUNT_BW_BCT_SHIFT 0 +#define I40E_GLPCI_BYTCTH_PCI_COUNT_BW_BCT_MASK (0xFFFFFFFF << I40E_GLPCI_BYTCTH_PCI_COUNT_BW_BCT_SHIFT) +#define I40E_GLPCI_BYTCTL 0x0009C488 +#define I40E_GLPCI_BYTCTL_PCI_COUNT_BW_BCT_SHIFT 0 +#define I40E_GLPCI_BYTCTL_PCI_COUNT_BW_BCT_MASK (0xFFFFFFFF << I40E_GLPCI_BYTCTL_PCI_COUNT_BW_BCT_SHIFT) +#define I40E_GLPCI_CAPCTRL 0x000BE4A4 +#define I40E_GLPCI_CAPCTRL_VPD_EN_SHIFT 0 +#define I40E_GLPCI_CAPCTRL_VPD_EN_MASK (0x1 << I40E_GLPCI_CAPCTRL_VPD_EN_SHIFT) +#define I40E_GLPCI_CAPSUP 0x000BE4A8 +#define I40E_GLPCI_CAPSUP_PCIE_VER_SHIFT 0 +#define I40E_GLPCI_CAPSUP_PCIE_VER_MASK (0x1 << I40E_GLPCI_CAPSUP_PCIE_VER_SHIFT) +#define I40E_GLPCI_CAPSUP_LTR_EN_SHIFT 2 +#define I40E_GLPCI_CAPSUP_LTR_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_LTR_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_TPH_EN_SHIFT 3 +#define I40E_GLPCI_CAPSUP_TPH_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_TPH_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_ARI_EN_SHIFT 4 +#define I40E_GLPCI_CAPSUP_ARI_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_ARI_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_IOV_EN_SHIFT 5 +#define I40E_GLPCI_CAPSUP_IOV_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_IOV_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_ACS_EN_SHIFT 6 +#define I40E_GLPCI_CAPSUP_ACS_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_ACS_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_SEC_EN_SHIFT 7 +#define I40E_GLPCI_CAPSUP_SEC_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_SEC_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_ECRC_GEN_EN_SHIFT 16 +#define I40E_GLPCI_CAPSUP_ECRC_GEN_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_ECRC_GEN_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_ECRC_CHK_EN_SHIFT 17 +#define I40E_GLPCI_CAPSUP_ECRC_CHK_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_ECRC_CHK_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_IDO_EN_SHIFT 18 +#define I40E_GLPCI_CAPSUP_IDO_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_IDO_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_MSI_MASK_SHIFT 19 +#define I40E_GLPCI_CAPSUP_MSI_MASK_MASK (0x1 << I40E_GLPCI_CAPSUP_MSI_MASK_SHIFT) +#define I40E_GLPCI_CAPSUP_CSR_CONF_EN_SHIFT 20 +#define I40E_GLPCI_CAPSUP_CSR_CONF_EN_MASK (0x1 << I40E_GLPCI_CAPSUP_CSR_CONF_EN_SHIFT) +#define I40E_GLPCI_CAPSUP_LOAD_SUBSYS_ID_SHIFT 30 +#define I40E_GLPCI_CAPSUP_LOAD_SUBSYS_ID_MASK (0x1 << I40E_GLPCI_CAPSUP_LOAD_SUBSYS_ID_SHIFT) +#define I40E_GLPCI_CAPSUP_LOAD_DEV_ID_SHIFT 31 +#define I40E_GLPCI_CAPSUP_LOAD_DEV_ID_MASK (0x1 << I40E_GLPCI_CAPSUP_LOAD_DEV_ID_SHIFT) +#define I40E_GLPCI_CNF 0x000BE4C0 +#define I40E_GLPCI_CNF_FLEX10_SHIFT 1 +#define I40E_GLPCI_CNF_FLEX10_MASK (0x1 << I40E_GLPCI_CNF_FLEX10_SHIFT) +#define I40E_GLPCI_CNF_WAKE_PIN_EN_SHIFT 2 +#define I40E_GLPCI_CNF_WAKE_PIN_EN_MASK (0x1 << I40E_GLPCI_CNF_WAKE_PIN_EN_SHIFT) +#define I40E_GLPCI_CNF2 0x000BE494 +#define I40E_GLPCI_CNF2_RO_DIS_SHIFT 0 +#define I40E_GLPCI_CNF2_RO_DIS_MASK (0x1 << I40E_GLPCI_CNF2_RO_DIS_SHIFT) +#define I40E_GLPCI_CNF2_CACHELINE_SIZE_SHIFT 1 +#define I40E_GLPCI_CNF2_CACHELINE_SIZE_MASK (0x1 << I40E_GLPCI_CNF2_CACHELINE_SIZE_SHIFT) +#define I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT 2 +#define I40E_GLPCI_CNF2_MSI_X_PF_N_MASK (0x7FF << I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT) +#define I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT 13 +#define I40E_GLPCI_CNF2_MSI_X_VF_N_MASK (0x7FF << I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT) +#define I40E_GLPCI_DREVID 0x0009C480 +#define I40E_GLPCI_DREVID_DEFAULT_REVID_SHIFT 0 +#define I40E_GLPCI_DREVID_DEFAULT_REVID_MASK (0xFF << I40E_GLPCI_DREVID_DEFAULT_REVID_SHIFT) +#define I40E_GLPCI_GSCL_1 0x0009C48C +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_0_SHIFT 0 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_0_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_EN_0_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_1_SHIFT 1 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_1_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_EN_1_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_2_SHIFT 2 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_2_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_EN_2_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_3_SHIFT 3 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_EN_3_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_EN_3_SHIFT) +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_0_SHIFT 4 +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_0_MASK (0x1 << I40E_GLPCI_GSCL_1_LBC_ENABLE_0_SHIFT) +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_1_SHIFT 5 +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_1_MASK (0x1 << I40E_GLPCI_GSCL_1_LBC_ENABLE_1_SHIFT) +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_2_SHIFT 6 +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_2_MASK (0x1 << I40E_GLPCI_GSCL_1_LBC_ENABLE_2_SHIFT) +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_3_SHIFT 7 +#define I40E_GLPCI_GSCL_1_LBC_ENABLE_3_MASK (0x1 << I40E_GLPCI_GSCL_1_LBC_ENABLE_3_SHIFT) +#define I40E_GLPCI_GSCL_1_PCI_COUNT_LAT_EN_SHIFT 8 +#define I40E_GLPCI_GSCL_1_PCI_COUNT_LAT_EN_MASK (0x1 << I40E_GLPCI_GSCL_1_PCI_COUNT_LAT_EN_SHIFT) +#define I40E_GLPCI_GSCL_1_PCI_COUNT_LAT_EV_SHIFT 9 +#define I40E_GLPCI_GSCL_1_PCI_COUNT_LAT_EV_MASK (0x1F << I40E_GLPCI_GSCL_1_PCI_COUNT_LAT_EV_SHIFT) +#define I40E_GLPCI_GSCL_1_PCI_COUNT_BW_EN_SHIFT 14 +#define I40E_GLPCI_GSCL_1_PCI_COUNT_BW_EN_MASK (0x1 << I40E_GLPCI_GSCL_1_PCI_COUNT_BW_EN_SHIFT) +#define I40E_GLPCI_GSCL_1_PCI_COUNT_BW_EV_SHIFT 15 +#define I40E_GLPCI_GSCL_1_PCI_COUNT_BW_EV_MASK (0x1F << I40E_GLPCI_GSCL_1_PCI_COUNT_BW_EV_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_64_BIT_EN_SHIFT 28 +#define I40E_GLPCI_GSCL_1_GIO_64_BIT_EN_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_64_BIT_EN_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_COUNT_RESET_SHIFT 29 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_RESET_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_RESET_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_COUNT_STOP_SHIFT 30 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_STOP_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_STOP_SHIFT) +#define I40E_GLPCI_GSCL_1_GIO_COUNT_START_SHIFT 31 +#define I40E_GLPCI_GSCL_1_GIO_COUNT_START_MASK (0x1 << I40E_GLPCI_GSCL_1_GIO_COUNT_START_SHIFT) +#define I40E_GLPCI_GSCL_2 0x0009C490 +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_0_SHIFT 0 +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_0_MASK (0xFF << I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_0_SHIFT) +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_1_SHIFT 8 +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_1_MASK (0xFF << I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_1_SHIFT) +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_2_SHIFT 16 +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_2_MASK (0xFF << I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_2_SHIFT) +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_3_SHIFT 24 +#define I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_3_MASK (0xFF << I40E_GLPCI_GSCL_2_GIO_EVENT_NUM_3_SHIFT) +#define I40E_GLPCI_GSCL_5_8(_i) (0x0009C494 + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLPCI_GSCL_5_8_MAX_INDEX 3 +#define I40E_GLPCI_GSCL_5_8_LBC_THRESHOLD_N_SHIFT 0 +#define I40E_GLPCI_GSCL_5_8_LBC_THRESHOLD_N_MASK (0xFFFF << I40E_GLPCI_GSCL_5_8_LBC_THRESHOLD_N_SHIFT) +#define I40E_GLPCI_GSCL_5_8_LBC_TIMER_N_SHIFT 16 +#define I40E_GLPCI_GSCL_5_8_LBC_TIMER_N_MASK (0xFFFF << I40E_GLPCI_GSCL_5_8_LBC_TIMER_N_SHIFT) +#define I40E_GLPCI_GSCN_0_3(_i) (0x0009C4A4 + ((_i) * 4)) /* _i=0...3 */ +#define I40E_GLPCI_GSCN_0_3_MAX_INDEX 3 +#define I40E_GLPCI_GSCN_0_3_EVENT_COUNTER_SHIFT 0 +#define I40E_GLPCI_GSCN_0_3_EVENT_COUNTER_MASK (0xFFFFFFFF << I40E_GLPCI_GSCN_0_3_EVENT_COUNTER_SHIFT) +#define I40E_GLPCI_LATCT 0x0009C4B4 +#define I40E_GLPCI_LATCT_PCI_COUNT_LAT_CT_SHIFT 0 +#define I40E_GLPCI_LATCT_PCI_COUNT_LAT_CT_MASK (0xFFFFFFFF << I40E_GLPCI_LATCT_PCI_COUNT_LAT_CT_SHIFT) +#define I40E_GLPCI_LBARCTRL 0x000BE484 +#define I40E_GLPCI_LBARCTRL_PREFBAR_SHIFT 0 +#define I40E_GLPCI_LBARCTRL_PREFBAR_MASK (0x1 << I40E_GLPCI_LBARCTRL_PREFBAR_SHIFT) +#define I40E_GLPCI_LBARCTRL_BAR32_SHIFT 1 +#define I40E_GLPCI_LBARCTRL_BAR32_MASK (0x1 << I40E_GLPCI_LBARCTRL_BAR32_SHIFT) +#define I40E_GLPCI_LBARCTRL_FLASH_EXPOSE_SHIFT 3 +#define I40E_GLPCI_LBARCTRL_FLASH_EXPOSE_MASK (0x1 << I40E_GLPCI_LBARCTRL_FLASH_EXPOSE_SHIFT) +#define I40E_GLPCI_LBARCTRL_PE_DB_SIZE_SHIFT 4 +#define I40E_GLPCI_LBARCTRL_PE_DB_SIZE_MASK (0x3 << I40E_GLPCI_LBARCTRL_PE_DB_SIZE_SHIFT) +#define I40E_GLPCI_LBARCTRL_FL_SIZE_SHIFT 6 +#define I40E_GLPCI_LBARCTRL_FL_SIZE_MASK (0x7 << I40E_GLPCI_LBARCTRL_FL_SIZE_SHIFT) +#define I40E_GLPCI_LBARCTRL_VF_PE_DB_SIZE_SHIFT 10 +#define I40E_GLPCI_LBARCTRL_VF_PE_DB_SIZE_MASK (0x1 << I40E_GLPCI_LBARCTRL_VF_PE_DB_SIZE_SHIFT) +#define I40E_GLPCI_LBARCTRL_EXROM_SIZE_SHIFT 11 +#define I40E_GLPCI_LBARCTRL_EXROM_SIZE_MASK (0x7 << I40E_GLPCI_LBARCTRL_EXROM_SIZE_SHIFT) +#define I40E_GLPCI_LINKCAP 0x000BE4AC +#define I40E_GLPCI_LINKCAP_LINK_SPEEDS_VECTOR_SHIFT 0 +#define I40E_GLPCI_LINKCAP_LINK_SPEEDS_VECTOR_MASK (0x3F << I40E_GLPCI_LINKCAP_LINK_SPEEDS_VECTOR_SHIFT) +#define I40E_GLPCI_LINKCAP_MAX_PAYLOAD_SHIFT 6 +#define I40E_GLPCI_LINKCAP_MAX_PAYLOAD_MASK (0x7 << I40E_GLPCI_LINKCAP_MAX_PAYLOAD_SHIFT) +#define I40E_GLPCI_LINKCAP_MAX_LINK_WIDTH_SHIFT 9 +#define I40E_GLPCI_LINKCAP_MAX_LINK_WIDTH_MASK (0xF << I40E_GLPCI_LINKCAP_MAX_LINK_WIDTH_SHIFT) +#define I40E_GLPCI_PCIERR 0x000BE4FC +#define I40E_GLPCI_PCIERR_PCIE_ERR_REP_SHIFT 0 +#define I40E_GLPCI_PCIERR_PCIE_ERR_REP_MASK (0xFFFFFFFF << I40E_GLPCI_PCIERR_PCIE_ERR_REP_SHIFT) +#define I40E_GLPCI_PCITEST2 0x000BE4BC +#define I40E_GLPCI_PCITEST2_IOV_TEST_MODE_SHIFT 0 +#define I40E_GLPCI_PCITEST2_IOV_TEST_MODE_MASK (0x1 << I40E_GLPCI_PCITEST2_IOV_TEST_MODE_SHIFT) +#define I40E_GLPCI_PCITEST2_TAG_ALLOC_SHIFT 1 +#define I40E_GLPCI_PCITEST2_TAG_ALLOC_MASK (0x1 << I40E_GLPCI_PCITEST2_TAG_ALLOC_SHIFT) + +#define I40E_GLPCI_PKTCT 0x0009C4BC +#define I40E_GLPCI_PKTCT_PCI_COUNT_BW_PCT_SHIFT 0 +#define I40E_GLPCI_PKTCT_PCI_COUNT_BW_PCT_MASK (0xFFFFFFFF << I40E_GLPCI_PKTCT_PCI_COUNT_BW_PCT_SHIFT) +#define I40E_GLPCI_PMSUP 0x000BE4B0 +#define I40E_GLPCI_PMSUP_ASPM_SUP_SHIFT 0 +#define I40E_GLPCI_PMSUP_ASPM_SUP_MASK (0x3 << I40E_GLPCI_PMSUP_ASPM_SUP_SHIFT) +#define I40E_GLPCI_PMSUP_L0S_EXIT_LAT_SHIFT 2 +#define I40E_GLPCI_PMSUP_L0S_EXIT_LAT_MASK (0x7 << I40E_GLPCI_PMSUP_L0S_EXIT_LAT_SHIFT) +#define I40E_GLPCI_PMSUP_L1_EXIT_LAT_SHIFT 5 +#define I40E_GLPCI_PMSUP_L1_EXIT_LAT_MASK (0x7 << I40E_GLPCI_PMSUP_L1_EXIT_LAT_SHIFT) +#define I40E_GLPCI_PMSUP_L0S_ACC_LAT_SHIFT 8 +#define I40E_GLPCI_PMSUP_L0S_ACC_LAT_MASK (0x7 << I40E_GLPCI_PMSUP_L0S_ACC_LAT_SHIFT) +#define I40E_GLPCI_PMSUP_L1_ACC_LAT_SHIFT 11 +#define I40E_GLPCI_PMSUP_L1_ACC_LAT_MASK (0x7 << I40E_GLPCI_PMSUP_L1_ACC_LAT_SHIFT) +#define I40E_GLPCI_PMSUP_SLOT_CLK_SHIFT 14 +#define I40E_GLPCI_PMSUP_SLOT_CLK_MASK (0x1 << I40E_GLPCI_PMSUP_SLOT_CLK_SHIFT) +#define I40E_GLPCI_PMSUP_OBFF_SUP_SHIFT 15 +#define I40E_GLPCI_PMSUP_OBFF_SUP_MASK (0x3 << I40E_GLPCI_PMSUP_OBFF_SUP_SHIFT) +#define I40E_GLPCI_PWRDATA 0x000BE490 +#define I40E_GLPCI_PWRDATA_D0_POWER_SHIFT 0 +#define I40E_GLPCI_PWRDATA_D0_POWER_MASK (0xFF << I40E_GLPCI_PWRDATA_D0_POWER_SHIFT) +#define I40E_GLPCI_PWRDATA_COMM_POWER_SHIFT 8 +#define I40E_GLPCI_PWRDATA_COMM_POWER_MASK (0xFF << I40E_GLPCI_PWRDATA_COMM_POWER_SHIFT) +#define I40E_GLPCI_PWRDATA_D3_POWER_SHIFT 16 +#define I40E_GLPCI_PWRDATA_D3_POWER_MASK (0xFF << I40E_GLPCI_PWRDATA_D3_POWER_SHIFT) +#define I40E_GLPCI_PWRDATA_DATA_SCALE_SHIFT 24 +#define I40E_GLPCI_PWRDATA_DATA_SCALE_MASK (0x3 << I40E_GLPCI_PWRDATA_DATA_SCALE_SHIFT) +#define I40E_GLPCI_REVID 0x000BE4B4 +#define I40E_GLPCI_REVID_NVM_REVID_SHIFT 0 +#define I40E_GLPCI_REVID_NVM_REVID_MASK (0xFF << I40E_GLPCI_REVID_NVM_REVID_SHIFT) +#define I40E_GLPCI_SERH 0x000BE49C +#define I40E_GLPCI_SERH_SER_NUM_H_SHIFT 0 +#define I40E_GLPCI_SERH_SER_NUM_H_MASK (0xFFFF << I40E_GLPCI_SERH_SER_NUM_H_SHIFT) +#define I40E_GLPCI_SERL 0x000BE498 +#define I40E_GLPCI_SERL_SER_NUM_L_SHIFT 0 +#define I40E_GLPCI_SERL_SER_NUM_L_MASK (0xFFFFFFFF << I40E_GLPCI_SERL_SER_NUM_L_SHIFT) +#define I40E_GLPCI_SUBSYSID 0x000BE48C +#define I40E_GLPCI_SUBSYSID_SUB_VEN_ID_SHIFT 0 +#define I40E_GLPCI_SUBSYSID_SUB_VEN_ID_MASK (0xFFFF << I40E_GLPCI_SUBSYSID_SUB_VEN_ID_SHIFT) +#define I40E_GLPCI_SUBSYSID_SUB_ID_SHIFT 16 +#define I40E_GLPCI_SUBSYSID_SUB_ID_MASK (0xFFFF << I40E_GLPCI_SUBSYSID_SUB_ID_SHIFT) +#define I40E_GLPCI_UPADD 0x000BE4F8 +#define I40E_GLPCI_UPADD_ADDRESS_SHIFT 1 +#define I40E_GLPCI_UPADD_ADDRESS_MASK (0x7FFFFFFF << I40E_GLPCI_UPADD_ADDRESS_SHIFT) +#define I40E_GLPCI_VFSUP 0x000BE4B8 +#define I40E_GLPCI_VFSUP_VF_PREFETCH_SHIFT 0 +#define I40E_GLPCI_VFSUP_VF_PREFETCH_MASK (0x1 << I40E_GLPCI_VFSUP_VF_PREFETCH_SHIFT) +#define I40E_GLPCI_VFSUP_VR_BAR_TYPE_SHIFT 1 +#define I40E_GLPCI_VFSUP_VR_BAR_TYPE_MASK (0x1 << I40E_GLPCI_VFSUP_VR_BAR_TYPE_SHIFT) +#define I40E_PF_FUNC_RID 0x0009C000 +#define I40E_PF_FUNC_RID_FUNCTION_NUMBER_SHIFT 0 +#define I40E_PF_FUNC_RID_FUNCTION_NUMBER_MASK (0x7 << I40E_PF_FUNC_RID_FUNCTION_NUMBER_SHIFT) +#define I40E_PF_FUNC_RID_DEVICE_NUMBER_SHIFT 3 +#define I40E_PF_FUNC_RID_DEVICE_NUMBER_MASK (0x1F << I40E_PF_FUNC_RID_DEVICE_NUMBER_SHIFT) +#define I40E_PF_FUNC_RID_BUS_NUMBER_SHIFT 8 +#define I40E_PF_FUNC_RID_BUS_NUMBER_MASK (0xFF << I40E_PF_FUNC_RID_BUS_NUMBER_SHIFT) +#define I40E_PF_PCI_CIAA 0x0009C080 +#define I40E_PF_PCI_CIAA_ADDRESS_SHIFT 0 +#define I40E_PF_PCI_CIAA_ADDRESS_MASK (0xFFF << I40E_PF_PCI_CIAA_ADDRESS_SHIFT) +#define I40E_PF_PCI_CIAA_VF_NUM_SHIFT 12 +#define I40E_PF_PCI_CIAA_VF_NUM_MASK (0x7F << I40E_PF_PCI_CIAA_VF_NUM_SHIFT) +#define I40E_PF_PCI_CIAD 0x0009C100 +#define I40E_PF_PCI_CIAD_DATA_SHIFT 0 +#define I40E_PF_PCI_CIAD_DATA_MASK (0xFFFFFFFF << I40E_PF_PCI_CIAD_DATA_SHIFT) +#define I40E_PFPCI_CLASS 0x000BE400 +#define I40E_PFPCI_CLASS_STORAGE_CLASS_SHIFT 0 +#define I40E_PFPCI_CLASS_STORAGE_CLASS_MASK (0x1 << I40E_PFPCI_CLASS_STORAGE_CLASS_SHIFT) +#define I40E_PFPCI_CNF 0x000BE000 +#define I40E_PFPCI_CNF_MSI_EN_SHIFT 2 +#define I40E_PFPCI_CNF_MSI_EN_MASK (0x1 << I40E_PFPCI_CNF_MSI_EN_SHIFT) +#define I40E_PFPCI_CNF_EXROM_DIS_SHIFT 3 +#define I40E_PFPCI_CNF_EXROM_DIS_MASK (0x1 << I40E_PFPCI_CNF_EXROM_DIS_SHIFT) +#define I40E_PFPCI_CNF_IO_BAR_SHIFT 4 +#define I40E_PFPCI_CNF_IO_BAR_MASK (0x1 << I40E_PFPCI_CNF_IO_BAR_SHIFT) +#define I40E_PFPCI_CNF_INT_PIN_SHIFT 5 +#define I40E_PFPCI_CNF_INT_PIN_MASK (0x3 << I40E_PFPCI_CNF_INT_PIN_SHIFT) +#define I40E_PFPCI_FACTPS 0x0009C180 +#define I40E_PFPCI_FACTPS_FUNC_POWER_STATE_SHIFT 0 +#define I40E_PFPCI_FACTPS_FUNC_POWER_STATE_MASK (0x3 << I40E_PFPCI_FACTPS_FUNC_POWER_STATE_SHIFT) +#define I40E_PFPCI_FACTPS_FUNC_AUX_EN_SHIFT 3 +#define I40E_PFPCI_FACTPS_FUNC_AUX_EN_MASK (0x1 << I40E_PFPCI_FACTPS_FUNC_AUX_EN_SHIFT) +#define I40E_PFPCI_FUNC 0x000BE200 +#define I40E_PFPCI_FUNC_FUNC_DIS_SHIFT 0 +#define I40E_PFPCI_FUNC_FUNC_DIS_MASK (0x1 << I40E_PFPCI_FUNC_FUNC_DIS_SHIFT) +#define I40E_PFPCI_FUNC_ALLOW_FUNC_DIS_SHIFT 1 +#define I40E_PFPCI_FUNC_ALLOW_FUNC_DIS_MASK (0x1 << I40E_PFPCI_FUNC_ALLOW_FUNC_DIS_SHIFT) +#define I40E_PFPCI_FUNC_DIS_FUNC_ON_PORT_DIS_SHIFT 2 +#define I40E_PFPCI_FUNC_DIS_FUNC_ON_PORT_DIS_MASK (0x1 << I40E_PFPCI_FUNC_DIS_FUNC_ON_PORT_DIS_SHIFT) +#define I40E_PFPCI_FUNC2 0x000BE180 +#define I40E_PFPCI_FUNC2_EMP_FUNC_DIS_SHIFT 0 +#define I40E_PFPCI_FUNC2_EMP_FUNC_DIS_MASK (0x1 << I40E_PFPCI_FUNC2_EMP_FUNC_DIS_SHIFT) +#define I40E_PFPCI_ICAUSE 0x0009C200 +#define I40E_PFPCI_ICAUSE_PCIE_ERR_CAUSE_SHIFT 0 +#define I40E_PFPCI_ICAUSE_PCIE_ERR_CAUSE_MASK (0xFFFFFFFF << I40E_PFPCI_ICAUSE_PCIE_ERR_CAUSE_SHIFT) +#define I40E_PFPCI_IENA 0x0009C280 +#define I40E_PFPCI_IENA_PCIE_ERR_EN_SHIFT 0 +#define I40E_PFPCI_IENA_PCIE_ERR_EN_MASK (0xFFFFFFFF << I40E_PFPCI_IENA_PCIE_ERR_EN_SHIFT) +#define I40E_PFPCI_PFDEVID 0x000BE080 +#define I40E_PFPCI_PFDEVID_PF_DEV_ID_LAN_SHIFT 0 +#define I40E_PFPCI_PFDEVID_PF_DEV_ID_LAN_MASK (0xFFFF << I40E_PFPCI_PFDEVID_PF_DEV_ID_LAN_SHIFT) +#define I40E_PFPCI_PFDEVID_PF_DEV_ID_SAN_SHIFT 16 +#define I40E_PFPCI_PFDEVID_PF_DEV_ID_SAN_MASK (0xFFFF << I40E_PFPCI_PFDEVID_PF_DEV_ID_SAN_SHIFT) +#define I40E_PFPCI_PM 0x000BE300 +#define I40E_PFPCI_PM_PME_EN_SHIFT 0 +#define I40E_PFPCI_PM_PME_EN_MASK (0x1 << I40E_PFPCI_PM_PME_EN_SHIFT) +#define I40E_PFPCI_STATUS1 0x000BE280 +#define I40E_PFPCI_STATUS1_FUNC_VALID_SHIFT 0 +#define I40E_PFPCI_STATUS1_FUNC_VALID_MASK (0x1 << I40E_PFPCI_STATUS1_FUNC_VALID_SHIFT) +#define I40E_PFPCI_VFDEVID 0x000BE100 +#define I40E_PFPCI_VFDEVID_VF_DEV_ID_LAN_SHIFT 0 +#define I40E_PFPCI_VFDEVID_VF_DEV_ID_LAN_MASK (0xFFFF << I40E_PFPCI_VFDEVID_VF_DEV_ID_LAN_SHIFT) +#define I40E_PFPCI_VFDEVID_VF_DEV_ID_SAN_SHIFT 16 +#define I40E_PFPCI_VFDEVID_VF_DEV_ID_SAN_MASK (0xFFFF << I40E_PFPCI_VFDEVID_VF_DEV_ID_SAN_SHIFT) +#define I40E_PFPCI_VMINDEX 0x0009C300 +#define I40E_PFPCI_VMINDEX_VMINDEX_SHIFT 0 +#define I40E_PFPCI_VMINDEX_VMINDEX_MASK (0x1FF << I40E_PFPCI_VMINDEX_VMINDEX_SHIFT) +#define I40E_PFPCI_VMPEND 0x0009C380 +#define I40E_PFPCI_VMPEND_PENDING_SHIFT 0 +#define I40E_PFPCI_VMPEND_PENDING_MASK (0x1 << I40E_PFPCI_VMPEND_PENDING_SHIFT) +#define I40E_GLPE_CPUSTATUS0 0x0000D040 +#define I40E_GLPE_CPUSTATUS0_PECPUSTATUS0_SHIFT 0 +#define I40E_GLPE_CPUSTATUS0_PECPUSTATUS0_MASK (0xFFFFFFFF << I40E_GLPE_CPUSTATUS0_PECPUSTATUS0_SHIFT) +#define I40E_GLPE_CPUSTATUS1 0x0000D044 +#define I40E_GLPE_CPUSTATUS1_PECPUSTATUS1_SHIFT 0 +#define I40E_GLPE_CPUSTATUS1_PECPUSTATUS1_MASK (0xFFFFFFFF << I40E_GLPE_CPUSTATUS1_PECPUSTATUS1_SHIFT) +#define I40E_GLPE_CPUSTATUS2 0x0000D048 +#define I40E_GLPE_CPUSTATUS2_PECPUSTATUS2_SHIFT 0 +#define I40E_GLPE_CPUSTATUS2_PECPUSTATUS2_MASK (0xFFFFFFFF << I40E_GLPE_CPUSTATUS2_PECPUSTATUS2_SHIFT) +#define I40E_GLPE_PFFLMOBJCTRL(_i) (0x0000D480 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPE_PFFLMOBJCTRL_MAX_INDEX 15 +#define I40E_GLPE_PFFLMOBJCTRL_XMIT_BLOCKSIZE_SHIFT 0 +#define I40E_GLPE_PFFLMOBJCTRL_XMIT_BLOCKSIZE_MASK (0x7 << I40E_GLPE_PFFLMOBJCTRL_XMIT_BLOCKSIZE_SHIFT) +#define I40E_GLPE_PFFLMOBJCTRL_Q1_BLOCKSIZE_SHIFT 8 +#define I40E_GLPE_PFFLMOBJCTRL_Q1_BLOCKSIZE_MASK (0x7 << I40E_GLPE_PFFLMOBJCTRL_Q1_BLOCKSIZE_SHIFT) +#define I40E_GLPE_VFFLMOBJCTRL(_i) (0x0000D400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPE_VFFLMOBJCTRL_MAX_INDEX 31 +#define I40E_GLPE_VFFLMOBJCTRL_XMIT_BLOCKSIZE_SHIFT 0 +#define I40E_GLPE_VFFLMOBJCTRL_XMIT_BLOCKSIZE_MASK (0x7 << I40E_GLPE_VFFLMOBJCTRL_XMIT_BLOCKSIZE_SHIFT) +#define I40E_GLPE_VFFLMOBJCTRL_Q1_BLOCKSIZE_SHIFT 8 +#define I40E_GLPE_VFFLMOBJCTRL_Q1_BLOCKSIZE_MASK (0x7 << I40E_GLPE_VFFLMOBJCTRL_Q1_BLOCKSIZE_SHIFT) +#define I40E_GLPE_VFFLMQ1ALLOCERR(_i) (0x0000C700 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPE_VFFLMQ1ALLOCERR_MAX_INDEX 31 +#define I40E_GLPE_VFFLMQ1ALLOCERR_ERROR_COUNT_SHIFT 0 +#define I40E_GLPE_VFFLMQ1ALLOCERR_ERROR_COUNT_MASK (0xFFFF << I40E_GLPE_VFFLMQ1ALLOCERR_ERROR_COUNT_SHIFT) +#define I40E_GLPE_VFFLMXMITALLOCERR(_i) (0x0000C600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPE_VFFLMXMITALLOCERR_MAX_INDEX 31 +#define I40E_GLPE_VFFLMXMITALLOCERR_ERROR_COUNT_SHIFT 0 +#define I40E_GLPE_VFFLMXMITALLOCERR_ERROR_COUNT_MASK (0xFFFF << I40E_GLPE_VFFLMXMITALLOCERR_ERROR_COUNT_SHIFT) +#define I40E_GLPE_VFUDACTRL(_i) (0x0000C000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPE_VFUDACTRL_MAX_INDEX 31 +#define I40E_GLPE_VFUDACTRL_IPV4MCFRAGRESBP_SHIFT 0 +#define I40E_GLPE_VFUDACTRL_IPV4MCFRAGRESBP_MASK (0x1 << I40E_GLPE_VFUDACTRL_IPV4MCFRAGRESBP_SHIFT) +#define I40E_GLPE_VFUDACTRL_IPV4UCFRAGRESBP_SHIFT 1 +#define I40E_GLPE_VFUDACTRL_IPV4UCFRAGRESBP_MASK (0x1 << I40E_GLPE_VFUDACTRL_IPV4UCFRAGRESBP_SHIFT) +#define I40E_GLPE_VFUDACTRL_IPV6MCFRAGRESBP_SHIFT 2 +#define I40E_GLPE_VFUDACTRL_IPV6MCFRAGRESBP_MASK (0x1 << I40E_GLPE_VFUDACTRL_IPV6MCFRAGRESBP_SHIFT) +#define I40E_GLPE_VFUDACTRL_IPV6UCFRAGRESBP_SHIFT 3 +#define I40E_GLPE_VFUDACTRL_IPV6UCFRAGRESBP_MASK (0x1 << I40E_GLPE_VFUDACTRL_IPV6UCFRAGRESBP_SHIFT) +#define I40E_GLPE_VFUDACTRL_UDPMCFRAGRESFAIL_SHIFT 4 +#define I40E_GLPE_VFUDACTRL_UDPMCFRAGRESFAIL_MASK (0x1 << I40E_GLPE_VFUDACTRL_UDPMCFRAGRESFAIL_SHIFT) +#define I40E_GLPE_VFUDAUCFBQPN(_i) (0x0000C100 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPE_VFUDAUCFBQPN_MAX_INDEX 31 +#define I40E_GLPE_VFUDAUCFBQPN_QPN_SHIFT 0 +#define I40E_GLPE_VFUDAUCFBQPN_QPN_MASK (0x3FFFF << I40E_GLPE_VFUDAUCFBQPN_QPN_SHIFT) +#define I40E_GLPE_VFUDAUCFBQPN_VALID_SHIFT 31 +#define I40E_GLPE_VFUDAUCFBQPN_VALID_MASK (0x1 << I40E_GLPE_VFUDAUCFBQPN_VALID_SHIFT) +#define I40E_PFPE_AEQALLOC 0x00131180 +#define I40E_PFPE_AEQALLOC_AECOUNT_SHIFT 0 +#define I40E_PFPE_AEQALLOC_AECOUNT_MASK (0xFFFFFFFF << I40E_PFPE_AEQALLOC_AECOUNT_SHIFT) +#define I40E_PFPE_CCQPHIGH 0x00008200 +#define I40E_PFPE_CCQPHIGH_PECCQPHIGH_SHIFT 0 +#define I40E_PFPE_CCQPHIGH_PECCQPHIGH_MASK (0xFFFFFFFF << I40E_PFPE_CCQPHIGH_PECCQPHIGH_SHIFT) +#define I40E_PFPE_CCQPLOW 0x00008180 +#define I40E_PFPE_CCQPLOW_PECCQPLOW_SHIFT 0 +#define I40E_PFPE_CCQPLOW_PECCQPLOW_MASK (0xFFFFFFFF << I40E_PFPE_CCQPLOW_PECCQPLOW_SHIFT) +#define I40E_PFPE_CCQPSTATUS 0x00008100 +#define I40E_PFPE_CCQPSTATUS_CCQP_DONE_SHIFT 0 +#define I40E_PFPE_CCQPSTATUS_CCQP_DONE_MASK (0x1 << I40E_PFPE_CCQPSTATUS_CCQP_DONE_SHIFT) +#define I40E_PFPE_CCQPSTATUS_CCQP_ERR_SHIFT 31 +#define I40E_PFPE_CCQPSTATUS_CCQP_ERR_MASK (0x1 << I40E_PFPE_CCQPSTATUS_CCQP_ERR_SHIFT) +#define I40E_PFPE_CQACK 0x00131100 +#define I40E_PFPE_CQACK_PECQID_SHIFT 0 +#define I40E_PFPE_CQACK_PECQID_MASK (0x1FFFF << I40E_PFPE_CQACK_PECQID_SHIFT) +#define I40E_PFPE_CQARM 0x00131080 +#define I40E_PFPE_CQARM_PECQID_SHIFT 0 +#define I40E_PFPE_CQARM_PECQID_MASK (0x1FFFF << I40E_PFPE_CQARM_PECQID_SHIFT) +#define I40E_PFPE_CQPDB 0x00008000 +#define I40E_PFPE_CQPDB_WQHEAD_SHIFT 0 +#define I40E_PFPE_CQPDB_WQHEAD_MASK (0x7FF << I40E_PFPE_CQPDB_WQHEAD_SHIFT) +#define I40E_PFPE_CQPERRCODES 0x00008880 +#define I40E_PFPE_CQPERRCODES_CQP_MINOR_CODE_SHIFT 0 +#define I40E_PFPE_CQPERRCODES_CQP_MINOR_CODE_MASK (0xFFFF << I40E_PFPE_CQPERRCODES_CQP_MINOR_CODE_SHIFT) +#define I40E_PFPE_CQPERRCODES_CQP_MAJOR_CODE_SHIFT 16 +#define I40E_PFPE_CQPERRCODES_CQP_MAJOR_CODE_MASK (0xFFFF << I40E_PFPE_CQPERRCODES_CQP_MAJOR_CODE_SHIFT) +#define I40E_PFPE_CQPTAIL 0x00008080 +#define I40E_PFPE_CQPTAIL_WQTAIL_SHIFT 0 +#define I40E_PFPE_CQPTAIL_WQTAIL_MASK (0x7FF << I40E_PFPE_CQPTAIL_WQTAIL_SHIFT) +#define I40E_PFPE_CQPTAIL_CQP_OP_ERR_SHIFT 31 +#define I40E_PFPE_CQPTAIL_CQP_OP_ERR_MASK (0x1 << I40E_PFPE_CQPTAIL_CQP_OP_ERR_SHIFT) +#define I40E_PFPE_FLMQ1ALLOCERR 0x00008980 +#define I40E_PFPE_FLMQ1ALLOCERR_ERROR_COUNT_SHIFT 0 +#define I40E_PFPE_FLMQ1ALLOCERR_ERROR_COUNT_MASK (0xFFFF << I40E_PFPE_FLMQ1ALLOCERR_ERROR_COUNT_SHIFT) +#define I40E_PFPE_FLMXMITALLOCERR 0x00008900 +#define I40E_PFPE_FLMXMITALLOCERR_ERROR_COUNT_SHIFT 0 +#define I40E_PFPE_FLMXMITALLOCERR_ERROR_COUNT_MASK (0xFFFF << I40E_PFPE_FLMXMITALLOCERR_ERROR_COUNT_SHIFT) +#define I40E_PFPE_IPCONFIG0 0x00008280 +#define I40E_PFPE_IPCONFIG0_PEIPID_SHIFT 0 +#define I40E_PFPE_IPCONFIG0_PEIPID_MASK (0xFFFF << I40E_PFPE_IPCONFIG0_PEIPID_SHIFT) +#define I40E_PFPE_IPCONFIG0_USEENTIREIDRANGE_SHIFT 16 +#define I40E_PFPE_IPCONFIG0_USEENTIREIDRANGE_MASK (0x1 << I40E_PFPE_IPCONFIG0_USEENTIREIDRANGE_SHIFT) + +#define I40E_PFPE_MRTEIDXMASK 0x00008600 +#define I40E_PFPE_MRTEIDXMASK_MRTEIDXMASKBITS_SHIFT 0 +#define I40E_PFPE_MRTEIDXMASK_MRTEIDXMASKBITS_MASK (0x1F << I40E_PFPE_MRTEIDXMASK_MRTEIDXMASKBITS_SHIFT) +#define I40E_PFPE_RCVUNEXPECTEDERROR 0x00008680 +#define I40E_PFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_SHIFT 0 +#define I40E_PFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_MASK (0xFFFFFF << I40E_PFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_SHIFT) +#define I40E_PFPE_TCPNOWTIMER 0x00008580 +#define I40E_PFPE_TCPNOWTIMER_TCP_NOW_SHIFT 0 +#define I40E_PFPE_TCPNOWTIMER_TCP_NOW_MASK (0xFFFFFFFF << I40E_PFPE_TCPNOWTIMER_TCP_NOW_SHIFT) +#define I40E_PFPE_UDACTRL 0x00008700 +#define I40E_PFPE_UDACTRL_IPV4MCFRAGRESBP_SHIFT 0 +#define I40E_PFPE_UDACTRL_IPV4MCFRAGRESBP_MASK (0x1 << I40E_PFPE_UDACTRL_IPV4MCFRAGRESBP_SHIFT) +#define I40E_PFPE_UDACTRL_IPV4UCFRAGRESBP_SHIFT 1 +#define I40E_PFPE_UDACTRL_IPV4UCFRAGRESBP_MASK (0x1 << I40E_PFPE_UDACTRL_IPV4UCFRAGRESBP_SHIFT) +#define I40E_PFPE_UDACTRL_IPV6MCFRAGRESBP_SHIFT 2 +#define I40E_PFPE_UDACTRL_IPV6MCFRAGRESBP_MASK (0x1 << I40E_PFPE_UDACTRL_IPV6MCFRAGRESBP_SHIFT) +#define I40E_PFPE_UDACTRL_IPV6UCFRAGRESBP_SHIFT 3 +#define I40E_PFPE_UDACTRL_IPV6UCFRAGRESBP_MASK (0x1 << I40E_PFPE_UDACTRL_IPV6UCFRAGRESBP_SHIFT) +#define I40E_PFPE_UDACTRL_UDPMCFRAGRESFAIL_SHIFT 4 +#define I40E_PFPE_UDACTRL_UDPMCFRAGRESFAIL_MASK (0x1 << I40E_PFPE_UDACTRL_UDPMCFRAGRESFAIL_SHIFT) +#define I40E_PFPE_UDAUCFBQPN 0x00008780 +#define I40E_PFPE_UDAUCFBQPN_QPN_SHIFT 0 +#define I40E_PFPE_UDAUCFBQPN_QPN_MASK (0x3FFFF << I40E_PFPE_UDAUCFBQPN_QPN_SHIFT) +#define I40E_PFPE_UDAUCFBQPN_VALID_SHIFT 31 +#define I40E_PFPE_UDAUCFBQPN_VALID_MASK (0x1 << I40E_PFPE_UDAUCFBQPN_VALID_SHIFT) +#define I40E_PFPE_WQEALLOC 0x00138C00 +#define I40E_PFPE_WQEALLOC_PEQPID_SHIFT 0 +#define I40E_PFPE_WQEALLOC_PEQPID_MASK (0x3FFFF << I40E_PFPE_WQEALLOC_PEQPID_SHIFT) +#define I40E_PFPE_WQEALLOC_WQE_DESC_INDEX_SHIFT 20 +#define I40E_PFPE_WQEALLOC_WQE_DESC_INDEX_MASK (0xFFF << I40E_PFPE_WQEALLOC_WQE_DESC_INDEX_SHIFT) +#define I40E_VFPE_AEQALLOC(_VF) (0x00130C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_AEQALLOC_MAX_INDEX 127 +#define I40E_VFPE_AEQALLOC_AECOUNT_SHIFT 0 +#define I40E_VFPE_AEQALLOC_AECOUNT_MASK (0xFFFFFFFF << I40E_VFPE_AEQALLOC_AECOUNT_SHIFT) +#define I40E_VFPE_CCQPHIGH(_VF) (0x00001000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CCQPHIGH_MAX_INDEX 127 +#define I40E_VFPE_CCQPHIGH_PECCQPHIGH_SHIFT 0 +#define I40E_VFPE_CCQPHIGH_PECCQPHIGH_MASK (0xFFFFFFFF << I40E_VFPE_CCQPHIGH_PECCQPHIGH_SHIFT) +#define I40E_VFPE_CCQPLOW(_VF) (0x00000C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CCQPLOW_MAX_INDEX 127 +#define I40E_VFPE_CCQPLOW_PECCQPLOW_SHIFT 0 +#define I40E_VFPE_CCQPLOW_PECCQPLOW_MASK (0xFFFFFFFF << I40E_VFPE_CCQPLOW_PECCQPLOW_SHIFT) +#define I40E_VFPE_CCQPSTATUS(_VF) (0x00000800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CCQPSTATUS_MAX_INDEX 127 +#define I40E_VFPE_CCQPSTATUS_CCQP_DONE_SHIFT 0 +#define I40E_VFPE_CCQPSTATUS_CCQP_DONE_MASK (0x1 << I40E_VFPE_CCQPSTATUS_CCQP_DONE_SHIFT) +#define I40E_VFPE_CCQPSTATUS_CCQP_ERR_SHIFT 31 +#define I40E_VFPE_CCQPSTATUS_CCQP_ERR_MASK (0x1 << I40E_VFPE_CCQPSTATUS_CCQP_ERR_SHIFT) +#define I40E_VFPE_CQACK(_VF) (0x00130800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CQACK_MAX_INDEX 127 +#define I40E_VFPE_CQACK_PECQID_SHIFT 0 +#define I40E_VFPE_CQACK_PECQID_MASK (0x1FFFF << I40E_VFPE_CQACK_PECQID_SHIFT) +#define I40E_VFPE_CQARM(_VF) (0x00130400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CQARM_MAX_INDEX 127 +#define I40E_VFPE_CQARM_PECQID_SHIFT 0 +#define I40E_VFPE_CQARM_PECQID_MASK (0x1FFFF << I40E_VFPE_CQARM_PECQID_SHIFT) +#define I40E_VFPE_CQPDB(_VF) (0x00000000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CQPDB_MAX_INDEX 127 +#define I40E_VFPE_CQPDB_WQHEAD_SHIFT 0 +#define I40E_VFPE_CQPDB_WQHEAD_MASK (0x7FF << I40E_VFPE_CQPDB_WQHEAD_SHIFT) +#define I40E_VFPE_CQPERRCODES(_VF) (0x00001800 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CQPERRCODES_MAX_INDEX 127 +#define I40E_VFPE_CQPERRCODES_CQP_MINOR_CODE_SHIFT 0 +#define I40E_VFPE_CQPERRCODES_CQP_MINOR_CODE_MASK (0xFFFF << I40E_VFPE_CQPERRCODES_CQP_MINOR_CODE_SHIFT) +#define I40E_VFPE_CQPERRCODES_CQP_MAJOR_CODE_SHIFT 16 +#define I40E_VFPE_CQPERRCODES_CQP_MAJOR_CODE_MASK (0xFFFF << I40E_VFPE_CQPERRCODES_CQP_MAJOR_CODE_SHIFT) +#define I40E_VFPE_CQPTAIL(_VF) (0x00000400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_CQPTAIL_MAX_INDEX 127 +#define I40E_VFPE_CQPTAIL_WQTAIL_SHIFT 0 +#define I40E_VFPE_CQPTAIL_WQTAIL_MASK (0x7FF << I40E_VFPE_CQPTAIL_WQTAIL_SHIFT) +#define I40E_VFPE_CQPTAIL_CQP_OP_ERR_SHIFT 31 +#define I40E_VFPE_CQPTAIL_CQP_OP_ERR_MASK (0x1 << I40E_VFPE_CQPTAIL_CQP_OP_ERR_SHIFT) +#define I40E_VFPE_IPCONFIG0(_VF) (0x00001400 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_IPCONFIG0_MAX_INDEX 127 +#define I40E_VFPE_IPCONFIG0_PEIPID_SHIFT 0 +#define I40E_VFPE_IPCONFIG0_PEIPID_MASK (0xFFFF << I40E_VFPE_IPCONFIG0_PEIPID_SHIFT) +#define I40E_VFPE_IPCONFIG0_USEENTIREIDRANGE_SHIFT 16 +#define I40E_VFPE_IPCONFIG0_USEENTIREIDRANGE_MASK (0x1 << I40E_VFPE_IPCONFIG0_USEENTIREIDRANGE_SHIFT) +#define I40E_VFPE_MRTEIDXMASK(_VF) (0x00003000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_MRTEIDXMASK_MAX_INDEX 127 +#define I40E_VFPE_MRTEIDXMASK_MRTEIDXMASKBITS_SHIFT 0 +#define I40E_VFPE_MRTEIDXMASK_MRTEIDXMASKBITS_MASK (0x1F << I40E_VFPE_MRTEIDXMASK_MRTEIDXMASKBITS_SHIFT) +#define I40E_VFPE_RCVUNEXPECTEDERROR(_VF) (0x00003400 + ((_VF) * 4)) +#define I40E_VFPE_RCVUNEXPECTEDERROR_MAX_INDEX 127 +#define I40E_VFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_SHIFT 0 +#define I40E_VFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_MASK (0xFFFFFF << I40E_VFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_SHIFT) +#define I40E_VFPE_TCPNOWTIMER(_VF) (0x00002C00 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_TCPNOWTIMER_MAX_INDEX 127 +#define I40E_VFPE_TCPNOWTIMER_TCP_NOW_SHIFT 0 +#define I40E_VFPE_TCPNOWTIMER_TCP_NOW_MASK (0xFFFFFFFF << I40E_VFPE_TCPNOWTIMER_TCP_NOW_SHIFT) +#define I40E_VFPE_WQEALLOC(_VF) (0x00138000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VFPE_WQEALLOC_MAX_INDEX 127 +#define I40E_VFPE_WQEALLOC_PEQPID_SHIFT 0 +#define I40E_VFPE_WQEALLOC_PEQPID_MASK (0x3FFFF << I40E_VFPE_WQEALLOC_PEQPID_SHIFT) +#define I40E_VFPE_WQEALLOC_WQE_DESC_INDEX_SHIFT 20 +#define I40E_VFPE_WQEALLOC_WQE_DESC_INDEX_MASK (0xFFF << I40E_VFPE_WQEALLOC_WQE_DESC_INDEX_SHIFT) +#define I40E_GLPES_PFIP4RXDISCARD(_i) (0x00010600 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXDISCARD_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXDISCARD_IP4RXDISCARD_SHIFT 0 +#define I40E_GLPES_PFIP4RXDISCARD_IP4RXDISCARD_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXDISCARD_IP4RXDISCARD_SHIFT) +#define I40E_GLPES_PFIP4RXFRAGSHI(_i) (0x00010804 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXFRAGSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXFRAGSHI_IP4RXFRAGSHI_SHIFT 0 +#define I40E_GLPES_PFIP4RXFRAGSHI_IP4RXFRAGSHI_MASK (0xFFFF << I40E_GLPES_PFIP4RXFRAGSHI_IP4RXFRAGSHI_SHIFT) +#define I40E_GLPES_PFIP4RXFRAGSLO(_i) (0x00010800 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXFRAGSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXFRAGSLO_IP4RXFRAGSLO_SHIFT 0 +#define I40E_GLPES_PFIP4RXFRAGSLO_IP4RXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXFRAGSLO_IP4RXFRAGSLO_SHIFT) +#define I40E_GLPES_PFIP4RXMCOCTSHI(_i) (0x00010A04 + ((_i) * 8)) +#define I40E_GLPES_PFIP4RXMCOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXMCOCTSHI_IP4RXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4RXMCOCTSHI_IP4RXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4RXMCOCTSHI_IP4RXMCOCTSHI_SHIFT) +#define I40E_GLPES_PFIP4RXMCOCTSLO(_i) (0x00010A00 + ((_i) * 8)) +#define I40E_GLPES_PFIP4RXMCOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXMCOCTSLO_IP4RXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4RXMCOCTSLO_IP4RXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXMCOCTSLO_IP4RXMCOCTSLO_SHIFT) +#define I40E_GLPES_PFIP4RXMCPKTSHI(_i) (0x00010C04 + ((_i) * 8)) +#define I40E_GLPES_PFIP4RXMCPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXMCPKTSHI_IP4RXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4RXMCPKTSHI_IP4RXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4RXMCPKTSHI_IP4RXMCPKTSHI_SHIFT) +#define I40E_GLPES_PFIP4RXMCPKTSLO(_i) (0x00010C00 + ((_i) * 8)) +#define I40E_GLPES_PFIP4RXMCPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXMCPKTSLO_IP4RXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4RXMCPKTSLO_IP4RXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXMCPKTSLO_IP4RXMCPKTSLO_SHIFT) +#define I40E_GLPES_PFIP4RXOCTSHI(_i) (0x00010204 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXOCTSHI_IP4RXOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4RXOCTSHI_IP4RXOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4RXOCTSHI_IP4RXOCTSHI_SHIFT) +#define I40E_GLPES_PFIP4RXOCTSLO(_i) (0x00010200 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXOCTSLO_IP4RXOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4RXOCTSLO_IP4RXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXOCTSLO_IP4RXOCTSLO_SHIFT) +#define I40E_GLPES_PFIP4RXPKTSHI(_i) (0x00010404 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXPKTSHI_IP4RXPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4RXPKTSHI_IP4RXPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4RXPKTSHI_IP4RXPKTSHI_SHIFT) +#define I40E_GLPES_PFIP4RXPKTSLO(_i) (0x00010400 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXPKTSLO_IP4RXPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4RXPKTSLO_IP4RXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXPKTSLO_IP4RXPKTSLO_SHIFT) +#define I40E_GLPES_PFIP4RXTRUNC(_i) (0x00010700 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4RXTRUNC_MAX_INDEX 15 +#define I40E_GLPES_PFIP4RXTRUNC_IP4RXTRUNC_SHIFT 0 +#define I40E_GLPES_PFIP4RXTRUNC_IP4RXTRUNC_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4RXTRUNC_IP4RXTRUNC_SHIFT) +#define I40E_GLPES_PFIP4TXFRAGSHI(_i) (0x00011E04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXFRAGSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXFRAGSHI_IP4TXFRAGSHI_SHIFT 0 +#define I40E_GLPES_PFIP4TXFRAGSHI_IP4TXFRAGSHI_MASK (0xFFFF << I40E_GLPES_PFIP4TXFRAGSHI_IP4TXFRAGSHI_SHIFT) +#define I40E_GLPES_PFIP4TXFRAGSLO(_i) (0x00011E00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXFRAGSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXFRAGSLO_IP4TXFRAGSLO_SHIFT 0 +#define I40E_GLPES_PFIP4TXFRAGSLO_IP4TXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4TXFRAGSLO_IP4TXFRAGSLO_SHIFT) +#define I40E_GLPES_PFIP4TXMCOCTSHI(_i) (0x00012004 + ((_i) * 8)) +#define I40E_GLPES_PFIP4TXMCOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXMCOCTSHI_IP4TXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4TXMCOCTSHI_IP4TXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4TXMCOCTSHI_IP4TXMCOCTSHI_SHIFT) +#define I40E_GLPES_PFIP4TXMCOCTSLO(_i) (0x00012000 + ((_i) * 8)) +#define I40E_GLPES_PFIP4TXMCOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXMCOCTSLO_IP4TXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4TXMCOCTSLO_IP4TXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4TXMCOCTSLO_IP4TXMCOCTSLO_SHIFT) +#define I40E_GLPES_PFIP4TXMCPKTSHI(_i) (0x00012204 + ((_i) * 8)) +#define I40E_GLPES_PFIP4TXMCPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXMCPKTSHI_IP4TXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4TXMCPKTSHI_IP4TXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4TXMCPKTSHI_IP4TXMCPKTSHI_SHIFT) +#define I40E_GLPES_PFIP4TXMCPKTSLO(_i) (0x00012200 + ((_i) * 8)) +#define I40E_GLPES_PFIP4TXMCPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXMCPKTSLO_IP4TXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4TXMCPKTSLO_IP4TXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4TXMCPKTSLO_IP4TXMCPKTSLO_SHIFT) +#define I40E_GLPES_PFIP4TXNOROUTE(_i) (0x00012E00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXNOROUTE_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXNOROUTE_IP4TXNOROUTE_SHIFT 0 +#define I40E_GLPES_PFIP4TXNOROUTE_IP4TXNOROUTE_MASK (0xFFFFFF << I40E_GLPES_PFIP4TXNOROUTE_IP4TXNOROUTE_SHIFT) +#define I40E_GLPES_PFIP4TXOCTSHI(_i) (0x00011A04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXOCTSHI_IP4TXOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4TXOCTSHI_IP4TXOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4TXOCTSHI_IP4TXOCTSHI_SHIFT) +#define I40E_GLPES_PFIP4TXOCTSLO(_i) (0x00011A00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXOCTSLO_IP4TXOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4TXOCTSLO_IP4TXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4TXOCTSLO_IP4TXOCTSLO_SHIFT) +#define I40E_GLPES_PFIP4TXPKTSHI(_i) (0x00011C04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXPKTSHI_IP4TXPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP4TXPKTSHI_IP4TXPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP4TXPKTSHI_IP4TXPKTSHI_SHIFT) +#define I40E_GLPES_PFIP4TXPKTSLO(_i) (0x00011C00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP4TXPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP4TXPKTSLO_IP4TXPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP4TXPKTSLO_IP4TXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP4TXPKTSLO_IP4TXPKTSLO_SHIFT) +#define I40E_GLPES_PFIP6RXDISCARD(_i) (0x00011200 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXDISCARD_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXDISCARD_IP6RXDISCARD_SHIFT 0 +#define I40E_GLPES_PFIP6RXDISCARD_IP6RXDISCARD_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXDISCARD_IP6RXDISCARD_SHIFT) +#define I40E_GLPES_PFIP6RXFRAGSHI(_i) (0x00011404 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXFRAGSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXFRAGSHI_IP6RXFRAGSHI_SHIFT 0 +#define I40E_GLPES_PFIP6RXFRAGSHI_IP6RXFRAGSHI_MASK (0xFFFF << I40E_GLPES_PFIP6RXFRAGSHI_IP6RXFRAGSHI_SHIFT) +#define I40E_GLPES_PFIP6RXFRAGSLO(_i) (0x00011400 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXFRAGSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXFRAGSLO_IP6RXFRAGSLO_SHIFT 0 +#define I40E_GLPES_PFIP6RXFRAGSLO_IP6RXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXFRAGSLO_IP6RXFRAGSLO_SHIFT) +#define I40E_GLPES_PFIP6RXMCOCTSHI(_i) (0x00011604 + ((_i) * 8)) +#define I40E_GLPES_PFIP6RXMCOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXMCOCTSHI_IP6RXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6RXMCOCTSHI_IP6RXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6RXMCOCTSHI_IP6RXMCOCTSHI_SHIFT) +#define I40E_GLPES_PFIP6RXMCOCTSLO(_i) (0x00011600 + ((_i) * 8)) +#define I40E_GLPES_PFIP6RXMCOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXMCOCTSLO_IP6RXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6RXMCOCTSLO_IP6RXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXMCOCTSLO_IP6RXMCOCTSLO_SHIFT) +#define I40E_GLPES_PFIP6RXMCPKTSHI(_i) (0x00011804 + ((_i) * 8)) +#define I40E_GLPES_PFIP6RXMCPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXMCPKTSHI_IP6RXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6RXMCPKTSHI_IP6RXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6RXMCPKTSHI_IP6RXMCPKTSHI_SHIFT) +#define I40E_GLPES_PFIP6RXMCPKTSLO(_i) (0x00011800 + ((_i) * 8)) +#define I40E_GLPES_PFIP6RXMCPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXMCPKTSLO_IP6RXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6RXMCPKTSLO_IP6RXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXMCPKTSLO_IP6RXMCPKTSLO_SHIFT) +#define I40E_GLPES_PFIP6RXOCTSHI(_i) (0x00010E04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXOCTSHI_IP6RXOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6RXOCTSHI_IP6RXOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6RXOCTSHI_IP6RXOCTSHI_SHIFT) +#define I40E_GLPES_PFIP6RXOCTSLO(_i) (0x00010E00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXOCTSLO_IP6RXOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6RXOCTSLO_IP6RXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXOCTSLO_IP6RXOCTSLO_SHIFT) +#define I40E_GLPES_PFIP6RXPKTSHI(_i) (0x00011004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXPKTSHI_IP6RXPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6RXPKTSHI_IP6RXPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6RXPKTSHI_IP6RXPKTSHI_SHIFT) +#define I40E_GLPES_PFIP6RXPKTSLO(_i) (0x00011000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXPKTSLO_IP6RXPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6RXPKTSLO_IP6RXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXPKTSLO_IP6RXPKTSLO_SHIFT) +#define I40E_GLPES_PFIP6RXTRUNC(_i) (0x00011300 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6RXTRUNC_MAX_INDEX 15 +#define I40E_GLPES_PFIP6RXTRUNC_IP6RXTRUNC_SHIFT 0 +#define I40E_GLPES_PFIP6RXTRUNC_IP6RXTRUNC_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6RXTRUNC_IP6RXTRUNC_SHIFT) +#define I40E_GLPES_PFIP6TXFRAGSHI(_i) (0x00012804 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXFRAGSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXFRAGSHI_IP6TXFRAGSHI_SHIFT 0 +#define I40E_GLPES_PFIP6TXFRAGSHI_IP6TXFRAGSHI_MASK (0xFFFF << I40E_GLPES_PFIP6TXFRAGSHI_IP6TXFRAGSHI_SHIFT) +#define I40E_GLPES_PFIP6TXFRAGSLO(_i) (0x00012800 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXFRAGSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXFRAGSLO_IP6TXFRAGSLO_SHIFT 0 +#define I40E_GLPES_PFIP6TXFRAGSLO_IP6TXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6TXFRAGSLO_IP6TXFRAGSLO_SHIFT) +#define I40E_GLPES_PFIP6TXMCOCTSHI(_i) (0x00012A04 + ((_i) * 8)) +#define I40E_GLPES_PFIP6TXMCOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXMCOCTSHI_IP6TXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6TXMCOCTSHI_IP6TXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6TXMCOCTSHI_IP6TXMCOCTSHI_SHIFT) +#define I40E_GLPES_PFIP6TXMCOCTSLO(_i) (0x00012A00 + ((_i) * 8)) +#define I40E_GLPES_PFIP6TXMCOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXMCOCTSLO_IP6TXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6TXMCOCTSLO_IP6TXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6TXMCOCTSLO_IP6TXMCOCTSLO_SHIFT) +#define I40E_GLPES_PFIP6TXMCPKTSHI(_i) (0x00012C04 + ((_i) * 8)) +#define I40E_GLPES_PFIP6TXMCPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXMCPKTSHI_IP6TXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6TXMCPKTSHI_IP6TXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6TXMCPKTSHI_IP6TXMCPKTSHI_SHIFT) +#define I40E_GLPES_PFIP6TXMCPKTSLO(_i) (0x00012C00 + ((_i) * 8)) +#define I40E_GLPES_PFIP6TXMCPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXMCPKTSLO_IP6TXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6TXMCPKTSLO_IP6TXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6TXMCPKTSLO_IP6TXMCPKTSLO_SHIFT) +#define I40E_GLPES_PFIP6TXNOROUTE(_i) (0x00012F00 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXNOROUTE_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXNOROUTE_IP6TXNOROUTE_SHIFT 0 +#define I40E_GLPES_PFIP6TXNOROUTE_IP6TXNOROUTE_MASK (0xFFFFFF << I40E_GLPES_PFIP6TXNOROUTE_IP6TXNOROUTE_SHIFT) +#define I40E_GLPES_PFIP6TXOCTSHI(_i) (0x00012404 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXOCTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXOCTSHI_IP6TXOCTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6TXOCTSHI_IP6TXOCTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6TXOCTSHI_IP6TXOCTSHI_SHIFT) +#define I40E_GLPES_PFIP6TXOCTSLO(_i) (0x00012400 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXOCTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXOCTSLO_IP6TXOCTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6TXOCTSLO_IP6TXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6TXOCTSLO_IP6TXOCTSLO_SHIFT) +#define I40E_GLPES_PFIP6TXPKTSHI(_i) (0x00012604 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXPKTSHI_IP6TXPKTSHI_SHIFT 0 +#define I40E_GLPES_PFIP6TXPKTSHI_IP6TXPKTSHI_MASK (0xFFFF << I40E_GLPES_PFIP6TXPKTSHI_IP6TXPKTSHI_SHIFT) +#define I40E_GLPES_PFIP6TXPKTSLO(_i) (0x00012600 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFIP6TXPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFIP6TXPKTSLO_IP6TXPKTSLO_SHIFT 0 +#define I40E_GLPES_PFIP6TXPKTSLO_IP6TXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFIP6TXPKTSLO_IP6TXPKTSLO_SHIFT) +#define I40E_GLPES_PFRDMARXRDSHI(_i) (0x00013E04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMARXRDSHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMARXRDSHI_RDMARXRDSHI_SHIFT 0 +#define I40E_GLPES_PFRDMARXRDSHI_RDMARXRDSHI_MASK (0xFFFF << I40E_GLPES_PFRDMARXRDSHI_RDMARXRDSHI_SHIFT) +#define I40E_GLPES_PFRDMARXRDSLO(_i) (0x00013E00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMARXRDSLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMARXRDSLO_RDMARXRDSLO_SHIFT 0 +#define I40E_GLPES_PFRDMARXRDSLO_RDMARXRDSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMARXRDSLO_RDMARXRDSLO_SHIFT) +#define I40E_GLPES_PFRDMARXSNDSHI(_i) (0x00014004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMARXSNDSHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMARXSNDSHI_RDMARXSNDSHI_SHIFT 0 +#define I40E_GLPES_PFRDMARXSNDSHI_RDMARXSNDSHI_MASK (0xFFFF << I40E_GLPES_PFRDMARXSNDSHI_RDMARXSNDSHI_SHIFT) +#define I40E_GLPES_PFRDMARXSNDSLO(_i) (0x00014000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMARXSNDSLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMARXSNDSLO_RDMARXSNDSLO_SHIFT 0 +#define I40E_GLPES_PFRDMARXSNDSLO_RDMARXSNDSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMARXSNDSLO_RDMARXSNDSLO_SHIFT) +#define I40E_GLPES_PFRDMARXWRSHI(_i) (0x00013C04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMARXWRSHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMARXWRSHI_RDMARXWRSHI_SHIFT 0 +#define I40E_GLPES_PFRDMARXWRSHI_RDMARXWRSHI_MASK (0xFFFF << I40E_GLPES_PFRDMARXWRSHI_RDMARXWRSHI_SHIFT) +#define I40E_GLPES_PFRDMARXWRSLO(_i) (0x00013C00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMARXWRSLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMARXWRSLO_RDMARXWRSLO_SHIFT 0 +#define I40E_GLPES_PFRDMARXWRSLO_RDMARXWRSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMARXWRSLO_RDMARXWRSLO_SHIFT) +#define I40E_GLPES_PFRDMATXRDSHI(_i) (0x00014404 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMATXRDSHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMATXRDSHI_RDMARXRDSHI_SHIFT 0 +#define I40E_GLPES_PFRDMATXRDSHI_RDMARXRDSHI_MASK (0xFFFF << I40E_GLPES_PFRDMATXRDSHI_RDMARXRDSHI_SHIFT) +#define I40E_GLPES_PFRDMATXRDSLO(_i) (0x00014400 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMATXRDSLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMATXRDSLO_RDMARXRDSLO_SHIFT 0 +#define I40E_GLPES_PFRDMATXRDSLO_RDMARXRDSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMATXRDSLO_RDMARXRDSLO_SHIFT) +#define I40E_GLPES_PFRDMATXSNDSHI(_i) (0x00014604 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMATXSNDSHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMATXSNDSHI_RDMARXSNDSHI_SHIFT 0 +#define I40E_GLPES_PFRDMATXSNDSHI_RDMARXSNDSHI_MASK (0xFFFF << I40E_GLPES_PFRDMATXSNDSHI_RDMARXSNDSHI_SHIFT) +#define I40E_GLPES_PFRDMATXSNDSLO(_i) (0x00014600 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMATXSNDSLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMATXSNDSLO_RDMARXSNDSLO_SHIFT 0 +#define I40E_GLPES_PFRDMATXSNDSLO_RDMARXSNDSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMATXSNDSLO_RDMARXSNDSLO_SHIFT) +#define I40E_GLPES_PFRDMATXWRSHI(_i) (0x00014204 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMATXWRSHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMATXWRSHI_RDMARXWRSHI_SHIFT 0 +#define I40E_GLPES_PFRDMATXWRSHI_RDMARXWRSHI_MASK (0xFFFF << I40E_GLPES_PFRDMATXWRSHI_RDMARXWRSHI_SHIFT) +#define I40E_GLPES_PFRDMATXWRSLO(_i) (0x00014200 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMATXWRSLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMATXWRSLO_RDMARXWRSLO_SHIFT 0 +#define I40E_GLPES_PFRDMATXWRSLO_RDMARXWRSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMATXWRSLO_RDMARXWRSLO_SHIFT) +#define I40E_GLPES_PFRDMAVBNDHI(_i) (0x00014804 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMAVBNDHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMAVBNDHI_RDMAVBNDHI_SHIFT 0 +#define I40E_GLPES_PFRDMAVBNDHI_RDMAVBNDHI_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMAVBNDHI_RDMAVBNDHI_SHIFT) +#define I40E_GLPES_PFRDMAVBNDLO(_i) (0x00014800 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMAVBNDLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMAVBNDLO_RDMAVBNDLO_SHIFT 0 +#define I40E_GLPES_PFRDMAVBNDLO_RDMAVBNDLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMAVBNDLO_RDMAVBNDLO_SHIFT) +#define I40E_GLPES_PFRDMAVINVHI(_i) (0x00014A04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMAVINVHI_MAX_INDEX 15 +#define I40E_GLPES_PFRDMAVINVHI_RDMAVINVHI_SHIFT 0 +#define I40E_GLPES_PFRDMAVINVHI_RDMAVINVHI_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMAVINVHI_RDMAVINVHI_SHIFT) +#define I40E_GLPES_PFRDMAVINVLO(_i) (0x00014A00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFRDMAVINVLO_MAX_INDEX 15 +#define I40E_GLPES_PFRDMAVINVLO_RDMAVINVLO_SHIFT 0 +#define I40E_GLPES_PFRDMAVINVLO_RDMAVINVLO_MASK (0xFFFFFFFF << I40E_GLPES_PFRDMAVINVLO_RDMAVINVLO_SHIFT) +#define I40E_GLPES_PFRXVLANERR(_i) (0x00010000 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFRXVLANERR_MAX_INDEX 15 +#define I40E_GLPES_PFRXVLANERR_RXVLANERR_SHIFT 0 +#define I40E_GLPES_PFRXVLANERR_RXVLANERR_MASK (0xFFFFFF << I40E_GLPES_PFRXVLANERR_RXVLANERR_SHIFT) +#define I40E_GLPES_PFTCPRTXSEG(_i) (0x00013600 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFTCPRTXSEG_MAX_INDEX 15 +#define I40E_GLPES_PFTCPRTXSEG_TCPRTXSEG_SHIFT 0 +#define I40E_GLPES_PFTCPRTXSEG_TCPRTXSEG_MASK (0xFFFFFFFF << I40E_GLPES_PFTCPRTXSEG_TCPRTXSEG_SHIFT) +#define I40E_GLPES_PFTCPRXOPTERR(_i) (0x00013200 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_GLPES_PFTCPRXOPTERR_MAX_INDEX 15 +#define I40E_GLPES_PFTCPRXOPTERR_TCPRXOPTERR_SHIFT 0 +#define I40E_GLPES_PFTCPRXOPTERR_TCPRXOPTERR_MASK (0xFFFFFF << I40E_GLPES_PFTCPRXOPTERR_TCPRXOPTERR_SHIFT) +#define I40E_GLPES_PFTCPRXPROTOERR(_i) (0x00013300 + ((_i) * 4)) +#define I40E_GLPES_PFTCPRXPROTOERR_MAX_INDEX 15 +#define I40E_GLPES_PFTCPRXPROTOERR_TCPRXPROTOERR_SHIFT 0 +#define I40E_GLPES_PFTCPRXPROTOERR_TCPRXPROTOERR_MASK (0xFFFFFF << I40E_GLPES_PFTCPRXPROTOERR_TCPRXPROTOERR_SHIFT) +#define I40E_GLPES_PFTCPRXSEGSHI(_i) (0x00013004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFTCPRXSEGSHI_MAX_INDEX 15 +#define I40E_GLPES_PFTCPRXSEGSHI_TCPRXSEGSHI_SHIFT 0 +#define I40E_GLPES_PFTCPRXSEGSHI_TCPRXSEGSHI_MASK (0xFFFF << I40E_GLPES_PFTCPRXSEGSHI_TCPRXSEGSHI_SHIFT) +#define I40E_GLPES_PFTCPRXSEGSLO(_i) (0x00013000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFTCPRXSEGSLO_MAX_INDEX 15 +#define I40E_GLPES_PFTCPRXSEGSLO_TCPRXSEGSLO_SHIFT 0 +#define I40E_GLPES_PFTCPRXSEGSLO_TCPRXSEGSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFTCPRXSEGSLO_TCPRXSEGSLO_SHIFT) +#define I40E_GLPES_PFTCPTXSEGHI(_i) (0x00013404 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFTCPTXSEGHI_MAX_INDEX 15 +#define I40E_GLPES_PFTCPTXSEGHI_TCPTXSEGHI_SHIFT 0 +#define I40E_GLPES_PFTCPTXSEGHI_TCPTXSEGHI_MASK (0xFFFF << I40E_GLPES_PFTCPTXSEGHI_TCPTXSEGHI_SHIFT) +#define I40E_GLPES_PFTCPTXSEGLO(_i) (0x00013400 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFTCPTXSEGLO_MAX_INDEX 15 +#define I40E_GLPES_PFTCPTXSEGLO_TCPTXSEGLO_SHIFT 0 +#define I40E_GLPES_PFTCPTXSEGLO_TCPTXSEGLO_MASK (0xFFFFFFFF << I40E_GLPES_PFTCPTXSEGLO_TCPTXSEGLO_SHIFT) +#define I40E_GLPES_PFUDPRXPKTSHI(_i) (0x00013804 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFUDPRXPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFUDPRXPKTSHI_UDPRXPKTSHI_SHIFT 0 +#define I40E_GLPES_PFUDPRXPKTSHI_UDPRXPKTSHI_MASK (0xFFFF << I40E_GLPES_PFUDPRXPKTSHI_UDPRXPKTSHI_SHIFT) +#define I40E_GLPES_PFUDPRXPKTSLO(_i) (0x00013800 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFUDPRXPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFUDPRXPKTSLO_UDPRXPKTSLO_SHIFT 0 +#define I40E_GLPES_PFUDPRXPKTSLO_UDPRXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFUDPRXPKTSLO_UDPRXPKTSLO_SHIFT) +#define I40E_GLPES_PFUDPTXPKTSHI(_i) (0x00013A04 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFUDPTXPKTSHI_MAX_INDEX 15 +#define I40E_GLPES_PFUDPTXPKTSHI_UDPTXPKTSHI_SHIFT 0 +#define I40E_GLPES_PFUDPTXPKTSHI_UDPTXPKTSHI_MASK (0xFFFF << I40E_GLPES_PFUDPTXPKTSHI_UDPTXPKTSHI_SHIFT) +#define I40E_GLPES_PFUDPTXPKTSLO(_i) (0x00013A00 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLPES_PFUDPTXPKTSLO_MAX_INDEX 15 +#define I40E_GLPES_PFUDPTXPKTSLO_UDPTXPKTSLO_SHIFT 0 +#define I40E_GLPES_PFUDPTXPKTSLO_UDPTXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_PFUDPTXPKTSLO_UDPTXPKTSLO_SHIFT) +#define I40E_GLPES_RDMARXMULTFPDUSHI 0x0001E014 +#define I40E_GLPES_RDMARXMULTFPDUSHI_RDMARXMULTFPDUSHI_SHIFT 0 +#define I40E_GLPES_RDMARXMULTFPDUSHI_RDMARXMULTFPDUSHI_MASK (0xFFFFFF << I40E_GLPES_RDMARXMULTFPDUSHI_RDMARXMULTFPDUSHI_SHIFT) +#define I40E_GLPES_RDMARXMULTFPDUSLO 0x0001E010 +#define I40E_GLPES_RDMARXMULTFPDUSLO_RDMARXMULTFPDUSLO_SHIFT 0 +#define I40E_GLPES_RDMARXMULTFPDUSLO_RDMARXMULTFPDUSLO_MASK (0xFFFFFFFF << I40E_GLPES_RDMARXMULTFPDUSLO_RDMARXMULTFPDUSLO_SHIFT) +#define I40E_GLPES_RDMARXOOODDPHI 0x0001E01C +#define I40E_GLPES_RDMARXOOODDPHI_RDMARXOOODDPHI_SHIFT 0 +#define I40E_GLPES_RDMARXOOODDPHI_RDMARXOOODDPHI_MASK (0xFFFFFF << I40E_GLPES_RDMARXOOODDPHI_RDMARXOOODDPHI_SHIFT) +#define I40E_GLPES_RDMARXOOODDPLO 0x0001E018 +#define I40E_GLPES_RDMARXOOODDPLO_RDMARXOOODDPLO_SHIFT 0 +#define I40E_GLPES_RDMARXOOODDPLO_RDMARXOOODDPLO_MASK (0xFFFFFFFF << I40E_GLPES_RDMARXOOODDPLO_RDMARXOOODDPLO_SHIFT) +#define I40E_GLPES_RDMARXOOONOMARK 0x0001E004 +#define I40E_GLPES_RDMARXOOONOMARK_RDMAOOONOMARK_SHIFT 0 +#define I40E_GLPES_RDMARXOOONOMARK_RDMAOOONOMARK_MASK (0xFFFFFFFF << I40E_GLPES_RDMARXOOONOMARK_RDMAOOONOMARK_SHIFT) +#define I40E_GLPES_RDMARXUNALIGN 0x0001E000 +#define I40E_GLPES_RDMARXUNALIGN_RDMRXAUNALIGN_SHIFT 0 +#define I40E_GLPES_RDMARXUNALIGN_RDMRXAUNALIGN_MASK (0xFFFFFFFF << I40E_GLPES_RDMARXUNALIGN_RDMRXAUNALIGN_SHIFT) +#define I40E_GLPES_TCPRXFOURHOLEHI 0x0001E044 +#define I40E_GLPES_TCPRXFOURHOLEHI_TCPRXFOURHOLEHI_SHIFT 0 +#define I40E_GLPES_TCPRXFOURHOLEHI_TCPRXFOURHOLEHI_MASK (0xFFFFFF << I40E_GLPES_TCPRXFOURHOLEHI_TCPRXFOURHOLEHI_SHIFT) +#define I40E_GLPES_TCPRXFOURHOLELO 0x0001E040 +#define I40E_GLPES_TCPRXFOURHOLELO_TCPRXFOURHOLELO_SHIFT 0 +#define I40E_GLPES_TCPRXFOURHOLELO_TCPRXFOURHOLELO_MASK (0xFFFFFFFF << I40E_GLPES_TCPRXFOURHOLELO_TCPRXFOURHOLELO_SHIFT) +#define I40E_GLPES_TCPRXONEHOLEHI 0x0001E02C +#define I40E_GLPES_TCPRXONEHOLEHI_TCPRXONEHOLEHI_SHIFT 0 +#define I40E_GLPES_TCPRXONEHOLEHI_TCPRXONEHOLEHI_MASK (0xFFFFFF << I40E_GLPES_TCPRXONEHOLEHI_TCPRXONEHOLEHI_SHIFT) +#define I40E_GLPES_TCPRXONEHOLELO 0x0001E028 +#define I40E_GLPES_TCPRXONEHOLELO_TCPRXONEHOLELO_SHIFT 0 +#define I40E_GLPES_TCPRXONEHOLELO_TCPRXONEHOLELO_MASK (0xFFFFFFFF << I40E_GLPES_TCPRXONEHOLELO_TCPRXONEHOLELO_SHIFT) +#define I40E_GLPES_TCPRXPUREACKHI 0x0001E024 +#define I40E_GLPES_TCPRXPUREACKHI_TCPRXPUREACKSHI_SHIFT 0 +#define I40E_GLPES_TCPRXPUREACKHI_TCPRXPUREACKSHI_MASK (0xFFFFFF << I40E_GLPES_TCPRXPUREACKHI_TCPRXPUREACKSHI_SHIFT) +#define I40E_GLPES_TCPRXPUREACKSLO 0x0001E020 +#define I40E_GLPES_TCPRXPUREACKSLO_TCPRXPUREACKLO_SHIFT 0 +#define I40E_GLPES_TCPRXPUREACKSLO_TCPRXPUREACKLO_MASK (0xFFFFFFFF << I40E_GLPES_TCPRXPUREACKSLO_TCPRXPUREACKLO_SHIFT) +#define I40E_GLPES_TCPRXTHREEHOLEHI 0x0001E03C +#define I40E_GLPES_TCPRXTHREEHOLEHI_TCPRXTHREEHOLEHI_SHIFT 0 +#define I40E_GLPES_TCPRXTHREEHOLEHI_TCPRXTHREEHOLEHI_MASK (0xFFFFFF << I40E_GLPES_TCPRXTHREEHOLEHI_TCPRXTHREEHOLEHI_SHIFT) +#define I40E_GLPES_TCPRXTHREEHOLELO 0x0001E038 +#define I40E_GLPES_TCPRXTHREEHOLELO_TCPRXTHREEHOLELO_SHIFT 0 +#define I40E_GLPES_TCPRXTHREEHOLELO_TCPRXTHREEHOLELO_MASK (0xFFFFFFFF << I40E_GLPES_TCPRXTHREEHOLELO_TCPRXTHREEHOLELO_SHIFT) +#define I40E_GLPES_TCPRXTWOHOLEHI 0x0001E034 +#define I40E_GLPES_TCPRXTWOHOLEHI_TCPRXTWOHOLEHI_SHIFT 0 +#define I40E_GLPES_TCPRXTWOHOLEHI_TCPRXTWOHOLEHI_MASK (0xFFFFFF << I40E_GLPES_TCPRXTWOHOLEHI_TCPRXTWOHOLEHI_SHIFT) +#define I40E_GLPES_TCPRXTWOHOLELO 0x0001E030 +#define I40E_GLPES_TCPRXTWOHOLELO_TCPRXTWOHOLELO_SHIFT 0 +#define I40E_GLPES_TCPRXTWOHOLELO_TCPRXTWOHOLELO_MASK (0xFFFFFFFF << I40E_GLPES_TCPRXTWOHOLELO_TCPRXTWOHOLELO_SHIFT) +#define I40E_GLPES_TCPRXUNEXPERR 0x0001E008 +#define I40E_GLPES_TCPRXUNEXPERR_TCPRXUNEXPERR_SHIFT 0 +#define I40E_GLPES_TCPRXUNEXPERR_TCPRXUNEXPERR_MASK (0xFFFFFF << I40E_GLPES_TCPRXUNEXPERR_TCPRXUNEXPERR_SHIFT) +#define I40E_GLPES_TCPTXRETRANSFASTHI 0x0001E04C +#define I40E_GLPES_TCPTXRETRANSFASTHI_TCPTXRETRANSFASTHI_SHIFT 0 +#define I40E_GLPES_TCPTXRETRANSFASTHI_TCPTXRETRANSFASTHI_MASK (0xFFFFFF << I40E_GLPES_TCPTXRETRANSFASTHI_TCPTXRETRANSFASTHI_SHIFT) +#define I40E_GLPES_TCPTXRETRANSFASTLO 0x0001E048 +#define I40E_GLPES_TCPTXRETRANSFASTLO_TCPTXRETRANSFASTLO_SHIFT 0 +#define I40E_GLPES_TCPTXRETRANSFASTLO_TCPTXRETRANSFASTLO_MASK (0xFFFFFFFF << I40E_GLPES_TCPTXRETRANSFASTLO_TCPTXRETRANSFASTLO_SHIFT) +#define I40E_GLPES_TCPTXTOUTSFASTHI 0x0001E054 +#define I40E_GLPES_TCPTXTOUTSFASTHI_TCPTXTOUTSFASTHI_SHIFT 0 +#define I40E_GLPES_TCPTXTOUTSFASTHI_TCPTXTOUTSFASTHI_MASK (0xFFFFFF << I40E_GLPES_TCPTXTOUTSFASTHI_TCPTXTOUTSFASTHI_SHIFT) +#define I40E_GLPES_TCPTXTOUTSFASTLO 0x0001E050 +#define I40E_GLPES_TCPTXTOUTSFASTLO_TCPTXTOUTSFASTLO_SHIFT 0 +#define I40E_GLPES_TCPTXTOUTSFASTLO_TCPTXTOUTSFASTLO_MASK (0xFFFFFFFF << I40E_GLPES_TCPTXTOUTSFASTLO_TCPTXTOUTSFASTLO_SHIFT) +#define I40E_GLPES_TCPTXTOUTSHI 0x0001E05C +#define I40E_GLPES_TCPTXTOUTSHI_TCPTXTOUTSHI_SHIFT 0 +#define I40E_GLPES_TCPTXTOUTSHI_TCPTXTOUTSHI_MASK (0xFFFFFF << I40E_GLPES_TCPTXTOUTSHI_TCPTXTOUTSHI_SHIFT) +#define I40E_GLPES_TCPTXTOUTSLO 0x0001E058 +#define I40E_GLPES_TCPTXTOUTSLO_TCPTXTOUTSLO_SHIFT 0 +#define I40E_GLPES_TCPTXTOUTSLO_TCPTXTOUTSLO_MASK (0xFFFFFFFF << I40E_GLPES_TCPTXTOUTSLO_TCPTXTOUTSLO_SHIFT) +#define I40E_GLPES_VFIP4RXDISCARD(_i) (0x00018600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXDISCARD_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXDISCARD_IP4RXDISCARD_SHIFT 0 +#define I40E_GLPES_VFIP4RXDISCARD_IP4RXDISCARD_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXDISCARD_IP4RXDISCARD_SHIFT) +#define I40E_GLPES_VFIP4RXFRAGSHI(_i) (0x00018804 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXFRAGSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXFRAGSHI_IP4RXFRAGSHI_SHIFT 0 +#define I40E_GLPES_VFIP4RXFRAGSHI_IP4RXFRAGSHI_MASK (0xFFFF << I40E_GLPES_VFIP4RXFRAGSHI_IP4RXFRAGSHI_SHIFT) +#define I40E_GLPES_VFIP4RXFRAGSLO(_i) (0x00018800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXFRAGSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXFRAGSLO_IP4RXFRAGSLO_SHIFT 0 +#define I40E_GLPES_VFIP4RXFRAGSLO_IP4RXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXFRAGSLO_IP4RXFRAGSLO_SHIFT) +#define I40E_GLPES_VFIP4RXMCOCTSHI(_i) (0x00018A04 + ((_i) * 4)) +#define I40E_GLPES_VFIP4RXMCOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXMCOCTSHI_IP4RXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4RXMCOCTSHI_IP4RXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4RXMCOCTSHI_IP4RXMCOCTSHI_SHIFT) +#define I40E_GLPES_VFIP4RXMCOCTSLO(_i) (0x00018A00 + ((_i) * 4)) +#define I40E_GLPES_VFIP4RXMCOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXMCOCTSLO_IP4RXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4RXMCOCTSLO_IP4RXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXMCOCTSLO_IP4RXMCOCTSLO_SHIFT) +#define I40E_GLPES_VFIP4RXMCPKTSHI(_i) (0x00018C04 + ((_i) * 4)) +#define I40E_GLPES_VFIP4RXMCPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXMCPKTSHI_IP4RXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4RXMCPKTSHI_IP4RXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4RXMCPKTSHI_IP4RXMCPKTSHI_SHIFT) +#define I40E_GLPES_VFIP4RXMCPKTSLO(_i) (0x00018C00 + ((_i) * 4)) +#define I40E_GLPES_VFIP4RXMCPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXMCPKTSLO_IP4RXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4RXMCPKTSLO_IP4RXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXMCPKTSLO_IP4RXMCPKTSLO_SHIFT) +#define I40E_GLPES_VFIP4RXOCTSHI(_i) (0x00018204 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXOCTSHI_IP4RXOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4RXOCTSHI_IP4RXOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4RXOCTSHI_IP4RXOCTSHI_SHIFT) +#define I40E_GLPES_VFIP4RXOCTSLO(_i) (0x00018200 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXOCTSLO_IP4RXOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4RXOCTSLO_IP4RXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXOCTSLO_IP4RXOCTSLO_SHIFT) +#define I40E_GLPES_VFIP4RXPKTSHI(_i) (0x00018404 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXPKTSHI_IP4RXPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4RXPKTSHI_IP4RXPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4RXPKTSHI_IP4RXPKTSHI_SHIFT) +#define I40E_GLPES_VFIP4RXPKTSLO(_i) (0x00018400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXPKTSLO_IP4RXPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4RXPKTSLO_IP4RXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXPKTSLO_IP4RXPKTSLO_SHIFT) +#define I40E_GLPES_VFIP4RXTRUNC(_i) (0x00018700 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4RXTRUNC_MAX_INDEX 31 +#define I40E_GLPES_VFIP4RXTRUNC_IP4RXTRUNC_SHIFT 0 +#define I40E_GLPES_VFIP4RXTRUNC_IP4RXTRUNC_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4RXTRUNC_IP4RXTRUNC_SHIFT) +#define I40E_GLPES_VFIP4TXFRAGSHI(_i) (0x00019E04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXFRAGSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXFRAGSHI_IP4TXFRAGSHI_SHIFT 0 +#define I40E_GLPES_VFIP4TXFRAGSHI_IP4TXFRAGSHI_MASK (0xFFFF << I40E_GLPES_VFIP4TXFRAGSHI_IP4TXFRAGSHI_SHIFT) +#define I40E_GLPES_VFIP4TXFRAGSLO(_i) (0x00019E00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXFRAGSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXFRAGSLO_IP4TXFRAGSLO_SHIFT 0 +#define I40E_GLPES_VFIP4TXFRAGSLO_IP4TXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4TXFRAGSLO_IP4TXFRAGSLO_SHIFT) +#define I40E_GLPES_VFIP4TXMCOCTSHI(_i) (0x0001A004 + ((_i) * 4)) +#define I40E_GLPES_VFIP4TXMCOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXMCOCTSHI_IP4TXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4TXMCOCTSHI_IP4TXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4TXMCOCTSHI_IP4TXMCOCTSHI_SHIFT) +#define I40E_GLPES_VFIP4TXMCOCTSLO(_i) (0x0001A000 + ((_i) * 4)) +#define I40E_GLPES_VFIP4TXMCOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXMCOCTSLO_IP4TXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4TXMCOCTSLO_IP4TXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4TXMCOCTSLO_IP4TXMCOCTSLO_SHIFT) +#define I40E_GLPES_VFIP4TXMCPKTSHI(_i) (0x0001A204 + ((_i) * 4)) +#define I40E_GLPES_VFIP4TXMCPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXMCPKTSHI_IP4TXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4TXMCPKTSHI_IP4TXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4TXMCPKTSHI_IP4TXMCPKTSHI_SHIFT) +#define I40E_GLPES_VFIP4TXMCPKTSLO(_i) (0x0001A200 + ((_i) * 4)) +#define I40E_GLPES_VFIP4TXMCPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXMCPKTSLO_IP4TXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4TXMCPKTSLO_IP4TXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4TXMCPKTSLO_IP4TXMCPKTSLO_SHIFT) +#define I40E_GLPES_VFIP4TXNOROUTE(_i) (0x0001AE00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXNOROUTE_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXNOROUTE_IP4TXNOROUTE_SHIFT 0 +#define I40E_GLPES_VFIP4TXNOROUTE_IP4TXNOROUTE_MASK (0xFFFFFF << I40E_GLPES_VFIP4TXNOROUTE_IP4TXNOROUTE_SHIFT) +#define I40E_GLPES_VFIP4TXOCTSHI(_i) (0x00019A04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXOCTSHI_IP4TXOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4TXOCTSHI_IP4TXOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4TXOCTSHI_IP4TXOCTSHI_SHIFT) +#define I40E_GLPES_VFIP4TXOCTSLO(_i) (0x00019A00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXOCTSLO_IP4TXOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4TXOCTSLO_IP4TXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4TXOCTSLO_IP4TXOCTSLO_SHIFT) +#define I40E_GLPES_VFIP4TXPKTSHI(_i) (0x00019C04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXPKTSHI_IP4TXPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP4TXPKTSHI_IP4TXPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP4TXPKTSHI_IP4TXPKTSHI_SHIFT) +#define I40E_GLPES_VFIP4TXPKTSLO(_i) (0x00019C00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP4TXPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP4TXPKTSLO_IP4TXPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP4TXPKTSLO_IP4TXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP4TXPKTSLO_IP4TXPKTSLO_SHIFT) +#define I40E_GLPES_VFIP6RXDISCARD(_i) (0x00019200 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXDISCARD_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXDISCARD_IP6RXDISCARD_SHIFT 0 +#define I40E_GLPES_VFIP6RXDISCARD_IP6RXDISCARD_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXDISCARD_IP6RXDISCARD_SHIFT) +#define I40E_GLPES_VFIP6RXFRAGSHI(_i) (0x00019404 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXFRAGSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXFRAGSHI_IP6RXFRAGSHI_SHIFT 0 +#define I40E_GLPES_VFIP6RXFRAGSHI_IP6RXFRAGSHI_MASK (0xFFFF << I40E_GLPES_VFIP6RXFRAGSHI_IP6RXFRAGSHI_SHIFT) +#define I40E_GLPES_VFIP6RXFRAGSLO(_i) (0x00019400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXFRAGSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXFRAGSLO_IP6RXFRAGSLO_SHIFT 0 +#define I40E_GLPES_VFIP6RXFRAGSLO_IP6RXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXFRAGSLO_IP6RXFRAGSLO_SHIFT) +#define I40E_GLPES_VFIP6RXMCOCTSHI(_i) (0x00019604 + ((_i) * 4)) +#define I40E_GLPES_VFIP6RXMCOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXMCOCTSHI_IP6RXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6RXMCOCTSHI_IP6RXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6RXMCOCTSHI_IP6RXMCOCTSHI_SHIFT) +#define I40E_GLPES_VFIP6RXMCOCTSLO(_i) (0x00019600 + ((_i) * 4)) +#define I40E_GLPES_VFIP6RXMCOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXMCOCTSLO_IP6RXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6RXMCOCTSLO_IP6RXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXMCOCTSLO_IP6RXMCOCTSLO_SHIFT) +#define I40E_GLPES_VFIP6RXMCPKTSHI(_i) (0x00019804 + ((_i) * 4)) +#define I40E_GLPES_VFIP6RXMCPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXMCPKTSHI_IP6RXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6RXMCPKTSHI_IP6RXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6RXMCPKTSHI_IP6RXMCPKTSHI_SHIFT) +#define I40E_GLPES_VFIP6RXMCPKTSLO(_i) (0x00019800 + ((_i) * 4)) +#define I40E_GLPES_VFIP6RXMCPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXMCPKTSLO_IP6RXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6RXMCPKTSLO_IP6RXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXMCPKTSLO_IP6RXMCPKTSLO_SHIFT) +#define I40E_GLPES_VFIP6RXOCTSHI(_i) (0x00018E04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXOCTSHI_IP6RXOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6RXOCTSHI_IP6RXOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6RXOCTSHI_IP6RXOCTSHI_SHIFT) +#define I40E_GLPES_VFIP6RXOCTSLO(_i) (0x00018E00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXOCTSLO_IP6RXOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6RXOCTSLO_IP6RXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXOCTSLO_IP6RXOCTSLO_SHIFT) +#define I40E_GLPES_VFIP6RXPKTSHI(_i) (0x00019004 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXPKTSHI_IP6RXPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6RXPKTSHI_IP6RXPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6RXPKTSHI_IP6RXPKTSHI_SHIFT) +#define I40E_GLPES_VFIP6RXPKTSLO(_i) (0x00019000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXPKTSLO_IP6RXPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6RXPKTSLO_IP6RXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXPKTSLO_IP6RXPKTSLO_SHIFT) +#define I40E_GLPES_VFIP6RXTRUNC(_i) (0x00019300 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6RXTRUNC_MAX_INDEX 31 +#define I40E_GLPES_VFIP6RXTRUNC_IP6RXTRUNC_SHIFT 0 +#define I40E_GLPES_VFIP6RXTRUNC_IP6RXTRUNC_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6RXTRUNC_IP6RXTRUNC_SHIFT) +#define I40E_GLPES_VFIP6TXFRAGSHI(_i) (0x0001A804 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXFRAGSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXFRAGSHI_IP6TXFRAGSHI_SHIFT 0 +#define I40E_GLPES_VFIP6TXFRAGSHI_IP6TXFRAGSHI_MASK (0xFFFF << I40E_GLPES_VFIP6TXFRAGSHI_IP6TXFRAGSHI_SHIFT) +#define I40E_GLPES_VFIP6TXFRAGSLO(_i) (0x0001A800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXFRAGSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXFRAGSLO_IP6TXFRAGSLO_SHIFT 0 +#define I40E_GLPES_VFIP6TXFRAGSLO_IP6TXFRAGSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6TXFRAGSLO_IP6TXFRAGSLO_SHIFT) +#define I40E_GLPES_VFIP6TXMCOCTSHI(_i) (0x0001AA04 + ((_i) * 4)) +#define I40E_GLPES_VFIP6TXMCOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXMCOCTSHI_IP6TXMCOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6TXMCOCTSHI_IP6TXMCOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6TXMCOCTSHI_IP6TXMCOCTSHI_SHIFT) +#define I40E_GLPES_VFIP6TXMCOCTSLO(_i) (0x0001AA00 + ((_i) * 4)) +#define I40E_GLPES_VFIP6TXMCOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXMCOCTSLO_IP6TXMCOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6TXMCOCTSLO_IP6TXMCOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6TXMCOCTSLO_IP6TXMCOCTSLO_SHIFT) +#define I40E_GLPES_VFIP6TXMCPKTSHI(_i) (0x0001AC04 + ((_i) * 4)) +#define I40E_GLPES_VFIP6TXMCPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXMCPKTSHI_IP6TXMCPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6TXMCPKTSHI_IP6TXMCPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6TXMCPKTSHI_IP6TXMCPKTSHI_SHIFT) +#define I40E_GLPES_VFIP6TXMCPKTSLO(_i) (0x0001AC00 + ((_i) * 4)) +#define I40E_GLPES_VFIP6TXMCPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXMCPKTSLO_IP6TXMCPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6TXMCPKTSLO_IP6TXMCPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6TXMCPKTSLO_IP6TXMCPKTSLO_SHIFT) +#define I40E_GLPES_VFIP6TXNOROUTE(_i) (0x0001AF00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXNOROUTE_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXNOROUTE_IP6TXNOROUTE_SHIFT 0 +#define I40E_GLPES_VFIP6TXNOROUTE_IP6TXNOROUTE_MASK (0xFFFFFF << I40E_GLPES_VFIP6TXNOROUTE_IP6TXNOROUTE_SHIFT) +#define I40E_GLPES_VFIP6TXOCTSHI(_i) (0x0001A404 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXOCTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXOCTSHI_IP6TXOCTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6TXOCTSHI_IP6TXOCTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6TXOCTSHI_IP6TXOCTSHI_SHIFT) +#define I40E_GLPES_VFIP6TXOCTSLO(_i) (0x0001A400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXOCTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXOCTSLO_IP6TXOCTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6TXOCTSLO_IP6TXOCTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6TXOCTSLO_IP6TXOCTSLO_SHIFT) +#define I40E_GLPES_VFIP6TXPKTSHI(_i) (0x0001A604 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXPKTSHI_IP6TXPKTSHI_SHIFT 0 +#define I40E_GLPES_VFIP6TXPKTSHI_IP6TXPKTSHI_MASK (0xFFFF << I40E_GLPES_VFIP6TXPKTSHI_IP6TXPKTSHI_SHIFT) +#define I40E_GLPES_VFIP6TXPKTSLO(_i) (0x0001A600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFIP6TXPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFIP6TXPKTSLO_IP6TXPKTSLO_SHIFT 0 +#define I40E_GLPES_VFIP6TXPKTSLO_IP6TXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFIP6TXPKTSLO_IP6TXPKTSLO_SHIFT) +#define I40E_GLPES_VFRDMARXRDSHI(_i) (0x0001BE04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMARXRDSHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMARXRDSHI_RDMARXRDSHI_SHIFT 0 +#define I40E_GLPES_VFRDMARXRDSHI_RDMARXRDSHI_MASK (0xFFFF << I40E_GLPES_VFRDMARXRDSHI_RDMARXRDSHI_SHIFT) +#define I40E_GLPES_VFRDMARXRDSLO(_i) (0x0001BE00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMARXRDSLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMARXRDSLO_RDMARXRDSLO_SHIFT 0 +#define I40E_GLPES_VFRDMARXRDSLO_RDMARXRDSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMARXRDSLO_RDMARXRDSLO_SHIFT) +#define I40E_GLPES_VFRDMARXSNDSHI(_i) (0x0001C004 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMARXSNDSHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMARXSNDSHI_RDMARXSNDSHI_SHIFT 0 +#define I40E_GLPES_VFRDMARXSNDSHI_RDMARXSNDSHI_MASK (0xFFFF << I40E_GLPES_VFRDMARXSNDSHI_RDMARXSNDSHI_SHIFT) +#define I40E_GLPES_VFRDMARXSNDSLO(_i) (0x0001C000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMARXSNDSLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMARXSNDSLO_RDMARXSNDSLO_SHIFT 0 +#define I40E_GLPES_VFRDMARXSNDSLO_RDMARXSNDSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMARXSNDSLO_RDMARXSNDSLO_SHIFT) +#define I40E_GLPES_VFRDMARXWRSHI(_i) (0x0001BC04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMARXWRSHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMARXWRSHI_RDMARXWRSHI_SHIFT 0 +#define I40E_GLPES_VFRDMARXWRSHI_RDMARXWRSHI_MASK (0xFFFF << I40E_GLPES_VFRDMARXWRSHI_RDMARXWRSHI_SHIFT) +#define I40E_GLPES_VFRDMARXWRSLO(_i) (0x0001BC00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMARXWRSLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMARXWRSLO_RDMARXWRSLO_SHIFT 0 +#define I40E_GLPES_VFRDMARXWRSLO_RDMARXWRSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMARXWRSLO_RDMARXWRSLO_SHIFT) +#define I40E_GLPES_VFRDMATXRDSHI(_i) (0x0001C404 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMATXRDSHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMATXRDSHI_RDMARXRDSHI_SHIFT 0 +#define I40E_GLPES_VFRDMATXRDSHI_RDMARXRDSHI_MASK (0xFFFF << I40E_GLPES_VFRDMATXRDSHI_RDMARXRDSHI_SHIFT) +#define I40E_GLPES_VFRDMATXRDSLO(_i) (0x0001C400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMATXRDSLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMATXRDSLO_RDMARXRDSLO_SHIFT 0 +#define I40E_GLPES_VFRDMATXRDSLO_RDMARXRDSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMATXRDSLO_RDMARXRDSLO_SHIFT) +#define I40E_GLPES_VFRDMATXSNDSHI(_i) (0x0001C604 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMATXSNDSHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMATXSNDSHI_RDMARXSNDSHI_SHIFT 0 +#define I40E_GLPES_VFRDMATXSNDSHI_RDMARXSNDSHI_MASK (0xFFFF << I40E_GLPES_VFRDMATXSNDSHI_RDMARXSNDSHI_SHIFT) +#define I40E_GLPES_VFRDMATXSNDSLO(_i) (0x0001C600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMATXSNDSLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMATXSNDSLO_RDMARXSNDSLO_SHIFT 0 +#define I40E_GLPES_VFRDMATXSNDSLO_RDMARXSNDSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMATXSNDSLO_RDMARXSNDSLO_SHIFT) +#define I40E_GLPES_VFRDMATXWRSHI(_i) (0x0001C204 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMATXWRSHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMATXWRSHI_RDMARXWRSHI_SHIFT 0 +#define I40E_GLPES_VFRDMATXWRSHI_RDMARXWRSHI_MASK (0xFFFF << I40E_GLPES_VFRDMATXWRSHI_RDMARXWRSHI_SHIFT) +#define I40E_GLPES_VFRDMATXWRSLO(_i) (0x0001C200 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMATXWRSLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMATXWRSLO_RDMARXWRSLO_SHIFT 0 +#define I40E_GLPES_VFRDMATXWRSLO_RDMARXWRSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMATXWRSLO_RDMARXWRSLO_SHIFT) +#define I40E_GLPES_VFRDMAVBNDHI(_i) (0x0001C804 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMAVBNDHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMAVBNDHI_RDMAVBNDHI_SHIFT 0 +#define I40E_GLPES_VFRDMAVBNDHI_RDMAVBNDHI_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMAVBNDHI_RDMAVBNDHI_SHIFT) +#define I40E_GLPES_VFRDMAVBNDLO(_i) (0x0001C800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMAVBNDLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMAVBNDLO_RDMAVBNDLO_SHIFT 0 +#define I40E_GLPES_VFRDMAVBNDLO_RDMAVBNDLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMAVBNDLO_RDMAVBNDLO_SHIFT) +#define I40E_GLPES_VFRDMAVINVHI(_i) (0x0001CA04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMAVINVHI_MAX_INDEX 31 +#define I40E_GLPES_VFRDMAVINVHI_RDMAVINVHI_SHIFT 0 +#define I40E_GLPES_VFRDMAVINVHI_RDMAVINVHI_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMAVINVHI_RDMAVINVHI_SHIFT) +#define I40E_GLPES_VFRDMAVINVLO(_i) (0x0001CA00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRDMAVINVLO_MAX_INDEX 31 +#define I40E_GLPES_VFRDMAVINVLO_RDMAVINVLO_SHIFT 0 +#define I40E_GLPES_VFRDMAVINVLO_RDMAVINVLO_MASK (0xFFFFFFFF << I40E_GLPES_VFRDMAVINVLO_RDMAVINVLO_SHIFT) +#define I40E_GLPES_VFRXVLANERR(_i) (0x00018000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFRXVLANERR_MAX_INDEX 31 +#define I40E_GLPES_VFRXVLANERR_RXVLANERR_SHIFT 0 +#define I40E_GLPES_VFRXVLANERR_RXVLANERR_MASK (0xFFFFFF << I40E_GLPES_VFRXVLANERR_RXVLANERR_SHIFT) +#define I40E_GLPES_VFTCPRTXSEG(_i) (0x0001B600 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFTCPRTXSEG_MAX_INDEX 31 +#define I40E_GLPES_VFTCPRTXSEG_TCPRTXSEG_SHIFT 0 +#define I40E_GLPES_VFTCPRTXSEG_TCPRTXSEG_MASK (0xFFFFFFFF << I40E_GLPES_VFTCPRTXSEG_TCPRTXSEG_SHIFT) +#define I40E_GLPES_VFTCPRXOPTERR(_i) (0x0001B200 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFTCPRXOPTERR_MAX_INDEX 31 +#define I40E_GLPES_VFTCPRXOPTERR_TCPRXOPTERR_SHIFT 0 +#define I40E_GLPES_VFTCPRXOPTERR_TCPRXOPTERR_MASK (0xFFFFFF << I40E_GLPES_VFTCPRXOPTERR_TCPRXOPTERR_SHIFT) +#define I40E_GLPES_VFTCPRXPROTOERR(_i) (0x0001B300 + ((_i) * 4)) +#define I40E_GLPES_VFTCPRXPROTOERR_MAX_INDEX 31 +#define I40E_GLPES_VFTCPRXPROTOERR_TCPRXPROTOERR_SHIFT 0 +#define I40E_GLPES_VFTCPRXPROTOERR_TCPRXPROTOERR_MASK (0xFFFFFF << I40E_GLPES_VFTCPRXPROTOERR_TCPRXPROTOERR_SHIFT) +#define I40E_GLPES_VFTCPRXSEGSHI(_i) (0x0001B004 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFTCPRXSEGSHI_MAX_INDEX 31 +#define I40E_GLPES_VFTCPRXSEGSHI_TCPRXSEGSHI_SHIFT 0 +#define I40E_GLPES_VFTCPRXSEGSHI_TCPRXSEGSHI_MASK (0xFFFF << I40E_GLPES_VFTCPRXSEGSHI_TCPRXSEGSHI_SHIFT) +#define I40E_GLPES_VFTCPRXSEGSLO(_i) (0x0001B000 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFTCPRXSEGSLO_MAX_INDEX 31 +#define I40E_GLPES_VFTCPRXSEGSLO_TCPRXSEGSLO_SHIFT 0 +#define I40E_GLPES_VFTCPRXSEGSLO_TCPRXSEGSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFTCPRXSEGSLO_TCPRXSEGSLO_SHIFT) +#define I40E_GLPES_VFTCPTXSEGHI(_i) (0x0001B404 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFTCPTXSEGHI_MAX_INDEX 31 +#define I40E_GLPES_VFTCPTXSEGHI_TCPTXSEGHI_SHIFT 0 +#define I40E_GLPES_VFTCPTXSEGHI_TCPTXSEGHI_MASK (0xFFFF << I40E_GLPES_VFTCPTXSEGHI_TCPTXSEGHI_SHIFT) +#define I40E_GLPES_VFTCPTXSEGLO(_i) (0x0001B400 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFTCPTXSEGLO_MAX_INDEX 31 +#define I40E_GLPES_VFTCPTXSEGLO_TCPTXSEGLO_SHIFT 0 +#define I40E_GLPES_VFTCPTXSEGLO_TCPTXSEGLO_MASK (0xFFFFFFFF << I40E_GLPES_VFTCPTXSEGLO_TCPTXSEGLO_SHIFT) +#define I40E_GLPES_VFUDPRXPKTSHI(_i) (0x0001B804 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFUDPRXPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFUDPRXPKTSHI_UDPRXPKTSHI_SHIFT 0 +#define I40E_GLPES_VFUDPRXPKTSHI_UDPRXPKTSHI_MASK (0xFFFF << I40E_GLPES_VFUDPRXPKTSHI_UDPRXPKTSHI_SHIFT) +#define I40E_GLPES_VFUDPRXPKTSLO(_i) (0x0001B800 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFUDPRXPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFUDPRXPKTSLO_UDPRXPKTSLO_SHIFT 0 +#define I40E_GLPES_VFUDPRXPKTSLO_UDPRXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFUDPRXPKTSLO_UDPRXPKTSLO_SHIFT) +#define I40E_GLPES_VFUDPTXPKTSHI(_i) (0x0001BA04 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFUDPTXPKTSHI_MAX_INDEX 31 +#define I40E_GLPES_VFUDPTXPKTSHI_UDPTXPKTSHI_SHIFT 0 +#define I40E_GLPES_VFUDPTXPKTSHI_UDPTXPKTSHI_MASK (0xFFFF << I40E_GLPES_VFUDPTXPKTSHI_UDPTXPKTSHI_SHIFT) +#define I40E_GLPES_VFUDPTXPKTSLO(_i) (0x0001BA00 + ((_i) * 4)) /* _i=0...31 */ +#define I40E_GLPES_VFUDPTXPKTSLO_MAX_INDEX 31 +#define I40E_GLPES_VFUDPTXPKTSLO_UDPTXPKTSLO_SHIFT 0 +#define I40E_GLPES_VFUDPTXPKTSLO_UDPTXPKTSLO_MASK (0xFFFFFFFF << I40E_GLPES_VFUDPTXPKTSLO_UDPTXPKTSLO_SHIFT) +#define I40E_PRTPM_EEE_STAT 0x001E4320 +#define I40E_PRTPM_EEE_STAT_EEE_NEG_SHIFT 29 +#define I40E_PRTPM_EEE_STAT_EEE_NEG_MASK (0x1 << I40E_PRTPM_EEE_STAT_EEE_NEG_SHIFT) +#define I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT 30 +#define I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK (0x1 << I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT) +#define I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT 31 +#define I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK (0x1 << I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT) +#define I40E_PRTPM_EEEC 0x001E4380 +#define I40E_PRTPM_EEEC_TW_WAKE_MIN_SHIFT 16 +#define I40E_PRTPM_EEEC_TW_WAKE_MIN_MASK (0x3F << I40E_PRTPM_EEEC_TW_WAKE_MIN_SHIFT) +#define I40E_PRTPM_EEEC_TX_LU_LPI_DLY_SHIFT 24 +#define I40E_PRTPM_EEEC_TX_LU_LPI_DLY_MASK (0x3 << I40E_PRTPM_EEEC_TX_LU_LPI_DLY_SHIFT) +#define I40E_PRTPM_EEEC_TEEE_DLY_SHIFT 26 +#define I40E_PRTPM_EEEC_TEEE_DLY_MASK (0x3F << I40E_PRTPM_EEEC_TEEE_DLY_SHIFT) +#define I40E_PRTPM_EEEFWD 0x001E4400 +#define I40E_PRTPM_EEEFWD_EEE_FW_CONFIG_DONE_SHIFT 31 +#define I40E_PRTPM_EEEFWD_EEE_FW_CONFIG_DONE_MASK (0x1 << I40E_PRTPM_EEEFWD_EEE_FW_CONFIG_DONE_SHIFT) +#define I40E_PRTPM_EEER 0x001E4360 +#define I40E_PRTPM_EEER_TW_SYSTEM_SHIFT 0 +#define I40E_PRTPM_EEER_TW_SYSTEM_MASK (0xFFFF << I40E_PRTPM_EEER_TW_SYSTEM_SHIFT) +#define I40E_PRTPM_EEER_TX_LPI_EN_SHIFT 16 +#define I40E_PRTPM_EEER_TX_LPI_EN_MASK (0x1 << I40E_PRTPM_EEER_TX_LPI_EN_SHIFT) +#define I40E_PRTPM_EEETXC 0x001E43E0 +#define I40E_PRTPM_EEETXC_TW_PHY_SHIFT 0 +#define I40E_PRTPM_EEETXC_TW_PHY_MASK (0xFFFF << I40E_PRTPM_EEETXC_TW_PHY_SHIFT) +#define I40E_PRTPM_GC 0x000B8140 +#define I40E_PRTPM_GC_EMP_LINK_ON_SHIFT 0 +#define I40E_PRTPM_GC_EMP_LINK_ON_MASK (0x1 << I40E_PRTPM_GC_EMP_LINK_ON_SHIFT) +#define I40E_PRTPM_GC_MNG_VETO_SHIFT 1 +#define I40E_PRTPM_GC_MNG_VETO_MASK (0x1 << I40E_PRTPM_GC_MNG_VETO_SHIFT) +#define I40E_PRTPM_GC_RATD_SHIFT 2 +#define I40E_PRTPM_GC_RATD_MASK (0x1 << I40E_PRTPM_GC_RATD_SHIFT) +#define I40E_PRTPM_GC_LCDMP_SHIFT 3 +#define I40E_PRTPM_GC_LCDMP_MASK (0x1 << I40E_PRTPM_GC_LCDMP_SHIFT) +#define I40E_PRTPM_GC_LPLU_ASSERTED_SHIFT 31 +#define I40E_PRTPM_GC_LPLU_ASSERTED_MASK (0x1 << I40E_PRTPM_GC_LPLU_ASSERTED_SHIFT) +#define I40E_PRTPM_RLPIC 0x001E43A0 +#define I40E_PRTPM_RLPIC_ERLPIC_SHIFT 0 +#define I40E_PRTPM_RLPIC_ERLPIC_MASK (0xFFFFFFFF << I40E_PRTPM_RLPIC_ERLPIC_SHIFT) +#define I40E_PRTPM_TLPIC 0x001E43C0 +#define I40E_PRTPM_TLPIC_ETLPIC_SHIFT 0 +#define I40E_PRTPM_TLPIC_ETLPIC_MASK (0xFFFFFFFF << I40E_PRTPM_TLPIC_ETLPIC_SHIFT) +#define I40E_GLRPB_DPSS 0x000AC828 +#define I40E_GLRPB_DPSS_DPS_TCN_SHIFT 0 +#define I40E_GLRPB_DPSS_DPS_TCN_MASK (0xFFFFF << I40E_GLRPB_DPSS_DPS_TCN_SHIFT) +#define I40E_GLRPB_GHW 0x000AC830 +#define I40E_GLRPB_GHW_GHW_SHIFT 0 +#define I40E_GLRPB_GHW_GHW_MASK (0xFFFFF << I40E_GLRPB_GHW_GHW_SHIFT) +#define I40E_GLRPB_GLW 0x000AC834 +#define I40E_GLRPB_GLW_GLW_SHIFT 0 +#define I40E_GLRPB_GLW_GLW_MASK (0xFFFFF << I40E_GLRPB_GLW_GLW_SHIFT) +#define I40E_GLRPB_PHW 0x000AC844 +#define I40E_GLRPB_PHW_PHW_SHIFT 0 +#define I40E_GLRPB_PHW_PHW_MASK (0xFFFFF << I40E_GLRPB_PHW_PHW_SHIFT) +#define I40E_GLRPB_PLW 0x000AC848 +#define I40E_GLRPB_PLW_PLW_SHIFT 0 +#define I40E_GLRPB_PLW_PLW_MASK (0xFFFFF << I40E_GLRPB_PLW_PLW_SHIFT) +#define I40E_PRTRPB_DHW(_i) (0x000AC100 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTRPB_DHW_MAX_INDEX 7 +#define I40E_PRTRPB_DHW_DHW_TCN_SHIFT 0 +#define I40E_PRTRPB_DHW_DHW_TCN_MASK (0xFFFFF << I40E_PRTRPB_DHW_DHW_TCN_SHIFT) +#define I40E_PRTRPB_DLW(_i) (0x000AC220 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTRPB_DLW_MAX_INDEX 7 +#define I40E_PRTRPB_DLW_DLW_TCN_SHIFT 0 +#define I40E_PRTRPB_DLW_DLW_TCN_MASK (0xFFFFF << I40E_PRTRPB_DLW_DLW_TCN_SHIFT) +#define I40E_PRTRPB_DPS(_i) (0x000AC320 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTRPB_DPS_MAX_INDEX 7 +#define I40E_PRTRPB_DPS_DPS_TCN_SHIFT 0 +#define I40E_PRTRPB_DPS_DPS_TCN_MASK (0xFFFFF << I40E_PRTRPB_DPS_DPS_TCN_SHIFT) +#define I40E_PRTRPB_SHT(_i) (0x000AC480 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTRPB_SHT_MAX_INDEX 7 +#define I40E_PRTRPB_SHT_SHT_TCN_SHIFT 0 +#define I40E_PRTRPB_SHT_SHT_TCN_MASK (0xFFFFF << I40E_PRTRPB_SHT_SHT_TCN_SHIFT) +#define I40E_PRTRPB_SHW 0x000AC580 +#define I40E_PRTRPB_SHW_SHW_SHIFT 0 +#define I40E_PRTRPB_SHW_SHW_MASK (0xFFFFF << I40E_PRTRPB_SHW_SHW_SHIFT) +#define I40E_PRTRPB_SLT(_i) (0x000AC5A0 + ((_i) * 32)) /* _i=0...7 */ +#define I40E_PRTRPB_SLT_MAX_INDEX 7 +#define I40E_PRTRPB_SLT_SLT_TCN_SHIFT 0 +#define I40E_PRTRPB_SLT_SLT_TCN_MASK (0xFFFFF << I40E_PRTRPB_SLT_SLT_TCN_SHIFT) +#define I40E_PRTRPB_SLW 0x000AC6A0 +#define I40E_PRTRPB_SLW_SLW_SHIFT 0 +#define I40E_PRTRPB_SLW_SLW_MASK (0xFFFFF << I40E_PRTRPB_SLW_SLW_SHIFT) +#define I40E_PRTRPB_SPS 0x000AC7C0 +#define I40E_PRTRPB_SPS_SPS_SHIFT 0 +#define I40E_PRTRPB_SPS_SPS_MASK (0xFFFFF << I40E_PRTRPB_SPS_SPS_SHIFT) +#define I40E_GLQF_APBVT(_i) (0x00260000 + ((_i) * 4)) /* _i=0...2047 */ +#define I40E_GLQF_APBVT_MAX_INDEX 2047 +#define I40E_GLQF_APBVT_APBVT_SHIFT 0 +#define I40E_GLQF_APBVT_APBVT_MASK (0xFFFFFFFF << I40E_GLQF_APBVT_APBVT_SHIFT) +#define I40E_GLQF_CTL 0x00269BA4 +#define I40E_GLQF_CTL_HTOEP_SHIFT 1 +#define I40E_GLQF_CTL_HTOEP_MASK (0x1 << I40E_GLQF_CTL_HTOEP_SHIFT) +#define I40E_GLQF_CTL_HTOEP_FCOE_SHIFT 2 +#define I40E_GLQF_CTL_HTOEP_FCOE_MASK (0x1 << I40E_GLQF_CTL_HTOEP_FCOE_SHIFT) +#define I40E_GLQF_CTL_PCNT_ALLOC_SHIFT 3 +#define I40E_GLQF_CTL_PCNT_ALLOC_MASK (0x7 << I40E_GLQF_CTL_PCNT_ALLOC_SHIFT) +#define I40E_GLQF_CTL_RSVD_SHIFT 7 +#define I40E_GLQF_CTL_RSVD_MASK (0x1 << I40E_GLQF_CTL_RSVD_SHIFT) +#define I40E_GLQF_CTL_MAXPEBLEN_SHIFT 8 +#define I40E_GLQF_CTL_MAXPEBLEN_MASK (0x7 << I40E_GLQF_CTL_MAXPEBLEN_SHIFT) +#define I40E_GLQF_CTL_MAXFCBLEN_SHIFT 11 +#define I40E_GLQF_CTL_MAXFCBLEN_MASK (0x7 << I40E_GLQF_CTL_MAXFCBLEN_SHIFT) +#define I40E_GLQF_CTL_MAXFDBLEN_SHIFT 14 +#define I40E_GLQF_CTL_MAXFDBLEN_MASK (0x7 << I40E_GLQF_CTL_MAXFDBLEN_SHIFT) +#define I40E_GLQF_CTL_FDBEST_SHIFT 17 +#define I40E_GLQF_CTL_FDBEST_MASK (0xFF << I40E_GLQF_CTL_FDBEST_SHIFT) +#define I40E_GLQF_CTL_PROGPRIO_SHIFT 25 +#define I40E_GLQF_CTL_PROGPRIO_MASK (0x1 << I40E_GLQF_CTL_PROGPRIO_SHIFT) +#define I40E_GLQF_CTL_INVALPRIO_SHIFT 26 +#define I40E_GLQF_CTL_INVALPRIO_MASK (0x1 << I40E_GLQF_CTL_INVALPRIO_SHIFT) +#define I40E_GLQF_CTL_IGNORE_IP_SHIFT 27 +#define I40E_GLQF_CTL_IGNORE_IP_MASK (0x1 << I40E_GLQF_CTL_IGNORE_IP_SHIFT) +#define I40E_GLQF_FDCNT_0 0x00269BAC +#define I40E_GLQF_FDCNT_0_GUARANT_CNT_SHIFT 0 +#define I40E_GLQF_FDCNT_0_GUARANT_CNT_MASK (0x1FFF << I40E_GLQF_FDCNT_0_GUARANT_CNT_SHIFT) +#define I40E_GLQF_FDCNT_0_BESTCNT_SHIFT 13 +#define I40E_GLQF_FDCNT_0_BESTCNT_MASK (0x1FFF << I40E_GLQF_FDCNT_0_BESTCNT_SHIFT) +#define I40E_GLQF_HSYM(_i) (0x00269D00 + ((_i) * 4)) /* _i=0...63 */ +#define I40E_GLQF_HSYM_MAX_INDEX 63 +#define I40E_GLQF_HSYM_SYMH_ENA_SHIFT 0 +#define I40E_GLQF_HSYM_SYMH_ENA_MASK (0x1 << I40E_GLQF_HSYM_SYMH_ENA_SHIFT) +#define I40E_GLQF_PCNT(_i) (0x00266800 + ((_i) * 4)) /* _i=0...511 */ +#define I40E_GLQF_PCNT_MAX_INDEX 511 +#define I40E_GLQF_PCNT_PCNT_SHIFT 0 +#define I40E_GLQF_PCNT_PCNT_MASK (0xFFFFFFFF << I40E_GLQF_PCNT_PCNT_SHIFT) +#define I40E_GLQF_SWAP(_i, _j) (0x00267E00 + ((_i) * 4 + (_j) * 8)) /* _i=0...1, _j=0...63 */ +#define I40E_GLQF_SWAP_MAX_INDEX 1 +#define I40E_GLQF_SWAP_OFF0_SRC0_SHIFT 0 +#define I40E_GLQF_SWAP_OFF0_SRC0_MASK (0x3F << I40E_GLQF_SWAP_OFF0_SRC0_SHIFT) +#define I40E_GLQF_SWAP_OFF0_SRC1_SHIFT 6 +#define I40E_GLQF_SWAP_OFF0_SRC1_MASK (0x3F << I40E_GLQF_SWAP_OFF0_SRC1_SHIFT) +#define I40E_GLQF_SWAP_FLEN0_SHIFT 12 +#define I40E_GLQF_SWAP_FLEN0_MASK (0xF << I40E_GLQF_SWAP_FLEN0_SHIFT) +#define I40E_GLQF_SWAP_OFF1_SRC0_SHIFT 16 +#define I40E_GLQF_SWAP_OFF1_SRC0_MASK (0x3F << I40E_GLQF_SWAP_OFF1_SRC0_SHIFT) +#define I40E_GLQF_SWAP_OFF1_SRC1_SHIFT 22 +#define I40E_GLQF_SWAP_OFF1_SRC1_MASK (0x3F << I40E_GLQF_SWAP_OFF1_SRC1_SHIFT) +#define I40E_GLQF_SWAP_FLEN1_SHIFT 28 +#define I40E_GLQF_SWAP_FLEN1_MASK (0xF << I40E_GLQF_SWAP_FLEN1_SHIFT) +#define I40E_PFQF_CTL_0 0x001C0AC0 +#define I40E_PFQF_CTL_0_PEHSIZE_SHIFT 0 +#define I40E_PFQF_CTL_0_PEHSIZE_MASK (0x1F << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) +#define I40E_PFQF_CTL_0_PEDSIZE_SHIFT 5 +#define I40E_PFQF_CTL_0_PEDSIZE_MASK (0x1F << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) +#define I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT 10 +#define I40E_PFQF_CTL_0_PFFCHSIZE_MASK (0xF << I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) +#define I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT 14 +#define I40E_PFQF_CTL_0_PFFCDSIZE_MASK (0x3 << I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) +#define I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT 16 +#define I40E_PFQF_CTL_0_HASHLUTSIZE_MASK (0x1 << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) +#define I40E_PFQF_CTL_0_FD_ENA_SHIFT 17 +#define I40E_PFQF_CTL_0_FD_ENA_MASK (0x1 << I40E_PFQF_CTL_0_FD_ENA_SHIFT) +#define I40E_PFQF_CTL_0_ETYPE_ENA_SHIFT 18 +#define I40E_PFQF_CTL_0_ETYPE_ENA_MASK (0x1 << I40E_PFQF_CTL_0_ETYPE_ENA_SHIFT) +#define I40E_PFQF_CTL_0_MACVLAN_ENA_SHIFT 19 +#define I40E_PFQF_CTL_0_MACVLAN_ENA_MASK (0x1 << I40E_PFQF_CTL_0_MACVLAN_ENA_SHIFT) +#define I40E_PFQF_CTL_0_VFFCHSIZE_SHIFT 20 +#define I40E_PFQF_CTL_0_VFFCHSIZE_MASK (0xF << I40E_PFQF_CTL_0_VFFCHSIZE_SHIFT) +#define I40E_PFQF_CTL_0_VFFCDSIZE_SHIFT 24 +#define I40E_PFQF_CTL_0_VFFCDSIZE_MASK (0x3 << I40E_PFQF_CTL_0_VFFCDSIZE_SHIFT) +#define I40E_PFQF_CTL_1 0x00245D80 +#define I40E_PFQF_CTL_1_CLEARFDTABLE_SHIFT 0 +#define I40E_PFQF_CTL_1_CLEARFDTABLE_MASK (0x1 << I40E_PFQF_CTL_1_CLEARFDTABLE_SHIFT) +#define I40E_PFQF_FDALLOC 0x00246280 +#define I40E_PFQF_FDALLOC_FDALLOC_SHIFT 0 +#define I40E_PFQF_FDALLOC_FDALLOC_MASK (0xFF << I40E_PFQF_FDALLOC_FDALLOC_SHIFT) +#define I40E_PFQF_FDALLOC_FDBEST_SHIFT 8 +#define I40E_PFQF_FDALLOC_FDBEST_MASK (0xFF << I40E_PFQF_FDALLOC_FDBEST_SHIFT) +#define I40E_PFQF_FDSTAT 0x00246380 +#define I40E_PFQF_FDSTAT_GUARANT_CNT_SHIFT 0 +#define I40E_PFQF_FDSTAT_GUARANT_CNT_MASK (0x1FFF << I40E_PFQF_FDSTAT_GUARANT_CNT_SHIFT) +#define I40E_PFQF_FDSTAT_BEST_CNT_SHIFT 16 +#define I40E_PFQF_FDSTAT_BEST_CNT_MASK (0x1FFF << I40E_PFQF_FDSTAT_BEST_CNT_SHIFT) +#define I40E_PFQF_HENA(_i) (0x00245900 + ((_i) * 128)) /* _i=0...1 */ +#define I40E_PFQF_HENA_MAX_INDEX 1 +#define I40E_PFQF_HENA_PTYPE_ENA_SHIFT 0 +#define I40E_PFQF_HENA_PTYPE_ENA_MASK (0xFFFFFFFF << I40E_PFQF_HENA_PTYPE_ENA_SHIFT) +#define I40E_PFQF_HKEY(_i) (0x00244800 + ((_i) * 128)) /* _i=0...12 */ +#define I40E_PFQF_HKEY_MAX_INDEX 12 +#define I40E_PFQF_HKEY_KEY_0_SHIFT 0 +#define I40E_PFQF_HKEY_KEY_0_MASK (0xFF << I40E_PFQF_HKEY_KEY_0_SHIFT) +#define I40E_PFQF_HKEY_KEY_1_SHIFT 8 +#define I40E_PFQF_HKEY_KEY_1_MASK (0xFF << I40E_PFQF_HKEY_KEY_1_SHIFT) +#define I40E_PFQF_HKEY_KEY_2_SHIFT 16 +#define I40E_PFQF_HKEY_KEY_2_MASK (0xFF << I40E_PFQF_HKEY_KEY_2_SHIFT) +#define I40E_PFQF_HKEY_KEY_3_SHIFT 24 +#define I40E_PFQF_HKEY_KEY_3_MASK (0xFF << I40E_PFQF_HKEY_KEY_3_SHIFT) +#define I40E_PFQF_HLUT(_i) (0x00240000 + ((_i) * 128)) /* _i=0...127 */ +#define I40E_PFQF_HLUT_MAX_INDEX 127 +#define I40E_PFQF_HLUT_LUT0_SHIFT 0 +#define I40E_PFQF_HLUT_LUT0_MASK (0x3F << I40E_PFQF_HLUT_LUT0_SHIFT) +#define I40E_PFQF_HLUT_LUT1_SHIFT 8 +#define I40E_PFQF_HLUT_LUT1_MASK (0x3F << I40E_PFQF_HLUT_LUT1_SHIFT) +#define I40E_PFQF_HLUT_LUT2_SHIFT 16 +#define I40E_PFQF_HLUT_LUT2_MASK (0x3F << I40E_PFQF_HLUT_LUT2_SHIFT) +#define I40E_PFQF_HLUT_LUT3_SHIFT 24 +#define I40E_PFQF_HLUT_LUT3_MASK (0x3F << I40E_PFQF_HLUT_LUT3_SHIFT) +#define I40E_PFQF_HREGION(_i) (0x00245400 + ((_i) * 128)) /* _i=0...7 */ +#define I40E_PFQF_HREGION_MAX_INDEX 7 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_0_SHIFT 0 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_0_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_0_SHIFT) +#define I40E_PFQF_HREGION_REGION_0_SHIFT 1 +#define I40E_PFQF_HREGION_REGION_0_MASK (0x7 << I40E_PFQF_HREGION_REGION_0_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_1_SHIFT 4 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_1_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_1_SHIFT) +#define I40E_PFQF_HREGION_REGION_1_SHIFT 5 +#define I40E_PFQF_HREGION_REGION_1_MASK (0x7 << I40E_PFQF_HREGION_REGION_1_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_2_SHIFT 8 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_2_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_2_SHIFT) +#define I40E_PFQF_HREGION_REGION_2_SHIFT 9 +#define I40E_PFQF_HREGION_REGION_2_MASK (0x7 << I40E_PFQF_HREGION_REGION_2_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_3_SHIFT 12 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_3_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_3_SHIFT) +#define I40E_PFQF_HREGION_REGION_3_SHIFT 13 +#define I40E_PFQF_HREGION_REGION_3_MASK (0x7 << I40E_PFQF_HREGION_REGION_3_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_4_SHIFT 16 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_4_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_4_SHIFT) +#define I40E_PFQF_HREGION_REGION_4_SHIFT 17 +#define I40E_PFQF_HREGION_REGION_4_MASK (0x7 << I40E_PFQF_HREGION_REGION_4_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_5_SHIFT 20 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_5_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_5_SHIFT) +#define I40E_PFQF_HREGION_REGION_5_SHIFT 21 +#define I40E_PFQF_HREGION_REGION_5_MASK (0x7 << I40E_PFQF_HREGION_REGION_5_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_6_SHIFT 24 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_6_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_6_SHIFT) +#define I40E_PFQF_HREGION_REGION_6_SHIFT 25 +#define I40E_PFQF_HREGION_REGION_6_MASK (0x7 << I40E_PFQF_HREGION_REGION_6_SHIFT) +#define I40E_PFQF_HREGION_OVERRIDE_ENA_7_SHIFT 28 +#define I40E_PFQF_HREGION_OVERRIDE_ENA_7_MASK (0x1 << I40E_PFQF_HREGION_OVERRIDE_ENA_7_SHIFT) +#define I40E_PFQF_HREGION_REGION_7_SHIFT 29 +#define I40E_PFQF_HREGION_REGION_7_MASK (0x7 << I40E_PFQF_HREGION_REGION_7_SHIFT) +#define I40E_PRTQF_CTL_0 0x00256E60 +#define I40E_PRTQF_CTL_0_HSYM_ENA_SHIFT 0 +#define I40E_PRTQF_CTL_0_HSYM_ENA_MASK (0x1 << I40E_PRTQF_CTL_0_HSYM_ENA_SHIFT) +#define I40E_PRTQF_FD_FLXINSET(_i) (0x00253800 + ((_i) * 32)) /* _i=0...63 */ +#define I40E_PRTQF_FD_FLXINSET_MAX_INDEX 63 +#define I40E_PRTQF_FD_FLXINSET_INSET_SHIFT 0 +#define I40E_PRTQF_FD_FLXINSET_INSET_MASK (0xFF << I40E_PRTQF_FD_FLXINSET_INSET_SHIFT) +#define I40E_PRTQF_FD_MSK(_i, _j) (0x00252000 + ((_i) * 64 + (_j) * 32)) /* _i=0...63, _j=0...1 */ +#define I40E_PRTQF_FD_MSK_MAX_INDEX 63 +#define I40E_PRTQF_FD_MSK_MASK_SHIFT 0 +#define I40E_PRTQF_FD_MSK_MASK_MASK (0xFFFF << I40E_PRTQF_FD_MSK_MASK_SHIFT) +#define I40E_PRTQF_FD_MSK_OFFSET_SHIFT 16 +#define I40E_PRTQF_FD_MSK_OFFSET_MASK (0x3F << I40E_PRTQF_FD_MSK_OFFSET_SHIFT) +#define I40E_PRTQF_FLX_PIT(_i) (0x00255200 + ((_i) * 32)) /* _i=0...8 */ +#define I40E_PRTQF_FLX_PIT_MAX_INDEX 8 +#define I40E_PRTQF_FLX_PIT_SOURCE_OFF_SHIFT 0 +#define I40E_PRTQF_FLX_PIT_SOURCE_OFF_MASK (0x1F << I40E_PRTQF_FLX_PIT_SOURCE_OFF_SHIFT) +#define I40E_PRTQF_FLX_PIT_FSIZE_SHIFT 5 +#define I40E_PRTQF_FLX_PIT_FSIZE_MASK (0x1F << I40E_PRTQF_FLX_PIT_FSIZE_SHIFT) +#define I40E_PRTQF_FLX_PIT_DEST_OFF_SHIFT 10 +#define I40E_PRTQF_FLX_PIT_DEST_OFF_MASK (0x3F << I40E_PRTQF_FLX_PIT_DEST_OFF_SHIFT) +#define I40E_VFQF_HENA1(_i, _VF) (0x00230800 + ((_i) * 1024 + (_VF) * 4)) +#define I40E_VFQF_HENA1_MAX_INDEX 1 +#define I40E_VFQF_HENA1_PTYPE_ENA_SHIFT 0 +#define I40E_VFQF_HENA1_PTYPE_ENA_MASK (0xFFFFFFFF << I40E_VFQF_HENA1_PTYPE_ENA_SHIFT) +#define I40E_VFQF_HKEY1(_i, _VF) (0x00228000 + ((_i) * 1024 + (_VF) * 4)) /* _i=0...12, _VF=0...127 */ +#define I40E_VFQF_HKEY1_MAX_INDEX 12 +#define I40E_VFQF_HKEY1_KEY_0_SHIFT 0 +#define I40E_VFQF_HKEY1_KEY_0_MASK (0xFF << I40E_VFQF_HKEY1_KEY_0_SHIFT) +#define I40E_VFQF_HKEY1_KEY_1_SHIFT 8 +#define I40E_VFQF_HKEY1_KEY_1_MASK (0xFF << I40E_VFQF_HKEY1_KEY_1_SHIFT) +#define I40E_VFQF_HKEY1_KEY_2_SHIFT 16 +#define I40E_VFQF_HKEY1_KEY_2_MASK (0xFF << I40E_VFQF_HKEY1_KEY_2_SHIFT) +#define I40E_VFQF_HKEY1_KEY_3_SHIFT 24 +#define I40E_VFQF_HKEY1_KEY_3_MASK (0xFF << I40E_VFQF_HKEY1_KEY_3_SHIFT) +#define I40E_VFQF_HLUT1(_i, _VF) (0x00220000 + ((_i) * 1024 + (_VF) * 4)) /* _i=0...15, _VF=0...127 */ +#define I40E_VFQF_HLUT1_MAX_INDEX 15 +#define I40E_VFQF_HLUT1_LUT0_SHIFT 0 +#define I40E_VFQF_HLUT1_LUT0_MASK (0xF << I40E_VFQF_HLUT1_LUT0_SHIFT) +#define I40E_VFQF_HLUT1_LUT1_SHIFT 8 +#define I40E_VFQF_HLUT1_LUT1_MASK (0xF << I40E_VFQF_HLUT1_LUT1_SHIFT) +#define I40E_VFQF_HLUT1_LUT2_SHIFT 16 +#define I40E_VFQF_HLUT1_LUT2_MASK (0xF << I40E_VFQF_HLUT1_LUT2_SHIFT) +#define I40E_VFQF_HLUT1_LUT3_SHIFT 24 +#define I40E_VFQF_HLUT1_LUT3_MASK (0xF << I40E_VFQF_HLUT1_LUT3_SHIFT) +#define I40E_VFQF_HREGION1(_i, _VF) (0x0022E000 + ((_i) * 1024 + (_VF) * 4)) +#define I40E_VFQF_HREGION1_MAX_INDEX 7 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_0_SHIFT 0 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_0_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_0_SHIFT) +#define I40E_VFQF_HREGION1_REGION_0_SHIFT 1 +#define I40E_VFQF_HREGION1_REGION_0_MASK (0x7 << I40E_VFQF_HREGION1_REGION_0_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_1_SHIFT 4 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_1_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_1_SHIFT) +#define I40E_VFQF_HREGION1_REGION_1_SHIFT 5 +#define I40E_VFQF_HREGION1_REGION_1_MASK (0x7 << I40E_VFQF_HREGION1_REGION_1_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_2_SHIFT 8 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_2_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_2_SHIFT) +#define I40E_VFQF_HREGION1_REGION_2_SHIFT 9 +#define I40E_VFQF_HREGION1_REGION_2_MASK (0x7 << I40E_VFQF_HREGION1_REGION_2_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_3_SHIFT 12 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_3_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_3_SHIFT) +#define I40E_VFQF_HREGION1_REGION_3_SHIFT 13 +#define I40E_VFQF_HREGION1_REGION_3_MASK (0x7 << I40E_VFQF_HREGION1_REGION_3_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_4_SHIFT 16 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_4_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_4_SHIFT) +#define I40E_VFQF_HREGION1_REGION_4_SHIFT 17 +#define I40E_VFQF_HREGION1_REGION_4_MASK (0x7 << I40E_VFQF_HREGION1_REGION_4_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_5_SHIFT 20 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_5_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_5_SHIFT) +#define I40E_VFQF_HREGION1_REGION_5_SHIFT 21 +#define I40E_VFQF_HREGION1_REGION_5_MASK (0x7 << I40E_VFQF_HREGION1_REGION_5_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_6_SHIFT 24 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_6_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_6_SHIFT) +#define I40E_VFQF_HREGION1_REGION_6_SHIFT 25 +#define I40E_VFQF_HREGION1_REGION_6_MASK (0x7 << I40E_VFQF_HREGION1_REGION_6_SHIFT) +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_7_SHIFT 28 +#define I40E_VFQF_HREGION1_OVERRIDE_ENA_7_MASK (0x1 << I40E_VFQF_HREGION1_OVERRIDE_ENA_7_SHIFT) +#define I40E_VFQF_HREGION1_REGION_7_SHIFT 29 +#define I40E_VFQF_HREGION1_REGION_7_MASK (0x7 << I40E_VFQF_HREGION1_REGION_7_SHIFT) +#define I40E_VPQF_CTL(_VF) (0x001C0000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VPQF_CTL_MAX_INDEX 127 +#define I40E_VPQF_CTL_PEHSIZE_SHIFT 0 +#define I40E_VPQF_CTL_PEHSIZE_MASK (0x1F << I40E_VPQF_CTL_PEHSIZE_SHIFT) +#define I40E_VPQF_CTL_PEDSIZE_SHIFT 5 +#define I40E_VPQF_CTL_PEDSIZE_MASK (0x1F << I40E_VPQF_CTL_PEDSIZE_SHIFT) +#define I40E_VPQF_CTL_FCHSIZE_SHIFT 10 +#define I40E_VPQF_CTL_FCHSIZE_MASK (0xF << I40E_VPQF_CTL_FCHSIZE_SHIFT) +#define I40E_VPQF_CTL_FCDSIZE_SHIFT 14 +#define I40E_VPQF_CTL_FCDSIZE_MASK (0x3 << I40E_VPQF_CTL_FCDSIZE_SHIFT) +#define I40E_VSIQF_CTL(_VSI) (0x0020D800 + ((_VSI) * 4)) /* _i=0...383 */ +#define I40E_VSIQF_CTL_MAX_INDEX 383 +#define I40E_VSIQF_CTL_FCOE_ENA_SHIFT 0 +#define I40E_VSIQF_CTL_FCOE_ENA_MASK (0x1 << I40E_VSIQF_CTL_FCOE_ENA_SHIFT) +#define I40E_VSIQF_CTL_PETCP_ENA_SHIFT 1 +#define I40E_VSIQF_CTL_PETCP_ENA_MASK (0x1 << I40E_VSIQF_CTL_PETCP_ENA_SHIFT) +#define I40E_VSIQF_CTL_PEUUDP_ENA_SHIFT 2 +#define I40E_VSIQF_CTL_PEUUDP_ENA_MASK (0x1 << I40E_VSIQF_CTL_PEUUDP_ENA_SHIFT) +#define I40E_VSIQF_CTL_PEMUDP_ENA_SHIFT 3 +#define I40E_VSIQF_CTL_PEMUDP_ENA_MASK (0x1 << I40E_VSIQF_CTL_PEMUDP_ENA_SHIFT) +#define I40E_VSIQF_CTL_PEUFRAG_ENA_SHIFT 4 +#define I40E_VSIQF_CTL_PEUFRAG_ENA_MASK (0x1 << I40E_VSIQF_CTL_PEUFRAG_ENA_SHIFT) +#define I40E_VSIQF_CTL_PEMFRAG_ENA_SHIFT 5 +#define I40E_VSIQF_CTL_PEMFRAG_ENA_MASK (0x1 << I40E_VSIQF_CTL_PEMFRAG_ENA_SHIFT) +#define I40E_VSIQF_TCREGION(_i, _VSI) (0x00206000 + ((_i) * 2048 + (_VSI) * 4)) +#define I40E_VSIQF_TCREGION_MAX_INDEX 3 +#define I40E_VSIQF_TCREGION_TC_OFFSET_SHIFT 0 +#define I40E_VSIQF_TCREGION_TC_OFFSET_MASK (0x1FF << I40E_VSIQF_TCREGION_TC_OFFSET_SHIFT) +#define I40E_VSIQF_TCREGION_TC_SIZE_SHIFT 9 +#define I40E_VSIQF_TCREGION_TC_SIZE_MASK (0x7 << I40E_VSIQF_TCREGION_TC_SIZE_SHIFT) +#define I40E_VSIQF_TCREGION_TC_OFFSET2_SHIFT 16 +#define I40E_VSIQF_TCREGION_TC_OFFSET2_MASK (0x1FF << I40E_VSIQF_TCREGION_TC_OFFSET2_SHIFT) +#define I40E_VSIQF_TCREGION_TC_SIZE2_SHIFT 25 +#define I40E_VSIQF_TCREGION_TC_SIZE2_MASK (0x7 << I40E_VSIQF_TCREGION_TC_SIZE2_SHIFT) +#define I40E_GL_FCOECRC(_i) (0x00314d80 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOECRC_MAX_INDEX 143 +#define I40E_GL_FCOECRC_FCOECRC_SHIFT 0 +#define I40E_GL_FCOECRC_FCOECRC_MASK (0xFFFFFFFF << I40E_GL_FCOECRC_FCOECRC_SHIFT) +#define I40E_GL_FCOEDDPC(_i) (0x00314480 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDDPC_MAX_INDEX 143 +#define I40E_GL_FCOEDDPC_FCOEDDPC_SHIFT 0 +#define I40E_GL_FCOEDDPC_FCOEDDPC_MASK (0xFFFFFFFF << I40E_GL_FCOEDDPC_FCOEDDPC_SHIFT) +/* _i=0...143 */ +#define I40E_GL_FCOEDIFEC(_i) (0x00318480 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDIFEC_MAX_INDEX 143 +#define I40E_GL_FCOEDIFEC_FCOEDIFRC_SHIFT 0 +#define I40E_GL_FCOEDIFEC_FCOEDIFRC_MASK (0xFFFFFFFF << I40E_GL_FCOEDIFEC_FCOEDIFRC_SHIFT) +#define I40E_GL_FCOEDIFRC(_i) (0x00318000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDIFRC_MAX_INDEX 143 +#define I40E_GL_FCOEDIFRC_FCOEDIFRC_SHIFT 0 +#define I40E_GL_FCOEDIFRC_FCOEDIFRC_MASK (0xFFFFFFFF << I40E_GL_FCOEDIFRC_FCOEDIFRC_SHIFT) +#define I40E_GL_FCOEDIFTCL(_i) (0x00354000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDIFTCL_MAX_INDEX 143 +#define I40E_GL_FCOEDIFTCL_FCOEDIFTC_SHIFT 0 +#define I40E_GL_FCOEDIFTCL_FCOEDIFTC_MASK (0xFFFFFFFF << I40E_GL_FCOEDIFTCL_FCOEDIFTC_SHIFT) +#define I40E_GL_FCOEDIXAC(_i) (0x0031c000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDIXAC_MAX_INDEX 143 +#define I40E_GL_FCOEDIXAC_FCOEDIXAC_SHIFT 0 +#define I40E_GL_FCOEDIXAC_FCOEDIXAC_MASK (0xFFFFFFFF << I40E_GL_FCOEDIXAC_FCOEDIXAC_SHIFT) +#define I40E_GL_FCOEDIXEC(_i) (0x0034c000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDIXEC_MAX_INDEX 143 +#define I40E_GL_FCOEDIXEC_FCOEDIXEC_SHIFT 0 +#define I40E_GL_FCOEDIXEC_FCOEDIXEC_MASK (0xFFFFFFFF << I40E_GL_FCOEDIXEC_FCOEDIXEC_SHIFT) +#define I40E_GL_FCOEDIXVC(_i) (0x00350000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDIXVC_MAX_INDEX 143 +#define I40E_GL_FCOEDIXVC_FCOEDIXVC_SHIFT 0 +#define I40E_GL_FCOEDIXVC_FCOEDIXVC_MASK (0xFFFFFFFF << I40E_GL_FCOEDIXVC_FCOEDIXVC_SHIFT) +#define I40E_GL_FCOEDWRCH(_i) (0x00320004 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDWRCH_MAX_INDEX 143 +#define I40E_GL_FCOEDWRCH_FCOEDWRCH_SHIFT 0 +#define I40E_GL_FCOEDWRCH_FCOEDWRCH_MASK (0xFFFF << I40E_GL_FCOEDWRCH_FCOEDWRCH_SHIFT) +#define I40E_GL_FCOEDWRCL(_i) (0x00320000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDWRCL_MAX_INDEX 143 +#define I40E_GL_FCOEDWRCL_FCOEDWRCL_SHIFT 0 +#define I40E_GL_FCOEDWRCL_FCOEDWRCL_MASK (0xFFFFFFFF << I40E_GL_FCOEDWRCL_FCOEDWRCL_SHIFT) +#define I40E_GL_FCOEDWTCH(_i) (0x00348084 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDWTCH_MAX_INDEX 143 +#define I40E_GL_FCOEDWTCH_FCOEDWTCH_SHIFT 0 +#define I40E_GL_FCOEDWTCH_FCOEDWTCH_MASK (0xFFFF << I40E_GL_FCOEDWTCH_FCOEDWTCH_SHIFT) +#define I40E_GL_FCOEDWTCL(_i) (0x00348080 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEDWTCL_MAX_INDEX 143 +#define I40E_GL_FCOEDWTCL_FCOEDWTCL_SHIFT 0 +#define I40E_GL_FCOEDWTCL_FCOEDWTCL_MASK (0xFFFFFFFF << I40E_GL_FCOEDWTCL_FCOEDWTCL_SHIFT) +#define I40E_GL_FCOELAST(_i) (0x00314000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOELAST_MAX_INDEX 143 +#define I40E_GL_FCOELAST_FCOELAST_SHIFT 0 +#define I40E_GL_FCOELAST_FCOELAST_MASK (0xFFFFFFFF << I40E_GL_FCOELAST_FCOELAST_SHIFT) +#define I40E_GL_FCOEPRC(_i) (0x00315200 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEPRC_MAX_INDEX 143 +#define I40E_GL_FCOEPRC_FCOEPRC_SHIFT 0 +#define I40E_GL_FCOEPRC_FCOEPRC_MASK (0xFFFFFFFF << I40E_GL_FCOEPRC_FCOEPRC_SHIFT) +#define I40E_GL_FCOEPTC(_i) (0x00344C00 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOEPTC_MAX_INDEX 143 +#define I40E_GL_FCOEPTC_FCOEPTC_SHIFT 0 +#define I40E_GL_FCOEPTC_FCOEPTC_MASK (0xFFFFFFFF << I40E_GL_FCOEPTC_FCOEPTC_SHIFT) +#define I40E_GL_FCOERPDC(_i) (0x00324000 + ((_i) * 8)) /* _i=0...143 */ +#define I40E_GL_FCOERPDC_MAX_INDEX 143 +#define I40E_GL_FCOERPDC_FCOERPDC_SHIFT 0 +#define I40E_GL_FCOERPDC_FCOERPDC_MASK (0xFFFFFFFF << I40E_GL_FCOERPDC_FCOERPDC_SHIFT) +#define I40E_GLPRT_BPRCH(_i) (0x003005E4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_BPRCH_MAX_INDEX 3 +#define I40E_GLPRT_BPRCH_UPRCH_SHIFT 0 +#define I40E_GLPRT_BPRCH_UPRCH_MASK (0xFFFF << I40E_GLPRT_BPRCH_UPRCH_SHIFT) +#define I40E_GLPRT_BPRCL(_i) (0x003005E0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_BPRCL_MAX_INDEX 3 +#define I40E_GLPRT_BPRCL_UPRCH_SHIFT 0 +#define I40E_GLPRT_BPRCL_UPRCH_MASK (0xFFFFFFFF << I40E_GLPRT_BPRCL_UPRCH_SHIFT) +#define I40E_GLPRT_BPTCH(_i) (0x00300A04 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_BPTCH_MAX_INDEX 3 +#define I40E_GLPRT_BPTCH_UPRCH_SHIFT 0 +#define I40E_GLPRT_BPTCH_UPRCH_MASK (0xFFFF << I40E_GLPRT_BPTCH_UPRCH_SHIFT) +#define I40E_GLPRT_BPTCL(_i) (0x00300A00 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_BPTCL_MAX_INDEX 3 +#define I40E_GLPRT_BPTCL_UPRCH_SHIFT 0 +#define I40E_GLPRT_BPTCL_UPRCH_MASK (0xFFFFFFFF << I40E_GLPRT_BPTCL_UPRCH_SHIFT) +#define I40E_GLPRT_CRCERRS(_i) (0x00300080 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_CRCERRS_MAX_INDEX 3 +#define I40E_GLPRT_CRCERRS_CRCERRS_SHIFT 0 +#define I40E_GLPRT_CRCERRS_CRCERRS_MASK (0xFFFFFFFF << I40E_GLPRT_CRCERRS_CRCERRS_SHIFT) +#define I40E_GLPRT_GORCH(_i) (0x00300004 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_GORCH_MAX_INDEX 3 +#define I40E_GLPRT_GORCH_GORCH_SHIFT 0 +#define I40E_GLPRT_GORCH_GORCH_MASK (0xFFFF << I40E_GLPRT_GORCH_GORCH_SHIFT) +#define I40E_GLPRT_GORCL(_i) (0x00300000 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_GORCL_MAX_INDEX 3 +#define I40E_GLPRT_GORCL_GORCL_SHIFT 0 +#define I40E_GLPRT_GORCL_GORCL_MASK (0xFFFFFFFF << I40E_GLPRT_GORCL_GORCL_SHIFT) +#define I40E_GLPRT_GOTCH(_i) (0x00300684 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_GOTCH_MAX_INDEX 3 +#define I40E_GLPRT_GOTCH_GOTCH_SHIFT 0 +#define I40E_GLPRT_GOTCH_GOTCH_MASK (0xFFFF << I40E_GLPRT_GOTCH_GOTCH_SHIFT) +#define I40E_GLPRT_GOTCL(_i) (0x00300680 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_GOTCL_MAX_INDEX 3 +#define I40E_GLPRT_GOTCL_GOTCL_SHIFT 0 +#define I40E_GLPRT_GOTCL_GOTCL_MASK (0xFFFFFFFF << I40E_GLPRT_GOTCL_GOTCL_SHIFT) +#define I40E_GLPRT_ILLERRC(_i) (0x003000E0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_ILLERRC_MAX_INDEX 3 +#define I40E_GLPRT_ILLERRC_ILLERRC_SHIFT 0 +#define I40E_GLPRT_ILLERRC_ILLERRC_MASK (0xFFFFFFFF << I40E_GLPRT_ILLERRC_ILLERRC_SHIFT) +#define I40E_GLPRT_LDPC(_i) (0x00300620 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_LDPC_MAX_INDEX 3 +#define I40E_GLPRT_LDPC_LDPC_SHIFT 0 +#define I40E_GLPRT_LDPC_LDPC_MASK (0xFFFFFFFF << I40E_GLPRT_LDPC_LDPC_SHIFT) +#define I40E_GLPRT_LXOFFRXC(_i) (0x00300160 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_LXOFFRXC_MAX_INDEX 3 +#define I40E_GLPRT_LXOFFRXC_LXOFFRXCNT_SHIFT 0 +#define I40E_GLPRT_LXOFFRXC_LXOFFRXCNT_MASK (0xFFFFFFFF << I40E_GLPRT_LXOFFRXC_LXOFFRXCNT_SHIFT) +#define I40E_GLPRT_LXOFFTXC(_i) (0x003009A0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_LXOFFTXC_MAX_INDEX 3 +#define I40E_GLPRT_LXOFFTXC_LXOFFTXC_SHIFT 0 +#define I40E_GLPRT_LXOFFTXC_LXOFFTXC_MASK (0xFFFFFFFF << I40E_GLPRT_LXOFFTXC_LXOFFTXC_SHIFT) +#define I40E_GLPRT_LXONRXC(_i) (0x00300140 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_LXONRXC_MAX_INDEX 3 +#define I40E_GLPRT_LXONRXC_LXONRXCNT_SHIFT 0 +#define I40E_GLPRT_LXONRXC_LXONRXCNT_MASK (0xFFFFFFFF << I40E_GLPRT_LXONRXC_LXONRXCNT_SHIFT) +#define I40E_GLPRT_LXONTXC(_i) (0x00300980 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_LXONTXC_MAX_INDEX 3 +#define I40E_GLPRT_LXONTXC_LXONTXC_SHIFT 0 +#define I40E_GLPRT_LXONTXC_LXONTXC_MASK (0xFFFFFFFF << I40E_GLPRT_LXONTXC_LXONTXC_SHIFT) +#define I40E_GLPRT_MLFC(_i) (0x00300020 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_MLFC_MAX_INDEX 3 +#define I40E_GLPRT_MLFC_MLFC_SHIFT 0 +#define I40E_GLPRT_MLFC_MLFC_MASK (0xFFFFFFFF << I40E_GLPRT_MLFC_MLFC_SHIFT) +#define I40E_GLPRT_MPRCH(_i) (0x003005C4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_MPRCH_MAX_INDEX 3 +#define I40E_GLPRT_MPRCH_MPRCH_SHIFT 0 +#define I40E_GLPRT_MPRCH_MPRCH_MASK (0xFFFF << I40E_GLPRT_MPRCH_MPRCH_SHIFT) +#define I40E_GLPRT_MPRCL(_i) (0x003005C0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_MPRCL_MAX_INDEX 3 +#define I40E_GLPRT_MPRCL_MPRCL_SHIFT 0 +#define I40E_GLPRT_MPRCL_MPRCL_MASK (0xFFFFFFFF << I40E_GLPRT_MPRCL_MPRCL_SHIFT) +#define I40E_GLPRT_MPTCH(_i) (0x003009E4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_MPTCH_MAX_INDEX 3 +#define I40E_GLPRT_MPTCH_MPTCH_SHIFT 0 +#define I40E_GLPRT_MPTCH_MPTCH_MASK (0xFFFF << I40E_GLPRT_MPTCH_MPTCH_SHIFT) +#define I40E_GLPRT_MPTCL(_i) (0x003009E0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_MPTCL_MAX_INDEX 3 +#define I40E_GLPRT_MPTCL_MPTCL_SHIFT 0 +#define I40E_GLPRT_MPTCL_MPTCL_MASK (0xFFFFFFFF << I40E_GLPRT_MPTCL_MPTCL_SHIFT) +#define I40E_GLPRT_MRFC(_i) (0x00300040 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_MRFC_MAX_INDEX 3 +#define I40E_GLPRT_MRFC_MRFC_SHIFT 0 +#define I40E_GLPRT_MRFC_MRFC_MASK (0xFFFFFFFF << I40E_GLPRT_MRFC_MRFC_SHIFT) +#define I40E_GLPRT_PRC1023H(_i) (0x00300504 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC1023H_MAX_INDEX 3 +#define I40E_GLPRT_PRC1023H_PRC1023H_SHIFT 0 +#define I40E_GLPRT_PRC1023H_PRC1023H_MASK (0xFFFF << I40E_GLPRT_PRC1023H_PRC1023H_SHIFT) +#define I40E_GLPRT_PRC1023L(_i) (0x00300500 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC1023L_MAX_INDEX 3 +#define I40E_GLPRT_PRC1023L_PRC1023L_SHIFT 0 +#define I40E_GLPRT_PRC1023L_PRC1023L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC1023L_PRC1023L_SHIFT) +#define I40E_GLPRT_PRC127H(_i) (0x003004A4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC127H_MAX_INDEX 3 +#define I40E_GLPRT_PRC127H_PRC127H_SHIFT 0 +#define I40E_GLPRT_PRC127H_PRC127H_MASK (0xFFFF << I40E_GLPRT_PRC127H_PRC127H_SHIFT) +#define I40E_GLPRT_PRC127L(_i) (0x003004A0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC127L_MAX_INDEX 3 +#define I40E_GLPRT_PRC127L_PRC127L_SHIFT 0 +#define I40E_GLPRT_PRC127L_PRC127L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC127L_PRC127L_SHIFT) +#define I40E_GLPRT_PRC1522H(_i) (0x00300524 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC1522H_MAX_INDEX 3 +#define I40E_GLPRT_PRC1522H_PRC1522H_SHIFT 0 +#define I40E_GLPRT_PRC1522H_PRC1522H_MASK (0xFFFF << I40E_GLPRT_PRC1522H_PRC1522H_SHIFT) +#define I40E_GLPRT_PRC1522L(_i) (0x00300520 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC1522L_MAX_INDEX 3 +#define I40E_GLPRT_PRC1522L_PRC1522L_SHIFT 0 +#define I40E_GLPRT_PRC1522L_PRC1522L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC1522L_PRC1522L_SHIFT) +#define I40E_GLPRT_PRC255H(_i) (0x003004C4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC255H_MAX_INDEX 3 +#define I40E_GLPRT_PRC255H_PRTPRC255H_SHIFT 0 +#define I40E_GLPRT_PRC255H_PRTPRC255H_MASK (0xFFFF << I40E_GLPRT_PRC255H_PRTPRC255H_SHIFT) +#define I40E_GLPRT_PRC255L(_i) (0x003004C0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC255L_MAX_INDEX 3 +#define I40E_GLPRT_PRC255L_PRC255L_SHIFT 0 +#define I40E_GLPRT_PRC255L_PRC255L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC255L_PRC255L_SHIFT) +#define I40E_GLPRT_PRC511H(_i) (0x003004E4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC511H_MAX_INDEX 3 +#define I40E_GLPRT_PRC511H_PRC511H_SHIFT 0 +#define I40E_GLPRT_PRC511H_PRC511H_MASK (0xFFFF << I40E_GLPRT_PRC511H_PRC511H_SHIFT) +#define I40E_GLPRT_PRC511L(_i) (0x003004E0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC511L_MAX_INDEX 3 +#define I40E_GLPRT_PRC511L_PRC511L_SHIFT 0 +#define I40E_GLPRT_PRC511L_PRC511L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC511L_PRC511L_SHIFT) +#define I40E_GLPRT_PRC64H(_i) (0x00300484 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC64H_MAX_INDEX 3 +#define I40E_GLPRT_PRC64H_PRC64H_SHIFT 0 +#define I40E_GLPRT_PRC64H_PRC64H_MASK (0xFFFF << I40E_GLPRT_PRC64H_PRC64H_SHIFT) +#define I40E_GLPRT_PRC64L(_i) (0x00300480 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC64L_MAX_INDEX 3 +#define I40E_GLPRT_PRC64L_PRC64L_SHIFT 0 +#define I40E_GLPRT_PRC64L_PRC64L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC64L_PRC64L_SHIFT) +#define I40E_GLPRT_PRC9522H(_i) (0x00300544 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC9522H_MAX_INDEX 3 +#define I40E_GLPRT_PRC9522H_PRC1522H_SHIFT 0 +#define I40E_GLPRT_PRC9522H_PRC1522H_MASK (0xFFFF << I40E_GLPRT_PRC9522H_PRC1522H_SHIFT) +#define I40E_GLPRT_PRC9522L(_i) (0x00300540 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PRC9522L_MAX_INDEX 3 +#define I40E_GLPRT_PRC9522L_PRC1522L_SHIFT 0 +#define I40E_GLPRT_PRC9522L_PRC1522L_MASK (0xFFFFFFFF << I40E_GLPRT_PRC9522L_PRC1522L_SHIFT) +#define I40E_GLPRT_PTC1023H(_i) (0x00300724 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC1023H_MAX_INDEX 3 +#define I40E_GLPRT_PTC1023H_PTC1023H_SHIFT 0 +#define I40E_GLPRT_PTC1023H_PTC1023H_MASK (0xFFFF << I40E_GLPRT_PTC1023H_PTC1023H_SHIFT) +#define I40E_GLPRT_PTC1023L(_i) (0x00300720 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC1023L_MAX_INDEX 3 +#define I40E_GLPRT_PTC1023L_PTC1023L_SHIFT 0 +#define I40E_GLPRT_PTC1023L_PTC1023L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC1023L_PTC1023L_SHIFT) +#define I40E_GLPRT_PTC127H(_i) (0x003006C4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC127H_MAX_INDEX 3 +#define I40E_GLPRT_PTC127H_PTC127H_SHIFT 0 +#define I40E_GLPRT_PTC127H_PTC127H_MASK (0xFFFF << I40E_GLPRT_PTC127H_PTC127H_SHIFT) +#define I40E_GLPRT_PTC127L(_i) (0x003006C0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC127L_MAX_INDEX 3 +#define I40E_GLPRT_PTC127L_PTC127L_SHIFT 0 +#define I40E_GLPRT_PTC127L_PTC127L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC127L_PTC127L_SHIFT) +#define I40E_GLPRT_PTC1522H(_i) (0x00300744 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC1522H_MAX_INDEX 3 +#define I40E_GLPRT_PTC1522H_PTC1522H_SHIFT 0 +#define I40E_GLPRT_PTC1522H_PTC1522H_MASK (0xFFFF << I40E_GLPRT_PTC1522H_PTC1522H_SHIFT) +#define I40E_GLPRT_PTC1522L(_i) (0x00300740 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC1522L_MAX_INDEX 3 +#define I40E_GLPRT_PTC1522L_PTC1522L_SHIFT 0 +#define I40E_GLPRT_PTC1522L_PTC1522L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC1522L_PTC1522L_SHIFT) +#define I40E_GLPRT_PTC255H(_i) (0x003006E4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC255H_MAX_INDEX 3 +#define I40E_GLPRT_PTC255H_PTC255H_SHIFT 0 +#define I40E_GLPRT_PTC255H_PTC255H_MASK (0xFFFF << I40E_GLPRT_PTC255H_PTC255H_SHIFT) +#define I40E_GLPRT_PTC255L(_i) (0x003006E0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC255L_MAX_INDEX 3 +#define I40E_GLPRT_PTC255L_PTC255L_SHIFT 0 +#define I40E_GLPRT_PTC255L_PTC255L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC255L_PTC255L_SHIFT) +#define I40E_GLPRT_PTC511H(_i) (0x00300704 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC511H_MAX_INDEX 3 +#define I40E_GLPRT_PTC511H_PTC511H_SHIFT 0 +#define I40E_GLPRT_PTC511H_PTC511H_MASK (0xFFFF << I40E_GLPRT_PTC511H_PTC511H_SHIFT) +#define I40E_GLPRT_PTC511L(_i) (0x00300700 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC511L_MAX_INDEX 3 +#define I40E_GLPRT_PTC511L_PTC511L_SHIFT 0 +#define I40E_GLPRT_PTC511L_PTC511L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC511L_PTC511L_SHIFT) +#define I40E_GLPRT_PTC64H(_i) (0x003006A4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC64H_MAX_INDEX 3 +#define I40E_GLPRT_PTC64H_PTC64H_SHIFT 0 +#define I40E_GLPRT_PTC64H_PTC64H_MASK (0xFFFF << I40E_GLPRT_PTC64H_PTC64H_SHIFT) +#define I40E_GLPRT_PTC64L(_i) (0x003006A0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC64L_MAX_INDEX 3 +#define I40E_GLPRT_PTC64L_PTC64L_SHIFT 0 +#define I40E_GLPRT_PTC64L_PTC64L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC64L_PTC64L_SHIFT) +#define I40E_GLPRT_PTC9522H(_i) (0x00300764 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC9522H_MAX_INDEX 3 +#define I40E_GLPRT_PTC9522H_PTC9522H_SHIFT 0 +#define I40E_GLPRT_PTC9522H_PTC9522H_MASK (0xFFFF << I40E_GLPRT_PTC9522H_PTC9522H_SHIFT) +#define I40E_GLPRT_PTC9522L(_i) (0x00300760 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_PTC9522L_MAX_INDEX 3 +#define I40E_GLPRT_PTC9522L_PTC9522L_SHIFT 0 +#define I40E_GLPRT_PTC9522L_PTC9522L_MASK (0xFFFFFFFF << I40E_GLPRT_PTC9522L_PTC9522L_SHIFT) +#define I40E_GLPRT_PXOFFRXC(_i, _j) (0x00300280 + ((_i) * 8 + (_j) * 32)) +#define I40E_GLPRT_PXOFFRXC_MAX_INDEX 3 +#define I40E_GLPRT_PXOFFRXC_PRPXOFFRXCNT_SHIFT 0 +#define I40E_GLPRT_PXOFFRXC_PRPXOFFRXCNT_MASK (0xFFFFFFFF << I40E_GLPRT_PXOFFRXC_PRPXOFFRXCNT_SHIFT) +#define I40E_GLPRT_PXOFFTXC(_i, _j) (0x00300880 + ((_i) * 8 + (_j) * 32)) +#define I40E_GLPRT_PXOFFTXC_MAX_INDEX 3 +#define I40E_GLPRT_PXOFFTXC_PRPXOFFTXCNT_SHIFT 0 +#define I40E_GLPRT_PXOFFTXC_PRPXOFFTXCNT_MASK (0xFFFFFFFF << I40E_GLPRT_PXOFFTXC_PRPXOFFTXCNT_SHIFT) +#define I40E_GLPRT_PXONRXC(_i, _j) (0x00300180 + ((_i) * 8 + (_j) * 32)) +#define I40E_GLPRT_PXONRXC_MAX_INDEX 3 +#define I40E_GLPRT_PXONRXC_PRPXONRXCNT_SHIFT 0 +#define I40E_GLPRT_PXONRXC_PRPXONRXCNT_MASK (0xFFFFFFFF << I40E_GLPRT_PXONRXC_PRPXONRXCNT_SHIFT) +#define I40E_GLPRT_PXONTXC(_i, _j) (0x00300780 + ((_i) * 8 + (_j) * 32)) +#define I40E_GLPRT_PXONTXC_MAX_INDEX 3 +#define I40E_GLPRT_PXONTXC_PRPXONTXC_SHIFT 0 +#define I40E_GLPRT_PXONTXC_PRPXONTXC_MASK (0xFFFFFFFF << I40E_GLPRT_PXONTXC_PRPXONTXC_SHIFT) +#define I40E_GLPRT_RDPC(_i) (0x00300600 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_RDPC_MAX_INDEX 3 +#define I40E_GLPRT_RDPC_RDPC_SHIFT 0 +#define I40E_GLPRT_RDPC_RDPC_MASK (0xFFFFFFFF << I40E_GLPRT_RDPC_RDPC_SHIFT) +#define I40E_GLPRT_RFC(_i) (0x00300560 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_RFC_MAX_INDEX 3 +#define I40E_GLPRT_RFC_RFC_SHIFT 0 +#define I40E_GLPRT_RFC_RFC_MASK (0xFFFFFFFF << I40E_GLPRT_RFC_RFC_SHIFT) +#define I40E_GLPRT_RJC(_i) (0x00300580 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_RJC_MAX_INDEX 3 +#define I40E_GLPRT_RJC_RJC_SHIFT 0 +#define I40E_GLPRT_RJC_RJC_MASK (0xFFFFFFFF << I40E_GLPRT_RJC_RJC_SHIFT) +#define I40E_GLPRT_RLEC(_i) (0x003000A0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_RLEC_MAX_INDEX 3 +#define I40E_GLPRT_RLEC_RLEC_SHIFT 0 +#define I40E_GLPRT_RLEC_RLEC_MASK (0xFFFFFFFF << I40E_GLPRT_RLEC_RLEC_SHIFT) +#define I40E_GLPRT_ROC(_i) (0x00300120 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_ROC_MAX_INDEX 3 +#define I40E_GLPRT_ROC_ROC_SHIFT 0 +#define I40E_GLPRT_ROC_ROC_MASK (0xFFFFFFFF << I40E_GLPRT_ROC_ROC_SHIFT) +#define I40E_GLPRT_RUC(_i) (0x00300100 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_RUC_MAX_INDEX 3 +#define I40E_GLPRT_RUC_RUC_SHIFT 0 +#define I40E_GLPRT_RUC_RUC_MASK (0xFFFFFFFF << I40E_GLPRT_RUC_RUC_SHIFT) +#define I40E_GLPRT_RUPP(_i) (0x00300660 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_RUPP_MAX_INDEX 3 +#define I40E_GLPRT_RUPP_RUPP_SHIFT 0 +#define I40E_GLPRT_RUPP_RUPP_MASK (0xFFFFFFFF << I40E_GLPRT_RUPP_RUPP_SHIFT) +#define I40E_GLPRT_RXON2OFFCNT(_i, _j) (0x00300380 + ((_i) * 8 + (_j) * 32)) +#define I40E_GLPRT_RXON2OFFCNT_MAX_INDEX 3 +#define I40E_GLPRT_RXON2OFFCNT_PRRXON2OFFCNT_SHIFT 0 +#define I40E_GLPRT_RXON2OFFCNT_PRRXON2OFFCNT_MASK (0xFFFFFFFF << I40E_GLPRT_RXON2OFFCNT_PRRXON2OFFCNT_SHIFT) +#define I40E_GLPRT_STDC(_i) (0x00300640 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_STDC_MAX_INDEX 3 +#define I40E_GLPRT_STDC_STDC_SHIFT 0 +#define I40E_GLPRT_STDC_STDC_MASK (0xFFFFFFFF << I40E_GLPRT_STDC_STDC_SHIFT) +#define I40E_GLPRT_TDOLD(_i) (0x00300A20 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_TDOLD_MAX_INDEX 3 +#define I40E_GLPRT_TDOLD_GLPRT_TDOLD_SHIFT 0 +#define I40E_GLPRT_TDOLD_GLPRT_TDOLD_MASK (0xFFFFFFFF << I40E_GLPRT_TDOLD_GLPRT_TDOLD_SHIFT) +#define I40E_GLPRT_TDPC(_i) (0x00375400 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_TDPC_MAX_INDEX 3 +#define I40E_GLPRT_TDPC_TDPC_SHIFT 0 +#define I40E_GLPRT_TDPC_TDPC_MASK (0xFFFFFFFF << I40E_GLPRT_TDPC_TDPC_SHIFT) +#define I40E_GLPRT_UPRCH(_i) (0x003005A4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_UPRCH_MAX_INDEX 3 +#define I40E_GLPRT_UPRCH_UPRCH_SHIFT 0 +#define I40E_GLPRT_UPRCH_UPRCH_MASK (0xFFFF << I40E_GLPRT_UPRCH_UPRCH_SHIFT) +#define I40E_GLPRT_UPRCL(_i) (0x003005A0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_UPRCL_MAX_INDEX 3 +#define I40E_GLPRT_UPRCL_UPRCL_SHIFT 0 +#define I40E_GLPRT_UPRCL_UPRCL_MASK (0xFFFFFFFF << I40E_GLPRT_UPRCL_UPRCL_SHIFT) +#define I40E_GLPRT_UPTCH(_i) (0x003009C4 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_UPTCH_MAX_INDEX 3 +#define I40E_GLPRT_UPTCH_UPTCH_SHIFT 0 +#define I40E_GLPRT_UPTCH_UPTCH_MASK (0xFFFF << I40E_GLPRT_UPTCH_UPTCH_SHIFT) +#define I40E_GLPRT_UPTCL(_i) (0x003009C0 + ((_i) * 8)) /* _i=0...3 */ +#define I40E_GLPRT_UPTCL_MAX_INDEX 3 +#define I40E_GLPRT_UPTCL_VUPTCH_SHIFT 0 +#define I40E_GLPRT_UPTCL_VUPTCH_MASK (0xFFFFFFFF << I40E_GLPRT_UPTCL_VUPTCH_SHIFT) +#define I40E_GLSW_BPRCH(_i) (0x00370104 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_BPRCH_MAX_INDEX 15 +#define I40E_GLSW_BPRCH_BPRCH_SHIFT 0 +#define I40E_GLSW_BPRCH_BPRCH_MASK (0xFFFF << I40E_GLSW_BPRCH_BPRCH_SHIFT) +#define I40E_GLSW_BPRCL(_i) (0x00370100 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_BPRCL_MAX_INDEX 15 +#define I40E_GLSW_BPRCL_BPRCL_SHIFT 0 +#define I40E_GLSW_BPRCL_BPRCL_MASK (0xFFFFFFFF << I40E_GLSW_BPRCL_BPRCL_SHIFT) +#define I40E_GLSW_BPTCH(_i) (0x00340104 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_BPTCH_MAX_INDEX 15 +#define I40E_GLSW_BPTCH_BPTCH_SHIFT 0 +#define I40E_GLSW_BPTCH_BPTCH_MASK (0xFFFF << I40E_GLSW_BPTCH_BPTCH_SHIFT) +#define I40E_GLSW_BPTCL(_i) (0x00340100 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_BPTCL_MAX_INDEX 15 +#define I40E_GLSW_BPTCL_BPTCL_SHIFT 0 +#define I40E_GLSW_BPTCL_BPTCL_MASK (0xFFFFFFFF << I40E_GLSW_BPTCL_BPTCL_SHIFT) +#define I40E_GLSW_GORCH(_i) (0x0035C004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_GORCH_MAX_INDEX 15 +#define I40E_GLSW_GORCH_GORCH_SHIFT 0 +#define I40E_GLSW_GORCH_GORCH_MASK (0xFFFF << I40E_GLSW_GORCH_GORCH_SHIFT) +#define I40E_GLSW_GORCL(_i) (0x0035c000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_GORCL_MAX_INDEX 15 +#define I40E_GLSW_GORCL_GORCL_SHIFT 0 +#define I40E_GLSW_GORCL_GORCL_MASK (0xFFFFFFFF << I40E_GLSW_GORCL_GORCL_SHIFT) +#define I40E_GLSW_GOTCH(_i) (0x0032C004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_GOTCH_MAX_INDEX 15 +#define I40E_GLSW_GOTCH_GOTCH_SHIFT 0 +#define I40E_GLSW_GOTCH_GOTCH_MASK (0xFFFF << I40E_GLSW_GOTCH_GOTCH_SHIFT) +#define I40E_GLSW_GOTCL(_i) (0x0032c000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_GOTCL_MAX_INDEX 15 +#define I40E_GLSW_GOTCL_GOTCL_SHIFT 0 +#define I40E_GLSW_GOTCL_GOTCL_MASK (0xFFFFFFFF << I40E_GLSW_GOTCL_GOTCL_SHIFT) +#define I40E_GLSW_MPRCH(_i) (0x00370084 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_MPRCH_MAX_INDEX 15 +#define I40E_GLSW_MPRCH_MPRCH_SHIFT 0 +#define I40E_GLSW_MPRCH_MPRCH_MASK (0xFFFF << I40E_GLSW_MPRCH_MPRCH_SHIFT) +#define I40E_GLSW_MPRCL(_i) (0x00370080 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_MPRCL_MAX_INDEX 15 +#define I40E_GLSW_MPRCL_MPRCL_SHIFT 0 +#define I40E_GLSW_MPRCL_MPRCL_MASK (0xFFFFFFFF << I40E_GLSW_MPRCL_MPRCL_SHIFT) +#define I40E_GLSW_MPTCH(_i) (0x00340084 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_MPTCH_MAX_INDEX 15 +#define I40E_GLSW_MPTCH_MPTCH_SHIFT 0 +#define I40E_GLSW_MPTCH_MPTCH_MASK (0xFFFF << I40E_GLSW_MPTCH_MPTCH_SHIFT) +#define I40E_GLSW_MPTCL(_i) (0x00340080 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_MPTCL_MAX_INDEX 15 +#define I40E_GLSW_MPTCL_MPTCL_SHIFT 0 +#define I40E_GLSW_MPTCL_MPTCL_MASK (0xFFFFFFFF << I40E_GLSW_MPTCL_MPTCL_SHIFT) +#define I40E_GLSW_RUPP(_i) (0x00370180 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_RUPP_MAX_INDEX 15 +#define I40E_GLSW_RUPP_RUPP_SHIFT 0 +#define I40E_GLSW_RUPP_RUPP_MASK (0xFFFFFFFF << I40E_GLSW_RUPP_RUPP_SHIFT) +#define I40E_GLSW_TDPC(_i) (0x00348000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_TDPC_MAX_INDEX 15 +#define I40E_GLSW_TDPC_TDPC_SHIFT 0 +#define I40E_GLSW_TDPC_TDPC_MASK (0xFFFFFFFF << I40E_GLSW_TDPC_TDPC_SHIFT) +#define I40E_GLSW_UPRCH(_i) (0x00370004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_UPRCH_MAX_INDEX 15 +#define I40E_GLSW_UPRCH_UPRCH_SHIFT 0 +#define I40E_GLSW_UPRCH_UPRCH_MASK (0xFFFF << I40E_GLSW_UPRCH_UPRCH_SHIFT) +#define I40E_GLSW_UPRCL(_i) (0x00370000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_UPRCL_MAX_INDEX 15 +#define I40E_GLSW_UPRCL_UPRCL_SHIFT 0 +#define I40E_GLSW_UPRCL_UPRCL_MASK (0xFFFFFFFF << I40E_GLSW_UPRCL_UPRCL_SHIFT) +#define I40E_GLSW_UPTCH(_i) (0x00340004 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_UPTCH_MAX_INDEX 15 +#define I40E_GLSW_UPTCH_UPTCH_SHIFT 0 +#define I40E_GLSW_UPTCH_UPTCH_MASK (0xFFFF << I40E_GLSW_UPTCH_UPTCH_SHIFT) +#define I40E_GLSW_UPTCL(_i) (0x00340000 + ((_i) * 8)) /* _i=0...15 */ +#define I40E_GLSW_UPTCL_MAX_INDEX 15 +#define I40E_GLSW_UPTCL_UPTCL_SHIFT 0 +#define I40E_GLSW_UPTCL_UPTCL_MASK (0xFFFFFFFF << I40E_GLSW_UPTCL_UPTCL_SHIFT) +#define I40E_GLV_BPRCH(_i) (0x0036D804 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_BPRCH_MAX_INDEX 383 +#define I40E_GLV_BPRCH_BPRCH_SHIFT 0 +#define I40E_GLV_BPRCH_BPRCH_MASK (0xFFFF << I40E_GLV_BPRCH_BPRCH_SHIFT) +#define I40E_GLV_BPRCL(_i) (0x0036d800 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_BPRCL_MAX_INDEX 383 +#define I40E_GLV_BPRCL_BPRCL_SHIFT 0 +#define I40E_GLV_BPRCL_BPRCL_MASK (0xFFFFFFFF << I40E_GLV_BPRCL_BPRCL_SHIFT) +#define I40E_GLV_BPTCH(_i) (0x0033D804 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_BPTCH_MAX_INDEX 383 +#define I40E_GLV_BPTCH_BPTCH_SHIFT 0 +#define I40E_GLV_BPTCH_BPTCH_MASK (0xFFFF << I40E_GLV_BPTCH_BPTCH_SHIFT) +#define I40E_GLV_BPTCL(_i) (0x0033d800 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_BPTCL_MAX_INDEX 383 +#define I40E_GLV_BPTCL_BPTCL_SHIFT 0 +#define I40E_GLV_BPTCL_BPTCL_MASK (0xFFFFFFFF << I40E_GLV_BPTCL_BPTCL_SHIFT) +#define I40E_GLV_GORCH(_i) (0x00358004 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_GORCH_MAX_INDEX 383 +#define I40E_GLV_GORCH_GORCH_SHIFT 0 +#define I40E_GLV_GORCH_GORCH_MASK (0xFFFF << I40E_GLV_GORCH_GORCH_SHIFT) +#define I40E_GLV_GORCL(_i) (0x00358000 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_GORCL_MAX_INDEX 383 +#define I40E_GLV_GORCL_GORCL_SHIFT 0 +#define I40E_GLV_GORCL_GORCL_MASK (0xFFFFFFFF << I40E_GLV_GORCL_GORCL_SHIFT) +#define I40E_GLV_GOTCH(_i) (0x00328004 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_GOTCH_MAX_INDEX 383 +#define I40E_GLV_GOTCH_GOTCH_SHIFT 0 +#define I40E_GLV_GOTCH_GOTCH_MASK (0xFFFF << I40E_GLV_GOTCH_GOTCH_SHIFT) +#define I40E_GLV_GOTCL(_i) (0x00328000 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_GOTCL_MAX_INDEX 383 +#define I40E_GLV_GOTCL_GOTCL_SHIFT 0 +#define I40E_GLV_GOTCL_GOTCL_MASK (0xFFFFFFFF << I40E_GLV_GOTCL_GOTCL_SHIFT) +#define I40E_GLV_MPRCH(_i) (0x0036CC04 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_MPRCH_MAX_INDEX 383 +#define I40E_GLV_MPRCH_MPRCH_SHIFT 0 +#define I40E_GLV_MPRCH_MPRCH_MASK (0xFFFF << I40E_GLV_MPRCH_MPRCH_SHIFT) +#define I40E_GLV_MPRCL(_i) (0x0036cc00 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_MPRCL_MAX_INDEX 383 +#define I40E_GLV_MPRCL_MPRCL_SHIFT 0 +#define I40E_GLV_MPRCL_MPRCL_MASK (0xFFFFFFFF << I40E_GLV_MPRCL_MPRCL_SHIFT) +#define I40E_GLV_MPTCH(_i) (0x0033CC04 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_MPTCH_MAX_INDEX 383 +#define I40E_GLV_MPTCH_MPTCH_SHIFT 0 +#define I40E_GLV_MPTCH_MPTCH_MASK (0xFFFF << I40E_GLV_MPTCH_MPTCH_SHIFT) +#define I40E_GLV_MPTCL(_i) (0x0033cc00 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_MPTCL_MAX_INDEX 383 +#define I40E_GLV_MPTCL_MPTCL_SHIFT 0 +#define I40E_GLV_MPTCL_MPTCL_MASK (0xFFFFFFFF << I40E_GLV_MPTCL_MPTCL_SHIFT) +#define I40E_GLV_RDPC(_i) (0x00310000 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_RDPC_MAX_INDEX 383 +#define I40E_GLV_RDPC_RDPC_SHIFT 0 +#define I40E_GLV_RDPC_RDPC_MASK (0xFFFFFFFF << I40E_GLV_RDPC_RDPC_SHIFT) +#define I40E_GLV_RUPP(_i) (0x0036E400 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_RUPP_MAX_INDEX 383 +#define I40E_GLV_RUPP_RUPP_SHIFT 0 +#define I40E_GLV_RUPP_RUPP_MASK (0xFFFFFFFF << I40E_GLV_RUPP_RUPP_SHIFT) +#define I40E_GLV_TEPC(_VSI) (0x00344000 + ((_VSI) * 8)) /* _i=0...383 */ +#define I40E_GLV_TEPC_MAX_INDEX 383 +#define I40E_GLV_TEPC_TEPC_SHIFT 0 +#define I40E_GLV_TEPC_TEPC_MASK (0xFFFFFFFF << I40E_GLV_TEPC_TEPC_SHIFT) +#define I40E_GLV_UPRCH(_i) (0x0036C004 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_UPRCH_MAX_INDEX 383 +#define I40E_GLV_UPRCH_UPRCH_SHIFT 0 +#define I40E_GLV_UPRCH_UPRCH_MASK (0xFFFF << I40E_GLV_UPRCH_UPRCH_SHIFT) +#define I40E_GLV_UPRCL(_i) (0x0036c000 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_UPRCL_MAX_INDEX 383 +#define I40E_GLV_UPRCL_UPRCL_SHIFT 0 +#define I40E_GLV_UPRCL_UPRCL_MASK (0xFFFFFFFF << I40E_GLV_UPRCL_UPRCL_SHIFT) +#define I40E_GLV_UPTCH(_i) (0x0033C004 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_UPTCH_MAX_INDEX 383 +#define I40E_GLV_UPTCH_GLVUPTCH_SHIFT 0 +#define I40E_GLV_UPTCH_GLVUPTCH_MASK (0xFFFF << I40E_GLV_UPTCH_GLVUPTCH_SHIFT) +#define I40E_GLV_UPTCL(_i) (0x0033c000 + ((_i) * 8)) /* _i=0...383 */ +#define I40E_GLV_UPTCL_MAX_INDEX 383 +#define I40E_GLV_UPTCL_UPTCL_SHIFT 0 +#define I40E_GLV_UPTCL_UPTCL_MASK (0xFFFFFFFF << I40E_GLV_UPTCL_UPTCL_SHIFT) +#define I40E_GLVEBTC_RBCH(_i, _j) (0x00364004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_RBCH_MAX_INDEX 7 +#define I40E_GLVEBTC_RBCH_TCBCH_SHIFT 0 +#define I40E_GLVEBTC_RBCH_TCBCH_MASK (0xFFFF << I40E_GLVEBTC_RBCH_TCBCH_SHIFT) +#define I40E_GLVEBTC_RBCL(_i, _j) (0x00364000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_RBCL_MAX_INDEX 7 +#define I40E_GLVEBTC_RBCL_TCBCL_SHIFT 0 +#define I40E_GLVEBTC_RBCL_TCBCL_MASK (0xFFFFFFFF << I40E_GLVEBTC_RBCL_TCBCL_SHIFT) +#define I40E_GLVEBTC_RPCH(_i, _j) (0x00368004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_RPCH_MAX_INDEX 7 +#define I40E_GLVEBTC_RPCH_TCPCH_SHIFT 0 +#define I40E_GLVEBTC_RPCH_TCPCH_MASK (0xFFFF << I40E_GLVEBTC_RPCH_TCPCH_SHIFT) +#define I40E_GLVEBTC_RPCL(_i, _j) (0x00368000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_RPCL_MAX_INDEX 7 +#define I40E_GLVEBTC_RPCL_TCPCL_SHIFT 0 +#define I40E_GLVEBTC_RPCL_TCPCL_MASK (0xFFFFFFFF << I40E_GLVEBTC_RPCL_TCPCL_SHIFT) +#define I40E_GLVEBTC_TBCH(_i, _j) (0x00334004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_TBCH_MAX_INDEX 7 +#define I40E_GLVEBTC_TBCH_TCBCH_SHIFT 0 +#define I40E_GLVEBTC_TBCH_TCBCH_MASK (0xFFFF << I40E_GLVEBTC_TBCH_TCBCH_SHIFT) +#define I40E_GLVEBTC_TBCL(_i, _j) (0x00334000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_TBCL_MAX_INDEX 7 +#define I40E_GLVEBTC_TBCL_TCBCL_SHIFT 0 +#define I40E_GLVEBTC_TBCL_TCBCL_MASK (0xFFFFFFFF << I40E_GLVEBTC_TBCL_TCBCL_SHIFT) +#define I40E_GLVEBTC_TPCH(_i, _j) (0x00338004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_TPCH_MAX_INDEX 7 +#define I40E_GLVEBTC_TPCH_TCPCH_SHIFT 0 +#define I40E_GLVEBTC_TPCH_TCPCH_MASK (0xFFFF << I40E_GLVEBTC_TPCH_TCPCH_SHIFT) +#define I40E_GLVEBTC_TPCL(_i, _j) (0x00338000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...15 */ +#define I40E_GLVEBTC_TPCL_MAX_INDEX 7 +#define I40E_GLVEBTC_TPCL_TCPCL_SHIFT 0 +#define I40E_GLVEBTC_TPCL_TCPCL_MASK (0xFFFFFFFF << I40E_GLVEBTC_TPCL_TCPCL_SHIFT) +#define I40E_GLVEBVL_BPCH(_i) (0x00374804 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_BPCH_MAX_INDEX 127 +#define I40E_GLVEBVL_BPCH_VLBPCH_SHIFT 0 +#define I40E_GLVEBVL_BPCH_VLBPCH_MASK (0xFFFF << I40E_GLVEBVL_BPCH_VLBPCH_SHIFT) +#define I40E_GLVEBVL_BPCL(_i) (0x00374800 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_BPCL_MAX_INDEX 127 +#define I40E_GLVEBVL_BPCL_VLBPCL_SHIFT 0 +#define I40E_GLVEBVL_BPCL_VLBPCL_MASK (0xFFFFFFFF << I40E_GLVEBVL_BPCL_VLBPCL_SHIFT) +#define I40E_GLVEBVL_GORCH(_i) (0x00360004 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_GORCH_MAX_INDEX 127 +#define I40E_GLVEBVL_GORCH_VLBCH_SHIFT 0 +#define I40E_GLVEBVL_GORCH_VLBCH_MASK (0xFFFF << I40E_GLVEBVL_GORCH_VLBCH_SHIFT) +#define I40E_GLVEBVL_GORCL(_i) (0x00360000 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_GORCL_MAX_INDEX 127 +#define I40E_GLVEBVL_GORCL_VLBCL_SHIFT 0 +#define I40E_GLVEBVL_GORCL_VLBCL_MASK (0xFFFFFFFF << I40E_GLVEBVL_GORCL_VLBCL_SHIFT) +#define I40E_GLVEBVL_GOTCH(_i) (0x00330004 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_GOTCH_MAX_INDEX 127 +#define I40E_GLVEBVL_GOTCH_VLBCH_SHIFT 0 +#define I40E_GLVEBVL_GOTCH_VLBCH_MASK (0xFFFF << I40E_GLVEBVL_GOTCH_VLBCH_SHIFT) +#define I40E_GLVEBVL_GOTCL(_i) (0x00330000 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_GOTCL_MAX_INDEX 127 +#define I40E_GLVEBVL_GOTCL_VLBCL_SHIFT 0 +#define I40E_GLVEBVL_GOTCL_VLBCL_MASK (0xFFFFFFFF << I40E_GLVEBVL_GOTCL_VLBCL_SHIFT) +#define I40E_GLVEBVL_MPCH(_i) (0x00374404 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_MPCH_MAX_INDEX 127 +#define I40E_GLVEBVL_MPCH_VLMPCH_SHIFT 0 +#define I40E_GLVEBVL_MPCH_VLMPCH_MASK (0xFFFF << I40E_GLVEBVL_MPCH_VLMPCH_SHIFT) +#define I40E_GLVEBVL_MPCL(_i) (0x00374400 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_MPCL_MAX_INDEX 127 +#define I40E_GLVEBVL_MPCL_VLMPCL_SHIFT 0 +#define I40E_GLVEBVL_MPCL_VLMPCL_MASK (0xFFFFFFFF << I40E_GLVEBVL_MPCL_VLMPCL_SHIFT) +#define I40E_GLVEBVL_UPCH(_i) (0x00374004 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_UPCH_MAX_INDEX 127 +#define I40E_GLVEBVL_UPCH_VLUPCH_SHIFT 0 +#define I40E_GLVEBVL_UPCH_VLUPCH_MASK (0xFFFF << I40E_GLVEBVL_UPCH_VLUPCH_SHIFT) +#define I40E_GLVEBVL_UPCL(_i) (0x00374000 + ((_i) * 8)) /* _i=0...127 */ +#define I40E_GLVEBVL_UPCL_MAX_INDEX 127 +#define I40E_GLVEBVL_UPCL_VLUPCL_SHIFT 0 +#define I40E_GLVEBVL_UPCL_VLUPCL_MASK (0xFFFFFFFF << I40E_GLVEBVL_UPCL_VLUPCL_SHIFT) +#define I40E_GL_MTG_FLU_MSK_H 0x00269F4C +#define I40E_GL_MTG_FLU_MSK_H_MASK_HIGH_SHIFT 0 +#define I40E_GL_MTG_FLU_MSK_H_MASK_HIGH_MASK (0xFFFF << I40E_GL_MTG_FLU_MSK_H_MASK_HIGH_SHIFT) +#define I40E_GL_MTG_FLU_MSK_L 0x00269F44 +#define I40E_GL_MTG_FLU_MSK_L_MASK_LOW_SHIFT 0 +#define I40E_GL_MTG_FLU_MSK_L_MASK_LOW_MASK (0xFFFFFFFF << I40E_GL_MTG_FLU_MSK_L_MASK_LOW_SHIFT) +#define I40E_GL_SWR_DEF_ACT(_i) (0x0026CF00 + ((_i) * 4)) /* _i=0...25 */ +#define I40E_GL_SWR_DEF_ACT_MAX_INDEX 25 +#define I40E_GL_SWR_DEF_ACT_DEF_ACTION_SHIFT 0 +#define I40E_GL_SWR_DEF_ACT_DEF_ACTION_MASK (0xFFFFFFFF << I40E_GL_SWR_DEF_ACT_DEF_ACTION_SHIFT) +#define I40E_GL_SWR_DEF_ACT_EN 0x0026CF84 +#define I40E_GL_SWR_DEF_ACT_EN_DEF_ACT_EN_BITMAP_SHIFT 0 +#define I40E_GL_SWR_DEF_ACT_EN_DEF_ACT_EN_BITMAP_MASK (0xFFFFFFFF << I40E_GL_SWR_DEF_ACT_EN_DEF_ACT_EN_BITMAP_SHIFT) +#define I40E_PRT_MSCCNT 0x00256BA0 +#define I40E_PRT_MSCCNT_CCOUNT_SHIFT 0 +#define I40E_PRT_MSCCNT_CCOUNT_MASK (0x1FFFFFF << I40E_PRT_MSCCNT_CCOUNT_SHIFT) +#define I40E_PRT_SCSTS 0x00256C20 +#define I40E_PRT_SCSTS_BSCA_SHIFT 0 +#define I40E_PRT_SCSTS_BSCA_MASK (0x1 << I40E_PRT_SCSTS_BSCA_SHIFT) +#define I40E_PRT_SCSTS_BSCAP_SHIFT 1 +#define I40E_PRT_SCSTS_BSCAP_MASK (0x1 << I40E_PRT_SCSTS_BSCAP_SHIFT) +#define I40E_PRT_SCSTS_MSCA_SHIFT 2 +#define I40E_PRT_SCSTS_MSCA_MASK (0x1 << I40E_PRT_SCSTS_MSCA_SHIFT) +#define I40E_PRT_SCSTS_MSCAP_SHIFT 3 +#define I40E_PRT_SCSTS_MSCAP_MASK (0x1 << I40E_PRT_SCSTS_MSCAP_SHIFT) +#define I40E_PRT_SWT_BSCCNT 0x00256C60 +#define I40E_PRT_SWT_BSCCNT_CCOUNT_SHIFT 0 +#define I40E_PRT_SWT_BSCCNT_CCOUNT_MASK (0x1FFFFFF << I40E_PRT_SWT_BSCCNT_CCOUNT_SHIFT) +#define I40E_PRTTSYN_ADJ 0x001E4280 +#define I40E_PRTTSYN_ADJ_TSYNADJ_SHIFT 0 +#define I40E_PRTTSYN_ADJ_TSYNADJ_MASK (0x7FFFFFFF << I40E_PRTTSYN_ADJ_TSYNADJ_SHIFT) +#define I40E_PRTTSYN_ADJ_SIGN_SHIFT 31 +#define I40E_PRTTSYN_ADJ_SIGN_MASK (0x1 << I40E_PRTTSYN_ADJ_SIGN_SHIFT) +#define I40E_PRTTSYN_AUX_0(_i) (0x001E42A0 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_AUX_0_MAX_INDEX 1 +#define I40E_PRTTSYN_AUX_0_OUT_ENA_SHIFT 0 +#define I40E_PRTTSYN_AUX_0_OUT_ENA_MASK (0x1 << I40E_PRTTSYN_AUX_0_OUT_ENA_SHIFT) +#define I40E_PRTTSYN_AUX_0_OUTMOD_SHIFT 1 +#define I40E_PRTTSYN_AUX_0_OUTMOD_MASK (0x3 << I40E_PRTTSYN_AUX_0_OUTMOD_SHIFT) +#define I40E_PRTTSYN_AUX_0_OUTLVL_SHIFT 3 +#define I40E_PRTTSYN_AUX_0_OUTLVL_MASK (0x1 << I40E_PRTTSYN_AUX_0_OUTLVL_SHIFT) +#define I40E_PRTTSYN_AUX_0_PULSEW_SHIFT 8 +#define I40E_PRTTSYN_AUX_0_PULSEW_MASK (0xF << I40E_PRTTSYN_AUX_0_PULSEW_SHIFT) +#define I40E_PRTTSYN_AUX_0_EVNTLVL_SHIFT 16 +#define I40E_PRTTSYN_AUX_0_EVNTLVL_MASK (0x3 << I40E_PRTTSYN_AUX_0_EVNTLVL_SHIFT) +#define I40E_PRTTSYN_AUX_1(_i) (0x001E42E0 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_AUX_1_MAX_INDEX 1 +#define I40E_PRTTSYN_AUX_1_INSTNT_SHIFT 0 +#define I40E_PRTTSYN_AUX_1_INSTNT_MASK (0x1 << I40E_PRTTSYN_AUX_1_INSTNT_SHIFT) +#define I40E_PRTTSYN_AUX_1_SAMPLE_TIME_SHIFT 1 +#define I40E_PRTTSYN_AUX_1_SAMPLE_TIME_MASK (0x1 << I40E_PRTTSYN_AUX_1_SAMPLE_TIME_SHIFT) +#define I40E_PRTTSYN_CLKO(_i) (0x001E4240 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_CLKO_MAX_INDEX 1 +#define I40E_PRTTSYN_CLKO_TSYNCLKO_SHIFT 0 +#define I40E_PRTTSYN_CLKO_TSYNCLKO_MASK (0xFFFFFFFF << I40E_PRTTSYN_CLKO_TSYNCLKO_SHIFT) +#define I40E_PRTTSYN_CTL0 0x001E4200 +#define I40E_PRTTSYN_CTL0_CLEAR_TSYNTIMER_SHIFT 0 +#define I40E_PRTTSYN_CTL0_CLEAR_TSYNTIMER_MASK (0x1 << I40E_PRTTSYN_CTL0_CLEAR_TSYNTIMER_SHIFT) +#define I40E_PRTTSYN_CTL0_TXTIME_INT_ENA_SHIFT 1 +#define I40E_PRTTSYN_CTL0_TXTIME_INT_ENA_MASK (0x1 << I40E_PRTTSYN_CTL0_TXTIME_INT_ENA_SHIFT) +#define I40E_PRTTSYN_CTL0_EVENT_INT_ENA_SHIFT 2 +#define I40E_PRTTSYN_CTL0_EVENT_INT_ENA_MASK (0x1 << I40E_PRTTSYN_CTL0_EVENT_INT_ENA_SHIFT) +#define I40E_PRTTSYN_CTL0_TGT_INT_ENA_SHIFT 3 +#define I40E_PRTTSYN_CTL0_TGT_INT_ENA_MASK (0x1 << I40E_PRTTSYN_CTL0_TGT_INT_ENA_SHIFT) +#define I40E_PRTTSYN_CTL0_PF_ID_SHIFT 8 +#define I40E_PRTTSYN_CTL0_PF_ID_MASK (0xF << I40E_PRTTSYN_CTL0_PF_ID_SHIFT) +#define I40E_PRTTSYN_CTL0_TSYNACT_SHIFT 12 +#define I40E_PRTTSYN_CTL0_TSYNACT_MASK (0x3 << I40E_PRTTSYN_CTL0_TSYNACT_SHIFT) +#define I40E_PRTTSYN_CTL0_TSYNENA_SHIFT 31 +#define I40E_PRTTSYN_CTL0_TSYNENA_MASK (0x1 << I40E_PRTTSYN_CTL0_TSYNENA_SHIFT) +#define I40E_PRTTSYN_CTL1 0x00085020 +#define I40E_PRTTSYN_CTL1_V1MESSTYPE0_SHIFT 0 +#define I40E_PRTTSYN_CTL1_V1MESSTYPE0_MASK (0xFF << I40E_PRTTSYN_CTL1_V1MESSTYPE0_SHIFT) +#define I40E_PRTTSYN_CTL1_V1MESSTYPE1_SHIFT 8 +#define I40E_PRTTSYN_CTL1_V1MESSTYPE1_MASK (0xFF << I40E_PRTTSYN_CTL1_V1MESSTYPE1_SHIFT) +#define I40E_PRTTSYN_CTL1_V2MESSTYPE0_SHIFT 16 +#define I40E_PRTTSYN_CTL1_V2MESSTYPE0_MASK (0xF << I40E_PRTTSYN_CTL1_V2MESSTYPE0_SHIFT) +#define I40E_PRTTSYN_CTL1_V2MESSTYPE1_SHIFT 20 +#define I40E_PRTTSYN_CTL1_V2MESSTYPE1_MASK (0xF << I40E_PRTTSYN_CTL1_V2MESSTYPE1_SHIFT) +#define I40E_PRTTSYN_CTL1_TSYNTYPE_SHIFT 24 +#define I40E_PRTTSYN_CTL1_TSYNTYPE_MASK (0x3 << I40E_PRTTSYN_CTL1_TSYNTYPE_SHIFT) +#define I40E_PRTTSYN_CTL1_UDP_ENA_SHIFT 26 +#define I40E_PRTTSYN_CTL1_UDP_ENA_MASK (0x3 << I40E_PRTTSYN_CTL1_UDP_ENA_SHIFT) +#define I40E_PRTTSYN_CTL1_TSYNENA_SHIFT 31 +#define I40E_PRTTSYN_CTL1_TSYNENA_MASK (0x1 << I40E_PRTTSYN_CTL1_TSYNENA_SHIFT) +#define I40E_PRTTSYN_EVNT_H(_i) (0x001E40C0 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_EVNT_H_MAX_INDEX 1 +#define I40E_PRTTSYN_EVNT_H_TSYNEVNT_H_SHIFT 0 +#define I40E_PRTTSYN_EVNT_H_TSYNEVNT_H_MASK (0xFFFFFFFF << I40E_PRTTSYN_EVNT_H_TSYNEVNT_H_SHIFT) +#define I40E_PRTTSYN_EVNT_L(_i) (0x001E4080 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_EVNT_L_MAX_INDEX 1 +#define I40E_PRTTSYN_EVNT_L_TSYNEVNT_L_SHIFT 0 +#define I40E_PRTTSYN_EVNT_L_TSYNEVNT_L_MASK (0xFFFFFFFF << I40E_PRTTSYN_EVNT_L_TSYNEVNT_L_SHIFT) +#define I40E_PRTTSYN_INC_H 0x001E4060 +#define I40E_PRTTSYN_INC_H_TSYNINC_H_SHIFT 0 +#define I40E_PRTTSYN_INC_H_TSYNINC_H_MASK (0x3F << I40E_PRTTSYN_INC_H_TSYNINC_H_SHIFT) +#define I40E_PRTTSYN_INC_L 0x001E4040 +#define I40E_PRTTSYN_INC_L_TSYNINC_L_SHIFT 0 +#define I40E_PRTTSYN_INC_L_TSYNINC_L_MASK (0xFFFFFFFF << I40E_PRTTSYN_INC_L_TSYNINC_L_SHIFT) +#define I40E_PRTTSYN_RXTIME_H(_i) (0x00085040 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRTTSYN_RXTIME_H_MAX_INDEX 3 +#define I40E_PRTTSYN_RXTIME_H_RXTIEM_H_SHIFT 0 +#define I40E_PRTTSYN_RXTIME_H_RXTIEM_H_MASK (0xFFFFFFFF << I40E_PRTTSYN_RXTIME_H_RXTIEM_H_SHIFT) +#define I40E_PRTTSYN_RXTIME_L(_i) (0x000850C0 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRTTSYN_RXTIME_L_MAX_INDEX 3 +#define I40E_PRTTSYN_RXTIME_L_RXTIEM_L_SHIFT 0 +#define I40E_PRTTSYN_RXTIME_L_RXTIEM_L_MASK (0xFFFFFFFF << I40E_PRTTSYN_RXTIME_L_RXTIEM_L_SHIFT) +#define I40E_PRTTSYN_STAT_0 0x001E4220 +#define I40E_PRTTSYN_STAT_0_EVENT0_SHIFT 0 +#define I40E_PRTTSYN_STAT_0_EVENT0_MASK (0x1 << I40E_PRTTSYN_STAT_0_EVENT0_SHIFT) +#define I40E_PRTTSYN_STAT_0_EVENT1_SHIFT 1 +#define I40E_PRTTSYN_STAT_0_EVENT1_MASK (0x1 << I40E_PRTTSYN_STAT_0_EVENT1_SHIFT) +#define I40E_PRTTSYN_STAT_0_TGT0_SHIFT 2 +#define I40E_PRTTSYN_STAT_0_TGT0_MASK (0x1 << I40E_PRTTSYN_STAT_0_TGT0_SHIFT) +#define I40E_PRTTSYN_STAT_0_TGT1_SHIFT 3 +#define I40E_PRTTSYN_STAT_0_TGT1_MASK (0x1 << I40E_PRTTSYN_STAT_0_TGT1_SHIFT) +#define I40E_PRTTSYN_STAT_0_TXTIME_SHIFT 4 +#define I40E_PRTTSYN_STAT_0_TXTIME_MASK (0x1 << I40E_PRTTSYN_STAT_0_TXTIME_SHIFT) +#define I40E_PRTTSYN_STAT_1 0x00085140 +#define I40E_PRTTSYN_STAT_1_RXT0_SHIFT 0 +#define I40E_PRTTSYN_STAT_1_RXT0_MASK (0x1 << I40E_PRTTSYN_STAT_1_RXT0_SHIFT) +#define I40E_PRTTSYN_STAT_1_RXT1_SHIFT 1 +#define I40E_PRTTSYN_STAT_1_RXT1_MASK (0x1 << I40E_PRTTSYN_STAT_1_RXT1_SHIFT) +#define I40E_PRTTSYN_STAT_1_RXT2_SHIFT 2 +#define I40E_PRTTSYN_STAT_1_RXT2_MASK (0x1 << I40E_PRTTSYN_STAT_1_RXT2_SHIFT) +#define I40E_PRTTSYN_STAT_1_RXT3_SHIFT 3 +#define I40E_PRTTSYN_STAT_1_RXT3_MASK (0x1 << I40E_PRTTSYN_STAT_1_RXT3_SHIFT) +#define I40E_PRTTSYN_TGT_H(_i) (0x001E4180 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_TGT_H_MAX_INDEX 1 +#define I40E_PRTTSYN_TGT_H_TSYNTGTT_H_SHIFT 0 +#define I40E_PRTTSYN_TGT_H_TSYNTGTT_H_MASK (0xFFFFFFFF << I40E_PRTTSYN_TGT_H_TSYNTGTT_H_SHIFT) +#define I40E_PRTTSYN_TGT_L(_i) (0x001E4140 + ((_i) * 32)) /* _i=0...1 */ +#define I40E_PRTTSYN_TGT_L_MAX_INDEX 1 +#define I40E_PRTTSYN_TGT_L_TSYNTGTT_L_SHIFT 0 +#define I40E_PRTTSYN_TGT_L_TSYNTGTT_L_MASK (0xFFFFFFFF << I40E_PRTTSYN_TGT_L_TSYNTGTT_L_SHIFT) +#define I40E_PRTTSYN_TIME_H 0x001E4120 +#define I40E_PRTTSYN_TIME_H_TSYNTIME_H_SHIFT 0 +#define I40E_PRTTSYN_TIME_H_TSYNTIME_H_MASK (0xFFFFFFFF << I40E_PRTTSYN_TIME_H_TSYNTIME_H_SHIFT) +#define I40E_PRTTSYN_TIME_L 0x001E4100 +#define I40E_PRTTSYN_TIME_L_TSYNTIME_L_SHIFT 0 +#define I40E_PRTTSYN_TIME_L_TSYNTIME_L_MASK (0xFFFFFFFF << I40E_PRTTSYN_TIME_L_TSYNTIME_L_SHIFT) +#define I40E_PRTTSYN_TXTIME_H 0x001E41E0 +#define I40E_PRTTSYN_TXTIME_H_TXTIEM_H_SHIFT 0 +#define I40E_PRTTSYN_TXTIME_H_TXTIEM_H_MASK (0xFFFFFFFF << I40E_PRTTSYN_TXTIME_H_TXTIEM_H_SHIFT) +#define I40E_PRTTSYN_TXTIME_L 0x001E41C0 +#define I40E_PRTTSYN_TXTIME_L_TXTIEM_L_SHIFT 0 +#define I40E_PRTTSYN_TXTIME_L_TXTIEM_L_MASK (0xFFFFFFFF << I40E_PRTTSYN_TXTIME_L_TXTIEM_L_SHIFT) +#define I40E_GLSCD_QUANTA 0x000B2080 +#define I40E_GLSCD_QUANTA_TSCDQUANTA_SHIFT 0 +#define I40E_GLSCD_QUANTA_TSCDQUANTA_MASK (0x7 << I40E_GLSCD_QUANTA_TSCDQUANTA_SHIFT) +#define I40E_GL_MDET_RX 0x0012A510 +#define I40E_GL_MDET_RX_FUNCTION_SHIFT 0 +#define I40E_GL_MDET_RX_FUNCTION_MASK (0xFF << I40E_GL_MDET_RX_FUNCTION_SHIFT) +#define I40E_GL_MDET_RX_EVENT_SHIFT 8 +#define I40E_GL_MDET_RX_EVENT_MASK (0x1FF << I40E_GL_MDET_RX_EVENT_SHIFT) +#define I40E_GL_MDET_RX_QUEUE_SHIFT 17 +#define I40E_GL_MDET_RX_QUEUE_MASK (0x3FFF << I40E_GL_MDET_RX_QUEUE_SHIFT) +#define I40E_GL_MDET_RX_VALID_SHIFT 31 +#define I40E_GL_MDET_RX_VALID_MASK (0x1 << I40E_GL_MDET_RX_VALID_SHIFT) +#define I40E_GL_MDET_TX 0x000E6480 +#define I40E_GL_MDET_TX_FUNCTION_SHIFT 0 +#define I40E_GL_MDET_TX_FUNCTION_MASK (0xFF << I40E_GL_MDET_TX_FUNCTION_SHIFT) +#define I40E_GL_MDET_TX_EVENT_SHIFT 8 +#define I40E_GL_MDET_TX_EVENT_MASK (0x1FF << I40E_GL_MDET_TX_EVENT_SHIFT) +#define I40E_GL_MDET_TX_QUEUE_SHIFT 17 +#define I40E_GL_MDET_TX_QUEUE_MASK (0x3FFF << I40E_GL_MDET_TX_QUEUE_SHIFT) +#define I40E_GL_MDET_TX_VALID_SHIFT 31 +#define I40E_GL_MDET_TX_VALID_MASK (0x1 << I40E_GL_MDET_TX_VALID_SHIFT) +#define I40E_PF_MDET_RX 0x0012A400 +#define I40E_PF_MDET_RX_VALID_SHIFT 0 +#define I40E_PF_MDET_RX_VALID_MASK (0x1 << I40E_PF_MDET_RX_VALID_SHIFT) +#define I40E_PF_MDET_TX 0x000E6400 +#define I40E_PF_MDET_TX_VALID_SHIFT 0 +#define I40E_PF_MDET_TX_VALID_MASK (0x1 << I40E_PF_MDET_TX_VALID_SHIFT) +#define I40E_PF_VT_PFALLOC 0x001C0500 +#define I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT 0 +#define I40E_PF_VT_PFALLOC_FIRSTVF_MASK (0xFF << I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT) +#define I40E_PF_VT_PFALLOC_LASTVF_SHIFT 8 +#define I40E_PF_VT_PFALLOC_LASTVF_MASK (0xFF << I40E_PF_VT_PFALLOC_LASTVF_SHIFT) +#define I40E_PF_VT_PFALLOC_VALID_SHIFT 31 +#define I40E_PF_VT_PFALLOC_VALID_MASK (0x1 << I40E_PF_VT_PFALLOC_VALID_SHIFT) +#define I40E_VP_MDET_RX(_VF) (0x0012A000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VP_MDET_RX_MAX_INDEX 127 +#define I40E_VP_MDET_RX_VALID_SHIFT 0 +#define I40E_VP_MDET_RX_VALID_MASK (0x1 << I40E_VP_MDET_RX_VALID_SHIFT) +#define I40E_VP_MDET_TX(_VF) (0x000E6000 + ((_VF) * 4)) /* _i=0...127 */ +#define I40E_VP_MDET_TX_MAX_INDEX 127 +#define I40E_VP_MDET_TX_VALID_SHIFT 0 +#define I40E_VP_MDET_TX_VALID_MASK (0x1 << I40E_VP_MDET_TX_VALID_SHIFT) +#define I40E_GLPM_WUMC 0x0006C800 +#define I40E_GLPM_WUMC_NOTCO_SHIFT 0 +#define I40E_GLPM_WUMC_NOTCO_MASK (0x1 << I40E_GLPM_WUMC_NOTCO_SHIFT) +#define I40E_GLPM_WUMC_SRST_PIN_VAL_SHIFT 1 +#define I40E_GLPM_WUMC_SRST_PIN_VAL_MASK (0x1 << I40E_GLPM_WUMC_SRST_PIN_VAL_SHIFT) +#define I40E_GLPM_WUMC_ROL_MODE_SHIFT 2 +#define I40E_GLPM_WUMC_ROL_MODE_MASK (0x1 << I40E_GLPM_WUMC_ROL_MODE_SHIFT) +#define I40E_GLPM_WUMC_RESERVED_4_SHIFT 3 +#define I40E_GLPM_WUMC_RESERVED_4_MASK (0x1FFF << I40E_GLPM_WUMC_RESERVED_4_SHIFT) +#define I40E_GLPM_WUMC_MNG_WU_PF_SHIFT 16 +#define I40E_GLPM_WUMC_MNG_WU_PF_MASK (0xFFFF << I40E_GLPM_WUMC_MNG_WU_PF_SHIFT) +#define I40E_PFPM_APM 0x000B8080 +#define I40E_PFPM_APM_APME_SHIFT 0 +#define I40E_PFPM_APM_APME_MASK (0x1 << I40E_PFPM_APM_APME_SHIFT) +#define I40E_PFPM_FHFT_LENGTH(_i) (0x0006A000 + ((_i) * 128)) /* _i=0...7 */ +#define I40E_PFPM_FHFT_LENGTH_MAX_INDEX 7 +#define I40E_PFPM_FHFT_LENGTH_LENGTH_SHIFT 0 +#define I40E_PFPM_FHFT_LENGTH_LENGTH_MASK (0xFF << I40E_PFPM_FHFT_LENGTH_LENGTH_SHIFT) +#define I40E_PFPM_WUC 0x0006B200 +#define I40E_PFPM_WUC_EN_APM_D0_SHIFT 5 +#define I40E_PFPM_WUC_EN_APM_D0_MASK (0x1 << I40E_PFPM_WUC_EN_APM_D0_SHIFT) +#define I40E_PFPM_WUFC 0x0006B400 +#define I40E_PFPM_WUFC_LNKC_SHIFT 0 +#define I40E_PFPM_WUFC_LNKC_MASK (0x1 << I40E_PFPM_WUFC_LNKC_SHIFT) +#define I40E_PFPM_WUFC_MAG_SHIFT 1 +#define I40E_PFPM_WUFC_MAG_MASK (0x1 << I40E_PFPM_WUFC_MAG_SHIFT) +#define I40E_PFPM_WUFC_MNG_SHIFT 3 +#define I40E_PFPM_WUFC_MNG_MASK (0x1 << I40E_PFPM_WUFC_MNG_SHIFT) +#define I40E_PFPM_WUFC_FLX0_ACT_SHIFT 4 +#define I40E_PFPM_WUFC_FLX0_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX0_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX1_ACT_SHIFT 5 +#define I40E_PFPM_WUFC_FLX1_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX1_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX2_ACT_SHIFT 6 +#define I40E_PFPM_WUFC_FLX2_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX2_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX3_ACT_SHIFT 7 +#define I40E_PFPM_WUFC_FLX3_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX3_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX4_ACT_SHIFT 8 +#define I40E_PFPM_WUFC_FLX4_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX4_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX5_ACT_SHIFT 9 +#define I40E_PFPM_WUFC_FLX5_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX5_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX6_ACT_SHIFT 10 +#define I40E_PFPM_WUFC_FLX6_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX6_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX7_ACT_SHIFT 11 +#define I40E_PFPM_WUFC_FLX7_ACT_MASK (0x1 << I40E_PFPM_WUFC_FLX7_ACT_SHIFT) +#define I40E_PFPM_WUFC_FLX0_SHIFT 16 +#define I40E_PFPM_WUFC_FLX0_MASK (0x1 << I40E_PFPM_WUFC_FLX0_SHIFT) +#define I40E_PFPM_WUFC_FLX1_SHIFT 17 +#define I40E_PFPM_WUFC_FLX1_MASK (0x1 << I40E_PFPM_WUFC_FLX1_SHIFT) +#define I40E_PFPM_WUFC_FLX2_SHIFT 18 +#define I40E_PFPM_WUFC_FLX2_MASK (0x1 << I40E_PFPM_WUFC_FLX2_SHIFT) +#define I40E_PFPM_WUFC_FLX3_SHIFT 19 +#define I40E_PFPM_WUFC_FLX3_MASK (0x1 << I40E_PFPM_WUFC_FLX3_SHIFT) +#define I40E_PFPM_WUFC_FLX4_SHIFT 20 +#define I40E_PFPM_WUFC_FLX4_MASK (0x1 << I40E_PFPM_WUFC_FLX4_SHIFT) +#define I40E_PFPM_WUFC_FLX5_SHIFT 21 +#define I40E_PFPM_WUFC_FLX5_MASK (0x1 << I40E_PFPM_WUFC_FLX5_SHIFT) +#define I40E_PFPM_WUFC_FLX6_SHIFT 22 +#define I40E_PFPM_WUFC_FLX6_MASK (0x1 << I40E_PFPM_WUFC_FLX6_SHIFT) +#define I40E_PFPM_WUFC_FLX7_SHIFT 23 +#define I40E_PFPM_WUFC_FLX7_MASK (0x1 << I40E_PFPM_WUFC_FLX7_SHIFT) +#define I40E_PFPM_WUFC_FW_RST_WK_SHIFT 31 +#define I40E_PFPM_WUFC_FW_RST_WK_MASK (0x1 << I40E_PFPM_WUFC_FW_RST_WK_SHIFT) +#define I40E_PFPM_WUS 0x0006B600 +#define I40E_PFPM_WUS_LNKC_SHIFT 0 +#define I40E_PFPM_WUS_LNKC_MASK (0x1 << I40E_PFPM_WUS_LNKC_SHIFT) +#define I40E_PFPM_WUS_MAG_SHIFT 1 +#define I40E_PFPM_WUS_MAG_MASK (0x1 << I40E_PFPM_WUS_MAG_SHIFT) +#define I40E_PFPM_WUS_PME_STATUS_SHIFT 2 +#define I40E_PFPM_WUS_PME_STATUS_MASK (0x1 << I40E_PFPM_WUS_PME_STATUS_SHIFT) +#define I40E_PFPM_WUS_MNG_SHIFT 3 +#define I40E_PFPM_WUS_MNG_MASK (0x1 << I40E_PFPM_WUS_MNG_SHIFT) +#define I40E_PFPM_WUS_FLX0_SHIFT 16 +#define I40E_PFPM_WUS_FLX0_MASK (0x1 << I40E_PFPM_WUS_FLX0_SHIFT) +#define I40E_PFPM_WUS_FLX1_SHIFT 17 +#define I40E_PFPM_WUS_FLX1_MASK (0x1 << I40E_PFPM_WUS_FLX1_SHIFT) +#define I40E_PFPM_WUS_FLX2_SHIFT 18 +#define I40E_PFPM_WUS_FLX2_MASK (0x1 << I40E_PFPM_WUS_FLX2_SHIFT) +#define I40E_PFPM_WUS_FLX3_SHIFT 19 +#define I40E_PFPM_WUS_FLX3_MASK (0x1 << I40E_PFPM_WUS_FLX3_SHIFT) +#define I40E_PFPM_WUS_FLX4_SHIFT 20 +#define I40E_PFPM_WUS_FLX4_MASK (0x1 << I40E_PFPM_WUS_FLX4_SHIFT) +#define I40E_PFPM_WUS_FLX5_SHIFT 21 +#define I40E_PFPM_WUS_FLX5_MASK (0x1 << I40E_PFPM_WUS_FLX5_SHIFT) +#define I40E_PFPM_WUS_FLX6_SHIFT 22 +#define I40E_PFPM_WUS_FLX6_MASK (0x1 << I40E_PFPM_WUS_FLX6_SHIFT) +#define I40E_PFPM_WUS_FLX7_SHIFT 23 +#define I40E_PFPM_WUS_FLX7_MASK (0x1 << I40E_PFPM_WUS_FLX7_SHIFT) +#define I40E_PFPM_WUS_FW_RST_WK_SHIFT 31 +#define I40E_PFPM_WUS_FW_RST_WK_MASK (0x1 << I40E_PFPM_WUS_FW_RST_WK_SHIFT) +#define I40E_PRTPM_FHFHR 0x0006C000 +#define I40E_PRTPM_FHFHR_UNICAST_SHIFT 0 +#define I40E_PRTPM_FHFHR_UNICAST_MASK (0x1 << I40E_PRTPM_FHFHR_UNICAST_SHIFT) +#define I40E_PRTPM_FHFHR_MULTICAST_SHIFT 1 +#define I40E_PRTPM_FHFHR_MULTICAST_MASK (0x1 << I40E_PRTPM_FHFHR_MULTICAST_SHIFT) +#define I40E_PRTPM_SAH(_i) (0x001E44C0 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRTPM_SAH_MAX_INDEX 3 +#define I40E_PRTPM_SAH_PFPM_SAH_SHIFT 0 +#define I40E_PRTPM_SAH_PFPM_SAH_MASK (0xFFFF << I40E_PRTPM_SAH_PFPM_SAH_SHIFT) +#define I40E_PRTPM_SAH_PF_NUM_SHIFT 26 +#define I40E_PRTPM_SAH_PF_NUM_MASK (0xF << I40E_PRTPM_SAH_PF_NUM_SHIFT) +#define I40E_PRTPM_SAH_MC_MAG_EN_SHIFT 30 +#define I40E_PRTPM_SAH_MC_MAG_EN_MASK (0x1 << I40E_PRTPM_SAH_MC_MAG_EN_SHIFT) +#define I40E_PRTPM_SAH_AV_SHIFT 31 +#define I40E_PRTPM_SAH_AV_MASK (0x1 << I40E_PRTPM_SAH_AV_SHIFT) +#define I40E_PRTPM_SAL(_i) (0x001E4440 + ((_i) * 32)) /* _i=0...3 */ +#define I40E_PRTPM_SAL_MAX_INDEX 3 +#define I40E_PRTPM_SAL_PFPM_SAL_SHIFT 0 +#define I40E_PRTPM_SAL_PFPM_SAL_MASK (0xFFFFFFFF << I40E_PRTPM_SAL_PFPM_SAL_SHIFT) +#define I40E_VF_ARQBAH1 0x00006000 +#define I40E_VF_ARQBAH1_ARQBAH_SHIFT 0 +#define I40E_VF_ARQBAH1_ARQBAH_MASK (0xFFFFFFFF << I40E_VF_ARQBAH1_ARQBAH_SHIFT) +#define I40E_VF_ARQBAL1 0x00006C00 +#define I40E_VF_ARQBAL1_ARQBAL_SHIFT 0 +#define I40E_VF_ARQBAL1_ARQBAL_MASK (0xFFFFFFFF << I40E_VF_ARQBAL1_ARQBAL_SHIFT) +#define I40E_VF_ARQH1 0x00007400 +#define I40E_VF_ARQH1_ARQH_SHIFT 0 +#define I40E_VF_ARQH1_ARQH_MASK (0x3FF << I40E_VF_ARQH1_ARQH_SHIFT) +#define I40E_VF_ARQLEN1 0x00008000 +#define I40E_VF_ARQLEN1_ARQLEN_SHIFT 0 +#define I40E_VF_ARQLEN1_ARQLEN_MASK (0x3FF << I40E_VF_ARQLEN1_ARQLEN_SHIFT) +#define I40E_VF_ARQLEN1_ARQVFE_SHIFT 28 +#define I40E_VF_ARQLEN1_ARQVFE_MASK (0x1 << I40E_VF_ARQLEN1_ARQVFE_SHIFT) +#define I40E_VF_ARQLEN1_ARQOVFL_SHIFT 29 +#define I40E_VF_ARQLEN1_ARQOVFL_MASK (0x1 << I40E_VF_ARQLEN1_ARQOVFL_SHIFT) +#define I40E_VF_ARQLEN1_ARQCRIT_SHIFT 30 +#define I40E_VF_ARQLEN1_ARQCRIT_MASK (0x1 << I40E_VF_ARQLEN1_ARQCRIT_SHIFT) +#define I40E_VF_ARQLEN1_ARQENABLE_SHIFT 31 +#define I40E_VF_ARQLEN1_ARQENABLE_MASK (0x1 << I40E_VF_ARQLEN1_ARQENABLE_SHIFT) +#define I40E_VF_ARQT1 0x00007000 +#define I40E_VF_ARQT1_ARQT_SHIFT 0 +#define I40E_VF_ARQT1_ARQT_MASK (0x3FF << I40E_VF_ARQT1_ARQT_SHIFT) +#define I40E_VF_ATQBAH1 0x00007800 +#define I40E_VF_ATQBAH1_ATQBAH_SHIFT 0 +#define I40E_VF_ATQBAH1_ATQBAH_MASK (0xFFFFFFFF << I40E_VF_ATQBAH1_ATQBAH_SHIFT) +#define I40E_VF_ATQBAL1 0x00007C00 +#define I40E_VF_ATQBAL1_ATQBAL_SHIFT 0 +#define I40E_VF_ATQBAL1_ATQBAL_MASK (0xFFFFFFFF << I40E_VF_ATQBAL1_ATQBAL_SHIFT) +#define I40E_VF_ATQH1 0x00006400 +#define I40E_VF_ATQH1_ATQH_SHIFT 0 +#define I40E_VF_ATQH1_ATQH_MASK (0x3FF << I40E_VF_ATQH1_ATQH_SHIFT) +#define I40E_VF_ATQLEN1 0x00006800 +#define I40E_VF_ATQLEN1_ATQLEN_SHIFT 0 +#define I40E_VF_ATQLEN1_ATQLEN_MASK (0x3FF << I40E_VF_ATQLEN1_ATQLEN_SHIFT) +#define I40E_VF_ATQLEN1_ATQVFE_SHIFT 28 +#define I40E_VF_ATQLEN1_ATQVFE_MASK (0x1 << I40E_VF_ATQLEN1_ATQVFE_SHIFT) +#define I40E_VF_ATQLEN1_ATQOVFL_SHIFT 29 +#define I40E_VF_ATQLEN1_ATQOVFL_MASK (0x1 << I40E_VF_ATQLEN1_ATQOVFL_SHIFT) +#define I40E_VF_ATQLEN1_ATQCRIT_SHIFT 30 +#define I40E_VF_ATQLEN1_ATQCRIT_MASK (0x1 << I40E_VF_ATQLEN1_ATQCRIT_SHIFT) +#define I40E_VF_ATQLEN1_ATQENABLE_SHIFT 31 +#define I40E_VF_ATQLEN1_ATQENABLE_MASK (0x1 << I40E_VF_ATQLEN1_ATQENABLE_SHIFT) +#define I40E_VF_ATQT1 0x00008400 +#define I40E_VF_ATQT1_ATQT_SHIFT 0 +#define I40E_VF_ATQT1_ATQT_MASK (0x3FF << I40E_VF_ATQT1_ATQT_SHIFT) +#define I40E_VFGEN_RSTAT 0x00008800 +#define I40E_VFGEN_RSTAT_VFR_STATE_SHIFT 0 +#define I40E_VFGEN_RSTAT_VFR_STATE_MASK (0x3 << I40E_VFGEN_RSTAT_VFR_STATE_SHIFT) +#define I40E_VFINT_DYN_CTL01 0x00005C00 +#define I40E_VFINT_DYN_CTL01_INTENA_SHIFT 0 +#define I40E_VFINT_DYN_CTL01_INTENA_MASK (0x1 << I40E_VFINT_DYN_CTL01_INTENA_SHIFT) +#define I40E_VFINT_DYN_CTL01_CLEARPBA_SHIFT 1 +#define I40E_VFINT_DYN_CTL01_CLEARPBA_MASK (0x1 << I40E_VFINT_DYN_CTL01_CLEARPBA_SHIFT) +#define I40E_VFINT_DYN_CTL01_SWINT_TRIG_SHIFT 2 +#define I40E_VFINT_DYN_CTL01_SWINT_TRIG_MASK (0x1 << I40E_VFINT_DYN_CTL01_SWINT_TRIG_SHIFT) +#define I40E_VFINT_DYN_CTL01_ITR_INDX_SHIFT 3 +#define I40E_VFINT_DYN_CTL01_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTL01_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTL01_INTERVAL_SHIFT 5 +#define I40E_VFINT_DYN_CTL01_INTERVAL_MASK (0xFFF << I40E_VFINT_DYN_CTL01_INTERVAL_SHIFT) +#define I40E_VFINT_DYN_CTL01_SW_ITR_INDX_ENA_SHIFT 24 +#define I40E_VFINT_DYN_CTL01_SW_ITR_INDX_ENA_MASK (0x1 << I40E_VFINT_DYN_CTL01_SW_ITR_INDX_ENA_SHIFT) +#define I40E_VFINT_DYN_CTL01_SW_ITR_INDX_SHIFT 25 +#define I40E_VFINT_DYN_CTL01_SW_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTL01_SW_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTL01_INTENA_MSK_SHIFT 31 +#define I40E_VFINT_DYN_CTL01_INTENA_MSK_MASK (0x1 << I40E_VFINT_DYN_CTL01_INTENA_MSK_SHIFT) +#define I40E_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) +#define I40E_VFINT_DYN_CTLN1_MAX_INDEX 15 +#define I40E_VFINT_DYN_CTLN1_INTENA_SHIFT 0 +#define I40E_VFINT_DYN_CTLN1_INTENA_MASK (0x1 << I40E_VFINT_DYN_CTLN1_INTENA_SHIFT) +#define I40E_VFINT_DYN_CTLN1_CLEARPBA_SHIFT 1 +#define I40E_VFINT_DYN_CTLN1_CLEARPBA_MASK (0x1 << I40E_VFINT_DYN_CTLN1_CLEARPBA_SHIFT) +#define I40E_VFINT_DYN_CTLN1_SWINT_TRIG_SHIFT 2 +#define I40E_VFINT_DYN_CTLN1_SWINT_TRIG_MASK (0x1 << I40E_VFINT_DYN_CTLN1_SWINT_TRIG_SHIFT) +#define I40E_VFINT_DYN_CTLN1_ITR_INDX_SHIFT 3 +#define I40E_VFINT_DYN_CTLN1_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTLN1_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTLN1_INTERVAL_SHIFT 5 +#define I40E_VFINT_DYN_CTLN1_INTERVAL_MASK (0xFFF << I40E_VFINT_DYN_CTLN1_INTERVAL_SHIFT) +#define I40E_VFINT_DYN_CTLN1_SW_ITR_INDX_ENA_SHIFT 24 +#define I40E_VFINT_DYN_CTLN1_SW_ITR_INDX_ENA_MASK (0x1 << I40E_VFINT_DYN_CTLN1_SW_ITR_INDX_ENA_SHIFT) +#define I40E_VFINT_DYN_CTLN1_SW_ITR_INDX_SHIFT 25 +#define I40E_VFINT_DYN_CTLN1_SW_ITR_INDX_MASK (0x3 << I40E_VFINT_DYN_CTLN1_SW_ITR_INDX_SHIFT) +#define I40E_VFINT_DYN_CTLN1_INTENA_MSK_SHIFT 31 +#define I40E_VFINT_DYN_CTLN1_INTENA_MSK_MASK (0x1 << I40E_VFINT_DYN_CTLN1_INTENA_MSK_SHIFT) +#define I40E_VFINT_ICR0_ENA1 0x00005000 +#define I40E_VFINT_ICR0_ENA1_LINK_STAT_CHANGE_SHIFT 25 +#define I40E_VFINT_ICR0_ENA1_LINK_STAT_CHANGE_MASK (0x1 << I40E_VFINT_ICR0_ENA1_LINK_STAT_CHANGE_SHIFT) +#define I40E_VFINT_ICR0_ENA1_ADMINQ_SHIFT 30 +#define I40E_VFINT_ICR0_ENA1_ADMINQ_MASK (0x1 << I40E_VFINT_ICR0_ENA1_ADMINQ_SHIFT) +#define I40E_VFINT_ICR0_ENA1_RSVD_SHIFT 31 +#define I40E_VFINT_ICR0_ENA1_RSVD_MASK (0x1 << I40E_VFINT_ICR0_ENA1_RSVD_SHIFT) +#define I40E_VFINT_ICR01 0x00004800 +#define I40E_VFINT_ICR01_INTEVENT_SHIFT 0 +#define I40E_VFINT_ICR01_INTEVENT_MASK (0x1 << I40E_VFINT_ICR01_INTEVENT_SHIFT) +#define I40E_VFINT_ICR01_QUEUE_0_SHIFT 1 +#define I40E_VFINT_ICR01_QUEUE_0_MASK (0x1 << I40E_VFINT_ICR01_QUEUE_0_SHIFT) +#define I40E_VFINT_ICR01_QUEUE_1_SHIFT 2 +#define I40E_VFINT_ICR01_QUEUE_1_MASK (0x1 << I40E_VFINT_ICR01_QUEUE_1_SHIFT) +#define I40E_VFINT_ICR01_QUEUE_2_SHIFT 3 +#define I40E_VFINT_ICR01_QUEUE_2_MASK (0x1 << I40E_VFINT_ICR01_QUEUE_2_SHIFT) +#define I40E_VFINT_ICR01_QUEUE_3_SHIFT 4 +#define I40E_VFINT_ICR01_QUEUE_3_MASK (0x1 << I40E_VFINT_ICR01_QUEUE_3_SHIFT) +#define I40E_VFINT_ICR01_LINK_STAT_CHANGE_SHIFT 25 +#define I40E_VFINT_ICR01_LINK_STAT_CHANGE_MASK (0x1 << I40E_VFINT_ICR01_LINK_STAT_CHANGE_SHIFT) +#define I40E_VFINT_ICR01_ADMINQ_SHIFT 30 +#define I40E_VFINT_ICR01_ADMINQ_MASK (0x1 << I40E_VFINT_ICR01_ADMINQ_SHIFT) +#define I40E_VFINT_ICR01_SWINT_SHIFT 31 +#define I40E_VFINT_ICR01_SWINT_MASK (0x1 << I40E_VFINT_ICR01_SWINT_SHIFT) +#define I40E_VFINT_ITR01(_i) (0x00004C00 + ((_i) * 4)) /* _i=0...2 */ +#define I40E_VFINT_ITR01_MAX_INDEX 2 +#define I40E_VFINT_ITR01_INTERVAL_SHIFT 0 +#define I40E_VFINT_ITR01_INTERVAL_MASK (0xFFF << I40E_VFINT_ITR01_INTERVAL_SHIFT) +#define I40E_VFINT_ITRN1(_i, _INTVF) (0x00002800 + ((_i) * 64 + (_INTVF) * 4)) +#define I40E_VFINT_ITRN1_MAX_INDEX 2 +#define I40E_VFINT_ITRN1_INTERVAL_SHIFT 0 +#define I40E_VFINT_ITRN1_INTERVAL_MASK (0xFFF << I40E_VFINT_ITRN1_INTERVAL_SHIFT) +#define I40E_VFINT_STAT_CTL01 0x00005400 +#define I40E_VFINT_STAT_CTL01_OTHER_ITR_INDX_SHIFT 2 +#define I40E_VFINT_STAT_CTL01_OTHER_ITR_INDX_MASK (0x3 << I40E_VFINT_STAT_CTL01_OTHER_ITR_INDX_SHIFT) +#define I40E_QRX_TAIL1(_Q) (0x00002000 + ((_Q) * 4)) /* _i=0...15 */ +#define I40E_QRX_TAIL1_MAX_INDEX 15 +#define I40E_QRX_TAIL1_TAIL_SHIFT 0 +#define I40E_QRX_TAIL1_TAIL_MASK (0x1FFF << I40E_QRX_TAIL1_TAIL_SHIFT) +#define I40E_QTX_TAIL1(_Q) (0x00000000 + ((_Q) * 4)) /* _i=0...15 */ +#define I40E_QTX_TAIL1_MAX_INDEX 15 +#define I40E_QTX_TAIL1_TAIL_SHIFT 0 +#define I40E_QTX_TAIL1_TAIL_MASK (0x1FFF << I40E_QTX_TAIL1_TAIL_SHIFT) +#define I40E_VFMSIX_PBA 0x00002000 +#define I40E_VFMSIX_PBA_PENBIT_SHIFT 0 +#define I40E_VFMSIX_PBA_PENBIT_MASK (0xFFFFFFFF << I40E_VFMSIX_PBA_PENBIT_SHIFT) +#define I40E_VFMSIX_TADD(_i) (0x00000000 + ((_i) * 16)) /* _i=0...16 */ +#define I40E_VFMSIX_TADD_MAX_INDEX 16 +#define I40E_VFMSIX_TADD_MSIXTADD10_SHIFT 0 +#define I40E_VFMSIX_TADD_MSIXTADD10_MASK (0x3 << I40E_VFMSIX_TADD_MSIXTADD10_SHIFT) +#define I40E_VFMSIX_TADD_MSIXTADD_SHIFT 2 +#define I40E_VFMSIX_TADD_MSIXTADD_MASK (0x3FFFFFFF << I40E_VFMSIX_TADD_MSIXTADD_SHIFT) +#define I40E_VFMSIX_TMSG(_i) (0x00000008 + ((_i) * 16)) /* _i=0...16 */ +#define I40E_VFMSIX_TMSG_MAX_INDEX 16 +#define I40E_VFMSIX_TMSG_MSIXTMSG_SHIFT 0 +#define I40E_VFMSIX_TMSG_MSIXTMSG_MASK (0xFFFFFFFF << I40E_VFMSIX_TMSG_MSIXTMSG_SHIFT) +#define I40E_VFMSIX_TUADD(_i) (0x00000004 + ((_i) * 16)) /* _i=0...16 */ +#define I40E_VFMSIX_TUADD_MAX_INDEX 16 +#define I40E_VFMSIX_TUADD_MSIXTUADD_SHIFT 0 +#define I40E_VFMSIX_TUADD_MSIXTUADD_MASK (0xFFFFFFFF << I40E_VFMSIX_TUADD_MSIXTUADD_SHIFT) +#define I40E_VFMSIX_TVCTRL(_i) (0x0000000C + ((_i) * 16)) /* _i=0...16 */ +#define I40E_VFMSIX_TVCTRL_MAX_INDEX 16 +#define I40E_VFMSIX_TVCTRL_MASK_SHIFT 0 +#define I40E_VFMSIX_TVCTRL_MASK_MASK (0x1 << I40E_VFMSIX_TVCTRL_MASK_SHIFT) +#define I40E_VFCM_PE_ERRDATA 0x0000DC00 +#define I40E_VFCM_PE_ERRDATA_ERROR_CODE_SHIFT 0 +#define I40E_VFCM_PE_ERRDATA_ERROR_CODE_MASK (0xF << I40E_VFCM_PE_ERRDATA_ERROR_CODE_SHIFT) +#define I40E_VFCM_PE_ERRDATA_Q_TYPE_SHIFT 4 +#define I40E_VFCM_PE_ERRDATA_Q_TYPE_MASK (0x7 << I40E_VFCM_PE_ERRDATA_Q_TYPE_SHIFT) +#define I40E_VFCM_PE_ERRDATA_Q_NUM_SHIFT 8 +#define I40E_VFCM_PE_ERRDATA_Q_NUM_MASK (0x3FFFF << I40E_VFCM_PE_ERRDATA_Q_NUM_SHIFT) +#define I40E_VFCM_PE_ERRINFO 0x0000D800 +#define I40E_VFCM_PE_ERRINFO_ERROR_VALID_SHIFT 0 +#define I40E_VFCM_PE_ERRINFO_ERROR_VALID_MASK (0x1 << I40E_VFCM_PE_ERRINFO_ERROR_VALID_SHIFT) +#define I40E_VFCM_PE_ERRINFO_ERROR_INST_SHIFT 4 +#define I40E_VFCM_PE_ERRINFO_ERROR_INST_MASK (0x7 << I40E_VFCM_PE_ERRINFO_ERROR_INST_SHIFT) +#define I40E_VFCM_PE_ERRINFO_DBL_ERROR_CNT_SHIFT 8 +#define I40E_VFCM_PE_ERRINFO_DBL_ERROR_CNT_MASK (0xFF << I40E_VFCM_PE_ERRINFO_DBL_ERROR_CNT_SHIFT) +#define I40E_VFCM_PE_ERRINFO_RLU_ERROR_CNT_SHIFT 16 +#define I40E_VFCM_PE_ERRINFO_RLU_ERROR_CNT_MASK (0xFF << I40E_VFCM_PE_ERRINFO_RLU_ERROR_CNT_SHIFT) +#define I40E_VFCM_PE_ERRINFO_RLS_ERROR_CNT_SHIFT 24 +#define I40E_VFCM_PE_ERRINFO_RLS_ERROR_CNT_MASK (0xFF << I40E_VFCM_PE_ERRINFO_RLS_ERROR_CNT_SHIFT) +#define I40E_VFPE_AEQALLOC1 0x0000A400 +#define I40E_VFPE_AEQALLOC1_AECOUNT_SHIFT 0 +#define I40E_VFPE_AEQALLOC1_AECOUNT_MASK (0xFFFFFFFF << I40E_VFPE_AEQALLOC1_AECOUNT_SHIFT) +#define I40E_VFPE_CCQPHIGH1 0x00009800 +#define I40E_VFPE_CCQPHIGH1_PECCQPHIGH_SHIFT 0 +#define I40E_VFPE_CCQPHIGH1_PECCQPHIGH_MASK (0xFFFFFFFF << I40E_VFPE_CCQPHIGH1_PECCQPHIGH_SHIFT) +#define I40E_VFPE_CCQPLOW1 0x0000AC00 +#define I40E_VFPE_CCQPLOW1_PECCQPLOW_SHIFT 0 +#define I40E_VFPE_CCQPLOW1_PECCQPLOW_MASK (0xFFFFFFFF << I40E_VFPE_CCQPLOW1_PECCQPLOW_SHIFT) +#define I40E_VFPE_CCQPSTATUS1 0x0000B800 +#define I40E_VFPE_CCQPSTATUS1_CCQP_DONE_SHIFT 0 +#define I40E_VFPE_CCQPSTATUS1_CCQP_DONE_MASK (0x1 << I40E_VFPE_CCQPSTATUS1_CCQP_DONE_SHIFT) +#define I40E_VFPE_CCQPSTATUS1_CCQP_ERR_SHIFT 31 +#define I40E_VFPE_CCQPSTATUS1_CCQP_ERR_MASK (0x1 << I40E_VFPE_CCQPSTATUS1_CCQP_ERR_SHIFT) +#define I40E_VFPE_CQACK1 0x0000B000 +#define I40E_VFPE_CQACK1_PECQID_SHIFT 0 +#define I40E_VFPE_CQACK1_PECQID_MASK (0x1FFFF << I40E_VFPE_CQACK1_PECQID_SHIFT) +#define I40E_VFPE_CQARM1 0x0000B400 +#define I40E_VFPE_CQARM1_PECQID_SHIFT 0 +#define I40E_VFPE_CQARM1_PECQID_MASK (0x1FFFF << I40E_VFPE_CQARM1_PECQID_SHIFT) +#define I40E_VFPE_CQPDB1 0x0000BC00 +#define I40E_VFPE_CQPDB1_WQHEAD_SHIFT 0 +#define I40E_VFPE_CQPDB1_WQHEAD_MASK (0x7FF << I40E_VFPE_CQPDB1_WQHEAD_SHIFT) +#define I40E_VFPE_CQPERRCODES1 0x00009C00 +#define I40E_VFPE_CQPERRCODES1_CQP_MINOR_CODE_SHIFT 0 +#define I40E_VFPE_CQPERRCODES1_CQP_MINOR_CODE_MASK (0xFFFF << I40E_VFPE_CQPERRCODES1_CQP_MINOR_CODE_SHIFT) +#define I40E_VFPE_CQPERRCODES1_CQP_MAJOR_CODE_SHIFT 16 +#define I40E_VFPE_CQPERRCODES1_CQP_MAJOR_CODE_MASK (0xFFFF << I40E_VFPE_CQPERRCODES1_CQP_MAJOR_CODE_SHIFT) +#define I40E_VFPE_CQPTAIL1 0x0000A000 +#define I40E_VFPE_CQPTAIL1_WQTAIL_SHIFT 0 +#define I40E_VFPE_CQPTAIL1_WQTAIL_MASK (0x7FF << I40E_VFPE_CQPTAIL1_WQTAIL_SHIFT) +#define I40E_VFPE_CQPTAIL1_CQP_OP_ERR_SHIFT 31 +#define I40E_VFPE_CQPTAIL1_CQP_OP_ERR_MASK (0x1 << I40E_VFPE_CQPTAIL1_CQP_OP_ERR_SHIFT) +#define I40E_VFPE_IPCONFIG01 0x00008C00 +#define I40E_VFPE_IPCONFIG01_PEIPID_SHIFT 0 +#define I40E_VFPE_IPCONFIG01_PEIPID_MASK (0xFFFF << I40E_VFPE_IPCONFIG01_PEIPID_SHIFT) +#define I40E_VFPE_IPCONFIG01_USEENTIREIDRANGE_SHIFT 16 +#define I40E_VFPE_IPCONFIG01_USEENTIREIDRANGE_MASK (0x1 << I40E_VFPE_IPCONFIG01_USEENTIREIDRANGE_SHIFT) +#define I40E_VFPE_MRTEIDXMASK1 0x00009000 +#define I40E_VFPE_MRTEIDXMASK1_MRTEIDXMASKBITS_SHIFT 0 +#define I40E_VFPE_MRTEIDXMASK1_MRTEIDXMASKBITS_MASK (0x1F << I40E_VFPE_MRTEIDXMASK1_MRTEIDXMASKBITS_SHIFT) +#define I40E_VFPE_RCVUNEXPECTEDERROR1 0x00009400 +#define I40E_VFPE_RCVUNEXPECTEDERROR1_TCP_RX_UNEXP_ERR_SHIFT 0 +#define I40E_VFPE_RCVUNEXPECTEDERROR1_TCP_RX_UNEXP_ERR_MASK (0xFFFFFF << I40E_VFPE_RCVUNEXPECTEDERROR1_TCP_RX_UNEXP_ERR_SHIFT) +#define I40E_VFPE_TCPNOWTIMER1 0x0000A800 +#define I40E_VFPE_TCPNOWTIMER1_TCP_NOW_SHIFT 0 +#define I40E_VFPE_TCPNOWTIMER1_TCP_NOW_MASK (0xFFFFFFFF << I40E_VFPE_TCPNOWTIMER1_TCP_NOW_SHIFT) +#define I40E_VFPE_WQEALLOC1 0x0000C000 +#define I40E_VFPE_WQEALLOC1_PEQPID_SHIFT 0 +#define I40E_VFPE_WQEALLOC1_PEQPID_MASK (0x3FFFF << I40E_VFPE_WQEALLOC1_PEQPID_SHIFT) +#define I40E_VFPE_WQEALLOC1_WQE_DESC_INDEX_SHIFT 20 +#define I40E_VFPE_WQEALLOC1_WQE_DESC_INDEX_MASK (0xFFF << I40E_VFPE_WQEALLOC1_WQE_DESC_INDEX_SHIFT) +#define I40E_VFQF_HENA(_i) (0x0000C400 + ((_i) * 4)) /* _i=0...1 */ +#define I40E_VFQF_HENA_MAX_INDEX 1 +#define I40E_VFQF_HENA_PTYPE_ENA_SHIFT 0 +#define I40E_VFQF_HENA_PTYPE_ENA_MASK (0xFFFFFFFF << I40E_VFQF_HENA_PTYPE_ENA_SHIFT) +#define I40E_VFQF_HKEY(_i) (0x0000CC00 + ((_i) * 4)) /* _i=0...12 */ +#define I40E_VFQF_HKEY_MAX_INDEX 12 +#define I40E_VFQF_HKEY_KEY_0_SHIFT 0 +#define I40E_VFQF_HKEY_KEY_0_MASK (0xFF << I40E_VFQF_HKEY_KEY_0_SHIFT) +#define I40E_VFQF_HKEY_KEY_1_SHIFT 8 +#define I40E_VFQF_HKEY_KEY_1_MASK (0xFF << I40E_VFQF_HKEY_KEY_1_SHIFT) +#define I40E_VFQF_HKEY_KEY_2_SHIFT 16 +#define I40E_VFQF_HKEY_KEY_2_MASK (0xFF << I40E_VFQF_HKEY_KEY_2_SHIFT) +#define I40E_VFQF_HKEY_KEY_3_SHIFT 24 +#define I40E_VFQF_HKEY_KEY_3_MASK (0xFF << I40E_VFQF_HKEY_KEY_3_SHIFT) +#define I40E_VFQF_HLUT(_i) (0x0000D000 + ((_i) * 4)) /* _i=0...15 */ +#define I40E_VFQF_HLUT_MAX_INDEX 15 +#define I40E_VFQF_HLUT_LUT0_SHIFT 0 +#define I40E_VFQF_HLUT_LUT0_MASK (0xF << I40E_VFQF_HLUT_LUT0_SHIFT) +#define I40E_VFQF_HLUT_LUT1_SHIFT 8 +#define I40E_VFQF_HLUT_LUT1_MASK (0xF << I40E_VFQF_HLUT_LUT1_SHIFT) +#define I40E_VFQF_HLUT_LUT2_SHIFT 16 +#define I40E_VFQF_HLUT_LUT2_MASK (0xF << I40E_VFQF_HLUT_LUT2_SHIFT) +#define I40E_VFQF_HLUT_LUT3_SHIFT 24 +#define I40E_VFQF_HLUT_LUT3_MASK (0xF << I40E_VFQF_HLUT_LUT3_SHIFT) +#define I40E_VFQF_HREGION(_i) (0x0000D400 + ((_i) * 4)) /* _i=0...7 */ +#define I40E_VFQF_HREGION_MAX_INDEX 7 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_0_SHIFT 0 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_0_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_0_SHIFT) +#define I40E_VFQF_HREGION_REGION_0_SHIFT 1 +#define I40E_VFQF_HREGION_REGION_0_MASK (0x7 << I40E_VFQF_HREGION_REGION_0_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_1_SHIFT 4 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_1_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_1_SHIFT) +#define I40E_VFQF_HREGION_REGION_1_SHIFT 5 +#define I40E_VFQF_HREGION_REGION_1_MASK (0x7 << I40E_VFQF_HREGION_REGION_1_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_2_SHIFT 8 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_2_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_2_SHIFT) +#define I40E_VFQF_HREGION_REGION_2_SHIFT 9 +#define I40E_VFQF_HREGION_REGION_2_MASK (0x7 << I40E_VFQF_HREGION_REGION_2_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_3_SHIFT 12 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_3_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_3_SHIFT) +#define I40E_VFQF_HREGION_REGION_3_SHIFT 13 +#define I40E_VFQF_HREGION_REGION_3_MASK (0x7 << I40E_VFQF_HREGION_REGION_3_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_4_SHIFT 16 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_4_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_4_SHIFT) +#define I40E_VFQF_HREGION_REGION_4_SHIFT 17 +#define I40E_VFQF_HREGION_REGION_4_MASK (0x7 << I40E_VFQF_HREGION_REGION_4_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_5_SHIFT 20 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_5_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_5_SHIFT) +#define I40E_VFQF_HREGION_REGION_5_SHIFT 21 +#define I40E_VFQF_HREGION_REGION_5_MASK (0x7 << I40E_VFQF_HREGION_REGION_5_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_6_SHIFT 24 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_6_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_6_SHIFT) +#define I40E_VFQF_HREGION_REGION_6_SHIFT 25 +#define I40E_VFQF_HREGION_REGION_6_MASK (0x7 << I40E_VFQF_HREGION_REGION_6_SHIFT) +#define I40E_VFQF_HREGION_OVERRIDE_ENA_7_SHIFT 28 +#define I40E_VFQF_HREGION_OVERRIDE_ENA_7_MASK (0x1 << I40E_VFQF_HREGION_OVERRIDE_ENA_7_SHIFT) +#define I40E_VFQF_HREGION_REGION_7_SHIFT 29 +#define I40E_VFQF_HREGION_REGION_7_MASK (0x7 << I40E_VFQF_HREGION_REGION_7_SHIFT) +#define I40E_RCU_PST_FOC_ACCESS_STATUS 0x00270110 +#define I40E_RCU_PST_FOC_ACCESS_STATUS_WR_ACCESS_CNT_SHIFT 0 +#define I40E_RCU_PST_FOC_ACCESS_STATUS_WR_ACCESS_CNT_MASK (0xFF << I40E_RCU_PST_FOC_ACCESS_STATUS_WR_ACCESS_CNT_SHIFT) +#define I40E_RCU_PST_FOC_ACCESS_STATUS_RD_ACCESS_CNT_SHIFT 8 +#define I40E_RCU_PST_FOC_ACCESS_STATUS_RD_ACCESS_CNT_MASK (0xFF << I40E_RCU_PST_FOC_ACCESS_STATUS_RD_ACCESS_CNT_SHIFT) +#define I40E_RCU_PST_FOC_ACCESS_STATUS_ERR_CNT_SHIFT 16 +#define I40E_RCU_PST_FOC_ACCESS_STATUS_ERR_CNT_MASK (0xFF << I40E_RCU_PST_FOC_ACCESS_STATUS_ERR_CNT_SHIFT) +#define I40E_RCU_PST_FOC_ACCESS_STATUS_LAST_ERR_CODE_SHIFT 24 +#define I40E_RCU_PST_FOC_ACCESS_STATUS_LAST_ERR_CODE_MASK (0x7 << I40E_RCU_PST_FOC_ACCESS_STATUS_LAST_ERR_CODE_SHIFT) +#endif diff --git a/drivers/net/ethernet/intel/i40evf/i40e_status.h b/drivers/net/ethernet/intel/i40evf/i40e_status.h new file mode 100644 index 00000000000..7fa7a41915c --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_status.h @@ -0,0 +1,100 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_STATUS_H_ +#define _I40E_STATUS_H_ + +/* Error Codes */ +enum i40e_status_code { +	I40E_SUCCESS				= 0, +	I40E_ERR_NVM				= -1, +	I40E_ERR_NVM_CHECKSUM			= -2, +	I40E_ERR_PHY				= -3, +	I40E_ERR_CONFIG				= -4, +	I40E_ERR_PARAM				= -5, +	I40E_ERR_MAC_TYPE			= -6, +	I40E_ERR_UNKNOWN_PHY			= -7, +	I40E_ERR_LINK_SETUP			= -8, +	I40E_ERR_ADAPTER_STOPPED		= -9, +	I40E_ERR_INVALID_MAC_ADDR		= -10, +	I40E_ERR_DEVICE_NOT_SUPPORTED		= -11, +	I40E_ERR_MASTER_REQUESTS_PENDING	= -12, +	I40E_ERR_INVALID_LINK_SETTINGS		= -13, +	I40E_ERR_AUTONEG_NOT_COMPLETE		= -14, +	I40E_ERR_RESET_FAILED			= -15, +	I40E_ERR_SWFW_SYNC			= -16, +	I40E_ERR_NO_AVAILABLE_VSI		= -17, +	I40E_ERR_NO_MEMORY			= -18, +	I40E_ERR_BAD_PTR			= -19, +	I40E_ERR_RING_FULL			= -20, +	I40E_ERR_INVALID_PD_ID			= -21, +	I40E_ERR_INVALID_QP_ID			= -22, +	I40E_ERR_INVALID_CQ_ID			= -23, +	I40E_ERR_INVALID_CEQ_ID			= -24, +	I40E_ERR_INVALID_AEQ_ID			= -25, +	I40E_ERR_INVALID_SIZE			= -26, +	I40E_ERR_INVALID_ARP_INDEX		= -27, +	I40E_ERR_INVALID_FPM_FUNC_ID		= -28, +	I40E_ERR_QP_INVALID_MSG_SIZE		= -29, +	I40E_ERR_QP_TOOMANY_WRS_POSTED		= -30, +	I40E_ERR_INVALID_FRAG_COUNT		= -31, +	I40E_ERR_QUEUE_EMPTY			= -32, +	I40E_ERR_INVALID_ALIGNMENT		= -33, +	I40E_ERR_FLUSHED_QUEUE			= -34, +	I40E_ERR_INVALID_PUSH_PAGE_INDEX	= -35, +	I40E_ERR_INVALID_IMM_DATA_SIZE		= -36, +	I40E_ERR_TIMEOUT			= -37, +	I40E_ERR_OPCODE_MISMATCH		= -38, +	I40E_ERR_CQP_COMPL_ERROR		= -39, +	I40E_ERR_INVALID_VF_ID			= -40, +	I40E_ERR_INVALID_HMCFN_ID		= -41, +	I40E_ERR_BACKING_PAGE_ERROR		= -42, +	I40E_ERR_NO_PBLCHUNKS_AVAILABLE		= -43, +	I40E_ERR_INVALID_PBLE_INDEX		= -44, +	I40E_ERR_INVALID_SD_INDEX		= -45, +	I40E_ERR_INVALID_PAGE_DESC_INDEX	= -46, +	I40E_ERR_INVALID_SD_TYPE		= -47, +	I40E_ERR_MEMCPY_FAILED			= -48, +	I40E_ERR_INVALID_HMC_OBJ_INDEX		= -49, +	I40E_ERR_INVALID_HMC_OBJ_COUNT		= -50, +	I40E_ERR_INVALID_SRQ_ARM_LIMIT		= -51, +	I40E_ERR_SRQ_ENABLED			= -52, +	I40E_ERR_ADMIN_QUEUE_ERROR		= -53, +	I40E_ERR_ADMIN_QUEUE_TIMEOUT		= -54, +	I40E_ERR_BUF_TOO_SHORT			= -55, +	I40E_ERR_ADMIN_QUEUE_FULL		= -56, +	I40E_ERR_ADMIN_QUEUE_NO_WORK		= -57, +	I40E_ERR_BAD_IWARP_CQE			= -58, +	I40E_ERR_NVM_BLANK_MODE			= -59, +	I40E_ERR_NOT_IMPLEMENTED		= -60, +	I40E_ERR_PE_DOORBELL_NOT_ENABLED	= -61, +	I40E_ERR_DIAG_TEST_FAILED		= -62, +	I40E_ERR_NOT_READY			= -63, +	I40E_NOT_SUPPORTED			= -64, +	I40E_ERR_FIRMWARE_API_VERSION		= -65, +}; + +#endif /* _I40E_STATUS_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c new file mode 100644 index 00000000000..48ebb6cd69f --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c @@ -0,0 +1,1667 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#include <linux/prefetch.h> + +#include "i40evf.h" +#include "i40e_prototype.h" + +static inline __le64 build_ctob(u32 td_cmd, u32 td_offset, unsigned int size, +				u32 td_tag) +{ +	return cpu_to_le64(I40E_TX_DESC_DTYPE_DATA | +			   ((u64)td_cmd  << I40E_TXD_QW1_CMD_SHIFT) | +			   ((u64)td_offset << I40E_TXD_QW1_OFFSET_SHIFT) | +			   ((u64)size  << I40E_TXD_QW1_TX_BUF_SZ_SHIFT) | +			   ((u64)td_tag  << I40E_TXD_QW1_L2TAG1_SHIFT)); +} + +#define I40E_TXD_CMD (I40E_TX_DESC_CMD_EOP | I40E_TX_DESC_CMD_RS) + +/** + * i40e_unmap_and_free_tx_resource - Release a Tx buffer + * @ring:      the ring that owns the buffer + * @tx_buffer: the buffer to free + **/ +static void i40e_unmap_and_free_tx_resource(struct i40e_ring *ring, +					    struct i40e_tx_buffer *tx_buffer) +{ +	if (tx_buffer->skb) { +		dev_kfree_skb_any(tx_buffer->skb); +		if (dma_unmap_len(tx_buffer, len)) +			dma_unmap_single(ring->dev, +					 dma_unmap_addr(tx_buffer, dma), +					 dma_unmap_len(tx_buffer, len), +					 DMA_TO_DEVICE); +	} else if (dma_unmap_len(tx_buffer, len)) { +		dma_unmap_page(ring->dev, +			       dma_unmap_addr(tx_buffer, dma), +			       dma_unmap_len(tx_buffer, len), +			       DMA_TO_DEVICE); +	} +	tx_buffer->next_to_watch = NULL; +	tx_buffer->skb = NULL; +	dma_unmap_len_set(tx_buffer, len, 0); +	/* tx_buffer must be completely set up in the transmit path */ +} + +/** + * i40evf_clean_tx_ring - Free any empty Tx buffers + * @tx_ring: ring to be cleaned + **/ +void i40evf_clean_tx_ring(struct i40e_ring *tx_ring) +{ +	unsigned long bi_size; +	u16 i; + +	/* ring already cleared, nothing to do */ +	if (!tx_ring->tx_bi) +		return; + +	/* Free all the Tx ring sk_buffs */ +	for (i = 0; i < tx_ring->count; i++) +		i40e_unmap_and_free_tx_resource(tx_ring, &tx_ring->tx_bi[i]); + +	bi_size = sizeof(struct i40e_tx_buffer) * tx_ring->count; +	memset(tx_ring->tx_bi, 0, bi_size); + +	/* Zero out the descriptor ring */ +	memset(tx_ring->desc, 0, tx_ring->size); + +	tx_ring->next_to_use = 0; +	tx_ring->next_to_clean = 0; + +	if (!tx_ring->netdev) +		return; + +	/* cleanup Tx queue statistics */ +	netdev_tx_reset_queue(netdev_get_tx_queue(tx_ring->netdev, +						  tx_ring->queue_index)); +} + +/** + * i40evf_free_tx_resources - Free Tx resources per queue + * @tx_ring: Tx descriptor ring for a specific queue + * + * Free all transmit software resources + **/ +void i40evf_free_tx_resources(struct i40e_ring *tx_ring) +{ +	i40evf_clean_tx_ring(tx_ring); +	kfree(tx_ring->tx_bi); +	tx_ring->tx_bi = NULL; + +	if (tx_ring->desc) { +		dma_free_coherent(tx_ring->dev, tx_ring->size, +				  tx_ring->desc, tx_ring->dma); +		tx_ring->desc = NULL; +	} +} + +/** + * i40e_get_tx_pending - how many tx descriptors not processed + * @tx_ring: the ring of descriptors + * + * Since there is no access to the ring head register + * in XL710, we need to use our local copies + **/ +static u32 i40e_get_tx_pending(struct i40e_ring *ring) +{ +	u32 ntu = ((ring->next_to_clean <= ring->next_to_use) +			? ring->next_to_use +			: ring->next_to_use + ring->count); +	return ntu - ring->next_to_clean; +} + +/** + * i40e_check_tx_hang - Is there a hang in the Tx queue + * @tx_ring: the ring of descriptors + **/ +static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) +{ +	u32 tx_pending = i40e_get_tx_pending(tx_ring); +	bool ret = false; + +	clear_check_for_tx_hang(tx_ring); + +	/* Check for a hung queue, but be thorough. This verifies +	 * that a transmit has been completed since the previous +	 * check AND there is at least one packet pending. The +	 * ARMED bit is set to indicate a potential hang. The +	 * bit is cleared if a pause frame is received to remove +	 * false hang detection due to PFC or 802.3x frames. By +	 * requiring this to fail twice we avoid races with +	 * PFC clearing the ARMED bit and conditions where we +	 * run the check_tx_hang logic with a transmit completion +	 * pending but without time to complete it yet. +	 */ +	if ((tx_ring->tx_stats.tx_done_old == tx_ring->stats.packets) && +	    tx_pending) { +		/* make sure it is true for two checks in a row */ +		ret = test_and_set_bit(__I40E_HANG_CHECK_ARMED, +				       &tx_ring->state); +	} else { +		/* update completed stats and disarm the hang check */ +		tx_ring->tx_stats.tx_done_old = tx_ring->stats.packets; +		clear_bit(__I40E_HANG_CHECK_ARMED, &tx_ring->state); +	} + +	return ret; +} + +/** + * i40e_get_head - Retrieve head from head writeback + * @tx_ring:  tx ring to fetch head of + * + * Returns value of Tx ring head based on value stored + * in head write-back location + **/ +static inline u32 i40e_get_head(struct i40e_ring *tx_ring) +{ +	void *head = (struct i40e_tx_desc *)tx_ring->desc + tx_ring->count; + +	return le32_to_cpu(*(volatile __le32 *)head); +} + +/** + * i40e_clean_tx_irq - Reclaim resources after transmit completes + * @tx_ring:  tx ring to clean + * @budget:   how many cleans we're allowed + * + * Returns true if there's any budget left (e.g. the clean is finished) + **/ +static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) +{ +	u16 i = tx_ring->next_to_clean; +	struct i40e_tx_buffer *tx_buf; +	struct i40e_tx_desc *tx_head; +	struct i40e_tx_desc *tx_desc; +	unsigned int total_packets = 0; +	unsigned int total_bytes = 0; + +	tx_buf = &tx_ring->tx_bi[i]; +	tx_desc = I40E_TX_DESC(tx_ring, i); +	i -= tx_ring->count; + +	tx_head = I40E_TX_DESC(tx_ring, i40e_get_head(tx_ring)); + +	do { +		struct i40e_tx_desc *eop_desc = tx_buf->next_to_watch; + +		/* if next_to_watch is not set then there is no work pending */ +		if (!eop_desc) +			break; + +		/* prevent any other reads prior to eop_desc */ +		read_barrier_depends(); + +		/* we have caught up to head, no work left to do */ +		if (tx_head == tx_desc) +			break; + +		/* clear next_to_watch to prevent false hangs */ +		tx_buf->next_to_watch = NULL; + +		/* update the statistics for this packet */ +		total_bytes += tx_buf->bytecount; +		total_packets += tx_buf->gso_segs; + +		/* free the skb */ +		dev_kfree_skb_any(tx_buf->skb); + +		/* unmap skb header data */ +		dma_unmap_single(tx_ring->dev, +				 dma_unmap_addr(tx_buf, dma), +				 dma_unmap_len(tx_buf, len), +				 DMA_TO_DEVICE); + +		/* clear tx_buffer data */ +		tx_buf->skb = NULL; +		dma_unmap_len_set(tx_buf, len, 0); + +		/* unmap remaining buffers */ +		while (tx_desc != eop_desc) { + +			tx_buf++; +			tx_desc++; +			i++; +			if (unlikely(!i)) { +				i -= tx_ring->count; +				tx_buf = tx_ring->tx_bi; +				tx_desc = I40E_TX_DESC(tx_ring, 0); +			} + +			/* unmap any remaining paged data */ +			if (dma_unmap_len(tx_buf, len)) { +				dma_unmap_page(tx_ring->dev, +					       dma_unmap_addr(tx_buf, dma), +					       dma_unmap_len(tx_buf, len), +					       DMA_TO_DEVICE); +				dma_unmap_len_set(tx_buf, len, 0); +			} +		} + +		/* move us one more past the eop_desc for start of next pkt */ +		tx_buf++; +		tx_desc++; +		i++; +		if (unlikely(!i)) { +			i -= tx_ring->count; +			tx_buf = tx_ring->tx_bi; +			tx_desc = I40E_TX_DESC(tx_ring, 0); +		} + +		/* update budget accounting */ +		budget--; +	} while (likely(budget)); + +	i += tx_ring->count; +	tx_ring->next_to_clean = i; +	u64_stats_update_begin(&tx_ring->syncp); +	tx_ring->stats.bytes += total_bytes; +	tx_ring->stats.packets += total_packets; +	u64_stats_update_end(&tx_ring->syncp); +	tx_ring->q_vector->tx.total_bytes += total_bytes; +	tx_ring->q_vector->tx.total_packets += total_packets; + +	if (check_for_tx_hang(tx_ring) && i40e_check_tx_hang(tx_ring)) { +		/* schedule immediate reset if we believe we hung */ +		dev_info(tx_ring->dev, "Detected Tx Unit Hang\n" +			 "  VSI                  <%d>\n" +			 "  Tx Queue             <%d>\n" +			 "  next_to_use          <%x>\n" +			 "  next_to_clean        <%x>\n", +			 tx_ring->vsi->seid, +			 tx_ring->queue_index, +			 tx_ring->next_to_use, i); +		dev_info(tx_ring->dev, "tx_bi[next_to_clean]\n" +			 "  time_stamp           <%lx>\n" +			 "  jiffies              <%lx>\n", +			 tx_ring->tx_bi[i].time_stamp, jiffies); + +		netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index); + +		dev_info(tx_ring->dev, +			 "tx hang detected on queue %d, resetting adapter\n", +			 tx_ring->queue_index); + +		tx_ring->netdev->netdev_ops->ndo_tx_timeout(tx_ring->netdev); + +		/* the adapter is about to reset, no point in enabling stuff */ +		return true; +	} + +	netdev_tx_completed_queue(netdev_get_tx_queue(tx_ring->netdev, +						      tx_ring->queue_index), +				  total_packets, total_bytes); + +#define TX_WAKE_THRESHOLD (DESC_NEEDED * 2) +	if (unlikely(total_packets && netif_carrier_ok(tx_ring->netdev) && +		     (I40E_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD))) { +		/* Make sure that anybody stopping the queue after this +		 * sees the new next_to_clean. +		 */ +		smp_mb(); +		if (__netif_subqueue_stopped(tx_ring->netdev, +					     tx_ring->queue_index) && +		   !test_bit(__I40E_DOWN, &tx_ring->vsi->state)) { +			netif_wake_subqueue(tx_ring->netdev, +					    tx_ring->queue_index); +			++tx_ring->tx_stats.restart_queue; +		} +	} + +	return budget > 0; +} + +/** + * i40e_set_new_dynamic_itr - Find new ITR level + * @rc: structure containing ring performance data + * + * Stores a new ITR value based on packets and byte counts during + * the last interrupt.  The advantage of per interrupt computation + * is faster updates and more accurate ITR for the current traffic + * pattern.  Constants in this function were computed based on + * theoretical maximum wire speed and thresholds were set based on + * testing data as well as attempting to minimize response time + * while increasing bulk throughput. + **/ +static void i40e_set_new_dynamic_itr(struct i40e_ring_container *rc) +{ +	enum i40e_latency_range new_latency_range = rc->latency_range; +	u32 new_itr = rc->itr; +	int bytes_per_int; + +	if (rc->total_packets == 0 || !rc->itr) +		return; + +	/* simple throttlerate management +	 *   0-10MB/s   lowest (100000 ints/s) +	 *  10-20MB/s   low    (20000 ints/s) +	 *  20-1249MB/s bulk   (8000 ints/s) +	 */ +	bytes_per_int = rc->total_bytes / rc->itr; +	switch (rc->itr) { +	case I40E_LOWEST_LATENCY: +		if (bytes_per_int > 10) +			new_latency_range = I40E_LOW_LATENCY; +		break; +	case I40E_LOW_LATENCY: +		if (bytes_per_int > 20) +			new_latency_range = I40E_BULK_LATENCY; +		else if (bytes_per_int <= 10) +			new_latency_range = I40E_LOWEST_LATENCY; +		break; +	case I40E_BULK_LATENCY: +		if (bytes_per_int <= 20) +			rc->latency_range = I40E_LOW_LATENCY; +		break; +	} + +	switch (new_latency_range) { +	case I40E_LOWEST_LATENCY: +		new_itr = I40E_ITR_100K; +		break; +	case I40E_LOW_LATENCY: +		new_itr = I40E_ITR_20K; +		break; +	case I40E_BULK_LATENCY: +		new_itr = I40E_ITR_8K; +		break; +	default: +		break; +	} + +	if (new_itr != rc->itr) { +		/* do an exponential smoothing */ +		new_itr = (10 * new_itr * rc->itr) / +			  ((9 * new_itr) + rc->itr); +		rc->itr = new_itr & I40E_MAX_ITR; +	} + +	rc->total_bytes = 0; +	rc->total_packets = 0; +} + +/** + * i40e_update_dynamic_itr - Adjust ITR based on bytes per int + * @q_vector: the vector to adjust + **/ +static void i40e_update_dynamic_itr(struct i40e_q_vector *q_vector) +{ +	u16 vector = q_vector->vsi->base_vector + q_vector->v_idx; +	struct i40e_hw *hw = &q_vector->vsi->back->hw; +	u32 reg_addr; +	u16 old_itr; + +	reg_addr = I40E_VFINT_ITRN1(I40E_RX_ITR, vector - 1); +	old_itr = q_vector->rx.itr; +	i40e_set_new_dynamic_itr(&q_vector->rx); +	if (old_itr != q_vector->rx.itr) +		wr32(hw, reg_addr, q_vector->rx.itr); + +	reg_addr = I40E_VFINT_ITRN1(I40E_TX_ITR, vector - 1); +	old_itr = q_vector->tx.itr; +	i40e_set_new_dynamic_itr(&q_vector->tx); +	if (old_itr != q_vector->tx.itr) +		wr32(hw, reg_addr, q_vector->tx.itr); +} + +/** + * i40evf_setup_tx_descriptors - Allocate the Tx descriptors + * @tx_ring: the tx ring to set up + * + * Return 0 on success, negative on error + **/ +int i40evf_setup_tx_descriptors(struct i40e_ring *tx_ring) +{ +	struct device *dev = tx_ring->dev; +	int bi_size; + +	if (!dev) +		return -ENOMEM; + +	bi_size = sizeof(struct i40e_tx_buffer) * tx_ring->count; +	tx_ring->tx_bi = kzalloc(bi_size, GFP_KERNEL); +	if (!tx_ring->tx_bi) +		goto err; + +	/* round up to nearest 4K */ +	tx_ring->size = tx_ring->count * sizeof(struct i40e_tx_desc); +	/* add u32 for head writeback, align after this takes care of +	 * guaranteeing this is at least one cache line in size +	 */ +	tx_ring->size += sizeof(u32); +	tx_ring->size = ALIGN(tx_ring->size, 4096); +	tx_ring->desc = dma_alloc_coherent(dev, tx_ring->size, +					   &tx_ring->dma, GFP_KERNEL); +	if (!tx_ring->desc) { +		dev_info(dev, "Unable to allocate memory for the Tx descriptor ring, size=%d\n", +			 tx_ring->size); +		goto err; +	} + +	tx_ring->next_to_use = 0; +	tx_ring->next_to_clean = 0; +	return 0; + +err: +	kfree(tx_ring->tx_bi); +	tx_ring->tx_bi = NULL; +	return -ENOMEM; +} + +/** + * i40evf_clean_rx_ring - Free Rx buffers + * @rx_ring: ring to be cleaned + **/ +void i40evf_clean_rx_ring(struct i40e_ring *rx_ring) +{ +	struct device *dev = rx_ring->dev; +	struct i40e_rx_buffer *rx_bi; +	unsigned long bi_size; +	u16 i; + +	/* ring already cleared, nothing to do */ +	if (!rx_ring->rx_bi) +		return; + +	/* Free all the Rx ring sk_buffs */ +	for (i = 0; i < rx_ring->count; i++) { +		rx_bi = &rx_ring->rx_bi[i]; +		if (rx_bi->dma) { +			dma_unmap_single(dev, +					 rx_bi->dma, +					 rx_ring->rx_buf_len, +					 DMA_FROM_DEVICE); +			rx_bi->dma = 0; +		} +		if (rx_bi->skb) { +			dev_kfree_skb(rx_bi->skb); +			rx_bi->skb = NULL; +		} +		if (rx_bi->page) { +			if (rx_bi->page_dma) { +				dma_unmap_page(dev, +					       rx_bi->page_dma, +					       PAGE_SIZE / 2, +					       DMA_FROM_DEVICE); +				rx_bi->page_dma = 0; +			} +			__free_page(rx_bi->page); +			rx_bi->page = NULL; +			rx_bi->page_offset = 0; +		} +	} + +	bi_size = sizeof(struct i40e_rx_buffer) * rx_ring->count; +	memset(rx_ring->rx_bi, 0, bi_size); + +	/* Zero out the descriptor ring */ +	memset(rx_ring->desc, 0, rx_ring->size); + +	rx_ring->next_to_clean = 0; +	rx_ring->next_to_use = 0; +} + +/** + * i40evf_free_rx_resources - Free Rx resources + * @rx_ring: ring to clean the resources from + * + * Free all receive software resources + **/ +void i40evf_free_rx_resources(struct i40e_ring *rx_ring) +{ +	i40evf_clean_rx_ring(rx_ring); +	kfree(rx_ring->rx_bi); +	rx_ring->rx_bi = NULL; + +	if (rx_ring->desc) { +		dma_free_coherent(rx_ring->dev, rx_ring->size, +				  rx_ring->desc, rx_ring->dma); +		rx_ring->desc = NULL; +	} +} + +/** + * i40evf_setup_rx_descriptors - Allocate Rx descriptors + * @rx_ring: Rx descriptor ring (for a specific queue) to setup + * + * Returns 0 on success, negative on failure + **/ +int i40evf_setup_rx_descriptors(struct i40e_ring *rx_ring) +{ +	struct device *dev = rx_ring->dev; +	int bi_size; + +	bi_size = sizeof(struct i40e_rx_buffer) * rx_ring->count; +	rx_ring->rx_bi = kzalloc(bi_size, GFP_KERNEL); +	if (!rx_ring->rx_bi) +		goto err; + +	/* Round up to nearest 4K */ +	rx_ring->size = ring_is_16byte_desc_enabled(rx_ring) +		? rx_ring->count * sizeof(union i40e_16byte_rx_desc) +		: rx_ring->count * sizeof(union i40e_32byte_rx_desc); +	rx_ring->size = ALIGN(rx_ring->size, 4096); +	rx_ring->desc = dma_alloc_coherent(dev, rx_ring->size, +					   &rx_ring->dma, GFP_KERNEL); + +	if (!rx_ring->desc) { +		dev_info(dev, "Unable to allocate memory for the Rx descriptor ring, size=%d\n", +			 rx_ring->size); +		goto err; +	} + +	rx_ring->next_to_clean = 0; +	rx_ring->next_to_use = 0; + +	return 0; +err: +	kfree(rx_ring->rx_bi); +	rx_ring->rx_bi = NULL; +	return -ENOMEM; +} + +/** + * i40e_release_rx_desc - Store the new tail and head values + * @rx_ring: ring to bump + * @val: new head index + **/ +static inline void i40e_release_rx_desc(struct i40e_ring *rx_ring, u32 val) +{ +	rx_ring->next_to_use = val; +	/* Force memory writes to complete before letting h/w +	 * know there are new descriptors to fetch.  (Only +	 * applicable for weak-ordered memory model archs, +	 * such as IA-64). +	 */ +	wmb(); +	writel(val, rx_ring->tail); +} + +/** + * i40evf_alloc_rx_buffers - Replace used receive buffers; packet split + * @rx_ring: ring to place buffers on + * @cleaned_count: number of buffers to replace + **/ +void i40evf_alloc_rx_buffers(struct i40e_ring *rx_ring, u16 cleaned_count) +{ +	u16 i = rx_ring->next_to_use; +	union i40e_rx_desc *rx_desc; +	struct i40e_rx_buffer *bi; +	struct sk_buff *skb; + +	/* do nothing if no valid netdev defined */ +	if (!rx_ring->netdev || !cleaned_count) +		return; + +	while (cleaned_count--) { +		rx_desc = I40E_RX_DESC(rx_ring, i); +		bi = &rx_ring->rx_bi[i]; +		skb = bi->skb; + +		if (!skb) { +			skb = netdev_alloc_skb_ip_align(rx_ring->netdev, +							rx_ring->rx_buf_len); +			if (!skb) { +				rx_ring->rx_stats.alloc_buff_failed++; +				goto no_buffers; +			} +			/* initialize queue mapping */ +			skb_record_rx_queue(skb, rx_ring->queue_index); +			bi->skb = skb; +		} + +		if (!bi->dma) { +			bi->dma = dma_map_single(rx_ring->dev, +						 skb->data, +						 rx_ring->rx_buf_len, +						 DMA_FROM_DEVICE); +			if (dma_mapping_error(rx_ring->dev, bi->dma)) { +				rx_ring->rx_stats.alloc_buff_failed++; +				bi->dma = 0; +				goto no_buffers; +			} +		} + +		if (ring_is_ps_enabled(rx_ring)) { +			if (!bi->page) { +				bi->page = alloc_page(GFP_ATOMIC); +				if (!bi->page) { +					rx_ring->rx_stats.alloc_page_failed++; +					goto no_buffers; +				} +			} + +			if (!bi->page_dma) { +				/* use a half page if we're re-using */ +				bi->page_offset ^= PAGE_SIZE / 2; +				bi->page_dma = dma_map_page(rx_ring->dev, +							    bi->page, +							    bi->page_offset, +							    PAGE_SIZE / 2, +							    DMA_FROM_DEVICE); +				if (dma_mapping_error(rx_ring->dev, +						      bi->page_dma)) { +					rx_ring->rx_stats.alloc_page_failed++; +					bi->page_dma = 0; +					goto no_buffers; +				} +			} + +			/* Refresh the desc even if buffer_addrs didn't change +			 * because each write-back erases this info. +			 */ +			rx_desc->read.pkt_addr = cpu_to_le64(bi->page_dma); +			rx_desc->read.hdr_addr = cpu_to_le64(bi->dma); +		} else { +			rx_desc->read.pkt_addr = cpu_to_le64(bi->dma); +			rx_desc->read.hdr_addr = 0; +		} +		i++; +		if (i == rx_ring->count) +			i = 0; +	} + +no_buffers: +	if (rx_ring->next_to_use != i) +		i40e_release_rx_desc(rx_ring, i); +} + +/** + * i40e_receive_skb - Send a completed packet up the stack + * @rx_ring:  rx ring in play + * @skb: packet to send up + * @vlan_tag: vlan tag for packet + **/ +static void i40e_receive_skb(struct i40e_ring *rx_ring, +			     struct sk_buff *skb, u16 vlan_tag) +{ +	struct i40e_q_vector *q_vector = rx_ring->q_vector; +	struct i40e_vsi *vsi = rx_ring->vsi; +	u64 flags = vsi->back->flags; + +	if (vlan_tag & VLAN_VID_MASK) +		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tag); + +	if (flags & I40E_FLAG_IN_NETPOLL) +		netif_rx(skb); +	else +		napi_gro_receive(&q_vector->napi, skb); +} + +/** + * i40e_rx_checksum - Indicate in skb if hw indicated a good cksum + * @vsi: the VSI we care about + * @skb: skb currently being received and modified + * @rx_status: status value of last descriptor in packet + * @rx_error: error value of last descriptor in packet + * @rx_ptype: ptype value of last descriptor in packet + **/ +static inline void i40e_rx_checksum(struct i40e_vsi *vsi, +				    struct sk_buff *skb, +				    u32 rx_status, +				    u32 rx_error, +				    u16 rx_ptype) +{ +	struct i40e_rx_ptype_decoded decoded = decode_rx_desc_ptype(rx_ptype); +	bool ipv4 = false, ipv6 = false; +	bool ipv4_tunnel, ipv6_tunnel; +	__wsum rx_udp_csum; +	struct iphdr *iph; +	__sum16 csum; + +	ipv4_tunnel = (rx_ptype > I40E_RX_PTYPE_GRENAT4_MAC_PAY3) && +		      (rx_ptype < I40E_RX_PTYPE_GRENAT4_MACVLAN_IPV6_ICMP_PAY4); +	ipv6_tunnel = (rx_ptype > I40E_RX_PTYPE_GRENAT6_MAC_PAY3) && +		      (rx_ptype < I40E_RX_PTYPE_GRENAT6_MACVLAN_IPV6_ICMP_PAY4); + +	skb->encapsulation = ipv4_tunnel || ipv6_tunnel; +	skb->ip_summed = CHECKSUM_NONE; + +	/* Rx csum enabled and ip headers found? */ +	if (!(vsi->netdev->features & NETIF_F_RXCSUM)) +		return; + +	/* did the hardware decode the packet and checksum? */ +	if (!(rx_status & (1 << I40E_RX_DESC_STATUS_L3L4P_SHIFT))) +		return; + +	/* both known and outer_ip must be set for the below code to work */ +	if (!(decoded.known && decoded.outer_ip)) +		return; + +	if (decoded.outer_ip == I40E_RX_PTYPE_OUTER_IP && +	    decoded.outer_ip_ver == I40E_RX_PTYPE_OUTER_IPV4) +		ipv4 = true; +	else if (decoded.outer_ip == I40E_RX_PTYPE_OUTER_IP && +		 decoded.outer_ip_ver == I40E_RX_PTYPE_OUTER_IPV6) +		ipv6 = true; + +	if (ipv4 && +	    (rx_error & ((1 << I40E_RX_DESC_ERROR_IPE_SHIFT) | +			 (1 << I40E_RX_DESC_ERROR_EIPE_SHIFT)))) +		goto checksum_fail; + +	/* likely incorrect csum if alternate IP extension headers found */ +	if (ipv6 && +	    decoded.inner_prot == I40E_RX_PTYPE_INNER_PROT_TCP && +	    rx_error & (1 << I40E_RX_DESC_ERROR_L4E_SHIFT) && +	    rx_status & (1 << I40E_RX_DESC_STATUS_IPV6EXADD_SHIFT)) +		/* don't increment checksum err here, non-fatal err */ +		return; + +	/* there was some L4 error, count error and punt packet to the stack */ +	if (rx_error & (1 << I40E_RX_DESC_ERROR_L4E_SHIFT)) +		goto checksum_fail; + +	/* handle packets that were not able to be checksummed due +	 * to arrival speed, in this case the stack can compute +	 * the csum. +	 */ +	if (rx_error & (1 << I40E_RX_DESC_ERROR_PPRS_SHIFT)) +		return; + +	/* If VXLAN traffic has an outer UDPv4 checksum we need to check +	 * it in the driver, hardware does not do it for us. +	 * Since L3L4P bit was set we assume a valid IHL value (>=5) +	 * so the total length of IPv4 header is IHL*4 bytes +	 * The UDP_0 bit *may* bet set if the *inner* header is UDP +	 */ +	if (ipv4_tunnel && +	    (decoded.inner_prot != I40E_RX_PTYPE_INNER_PROT_UDP) && +	    !(rx_status & (1 << I40E_RX_DESC_STATUS_UDP_0_SHIFT))) { +		skb->transport_header = skb->mac_header + +					sizeof(struct ethhdr) + +					(ip_hdr(skb)->ihl * 4); + +		/* Add 4 bytes for VLAN tagged packets */ +		skb->transport_header += (skb->protocol == htons(ETH_P_8021Q) || +					  skb->protocol == htons(ETH_P_8021AD)) +					  ? VLAN_HLEN : 0; + +		rx_udp_csum = udp_csum(skb); +		iph = ip_hdr(skb); +		csum = csum_tcpudp_magic( +				iph->saddr, iph->daddr, +				(skb->len - skb_transport_offset(skb)), +				IPPROTO_UDP, rx_udp_csum); + +		if (udp_hdr(skb)->check != csum) +			goto checksum_fail; +	} + +	skb->ip_summed = CHECKSUM_UNNECESSARY; + +	return; + +checksum_fail: +	vsi->back->hw_csum_rx_error++; +} + +/** + * i40e_rx_hash - returns the hash value from the Rx descriptor + * @ring: descriptor ring + * @rx_desc: specific descriptor + **/ +static inline u32 i40e_rx_hash(struct i40e_ring *ring, +			       union i40e_rx_desc *rx_desc) +{ +	const __le64 rss_mask = +		cpu_to_le64((u64)I40E_RX_DESC_FLTSTAT_RSS_HASH << +			    I40E_RX_DESC_STATUS_FLTSTAT_SHIFT); + +	if ((ring->netdev->features & NETIF_F_RXHASH) && +	    (rx_desc->wb.qword1.status_error_len & rss_mask) == rss_mask) +		return le32_to_cpu(rx_desc->wb.qword0.hi_dword.rss); +	else +		return 0; +} + +/** + * i40e_ptype_to_hash - get a hash type + * @ptype: the ptype value from the descriptor + * + * Returns a hash type to be used by skb_set_hash + **/ +static inline enum pkt_hash_types i40e_ptype_to_hash(u8 ptype) +{ +	struct i40e_rx_ptype_decoded decoded = decode_rx_desc_ptype(ptype); + +	if (!decoded.known) +		return PKT_HASH_TYPE_NONE; + +	if (decoded.outer_ip == I40E_RX_PTYPE_OUTER_IP && +	    decoded.payload_layer == I40E_RX_PTYPE_PAYLOAD_LAYER_PAY4) +		return PKT_HASH_TYPE_L4; +	else if (decoded.outer_ip == I40E_RX_PTYPE_OUTER_IP && +		 decoded.payload_layer == I40E_RX_PTYPE_PAYLOAD_LAYER_PAY3) +		return PKT_HASH_TYPE_L3; +	else +		return PKT_HASH_TYPE_L2; +} + +/** + * i40e_clean_rx_irq - Reclaim resources after receive completes + * @rx_ring:  rx ring to clean + * @budget:   how many cleans we're allowed + * + * Returns true if there's any budget left (e.g. the clean is finished) + **/ +static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget) +{ +	unsigned int total_rx_bytes = 0, total_rx_packets = 0; +	u16 rx_packet_len, rx_header_len, rx_sph, rx_hbo; +	u16 cleaned_count = I40E_DESC_UNUSED(rx_ring); +	const int current_node = numa_node_id(); +	struct i40e_vsi *vsi = rx_ring->vsi; +	u16 i = rx_ring->next_to_clean; +	union i40e_rx_desc *rx_desc; +	u32 rx_error, rx_status; +	u8 rx_ptype; +	u64 qword; + +	rx_desc = I40E_RX_DESC(rx_ring, i); +	qword = le64_to_cpu(rx_desc->wb.qword1.status_error_len); +	rx_status = (qword & I40E_RXD_QW1_STATUS_MASK) >> +		    I40E_RXD_QW1_STATUS_SHIFT; + +	while (rx_status & (1 << I40E_RX_DESC_STATUS_DD_SHIFT)) { +		union i40e_rx_desc *next_rxd; +		struct i40e_rx_buffer *rx_bi; +		struct sk_buff *skb; +		u16 vlan_tag; +		rx_bi = &rx_ring->rx_bi[i]; +		skb = rx_bi->skb; +		prefetch(skb->data); + +		rx_packet_len = (qword & I40E_RXD_QW1_LENGTH_PBUF_MASK) >> +				I40E_RXD_QW1_LENGTH_PBUF_SHIFT; +		rx_header_len = (qword & I40E_RXD_QW1_LENGTH_HBUF_MASK) >> +				I40E_RXD_QW1_LENGTH_HBUF_SHIFT; +		rx_sph = (qword & I40E_RXD_QW1_LENGTH_SPH_MASK) >> +			 I40E_RXD_QW1_LENGTH_SPH_SHIFT; + +		rx_error = (qword & I40E_RXD_QW1_ERROR_MASK) >> +			   I40E_RXD_QW1_ERROR_SHIFT; +		rx_hbo = rx_error & (1 << I40E_RX_DESC_ERROR_HBO_SHIFT); +		rx_error &= ~(1 << I40E_RX_DESC_ERROR_HBO_SHIFT); + +		rx_ptype = (qword & I40E_RXD_QW1_PTYPE_MASK) >> +			   I40E_RXD_QW1_PTYPE_SHIFT; +		rx_bi->skb = NULL; + +		/* This memory barrier is needed to keep us from reading +		 * any other fields out of the rx_desc until we know the +		 * STATUS_DD bit is set +		 */ +		rmb(); + +		/* Get the header and possibly the whole packet +		 * If this is an skb from previous receive dma will be 0 +		 */ +		if (rx_bi->dma) { +			u16 len; + +			if (rx_hbo) +				len = I40E_RX_HDR_SIZE; +			else if (rx_sph) +				len = rx_header_len; +			else if (rx_packet_len) +				len = rx_packet_len;   /* 1buf/no split found */ +			else +				len = rx_header_len;   /* split always mode */ + +			skb_put(skb, len); +			dma_unmap_single(rx_ring->dev, +					 rx_bi->dma, +					 rx_ring->rx_buf_len, +					 DMA_FROM_DEVICE); +			rx_bi->dma = 0; +		} + +		/* Get the rest of the data if this was a header split */ +		if (ring_is_ps_enabled(rx_ring) && rx_packet_len) { + +			skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, +					   rx_bi->page, +					   rx_bi->page_offset, +					   rx_packet_len); + +			skb->len += rx_packet_len; +			skb->data_len += rx_packet_len; +			skb->truesize += rx_packet_len; + +			if ((page_count(rx_bi->page) == 1) && +			    (page_to_nid(rx_bi->page) == current_node)) +				get_page(rx_bi->page); +			else +				rx_bi->page = NULL; + +			dma_unmap_page(rx_ring->dev, +				       rx_bi->page_dma, +				       PAGE_SIZE / 2, +				       DMA_FROM_DEVICE); +			rx_bi->page_dma = 0; +		} +		I40E_RX_NEXT_DESC_PREFETCH(rx_ring, i, next_rxd); + +		if (unlikely( +		    !(rx_status & (1 << I40E_RX_DESC_STATUS_EOF_SHIFT)))) { +			struct i40e_rx_buffer *next_buffer; + +			next_buffer = &rx_ring->rx_bi[i]; + +			if (ring_is_ps_enabled(rx_ring)) { +				rx_bi->skb = next_buffer->skb; +				rx_bi->dma = next_buffer->dma; +				next_buffer->skb = skb; +				next_buffer->dma = 0; +			} +			rx_ring->rx_stats.non_eop_descs++; +			goto next_desc; +		} + +		/* ERR_MASK will only have valid bits if EOP set */ +		if (unlikely(rx_error & (1 << I40E_RX_DESC_ERROR_RXE_SHIFT))) { +			dev_kfree_skb_any(skb); +			/* TODO: shouldn't we increment a counter indicating the +			 * drop? +			 */ +			goto next_desc; +		} + +		skb_set_hash(skb, i40e_rx_hash(rx_ring, rx_desc), +			     i40e_ptype_to_hash(rx_ptype)); +		/* probably a little skewed due to removing CRC */ +		total_rx_bytes += skb->len; +		total_rx_packets++; + +		skb->protocol = eth_type_trans(skb, rx_ring->netdev); + +		i40e_rx_checksum(vsi, skb, rx_status, rx_error, rx_ptype); + +		vlan_tag = rx_status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT) +			 ? le16_to_cpu(rx_desc->wb.qword0.lo_dword.l2tag1) +			 : 0; +		i40e_receive_skb(rx_ring, skb, vlan_tag); + +		rx_ring->netdev->last_rx = jiffies; +		budget--; +next_desc: +		rx_desc->wb.qword1.status_error_len = 0; +		if (!budget) +			break; + +		cleaned_count++; +		/* return some buffers to hardware, one at a time is too slow */ +		if (cleaned_count >= I40E_RX_BUFFER_WRITE) { +			i40evf_alloc_rx_buffers(rx_ring, cleaned_count); +			cleaned_count = 0; +		} + +		/* use prefetched values */ +		rx_desc = next_rxd; +		qword = le64_to_cpu(rx_desc->wb.qword1.status_error_len); +		rx_status = (qword & I40E_RXD_QW1_STATUS_MASK) >> +			    I40E_RXD_QW1_STATUS_SHIFT; +	} + +	rx_ring->next_to_clean = i; +	u64_stats_update_begin(&rx_ring->syncp); +	rx_ring->stats.packets += total_rx_packets; +	rx_ring->stats.bytes += total_rx_bytes; +	u64_stats_update_end(&rx_ring->syncp); +	rx_ring->q_vector->rx.total_packets += total_rx_packets; +	rx_ring->q_vector->rx.total_bytes += total_rx_bytes; + +	if (cleaned_count) +		i40evf_alloc_rx_buffers(rx_ring, cleaned_count); + +	return budget > 0; +} + +/** + * i40evf_napi_poll - NAPI polling Rx/Tx cleanup routine + * @napi: napi struct with our devices info in it + * @budget: amount of work driver is allowed to do this pass, in packets + * + * This function will clean all queues associated with a q_vector. + * + * Returns the amount of work done + **/ +int i40evf_napi_poll(struct napi_struct *napi, int budget) +{ +	struct i40e_q_vector *q_vector = +			       container_of(napi, struct i40e_q_vector, napi); +	struct i40e_vsi *vsi = q_vector->vsi; +	struct i40e_ring *ring; +	bool clean_complete = true; +	int budget_per_ring; + +	if (test_bit(__I40E_DOWN, &vsi->state)) { +		napi_complete(napi); +		return 0; +	} + +	/* Since the actual Tx work is minimal, we can give the Tx a larger +	 * budget and be more aggressive about cleaning up the Tx descriptors. +	 */ +	i40e_for_each_ring(ring, q_vector->tx) +		clean_complete &= i40e_clean_tx_irq(ring, vsi->work_limit); + +	/* We attempt to distribute budget to each Rx queue fairly, but don't +	 * allow the budget to go below 1 because that would exit polling early. +	 */ +	budget_per_ring = max(budget/q_vector->num_ringpairs, 1); + +	i40e_for_each_ring(ring, q_vector->rx) +		clean_complete &= i40e_clean_rx_irq(ring, budget_per_ring); + +	/* If work not completed, return budget and polling will return */ +	if (!clean_complete) +		return budget; + +	/* Work is done so exit the polling mode and re-enable the interrupt */ +	napi_complete(napi); +	if (ITR_IS_DYNAMIC(vsi->rx_itr_setting) || +	    ITR_IS_DYNAMIC(vsi->tx_itr_setting)) +		i40e_update_dynamic_itr(q_vector); + +	if (!test_bit(__I40E_DOWN, &vsi->state)) +		i40evf_irq_enable_queues(vsi->back, 1 << q_vector->v_idx); + +	return 0; +} + +/** + * i40e_tx_prepare_vlan_flags - prepare generic TX VLAN tagging flags for HW + * @skb:     send buffer + * @tx_ring: ring to send buffer on + * @flags:   the tx flags to be set + * + * Checks the skb and set up correspondingly several generic transmit flags + * related to VLAN tagging for the HW, such as VLAN, DCB, etc. + * + * Returns error code indicate the frame should be dropped upon error and the + * otherwise  returns 0 to indicate the flags has been set properly. + **/ +static int i40e_tx_prepare_vlan_flags(struct sk_buff *skb, +				      struct i40e_ring *tx_ring, +				      u32 *flags) +{ +	__be16 protocol = skb->protocol; +	u32  tx_flags = 0; + +	/* if we have a HW VLAN tag being added, default to the HW one */ +	if (vlan_tx_tag_present(skb)) { +		tx_flags |= vlan_tx_tag_get(skb) << I40E_TX_FLAGS_VLAN_SHIFT; +		tx_flags |= I40E_TX_FLAGS_HW_VLAN; +	/* else if it is a SW VLAN, check the next protocol and store the tag */ +	} else if (protocol == htons(ETH_P_8021Q)) { +		struct vlan_hdr *vhdr, _vhdr; +		vhdr = skb_header_pointer(skb, ETH_HLEN, sizeof(_vhdr), &_vhdr); +		if (!vhdr) +			return -EINVAL; + +		protocol = vhdr->h_vlan_encapsulated_proto; +		tx_flags |= ntohs(vhdr->h_vlan_TCI) << I40E_TX_FLAGS_VLAN_SHIFT; +		tx_flags |= I40E_TX_FLAGS_SW_VLAN; +	} + +	*flags = tx_flags; +	return 0; +} + +/** + * i40e_tso - set up the tso context descriptor + * @tx_ring:  ptr to the ring to send + * @skb:      ptr to the skb we're sending + * @tx_flags: the collected send information + * @protocol: the send protocol + * @hdr_len:  ptr to the size of the packet header + * @cd_tunneling: ptr to context descriptor bits + * + * Returns 0 if no TSO can happen, 1 if tso is going, or error + **/ +static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb, +		    u32 tx_flags, __be16 protocol, u8 *hdr_len, +		    u64 *cd_type_cmd_tso_mss, u32 *cd_tunneling) +{ +	u32 cd_cmd, cd_tso_len, cd_mss; +	struct ipv6hdr *ipv6h; +	struct tcphdr *tcph; +	struct iphdr *iph; +	u32 l4len; +	int err; + +	if (!skb_is_gso(skb)) +		return 0; + +	err = skb_cow_head(skb, 0); +	if (err < 0) +		return err; + +	if (protocol == htons(ETH_P_IP)) { +		iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); +		tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); +		iph->tot_len = 0; +		iph->check = 0; +		tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, +						 0, IPPROTO_TCP, 0); +	} else if (skb_is_gso_v6(skb)) { + +		ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) +					   : ipv6_hdr(skb); +		tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); +		ipv6h->payload_len = 0; +		tcph->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, +					       0, IPPROTO_TCP, 0); +	} + +	l4len = skb->encapsulation ? inner_tcp_hdrlen(skb) : tcp_hdrlen(skb); +	*hdr_len = (skb->encapsulation +		    ? (skb_inner_transport_header(skb) - skb->data) +		    : skb_transport_offset(skb)) + l4len; + +	/* find the field values */ +	cd_cmd = I40E_TX_CTX_DESC_TSO; +	cd_tso_len = skb->len - *hdr_len; +	cd_mss = skb_shinfo(skb)->gso_size; +	*cd_type_cmd_tso_mss |= ((u64)cd_cmd << I40E_TXD_CTX_QW1_CMD_SHIFT) | +				((u64)cd_tso_len << +				 I40E_TXD_CTX_QW1_TSO_LEN_SHIFT) | +				((u64)cd_mss << I40E_TXD_CTX_QW1_MSS_SHIFT); +	return 1; +} + +/** + * i40e_tx_enable_csum - Enable Tx checksum offloads + * @skb: send buffer + * @tx_flags: Tx flags currently set + * @td_cmd: Tx descriptor command bits to set + * @td_offset: Tx descriptor header offsets to set + * @cd_tunneling: ptr to context desc bits + **/ +static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags, +				u32 *td_cmd, u32 *td_offset, +				struct i40e_ring *tx_ring, +				u32 *cd_tunneling) +{ +	struct ipv6hdr *this_ipv6_hdr; +	unsigned int this_tcp_hdrlen; +	struct iphdr *this_ip_hdr; +	u32 network_hdr_len; +	u8 l4_hdr = 0; + +	if (skb->encapsulation) { +		network_hdr_len = skb_inner_network_header_len(skb); +		this_ip_hdr = inner_ip_hdr(skb); +		this_ipv6_hdr = inner_ipv6_hdr(skb); +		this_tcp_hdrlen = inner_tcp_hdrlen(skb); + +		if (tx_flags & I40E_TX_FLAGS_IPV4) { + +			if (tx_flags & I40E_TX_FLAGS_TSO) { +				*cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV4; +				ip_hdr(skb)->check = 0; +			} else { +				*cd_tunneling |= +					 I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; +			} +		} else if (tx_flags & I40E_TX_FLAGS_IPV6) { +			if (tx_flags & I40E_TX_FLAGS_TSO) { +				*cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6; +				ip_hdr(skb)->check = 0; +			} else { +				*cd_tunneling |= +					 I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; +			} +		} + +		/* Now set the ctx descriptor fields */ +		*cd_tunneling |= (skb_network_header_len(skb) >> 2) << +					I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT | +				   I40E_TXD_CTX_UDP_TUNNELING            | +				   ((skb_inner_network_offset(skb) - +					skb_transport_offset(skb)) >> 1) << +				   I40E_TXD_CTX_QW0_NATLEN_SHIFT; + +	} else { +		network_hdr_len = skb_network_header_len(skb); +		this_ip_hdr = ip_hdr(skb); +		this_ipv6_hdr = ipv6_hdr(skb); +		this_tcp_hdrlen = tcp_hdrlen(skb); +	} + +	/* Enable IP checksum offloads */ +	if (tx_flags & I40E_TX_FLAGS_IPV4) { +		l4_hdr = this_ip_hdr->protocol; +		/* the stack computes the IP header already, the only time we +		 * need the hardware to recompute it is in the case of TSO. +		 */ +		if (tx_flags & I40E_TX_FLAGS_TSO) { +			*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4_CSUM; +			this_ip_hdr->check = 0; +		} else { +			*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4; +		} +		/* Now set the td_offset for IP header length */ +		*td_offset = (network_hdr_len >> 2) << +			      I40E_TX_DESC_LENGTH_IPLEN_SHIFT; +	} else if (tx_flags & I40E_TX_FLAGS_IPV6) { +		l4_hdr = this_ipv6_hdr->nexthdr; +		*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV6; +		/* Now set the td_offset for IP header length */ +		*td_offset = (network_hdr_len >> 2) << +			      I40E_TX_DESC_LENGTH_IPLEN_SHIFT; +	} +	/* words in MACLEN + dwords in IPLEN + dwords in L4Len */ +	*td_offset |= (skb_network_offset(skb) >> 1) << +		       I40E_TX_DESC_LENGTH_MACLEN_SHIFT; + +	/* Enable L4 checksum offloads */ +	switch (l4_hdr) { +	case IPPROTO_TCP: +		/* enable checksum offloads */ +		*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP; +		*td_offset |= (this_tcp_hdrlen >> 2) << +			       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT; +		break; +	case IPPROTO_SCTP: +		/* enable SCTP checksum offload */ +		*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_SCTP; +		*td_offset |= (sizeof(struct sctphdr) >> 2) << +			       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT; +		break; +	case IPPROTO_UDP: +		/* enable UDP checksum offload */ +		*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_UDP; +		*td_offset |= (sizeof(struct udphdr) >> 2) << +			       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT; +		break; +	default: +		break; +	} +} + +/** + * i40e_create_tx_ctx Build the Tx context descriptor + * @tx_ring:  ring to create the descriptor on + * @cd_type_cmd_tso_mss: Quad Word 1 + * @cd_tunneling: Quad Word 0 - bits 0-31 + * @cd_l2tag2: Quad Word 0 - bits 32-63 + **/ +static void i40e_create_tx_ctx(struct i40e_ring *tx_ring, +			       const u64 cd_type_cmd_tso_mss, +			       const u32 cd_tunneling, const u32 cd_l2tag2) +{ +	struct i40e_tx_context_desc *context_desc; +	int i = tx_ring->next_to_use; + +	if ((cd_type_cmd_tso_mss == I40E_TX_DESC_DTYPE_CONTEXT) && +	    !cd_tunneling && !cd_l2tag2) +		return; + +	/* grab the next descriptor */ +	context_desc = I40E_TX_CTXTDESC(tx_ring, i); + +	i++; +	tx_ring->next_to_use = (i < tx_ring->count) ? i : 0; + +	/* cpu_to_le32 and assign to struct fields */ +	context_desc->tunneling_params = cpu_to_le32(cd_tunneling); +	context_desc->l2tag2 = cpu_to_le16(cd_l2tag2); +	context_desc->type_cmd_tso_mss = cpu_to_le64(cd_type_cmd_tso_mss); +} + +/** + * i40e_tx_map - Build the Tx descriptor + * @tx_ring:  ring to send buffer on + * @skb:      send buffer + * @first:    first buffer info buffer to use + * @tx_flags: collected send information + * @hdr_len:  size of the packet header + * @td_cmd:   the command field in the descriptor + * @td_offset: offset for checksum or crc + **/ +static void i40e_tx_map(struct i40e_ring *tx_ring, struct sk_buff *skb, +			struct i40e_tx_buffer *first, u32 tx_flags, +			const u8 hdr_len, u32 td_cmd, u32 td_offset) +{ +	unsigned int data_len = skb->data_len; +	unsigned int size = skb_headlen(skb); +	struct skb_frag_struct *frag; +	struct i40e_tx_buffer *tx_bi; +	struct i40e_tx_desc *tx_desc; +	u16 i = tx_ring->next_to_use; +	u32 td_tag = 0; +	dma_addr_t dma; +	u16 gso_segs; + +	if (tx_flags & I40E_TX_FLAGS_HW_VLAN) { +		td_cmd |= I40E_TX_DESC_CMD_IL2TAG1; +		td_tag = (tx_flags & I40E_TX_FLAGS_VLAN_MASK) >> +			 I40E_TX_FLAGS_VLAN_SHIFT; +	} + +	if (tx_flags & (I40E_TX_FLAGS_TSO | I40E_TX_FLAGS_FSO)) +		gso_segs = skb_shinfo(skb)->gso_segs; +	else +		gso_segs = 1; + +	/* multiply data chunks by size of headers */ +	first->bytecount = skb->len - hdr_len + (gso_segs * hdr_len); +	first->gso_segs = gso_segs; +	first->skb = skb; +	first->tx_flags = tx_flags; + +	dma = dma_map_single(tx_ring->dev, skb->data, size, DMA_TO_DEVICE); + +	tx_desc = I40E_TX_DESC(tx_ring, i); +	tx_bi = first; + +	for (frag = &skb_shinfo(skb)->frags[0];; frag++) { +		if (dma_mapping_error(tx_ring->dev, dma)) +			goto dma_error; + +		/* record length, and DMA address */ +		dma_unmap_len_set(tx_bi, len, size); +		dma_unmap_addr_set(tx_bi, dma, dma); + +		tx_desc->buffer_addr = cpu_to_le64(dma); + +		while (unlikely(size > I40E_MAX_DATA_PER_TXD)) { +			tx_desc->cmd_type_offset_bsz = +				build_ctob(td_cmd, td_offset, +					   I40E_MAX_DATA_PER_TXD, td_tag); + +			tx_desc++; +			i++; +			if (i == tx_ring->count) { +				tx_desc = I40E_TX_DESC(tx_ring, 0); +				i = 0; +			} + +			dma += I40E_MAX_DATA_PER_TXD; +			size -= I40E_MAX_DATA_PER_TXD; + +			tx_desc->buffer_addr = cpu_to_le64(dma); +		} + +		if (likely(!data_len)) +			break; + +		tx_desc->cmd_type_offset_bsz = build_ctob(td_cmd, td_offset, +							  size, td_tag); + +		tx_desc++; +		i++; +		if (i == tx_ring->count) { +			tx_desc = I40E_TX_DESC(tx_ring, 0); +			i = 0; +		} + +		size = skb_frag_size(frag); +		data_len -= size; + +		dma = skb_frag_dma_map(tx_ring->dev, frag, 0, size, +				       DMA_TO_DEVICE); + +		tx_bi = &tx_ring->tx_bi[i]; +	} + +	/* Place RS bit on last descriptor of any packet that spans across the +	 * 4th descriptor (WB_STRIDE aka 0x3) in a 64B cacheline. +	 */ +#define WB_STRIDE 0x3 +	if (((i & WB_STRIDE) != WB_STRIDE) && +	    (first <= &tx_ring->tx_bi[i]) && +	    (first >= &tx_ring->tx_bi[i & ~WB_STRIDE])) { +		tx_desc->cmd_type_offset_bsz = +			build_ctob(td_cmd, td_offset, size, td_tag) | +			cpu_to_le64((u64)I40E_TX_DESC_CMD_EOP << +					 I40E_TXD_QW1_CMD_SHIFT); +	} else { +		tx_desc->cmd_type_offset_bsz = +			build_ctob(td_cmd, td_offset, size, td_tag) | +			cpu_to_le64((u64)I40E_TXD_CMD << +					 I40E_TXD_QW1_CMD_SHIFT); +	} + +	netdev_tx_sent_queue(netdev_get_tx_queue(tx_ring->netdev, +						 tx_ring->queue_index), +			     first->bytecount); + +	/* set the timestamp */ +	first->time_stamp = jiffies; + +	/* Force memory writes to complete before letting h/w +	 * know there are new descriptors to fetch.  (Only +	 * applicable for weak-ordered memory model archs, +	 * such as IA-64). +	 */ +	wmb(); + +	/* set next_to_watch value indicating a packet is present */ +	first->next_to_watch = tx_desc; + +	i++; +	if (i == tx_ring->count) +		i = 0; + +	tx_ring->next_to_use = i; + +	/* notify HW of packet */ +	writel(i, tx_ring->tail); + +	return; + +dma_error: +	dev_info(tx_ring->dev, "TX DMA map failed\n"); + +	/* clear dma mappings for failed tx_bi map */ +	for (;;) { +		tx_bi = &tx_ring->tx_bi[i]; +		i40e_unmap_and_free_tx_resource(tx_ring, tx_bi); +		if (tx_bi == first) +			break; +		if (i == 0) +			i = tx_ring->count; +		i--; +	} + +	tx_ring->next_to_use = i; +} + +/** + * __i40e_maybe_stop_tx - 2nd level check for tx stop conditions + * @tx_ring: the ring to be checked + * @size:    the size buffer we want to assure is available + * + * Returns -EBUSY if a stop is needed, else 0 + **/ +static inline int __i40e_maybe_stop_tx(struct i40e_ring *tx_ring, int size) +{ +	netif_stop_subqueue(tx_ring->netdev, tx_ring->queue_index); +	/* Memory barrier before checking head and tail */ +	smp_mb(); + +	/* Check again in a case another CPU has just made room available. */ +	if (likely(I40E_DESC_UNUSED(tx_ring) < size)) +		return -EBUSY; + +	/* A reprieve! - use start_queue because it doesn't call schedule */ +	netif_start_subqueue(tx_ring->netdev, tx_ring->queue_index); +	++tx_ring->tx_stats.restart_queue; +	return 0; +} + +/** + * i40e_maybe_stop_tx - 1st level check for tx stop conditions + * @tx_ring: the ring to be checked + * @size:    the size buffer we want to assure is available + * + * Returns 0 if stop is not needed + **/ +static int i40e_maybe_stop_tx(struct i40e_ring *tx_ring, int size) +{ +	if (likely(I40E_DESC_UNUSED(tx_ring) >= size)) +		return 0; +	return __i40e_maybe_stop_tx(tx_ring, size); +} + +/** + * i40e_xmit_descriptor_count - calculate number of tx descriptors needed + * @skb:     send buffer + * @tx_ring: ring to send buffer on + * + * Returns number of data descriptors needed for this skb. Returns 0 to indicate + * there is not enough descriptors available in this ring since we need at least + * one descriptor. + **/ +static int i40e_xmit_descriptor_count(struct sk_buff *skb, +				      struct i40e_ring *tx_ring) +{ +	unsigned int f; +	int count = 0; + +	/* need: 1 descriptor per page * PAGE_SIZE/I40E_MAX_DATA_PER_TXD, +	 *       + 1 desc for skb_head_len/I40E_MAX_DATA_PER_TXD, +	 *       + 4 desc gap to avoid the cache line where head is, +	 *       + 1 desc for context descriptor, +	 * otherwise try next time +	 */ +	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) +		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size); + +	count += TXD_USE_COUNT(skb_headlen(skb)); +	if (i40e_maybe_stop_tx(tx_ring, count + 4 + 1)) { +		tx_ring->tx_stats.tx_busy++; +		return 0; +	} +	return count; +} + +/** + * i40e_xmit_frame_ring - Sends buffer on Tx ring + * @skb:     send buffer + * @tx_ring: ring to send buffer on + * + * Returns NETDEV_TX_OK if sent, else an error code + **/ +static netdev_tx_t i40e_xmit_frame_ring(struct sk_buff *skb, +					struct i40e_ring *tx_ring) +{ +	u64 cd_type_cmd_tso_mss = I40E_TX_DESC_DTYPE_CONTEXT; +	u32 cd_tunneling = 0, cd_l2tag2 = 0; +	struct i40e_tx_buffer *first; +	u32 td_offset = 0; +	u32 tx_flags = 0; +	__be16 protocol; +	u32 td_cmd = 0; +	u8 hdr_len = 0; +	int tso; +	if (0 == i40e_xmit_descriptor_count(skb, tx_ring)) +		return NETDEV_TX_BUSY; + +	/* prepare the xmit flags */ +	if (i40e_tx_prepare_vlan_flags(skb, tx_ring, &tx_flags)) +		goto out_drop; + +	/* obtain protocol of skb */ +	protocol = skb->protocol; + +	/* record the location of the first descriptor for this packet */ +	first = &tx_ring->tx_bi[tx_ring->next_to_use]; + +	/* setup IPv4/IPv6 offloads */ +	if (protocol == htons(ETH_P_IP)) +		tx_flags |= I40E_TX_FLAGS_IPV4; +	else if (protocol == htons(ETH_P_IPV6)) +		tx_flags |= I40E_TX_FLAGS_IPV6; + +	tso = i40e_tso(tx_ring, skb, tx_flags, protocol, &hdr_len, +		       &cd_type_cmd_tso_mss, &cd_tunneling); + +	if (tso < 0) +		goto out_drop; +	else if (tso) +		tx_flags |= I40E_TX_FLAGS_TSO; + +	skb_tx_timestamp(skb); + +	/* always enable CRC insertion offload */ +	td_cmd |= I40E_TX_DESC_CMD_ICRC; + +	/* Always offload the checksum, since it's in the data descriptor */ +	if (skb->ip_summed == CHECKSUM_PARTIAL) { +		tx_flags |= I40E_TX_FLAGS_CSUM; + +		i40e_tx_enable_csum(skb, tx_flags, &td_cmd, &td_offset, +				    tx_ring, &cd_tunneling); +	} + +	i40e_create_tx_ctx(tx_ring, cd_type_cmd_tso_mss, +			   cd_tunneling, cd_l2tag2); + +	i40e_tx_map(tx_ring, skb, first, tx_flags, hdr_len, +		    td_cmd, td_offset); + +	i40e_maybe_stop_tx(tx_ring, DESC_NEEDED); + +	return NETDEV_TX_OK; + +out_drop: +	dev_kfree_skb_any(skb); +	return NETDEV_TX_OK; +} + +/** + * i40evf_xmit_frame - Selects the correct VSI and Tx queue to send buffer + * @skb:    send buffer + * @netdev: network interface device structure + * + * Returns NETDEV_TX_OK if sent, else an error code + **/ +netdev_tx_t i40evf_xmit_frame(struct sk_buff *skb, struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_ring *tx_ring = adapter->tx_rings[skb->queue_mapping]; + +	/* hardware can't handle really short frames, hardware padding works +	 * beyond this point +	 */ +	if (unlikely(skb->len < I40E_MIN_TX_LEN)) { +		if (skb_pad(skb, I40E_MIN_TX_LEN - skb->len)) +			return NETDEV_TX_OK; +		skb->len = I40E_MIN_TX_LEN; +		skb_set_tail_pointer(skb, I40E_MIN_TX_LEN); +	} + +	return i40e_xmit_frame_ring(skb, tx_ring); +} diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h new file mode 100644 index 00000000000..30d248bc5d1 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h @@ -0,0 +1,287 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_TXRX_H_ +#define _I40E_TXRX_H_ + +/* Interrupt Throttling and Rate Limiting Goodies */ + +#define I40E_MAX_ITR               0x0FF0  /* reg uses 2 usec resolution */ +#define I40E_MIN_ITR               0x0004  /* reg uses 2 usec resolution */ +#define I40E_MAX_IRATE             0x03F +#define I40E_MIN_IRATE             0x001 +#define I40E_IRATE_USEC_RESOLUTION 4 +#define I40E_ITR_100K              0x0005 +#define I40E_ITR_20K               0x0019 +#define I40E_ITR_8K                0x003E +#define I40E_ITR_4K                0x007A +#define I40E_ITR_RX_DEF            I40E_ITR_8K +#define I40E_ITR_TX_DEF            I40E_ITR_4K +#define I40E_ITR_DYNAMIC           0x8000  /* use top bit as a flag */ +#define I40E_MIN_INT_RATE          250     /* ~= 1000000 / (I40E_MAX_ITR * 2) */ +#define I40E_MAX_INT_RATE          500000  /* == 1000000 / (I40E_MIN_ITR * 2) */ +#define I40E_DEFAULT_IRQ_WORK      256 +#define ITR_TO_REG(setting) ((setting & ~I40E_ITR_DYNAMIC) >> 1) +#define ITR_IS_DYNAMIC(setting) (!!(setting & I40E_ITR_DYNAMIC)) +#define ITR_REG_TO_USEC(itr_reg) (itr_reg << 1) + +#define I40E_QUEUE_END_OF_LIST 0x7FF + +/* this enum matches hardware bits and is meant to be used by DYN_CTLN + * registers and QINT registers or more generally anywhere in the manual + * mentioning ITR_INDX, ITR_NONE cannot be used as an index 'n' into any + * register but instead is a special value meaning "don't update" ITR0/1/2. + */ +enum i40e_dyn_idx_t { +	I40E_IDX_ITR0 = 0, +	I40E_IDX_ITR1 = 1, +	I40E_IDX_ITR2 = 2, +	I40E_ITR_NONE = 3	/* ITR_NONE must not be used as an index */ +}; + +/* these are indexes into ITRN registers */ +#define I40E_RX_ITR    I40E_IDX_ITR0 +#define I40E_TX_ITR    I40E_IDX_ITR1 +#define I40E_PE_ITR    I40E_IDX_ITR2 + +/* Supported RSS offloads */ +#define I40E_DEFAULT_RSS_HENA ( \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER) | \ +	((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP) | \ +	((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) | \ +	((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6) | \ +	((u64)1 << I40E_FILTER_PCTYPE_L2_PAYLOAD)) + +/* Supported Rx Buffer Sizes */ +#define I40E_RXBUFFER_512   512    /* Used for packet split */ +#define I40E_RXBUFFER_2048  2048 +#define I40E_RXBUFFER_3072  3072   /* For FCoE MTU of 2158 */ +#define I40E_RXBUFFER_4096  4096 +#define I40E_RXBUFFER_8192  8192 +#define I40E_MAX_RXBUFFER   9728  /* largest size for single descriptor */ + +/* NOTE: netdev_alloc_skb reserves up to 64 bytes, NET_IP_ALIGN means we + * reserve 2 more, and skb_shared_info adds an additional 384 bytes more, + * this adds up to 512 bytes of extra data meaning the smallest allocation + * we could have is 1K. + * i.e. RXBUFFER_512 --> size-1024 slab + */ +#define I40E_RX_HDR_SIZE  I40E_RXBUFFER_512 + +/* How many Rx Buffers do we bundle into one write to the hardware ? */ +#define I40E_RX_BUFFER_WRITE	16	/* Must be power of 2 */ +#define I40E_RX_NEXT_DESC(r, i, n)		\ +	do {					\ +		(i)++;				\ +		if ((i) == (r)->count)		\ +			i = 0;			\ +		(n) = I40E_RX_DESC((r), (i));	\ +	} while (0) + +#define I40E_RX_NEXT_DESC_PREFETCH(r, i, n)		\ +	do {						\ +		I40E_RX_NEXT_DESC((r), (i), (n));	\ +		prefetch((n));				\ +	} while (0) + +#define i40e_rx_desc i40e_32byte_rx_desc + +#define I40E_MIN_TX_LEN		17 +#define I40E_MAX_DATA_PER_TXD	8192 + +/* Tx Descriptors needed, worst case */ +#define TXD_USE_COUNT(S) DIV_ROUND_UP((S), I40E_MAX_DATA_PER_TXD) +#define DESC_NEEDED (MAX_SKB_FRAGS + 4) + +#define I40E_TX_FLAGS_CSUM		(u32)(1) +#define I40E_TX_FLAGS_HW_VLAN		(u32)(1 << 1) +#define I40E_TX_FLAGS_SW_VLAN		(u32)(1 << 2) +#define I40E_TX_FLAGS_TSO		(u32)(1 << 3) +#define I40E_TX_FLAGS_IPV4		(u32)(1 << 4) +#define I40E_TX_FLAGS_IPV6		(u32)(1 << 5) +#define I40E_TX_FLAGS_FCCRC		(u32)(1 << 6) +#define I40E_TX_FLAGS_FSO		(u32)(1 << 7) +#define I40E_TX_FLAGS_VLAN_MASK		0xffff0000 +#define I40E_TX_FLAGS_VLAN_PRIO_MASK	0xe0000000 +#define I40E_TX_FLAGS_VLAN_PRIO_SHIFT	29 +#define I40E_TX_FLAGS_VLAN_SHIFT	16 + +struct i40e_tx_buffer { +	struct i40e_tx_desc *next_to_watch; +	unsigned long time_stamp; +	struct sk_buff *skb; +	unsigned int bytecount; +	unsigned short gso_segs; +	DEFINE_DMA_UNMAP_ADDR(dma); +	DEFINE_DMA_UNMAP_LEN(len); +	u32 tx_flags; +}; + +struct i40e_rx_buffer { +	struct sk_buff *skb; +	dma_addr_t dma; +	struct page *page; +	dma_addr_t page_dma; +	unsigned int page_offset; +}; + +struct i40e_queue_stats { +	u64 packets; +	u64 bytes; +}; + +struct i40e_tx_queue_stats { +	u64 restart_queue; +	u64 tx_busy; +	u64 tx_done_old; +}; + +struct i40e_rx_queue_stats { +	u64 non_eop_descs; +	u64 alloc_page_failed; +	u64 alloc_buff_failed; +}; + +enum i40e_ring_state_t { +	__I40E_TX_FDIR_INIT_DONE, +	__I40E_TX_XPS_INIT_DONE, +	__I40E_TX_DETECT_HANG, +	__I40E_HANG_CHECK_ARMED, +	__I40E_RX_PS_ENABLED, +	__I40E_RX_16BYTE_DESC_ENABLED, +}; + +#define ring_is_ps_enabled(ring) \ +	test_bit(__I40E_RX_PS_ENABLED, &(ring)->state) +#define set_ring_ps_enabled(ring) \ +	set_bit(__I40E_RX_PS_ENABLED, &(ring)->state) +#define clear_ring_ps_enabled(ring) \ +	clear_bit(__I40E_RX_PS_ENABLED, &(ring)->state) +#define check_for_tx_hang(ring) \ +	test_bit(__I40E_TX_DETECT_HANG, &(ring)->state) +#define set_check_for_tx_hang(ring) \ +	set_bit(__I40E_TX_DETECT_HANG, &(ring)->state) +#define clear_check_for_tx_hang(ring) \ +	clear_bit(__I40E_TX_DETECT_HANG, &(ring)->state) +#define ring_is_16byte_desc_enabled(ring) \ +	test_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) +#define set_ring_16byte_desc_enabled(ring) \ +	set_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) +#define clear_ring_16byte_desc_enabled(ring) \ +	clear_bit(__I40E_RX_16BYTE_DESC_ENABLED, &(ring)->state) + +/* struct that defines a descriptor ring, associated with a VSI */ +struct i40e_ring { +	struct i40e_ring *next;		/* pointer to next ring in q_vector */ +	void *desc;			/* Descriptor ring memory */ +	struct device *dev;		/* Used for DMA mapping */ +	struct net_device *netdev;	/* netdev ring maps to */ +	union { +		struct i40e_tx_buffer *tx_bi; +		struct i40e_rx_buffer *rx_bi; +	}; +	unsigned long state; +	u16 queue_index;		/* Queue number of ring */ +	u8 dcb_tc;			/* Traffic class of ring */ +	u8 __iomem *tail; + +	u16 count;			/* Number of descriptors */ +	u16 reg_idx;			/* HW register index of the ring */ +	u16 rx_hdr_len; +	u16 rx_buf_len; +	u8  dtype; +#define I40E_RX_DTYPE_NO_SPLIT      0 +#define I40E_RX_DTYPE_SPLIT_ALWAYS  1 +#define I40E_RX_DTYPE_HEADER_SPLIT  2 +	u8  hsplit; +#define I40E_RX_SPLIT_L2      0x1 +#define I40E_RX_SPLIT_IP      0x2 +#define I40E_RX_SPLIT_TCP_UDP 0x4 +#define I40E_RX_SPLIT_SCTP    0x8 + +	/* used in interrupt processing */ +	u16 next_to_use; +	u16 next_to_clean; + +	u8 atr_sample_rate; +	u8 atr_count; + +	bool ring_active;		/* is ring online or not */ + +	/* stats structs */ +	struct i40e_queue_stats	stats; +	struct u64_stats_sync syncp; +	union { +		struct i40e_tx_queue_stats tx_stats; +		struct i40e_rx_queue_stats rx_stats; +	}; + +	unsigned int size;		/* length of descriptor ring in bytes */ +	dma_addr_t dma;			/* physical address of ring */ + +	struct i40e_vsi *vsi;		/* Backreference to associated VSI */ +	struct i40e_q_vector *q_vector;	/* Backreference to associated vector */ + +	struct rcu_head rcu;		/* to avoid race on free */ +} ____cacheline_internodealigned_in_smp; + +enum i40e_latency_range { +	I40E_LOWEST_LATENCY = 0, +	I40E_LOW_LATENCY = 1, +	I40E_BULK_LATENCY = 2, +}; + +struct i40e_ring_container { +	/* array of pointers to rings */ +	struct i40e_ring *ring; +	unsigned int total_bytes;	/* total bytes processed this int */ +	unsigned int total_packets;	/* total packets processed this int */ +	u16 count; +	enum i40e_latency_range latency_range; +	u16 itr; +}; + +/* iterator for handling rings in ring container */ +#define i40e_for_each_ring(pos, head) \ +	for (pos = (head).ring; pos != NULL; pos = pos->next) + +void i40evf_alloc_rx_buffers(struct i40e_ring *rxr, u16 cleaned_count); +netdev_tx_t i40evf_xmit_frame(struct sk_buff *skb, struct net_device *netdev); +void i40evf_clean_tx_ring(struct i40e_ring *tx_ring); +void i40evf_clean_rx_ring(struct i40e_ring *rx_ring); +int i40evf_setup_tx_descriptors(struct i40e_ring *tx_ring); +int i40evf_setup_rx_descriptors(struct i40e_ring *rx_ring); +void i40evf_free_tx_resources(struct i40e_ring *tx_ring); +void i40evf_free_rx_resources(struct i40e_ring *rx_ring); +int i40evf_napi_poll(struct napi_struct *napi, int budget); +#endif /* _I40E_TXRX_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_type.h b/drivers/net/ethernet/intel/i40evf/i40e_type.h new file mode 100644 index 00000000000..d3cf5a69de5 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_type.h @@ -0,0 +1,1165 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_TYPE_H_ +#define _I40E_TYPE_H_ + +#include "i40e_status.h" +#include "i40e_osdep.h" +#include "i40e_register.h" +#include "i40e_adminq.h" +#include "i40e_hmc.h" +#include "i40e_lan_hmc.h" + +/* Device IDs */ +#define I40E_DEV_ID_SFP_XL710		0x1572 +#define I40E_DEV_ID_QEMU		0x1574 +#define I40E_DEV_ID_KX_A		0x157F +#define I40E_DEV_ID_KX_B		0x1580 +#define I40E_DEV_ID_KX_C		0x1581 +#define I40E_DEV_ID_QSFP_A		0x1583 +#define I40E_DEV_ID_QSFP_B		0x1584 +#define I40E_DEV_ID_QSFP_C		0x1585 +#define I40E_DEV_ID_VF		0x154C +#define I40E_DEV_ID_VF_HV		0x1571 + +#define i40e_is_40G_device(d)		((d) == I40E_DEV_ID_QSFP_A  || \ +					 (d) == I40E_DEV_ID_QSFP_B  || \ +					 (d) == I40E_DEV_ID_QSFP_C) + +#define I40E_MAX_VSI_QP			16 +#define I40E_MAX_VF_VSI			3 +#define I40E_MAX_CHAINED_RX_BUFFERS	5 +#define I40E_MAX_PF_UDP_OFFLOAD_PORTS	16 + +/* Max default timeout in ms, */ +#define I40E_MAX_NVM_TIMEOUT		18000 + +/* Switch from ms to the 1usec global time (this is the GTIME resolution) */ +#define I40E_MS_TO_GTIME(time)		((time) * 1000) + +/* forward declaration */ +struct i40e_hw; +typedef void (*I40E_ADMINQ_CALLBACK)(struct i40e_hw *, struct i40e_aq_desc *); + +/* Data type manipulation macros. */ + +#define I40E_DESC_UNUSED(R)	\ +	((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ +	(R)->next_to_clean - (R)->next_to_use - 1) + +/* bitfields for Tx queue mapping in QTX_CTL */ +#define I40E_QTX_CTL_VF_QUEUE	0x0 +#define I40E_QTX_CTL_VM_QUEUE	0x1 +#define I40E_QTX_CTL_PF_QUEUE	0x2 + +/* debug masks - set these bits in hw->debug_mask to control output */ +enum i40e_debug_mask { +	I40E_DEBUG_INIT			= 0x00000001, +	I40E_DEBUG_RELEASE		= 0x00000002, + +	I40E_DEBUG_LINK			= 0x00000010, +	I40E_DEBUG_PHY			= 0x00000020, +	I40E_DEBUG_HMC			= 0x00000040, +	I40E_DEBUG_NVM			= 0x00000080, +	I40E_DEBUG_LAN			= 0x00000100, +	I40E_DEBUG_FLOW			= 0x00000200, +	I40E_DEBUG_DCB			= 0x00000400, +	I40E_DEBUG_DIAG			= 0x00000800, +	I40E_DEBUG_FD			= 0x00001000, + +	I40E_DEBUG_AQ_MESSAGE		= 0x01000000, +	I40E_DEBUG_AQ_DESCRIPTOR	= 0x02000000, +	I40E_DEBUG_AQ_DESC_BUFFER	= 0x04000000, +	I40E_DEBUG_AQ_COMMAND		= 0x06000000, +	I40E_DEBUG_AQ			= 0x0F000000, + +	I40E_DEBUG_USER			= 0xF0000000, + +	I40E_DEBUG_ALL			= 0xFFFFFFFF +}; + +/* These are structs for managing the hardware information and the operations. + * The structures of function pointers are filled out at init time when we + * know for sure exactly which hardware we're working with.  This gives us the + * flexibility of using the same main driver code but adapting to slightly + * different hardware needs as new parts are developed.  For this architecture, + * the Firmware and AdminQ are intended to insulate the driver from most of the + * future changes, but these structures will also do part of the job. + */ +enum i40e_mac_type { +	I40E_MAC_UNKNOWN = 0, +	I40E_MAC_X710, +	I40E_MAC_XL710, +	I40E_MAC_VF, +	I40E_MAC_GENERIC, +}; + +enum i40e_media_type { +	I40E_MEDIA_TYPE_UNKNOWN = 0, +	I40E_MEDIA_TYPE_FIBER, +	I40E_MEDIA_TYPE_BASET, +	I40E_MEDIA_TYPE_BACKPLANE, +	I40E_MEDIA_TYPE_CX4, +	I40E_MEDIA_TYPE_DA, +	I40E_MEDIA_TYPE_VIRTUAL +}; + +enum i40e_fc_mode { +	I40E_FC_NONE = 0, +	I40E_FC_RX_PAUSE, +	I40E_FC_TX_PAUSE, +	I40E_FC_FULL, +	I40E_FC_PFC, +	I40E_FC_DEFAULT +}; + +enum i40e_vsi_type { +	I40E_VSI_MAIN = 0, +	I40E_VSI_VMDQ1, +	I40E_VSI_VMDQ2, +	I40E_VSI_CTRL, +	I40E_VSI_FCOE, +	I40E_VSI_MIRROR, +	I40E_VSI_SRIOV, +	I40E_VSI_FDIR, +	I40E_VSI_TYPE_UNKNOWN +}; + +enum i40e_queue_type { +	I40E_QUEUE_TYPE_RX = 0, +	I40E_QUEUE_TYPE_TX, +	I40E_QUEUE_TYPE_PE_CEQ, +	I40E_QUEUE_TYPE_UNKNOWN +}; + +struct i40e_link_status { +	enum i40e_aq_phy_type phy_type; +	enum i40e_aq_link_speed link_speed; +	u8 link_info; +	u8 an_info; +	u8 ext_info; +	u8 loopback; +	/* is Link Status Event notification to SW enabled */ +	bool lse_enable; +	u16 max_frame_size; +	bool crc_enable; +	u8 pacing; +}; + +struct i40e_phy_info { +	struct i40e_link_status link_info; +	struct i40e_link_status link_info_old; +	u32 autoneg_advertised; +	u32 phy_id; +	u32 module_type; +	bool get_link_info; +	enum i40e_media_type media_type; +}; + +#define I40E_HW_CAP_MAX_GPIO			30 +/* Capabilities of a PF or a VF or the whole device */ +struct i40e_hw_capabilities { +	u32  switch_mode; +#define I40E_NVM_IMAGE_TYPE_EVB		0x0 +#define I40E_NVM_IMAGE_TYPE_CLOUD	0x2 +#define I40E_NVM_IMAGE_TYPE_UDP_CLOUD	0x3 + +	u32  management_mode; +	u32  npar_enable; +	u32  os2bmc; +	u32  valid_functions; +	bool sr_iov_1_1; +	bool vmdq; +	bool evb_802_1_qbg; /* Edge Virtual Bridging */ +	bool evb_802_1_qbh; /* Bridge Port Extension */ +	bool dcb; +	bool fcoe; +	bool mfp_mode_1; +	bool mgmt_cem; +	bool ieee_1588; +	bool iwarp; +	bool fd; +	u32 fd_filters_guaranteed; +	u32 fd_filters_best_effort; +	bool rss; +	u32 rss_table_size; +	u32 rss_table_entry_width; +	bool led[I40E_HW_CAP_MAX_GPIO]; +	bool sdp[I40E_HW_CAP_MAX_GPIO]; +	u32 nvm_image_type; +	u32 num_flow_director_filters; +	u32 num_vfs; +	u32 vf_base_id; +	u32 num_vsis; +	u32 num_rx_qp; +	u32 num_tx_qp; +	u32 base_queue; +	u32 num_msix_vectors; +	u32 num_msix_vectors_vf; +	u32 led_pin_num; +	u32 sdp_pin_num; +	u32 mdio_port_num; +	u32 mdio_port_mode; +	u8 rx_buf_chain_len; +	u32 enabled_tcmap; +	u32 maxtc; +}; + +struct i40e_mac_info { +	enum i40e_mac_type type; +	u8 addr[ETH_ALEN]; +	u8 perm_addr[ETH_ALEN]; +	u8 san_addr[ETH_ALEN]; +	u16 max_fcoeq; +}; + +enum i40e_aq_resources_ids { +	I40E_NVM_RESOURCE_ID = 1 +}; + +enum i40e_aq_resource_access_type { +	I40E_RESOURCE_READ = 1, +	I40E_RESOURCE_WRITE +}; + +struct i40e_nvm_info { +	u64 hw_semaphore_timeout; /* 2usec global time (GTIME resolution) */ +	u64 hw_semaphore_wait;    /* - || - */ +	u32 timeout;              /* [ms] */ +	u16 sr_size;              /* Shadow RAM size in words */ +	bool blank_nvm_mode;      /* is NVM empty (no FW present)*/ +	u16 version;              /* NVM package version */ +	u32 eetrack;              /* NVM data version */ +}; + +/* PCI bus types */ +enum i40e_bus_type { +	i40e_bus_type_unknown = 0, +	i40e_bus_type_pci, +	i40e_bus_type_pcix, +	i40e_bus_type_pci_express, +	i40e_bus_type_reserved +}; + +/* PCI bus speeds */ +enum i40e_bus_speed { +	i40e_bus_speed_unknown	= 0, +	i40e_bus_speed_33	= 33, +	i40e_bus_speed_66	= 66, +	i40e_bus_speed_100	= 100, +	i40e_bus_speed_120	= 120, +	i40e_bus_speed_133	= 133, +	i40e_bus_speed_2500	= 2500, +	i40e_bus_speed_5000	= 5000, +	i40e_bus_speed_8000	= 8000, +	i40e_bus_speed_reserved +}; + +/* PCI bus widths */ +enum i40e_bus_width { +	i40e_bus_width_unknown	= 0, +	i40e_bus_width_pcie_x1	= 1, +	i40e_bus_width_pcie_x2	= 2, +	i40e_bus_width_pcie_x4	= 4, +	i40e_bus_width_pcie_x8	= 8, +	i40e_bus_width_32	= 32, +	i40e_bus_width_64	= 64, +	i40e_bus_width_reserved +}; + +/* Bus parameters */ +struct i40e_bus_info { +	enum i40e_bus_speed speed; +	enum i40e_bus_width width; +	enum i40e_bus_type type; + +	u16 func; +	u16 device; +	u16 lan_id; +}; + +/* Flow control (FC) parameters */ +struct i40e_fc_info { +	enum i40e_fc_mode current_mode; /* FC mode in effect */ +	enum i40e_fc_mode requested_mode; /* FC mode requested by caller */ +}; + +#define I40E_MAX_TRAFFIC_CLASS		8 +#define I40E_MAX_USER_PRIORITY		8 +#define I40E_DCBX_MAX_APPS		32 +#define I40E_LLDPDU_SIZE		1500 + +/* IEEE 802.1Qaz ETS Configuration data */ +struct i40e_ieee_ets_config { +	u8 willing; +	u8 cbs; +	u8 maxtcs; +	u8 prioritytable[I40E_MAX_TRAFFIC_CLASS]; +	u8 tcbwtable[I40E_MAX_TRAFFIC_CLASS]; +	u8 tsatable[I40E_MAX_TRAFFIC_CLASS]; +}; + +/* IEEE 802.1Qaz ETS Recommendation data */ +struct i40e_ieee_ets_recommend { +	u8 prioritytable[I40E_MAX_TRAFFIC_CLASS]; +	u8 tcbwtable[I40E_MAX_TRAFFIC_CLASS]; +	u8 tsatable[I40E_MAX_TRAFFIC_CLASS]; +}; + +/* IEEE 802.1Qaz PFC Configuration data */ +struct i40e_ieee_pfc_config { +	u8 willing; +	u8 mbc; +	u8 pfccap; +	u8 pfcenable; +}; + +/* IEEE 802.1Qaz Application Priority data */ +struct i40e_ieee_app_priority_table { +	u8  priority; +	u8  selector; +	u16 protocolid; +}; + +struct i40e_dcbx_config { +	u32 numapps; +	struct i40e_ieee_ets_config etscfg; +	struct i40e_ieee_ets_recommend etsrec; +	struct i40e_ieee_pfc_config pfc; +	struct i40e_ieee_app_priority_table app[I40E_DCBX_MAX_APPS]; +}; + +/* Port hardware description */ +struct i40e_hw { +	u8 __iomem *hw_addr; +	void *back; + +	/* function pointer structs */ +	struct i40e_phy_info phy; +	struct i40e_mac_info mac; +	struct i40e_bus_info bus; +	struct i40e_nvm_info nvm; +	struct i40e_fc_info fc; + +	/* pci info */ +	u16 device_id; +	u16 vendor_id; +	u16 subsystem_device_id; +	u16 subsystem_vendor_id; +	u8 revision_id; +	u8 port; +	bool adapter_stopped; + +	/* capabilities for entire device and PCI func */ +	struct i40e_hw_capabilities dev_caps; +	struct i40e_hw_capabilities func_caps; + +	/* Flow Director shared filter space */ +	u16 fdir_shared_filter_count; + +	/* device profile info */ +	u8  pf_id; +	u16 main_vsi_seid; + +	/* Closest numa node to the device */ +	u16 numa_node; + +	/* Admin Queue info */ +	struct i40e_adminq_info aq; + +	/* HMC info */ +	struct i40e_hmc_info hmc; /* HMC info struct */ + +	/* LLDP/DCBX Status */ +	u16 dcbx_status; + +	/* DCBX info */ +	struct i40e_dcbx_config local_dcbx_config; +	struct i40e_dcbx_config remote_dcbx_config; + +	/* debug mask */ +	u32 debug_mask; +}; + +struct i40e_driver_version { +	u8 major_version; +	u8 minor_version; +	u8 build_version; +	u8 subbuild_version; +	u8 driver_string[32]; +}; + +/* RX Descriptors */ +union i40e_16byte_rx_desc { +	struct { +		__le64 pkt_addr; /* Packet buffer address */ +		__le64 hdr_addr; /* Header buffer address */ +	} read; +	struct { +		struct { +			struct { +				union { +					__le16 mirroring_status; +					__le16 fcoe_ctx_id; +				} mirr_fcoe; +				__le16 l2tag1; +			} lo_dword; +			union { +				__le32 rss; /* RSS Hash */ +				__le32 fd_id; /* Flow director filter id */ +				__le32 fcoe_param; /* FCoE DDP Context id */ +			} hi_dword; +		} qword0; +		struct { +			/* ext status/error/pktype/length */ +			__le64 status_error_len; +		} qword1; +	} wb;  /* writeback */ +}; + +union i40e_32byte_rx_desc { +	struct { +		__le64  pkt_addr; /* Packet buffer address */ +		__le64  hdr_addr; /* Header buffer address */ +			/* bit 0 of hdr_buffer_addr is DD bit */ +		__le64  rsvd1; +		__le64  rsvd2; +	} read; +	struct { +		struct { +			struct { +				union { +					__le16 mirroring_status; +					__le16 fcoe_ctx_id; +				} mirr_fcoe; +				__le16 l2tag1; +			} lo_dword; +			union { +				__le32 rss; /* RSS Hash */ +				__le32 fcoe_param; /* FCoE DDP Context id */ +				/* Flow director filter id in case of +				 * Programming status desc WB +				 */ +				__le32 fd_id; +			} hi_dword; +		} qword0; +		struct { +			/* status/error/pktype/length */ +			__le64 status_error_len; +		} qword1; +		struct { +			__le16 ext_status; /* extended status */ +			__le16 rsvd; +			__le16 l2tag2_1; +			__le16 l2tag2_2; +		} qword2; +		struct { +			union { +				__le32 flex_bytes_lo; +				__le32 pe_status; +			} lo_dword; +			union { +				__le32 flex_bytes_hi; +				__le32 fd_id; +			} hi_dword; +		} qword3; +	} wb;  /* writeback */ +}; + +enum i40e_rx_desc_status_bits { +	/* Note: These are predefined bit offsets */ +	I40E_RX_DESC_STATUS_DD_SHIFT		= 0, +	I40E_RX_DESC_STATUS_EOF_SHIFT		= 1, +	I40E_RX_DESC_STATUS_L2TAG1P_SHIFT	= 2, +	I40E_RX_DESC_STATUS_L3L4P_SHIFT		= 3, +	I40E_RX_DESC_STATUS_CRCP_SHIFT		= 4, +	I40E_RX_DESC_STATUS_TSYNINDX_SHIFT	= 5, /* 2 BITS */ +	I40E_RX_DESC_STATUS_TSYNVALID_SHIFT	= 7, +	I40E_RX_DESC_STATUS_PIF_SHIFT		= 8, +	I40E_RX_DESC_STATUS_UMBCAST_SHIFT	= 9, /* 2 BITS */ +	I40E_RX_DESC_STATUS_FLM_SHIFT		= 11, +	I40E_RX_DESC_STATUS_FLTSTAT_SHIFT	= 12, /* 2 BITS */ +	I40E_RX_DESC_STATUS_LPBK_SHIFT		= 14, +	I40E_RX_DESC_STATUS_IPV6EXADD_SHIFT	= 15, +	I40E_RX_DESC_STATUS_RESERVED_SHIFT	= 16, /* 2 BITS */ +	I40E_RX_DESC_STATUS_UDP_0_SHIFT		= 18, +	I40E_RX_DESC_STATUS_LAST /* this entry must be last!!! */ +}; + +#define I40E_RXD_QW1_STATUS_SHIFT	0 +#define I40E_RXD_QW1_STATUS_MASK	(((1 << I40E_RX_DESC_STATUS_LAST) - 1) \ +					 << I40E_RXD_QW1_STATUS_SHIFT) + +#define I40E_RXD_QW1_STATUS_TSYNINDX_SHIFT   I40E_RX_DESC_STATUS_TSYNINDX_SHIFT +#define I40E_RXD_QW1_STATUS_TSYNINDX_MASK	(0x3UL << \ +					     I40E_RXD_QW1_STATUS_TSYNINDX_SHIFT) + +#define I40E_RXD_QW1_STATUS_TSYNVALID_SHIFT  I40E_RX_DESC_STATUS_TSYNVALID_SHIFT +#define I40E_RXD_QW1_STATUS_TSYNVALID_MASK	(0x1UL << \ +					 I40E_RXD_QW1_STATUS_TSYNVALID_SHIFT) + +enum i40e_rx_desc_fltstat_values { +	I40E_RX_DESC_FLTSTAT_NO_DATA	= 0, +	I40E_RX_DESC_FLTSTAT_RSV_FD_ID	= 1, /* 16byte desc? FD_ID : RSV */ +	I40E_RX_DESC_FLTSTAT_RSV	= 2, +	I40E_RX_DESC_FLTSTAT_RSS_HASH	= 3, +}; + +#define I40E_RXD_QW1_ERROR_SHIFT	19 +#define I40E_RXD_QW1_ERROR_MASK		(0xFFUL << I40E_RXD_QW1_ERROR_SHIFT) + +enum i40e_rx_desc_error_bits { +	/* Note: These are predefined bit offsets */ +	I40E_RX_DESC_ERROR_RXE_SHIFT		= 0, +	I40E_RX_DESC_ERROR_RECIPE_SHIFT		= 1, +	I40E_RX_DESC_ERROR_HBO_SHIFT		= 2, +	I40E_RX_DESC_ERROR_L3L4E_SHIFT		= 3, /* 3 BITS */ +	I40E_RX_DESC_ERROR_IPE_SHIFT		= 3, +	I40E_RX_DESC_ERROR_L4E_SHIFT		= 4, +	I40E_RX_DESC_ERROR_EIPE_SHIFT		= 5, +	I40E_RX_DESC_ERROR_OVERSIZE_SHIFT	= 6, +	I40E_RX_DESC_ERROR_PPRS_SHIFT		= 7 +}; + +enum i40e_rx_desc_error_l3l4e_fcoe_masks { +	I40E_RX_DESC_ERROR_L3L4E_NONE		= 0, +	I40E_RX_DESC_ERROR_L3L4E_PROT		= 1, +	I40E_RX_DESC_ERROR_L3L4E_FC		= 2, +	I40E_RX_DESC_ERROR_L3L4E_DMAC_ERR	= 3, +	I40E_RX_DESC_ERROR_L3L4E_DMAC_WARN	= 4 +}; + +#define I40E_RXD_QW1_PTYPE_SHIFT	30 +#define I40E_RXD_QW1_PTYPE_MASK		(0xFFULL << I40E_RXD_QW1_PTYPE_SHIFT) + +/* Packet type non-ip values */ +enum i40e_rx_l2_ptype { +	I40E_RX_PTYPE_L2_RESERVED			= 0, +	I40E_RX_PTYPE_L2_MAC_PAY2			= 1, +	I40E_RX_PTYPE_L2_TIMESYNC_PAY2			= 2, +	I40E_RX_PTYPE_L2_FIP_PAY2			= 3, +	I40E_RX_PTYPE_L2_OUI_PAY2			= 4, +	I40E_RX_PTYPE_L2_MACCNTRL_PAY2			= 5, +	I40E_RX_PTYPE_L2_LLDP_PAY2			= 6, +	I40E_RX_PTYPE_L2_ECP_PAY2			= 7, +	I40E_RX_PTYPE_L2_EVB_PAY2			= 8, +	I40E_RX_PTYPE_L2_QCN_PAY2			= 9, +	I40E_RX_PTYPE_L2_EAPOL_PAY2			= 10, +	I40E_RX_PTYPE_L2_ARP				= 11, +	I40E_RX_PTYPE_L2_FCOE_PAY3			= 12, +	I40E_RX_PTYPE_L2_FCOE_FCDATA_PAY3		= 13, +	I40E_RX_PTYPE_L2_FCOE_FCRDY_PAY3		= 14, +	I40E_RX_PTYPE_L2_FCOE_FCRSP_PAY3		= 15, +	I40E_RX_PTYPE_L2_FCOE_FCOTHER_PA		= 16, +	I40E_RX_PTYPE_L2_FCOE_VFT_PAY3			= 17, +	I40E_RX_PTYPE_L2_FCOE_VFT_FCDATA		= 18, +	I40E_RX_PTYPE_L2_FCOE_VFT_FCRDY			= 19, +	I40E_RX_PTYPE_L2_FCOE_VFT_FCRSP			= 20, +	I40E_RX_PTYPE_L2_FCOE_VFT_FCOTHER		= 21, +	I40E_RX_PTYPE_GRENAT4_MAC_PAY3			= 58, +	I40E_RX_PTYPE_GRENAT4_MACVLAN_IPV6_ICMP_PAY4	= 87, +	I40E_RX_PTYPE_GRENAT6_MAC_PAY3			= 124, +	I40E_RX_PTYPE_GRENAT6_MACVLAN_IPV6_ICMP_PAY4	= 153 +}; + +struct i40e_rx_ptype_decoded { +	u32 ptype:8; +	u32 known:1; +	u32 outer_ip:1; +	u32 outer_ip_ver:1; +	u32 outer_frag:1; +	u32 tunnel_type:3; +	u32 tunnel_end_prot:2; +	u32 tunnel_end_frag:1; +	u32 inner_prot:4; +	u32 payload_layer:3; +}; + +enum i40e_rx_ptype_outer_ip { +	I40E_RX_PTYPE_OUTER_L2	= 0, +	I40E_RX_PTYPE_OUTER_IP	= 1 +}; + +enum i40e_rx_ptype_outer_ip_ver { +	I40E_RX_PTYPE_OUTER_NONE	= 0, +	I40E_RX_PTYPE_OUTER_IPV4	= 0, +	I40E_RX_PTYPE_OUTER_IPV6	= 1 +}; + +enum i40e_rx_ptype_outer_fragmented { +	I40E_RX_PTYPE_NOT_FRAG	= 0, +	I40E_RX_PTYPE_FRAG	= 1 +}; + +enum i40e_rx_ptype_tunnel_type { +	I40E_RX_PTYPE_TUNNEL_NONE		= 0, +	I40E_RX_PTYPE_TUNNEL_IP_IP		= 1, +	I40E_RX_PTYPE_TUNNEL_IP_GRENAT		= 2, +	I40E_RX_PTYPE_TUNNEL_IP_GRENAT_MAC	= 3, +	I40E_RX_PTYPE_TUNNEL_IP_GRENAT_MAC_VLAN	= 4, +}; + +enum i40e_rx_ptype_tunnel_end_prot { +	I40E_RX_PTYPE_TUNNEL_END_NONE	= 0, +	I40E_RX_PTYPE_TUNNEL_END_IPV4	= 1, +	I40E_RX_PTYPE_TUNNEL_END_IPV6	= 2, +}; + +enum i40e_rx_ptype_inner_prot { +	I40E_RX_PTYPE_INNER_PROT_NONE		= 0, +	I40E_RX_PTYPE_INNER_PROT_UDP		= 1, +	I40E_RX_PTYPE_INNER_PROT_TCP		= 2, +	I40E_RX_PTYPE_INNER_PROT_SCTP		= 3, +	I40E_RX_PTYPE_INNER_PROT_ICMP		= 4, +	I40E_RX_PTYPE_INNER_PROT_TIMESYNC	= 5 +}; + +enum i40e_rx_ptype_payload_layer { +	I40E_RX_PTYPE_PAYLOAD_LAYER_NONE	= 0, +	I40E_RX_PTYPE_PAYLOAD_LAYER_PAY2	= 1, +	I40E_RX_PTYPE_PAYLOAD_LAYER_PAY3	= 2, +	I40E_RX_PTYPE_PAYLOAD_LAYER_PAY4	= 3, +}; + +#define I40E_RXD_QW1_LENGTH_PBUF_SHIFT	38 +#define I40E_RXD_QW1_LENGTH_PBUF_MASK	(0x3FFFULL << \ +					 I40E_RXD_QW1_LENGTH_PBUF_SHIFT) + +#define I40E_RXD_QW1_LENGTH_HBUF_SHIFT	52 +#define I40E_RXD_QW1_LENGTH_HBUF_MASK	(0x7FFULL << \ +					 I40E_RXD_QW1_LENGTH_HBUF_SHIFT) + +#define I40E_RXD_QW1_LENGTH_SPH_SHIFT	63 +#define I40E_RXD_QW1_LENGTH_SPH_MASK	(0x1ULL << \ +					 I40E_RXD_QW1_LENGTH_SPH_SHIFT) + +enum i40e_rx_desc_ext_status_bits { +	/* Note: These are predefined bit offsets */ +	I40E_RX_DESC_EXT_STATUS_L2TAG2P_SHIFT	= 0, +	I40E_RX_DESC_EXT_STATUS_L2TAG3P_SHIFT	= 1, +	I40E_RX_DESC_EXT_STATUS_FLEXBL_SHIFT	= 2, /* 2 BITS */ +	I40E_RX_DESC_EXT_STATUS_FLEXBH_SHIFT	= 4, /* 2 BITS */ +	I40E_RX_DESC_EXT_STATUS_FDLONGB_SHIFT	= 9, +	I40E_RX_DESC_EXT_STATUS_FCOELONGB_SHIFT	= 10, +	I40E_RX_DESC_EXT_STATUS_PELONGB_SHIFT	= 11, +}; + +enum i40e_rx_desc_pe_status_bits { +	/* Note: These are predefined bit offsets */ +	I40E_RX_DESC_PE_STATUS_QPID_SHIFT	= 0, /* 18 BITS */ +	I40E_RX_DESC_PE_STATUS_L4PORT_SHIFT	= 0, /* 16 BITS */ +	I40E_RX_DESC_PE_STATUS_IPINDEX_SHIFT	= 16, /* 8 BITS */ +	I40E_RX_DESC_PE_STATUS_QPIDHIT_SHIFT	= 24, +	I40E_RX_DESC_PE_STATUS_APBVTHIT_SHIFT	= 25, +	I40E_RX_DESC_PE_STATUS_PORTV_SHIFT	= 26, +	I40E_RX_DESC_PE_STATUS_URG_SHIFT	= 27, +	I40E_RX_DESC_PE_STATUS_IPFRAG_SHIFT	= 28, +	I40E_RX_DESC_PE_STATUS_IPOPT_SHIFT	= 29 +}; + +#define I40E_RX_PROG_STATUS_DESC_LENGTH_SHIFT		38 +#define I40E_RX_PROG_STATUS_DESC_LENGTH			0x2000000 + +#define I40E_RX_PROG_STATUS_DESC_QW1_PROGID_SHIFT	2 +#define I40E_RX_PROG_STATUS_DESC_QW1_PROGID_MASK	(0x7UL << \ +				I40E_RX_PROG_STATUS_DESC_QW1_PROGID_SHIFT) + +#define I40E_RX_PROG_STATUS_DESC_QW1_ERROR_SHIFT	19 +#define I40E_RX_PROG_STATUS_DESC_QW1_ERROR_MASK		(0x3FUL << \ +				I40E_RX_PROG_STATUS_DESC_QW1_ERROR_SHIFT) + +enum i40e_rx_prog_status_desc_status_bits { +	/* Note: These are predefined bit offsets */ +	I40E_RX_PROG_STATUS_DESC_DD_SHIFT	= 0, +	I40E_RX_PROG_STATUS_DESC_PROG_ID_SHIFT	= 2 /* 3 BITS */ +}; + +enum i40e_rx_prog_status_desc_prog_id_masks { +	I40E_RX_PROG_STATUS_DESC_FD_FILTER_STATUS	= 1, +	I40E_RX_PROG_STATUS_DESC_FCOE_CTXT_PROG_STATUS	= 2, +	I40E_RX_PROG_STATUS_DESC_FCOE_CTXT_INVL_STATUS	= 4, +}; + +enum i40e_rx_prog_status_desc_error_bits { +	/* Note: These are predefined bit offsets */ +	I40E_RX_PROG_STATUS_DESC_FD_TBL_FULL_SHIFT	= 0, +	I40E_RX_PROG_STATUS_DESC_NO_FD_ENTRY_SHIFT	= 1, +	I40E_RX_PROG_STATUS_DESC_FCOE_TBL_FULL_SHIFT	= 2, +	I40E_RX_PROG_STATUS_DESC_FCOE_CONFLICT_SHIFT	= 3 +}; + +/* TX Descriptor */ +struct i40e_tx_desc { +	__le64 buffer_addr; /* Address of descriptor's data buf */ +	__le64 cmd_type_offset_bsz; +}; + +#define I40E_TXD_QW1_DTYPE_SHIFT	0 +#define I40E_TXD_QW1_DTYPE_MASK		(0xFUL << I40E_TXD_QW1_DTYPE_SHIFT) + +enum i40e_tx_desc_dtype_value { +	I40E_TX_DESC_DTYPE_DATA		= 0x0, +	I40E_TX_DESC_DTYPE_NOP		= 0x1, /* same as Context desc */ +	I40E_TX_DESC_DTYPE_CONTEXT	= 0x1, +	I40E_TX_DESC_DTYPE_FCOE_CTX	= 0x2, +	I40E_TX_DESC_DTYPE_FILTER_PROG	= 0x8, +	I40E_TX_DESC_DTYPE_DDP_CTX	= 0x9, +	I40E_TX_DESC_DTYPE_FLEX_DATA	= 0xB, +	I40E_TX_DESC_DTYPE_FLEX_CTX_1	= 0xC, +	I40E_TX_DESC_DTYPE_FLEX_CTX_2	= 0xD, +	I40E_TX_DESC_DTYPE_DESC_DONE	= 0xF +}; + +#define I40E_TXD_QW1_CMD_SHIFT	4 +#define I40E_TXD_QW1_CMD_MASK	(0x3FFUL << I40E_TXD_QW1_CMD_SHIFT) + +enum i40e_tx_desc_cmd_bits { +	I40E_TX_DESC_CMD_EOP			= 0x0001, +	I40E_TX_DESC_CMD_RS			= 0x0002, +	I40E_TX_DESC_CMD_ICRC			= 0x0004, +	I40E_TX_DESC_CMD_IL2TAG1		= 0x0008, +	I40E_TX_DESC_CMD_DUMMY			= 0x0010, +	I40E_TX_DESC_CMD_IIPT_NONIP		= 0x0000, /* 2 BITS */ +	I40E_TX_DESC_CMD_IIPT_IPV6		= 0x0020, /* 2 BITS */ +	I40E_TX_DESC_CMD_IIPT_IPV4		= 0x0040, /* 2 BITS */ +	I40E_TX_DESC_CMD_IIPT_IPV4_CSUM		= 0x0060, /* 2 BITS */ +	I40E_TX_DESC_CMD_FCOET			= 0x0080, +	I40E_TX_DESC_CMD_L4T_EOFT_UNK		= 0x0000, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_TCP		= 0x0100, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_SCTP		= 0x0200, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_UDP		= 0x0300, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_EOF_N		= 0x0000, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_EOF_T		= 0x0100, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_EOF_NI	= 0x0200, /* 2 BITS */ +	I40E_TX_DESC_CMD_L4T_EOFT_EOF_A		= 0x0300, /* 2 BITS */ +}; + +#define I40E_TXD_QW1_OFFSET_SHIFT	16 +#define I40E_TXD_QW1_OFFSET_MASK	(0x3FFFFULL << \ +					 I40E_TXD_QW1_OFFSET_SHIFT) + +enum i40e_tx_desc_length_fields { +	/* Note: These are predefined bit offsets */ +	I40E_TX_DESC_LENGTH_MACLEN_SHIFT	= 0, /* 7 BITS */ +	I40E_TX_DESC_LENGTH_IPLEN_SHIFT		= 7, /* 7 BITS */ +	I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT	= 14 /* 4 BITS */ +}; + +#define I40E_TXD_QW1_TX_BUF_SZ_SHIFT	34 +#define I40E_TXD_QW1_TX_BUF_SZ_MASK	(0x3FFFULL << \ +					 I40E_TXD_QW1_TX_BUF_SZ_SHIFT) + +#define I40E_TXD_QW1_L2TAG1_SHIFT	48 +#define I40E_TXD_QW1_L2TAG1_MASK	(0xFFFFULL << I40E_TXD_QW1_L2TAG1_SHIFT) + +/* Context descriptors */ +struct i40e_tx_context_desc { +	__le32 tunneling_params; +	__le16 l2tag2; +	__le16 rsvd; +	__le64 type_cmd_tso_mss; +}; + +#define I40E_TXD_CTX_QW1_DTYPE_SHIFT	0 +#define I40E_TXD_CTX_QW1_DTYPE_MASK	(0xFUL << I40E_TXD_CTX_QW1_DTYPE_SHIFT) + +#define I40E_TXD_CTX_QW1_CMD_SHIFT	4 +#define I40E_TXD_CTX_QW1_CMD_MASK	(0xFFFFUL << I40E_TXD_CTX_QW1_CMD_SHIFT) + +enum i40e_tx_ctx_desc_cmd_bits { +	I40E_TX_CTX_DESC_TSO		= 0x01, +	I40E_TX_CTX_DESC_TSYN		= 0x02, +	I40E_TX_CTX_DESC_IL2TAG2	= 0x04, +	I40E_TX_CTX_DESC_IL2TAG2_IL2H	= 0x08, +	I40E_TX_CTX_DESC_SWTCH_NOTAG	= 0x00, +	I40E_TX_CTX_DESC_SWTCH_UPLINK	= 0x10, +	I40E_TX_CTX_DESC_SWTCH_LOCAL	= 0x20, +	I40E_TX_CTX_DESC_SWTCH_VSI	= 0x30, +	I40E_TX_CTX_DESC_SWPE		= 0x40 +}; + +#define I40E_TXD_CTX_QW1_TSO_LEN_SHIFT	30 +#define I40E_TXD_CTX_QW1_TSO_LEN_MASK	(0x3FFFFULL << \ +					 I40E_TXD_CTX_QW1_TSO_LEN_SHIFT) + +#define I40E_TXD_CTX_QW1_MSS_SHIFT	50 +#define I40E_TXD_CTX_QW1_MSS_MASK	(0x3FFFULL << \ +					 I40E_TXD_CTX_QW1_MSS_SHIFT) + +#define I40E_TXD_CTX_QW1_VSI_SHIFT	50 +#define I40E_TXD_CTX_QW1_VSI_MASK	(0x1FFULL << I40E_TXD_CTX_QW1_VSI_SHIFT) + +#define I40E_TXD_CTX_QW0_EXT_IP_SHIFT	0 +#define I40E_TXD_CTX_QW0_EXT_IP_MASK	(0x3ULL << \ +					 I40E_TXD_CTX_QW0_EXT_IP_SHIFT) + +enum i40e_tx_ctx_desc_eipt_offload { +	I40E_TX_CTX_EXT_IP_NONE		= 0x0, +	I40E_TX_CTX_EXT_IP_IPV6		= 0x1, +	I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM	= 0x2, +	I40E_TX_CTX_EXT_IP_IPV4		= 0x3 +}; + +#define I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT	2 +#define I40E_TXD_CTX_QW0_EXT_IPLEN_MASK	(0x3FULL << \ +					 I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT) + +#define I40E_TXD_CTX_QW0_NATT_SHIFT	9 +#define I40E_TXD_CTX_QW0_NATT_MASK	(0x3ULL << I40E_TXD_CTX_QW0_NATT_SHIFT) + +#define I40E_TXD_CTX_UDP_TUNNELING	(0x1ULL << I40E_TXD_CTX_QW0_NATT_SHIFT) +#define I40E_TXD_CTX_GRE_TUNNELING	(0x2ULL << I40E_TXD_CTX_QW0_NATT_SHIFT) + +#define I40E_TXD_CTX_QW0_EIP_NOINC_SHIFT	11 +#define I40E_TXD_CTX_QW0_EIP_NOINC_MASK	(0x1ULL << \ +					 I40E_TXD_CTX_QW0_EIP_NOINC_SHIFT) + +#define I40E_TXD_CTX_EIP_NOINC_IPID_CONST	I40E_TXD_CTX_QW0_EIP_NOINC_MASK + +#define I40E_TXD_CTX_QW0_NATLEN_SHIFT	12 +#define I40E_TXD_CTX_QW0_NATLEN_MASK	(0X7FULL << \ +					 I40E_TXD_CTX_QW0_NATLEN_SHIFT) + +#define I40E_TXD_CTX_QW0_DECTTL_SHIFT	19 +#define I40E_TXD_CTX_QW0_DECTTL_MASK	(0xFULL << \ +					 I40E_TXD_CTX_QW0_DECTTL_SHIFT) + +struct i40e_filter_program_desc { +	__le32 qindex_flex_ptype_vsi; +	__le32 rsvd; +	__le32 dtype_cmd_cntindex; +	__le32 fd_id; +}; +#define I40E_TXD_FLTR_QW0_QINDEX_SHIFT	0 +#define I40E_TXD_FLTR_QW0_QINDEX_MASK	(0x7FFUL << \ +					 I40E_TXD_FLTR_QW0_QINDEX_SHIFT) +#define I40E_TXD_FLTR_QW0_FLEXOFF_SHIFT	11 +#define I40E_TXD_FLTR_QW0_FLEXOFF_MASK	(0x7UL << \ +					 I40E_TXD_FLTR_QW0_FLEXOFF_SHIFT) +#define I40E_TXD_FLTR_QW0_PCTYPE_SHIFT	17 +#define I40E_TXD_FLTR_QW0_PCTYPE_MASK	(0x3FUL << \ +					 I40E_TXD_FLTR_QW0_PCTYPE_SHIFT) + +/* Packet Classifier Types for filters */ +enum i40e_filter_pctype { +	/* Note: Values 0-30 are reserved for future use */ +	I40E_FILTER_PCTYPE_NONF_IPV4_UDP		= 31, +	/* Note: Value 32 is reserved for future use */ +	I40E_FILTER_PCTYPE_NONF_IPV4_TCP		= 33, +	I40E_FILTER_PCTYPE_NONF_IPV4_SCTP		= 34, +	I40E_FILTER_PCTYPE_NONF_IPV4_OTHER		= 35, +	I40E_FILTER_PCTYPE_FRAG_IPV4			= 36, +	/* Note: Values 37-40 are reserved for future use */ +	I40E_FILTER_PCTYPE_NONF_IPV6_UDP		= 41, +	I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN		= 42, +	I40E_FILTER_PCTYPE_NONF_IPV6_TCP		= 43, +	I40E_FILTER_PCTYPE_NONF_IPV6_SCTP		= 44, +	I40E_FILTER_PCTYPE_NONF_IPV6_OTHER		= 45, +	I40E_FILTER_PCTYPE_FRAG_IPV6			= 46, +	/* Note: Value 47 is reserved for future use */ +	I40E_FILTER_PCTYPE_FCOE_OX			= 48, +	I40E_FILTER_PCTYPE_FCOE_RX			= 49, +	I40E_FILTER_PCTYPE_FCOE_OTHER			= 50, +	/* Note: Values 51-62 are reserved for future use */ +	I40E_FILTER_PCTYPE_L2_PAYLOAD			= 63, +}; + +enum i40e_filter_program_desc_dest { +	I40E_FILTER_PROGRAM_DESC_DEST_DROP_PACKET		= 0x0, +	I40E_FILTER_PROGRAM_DESC_DEST_DIRECT_PACKET_QINDEX	= 0x1, +	I40E_FILTER_PROGRAM_DESC_DEST_DIRECT_PACKET_OTHER	= 0x2, +}; + +enum i40e_filter_program_desc_fd_status { +	I40E_FILTER_PROGRAM_DESC_FD_STATUS_NONE			= 0x0, +	I40E_FILTER_PROGRAM_DESC_FD_STATUS_FD_ID		= 0x1, +	I40E_FILTER_PROGRAM_DESC_FD_STATUS_FD_ID_4FLEX_BYTES	= 0x2, +	I40E_FILTER_PROGRAM_DESC_FD_STATUS_8FLEX_BYTES		= 0x3, +}; + +#define I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT	23 +#define I40E_TXD_FLTR_QW0_DEST_VSI_MASK	(0x1FFUL << \ +					 I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT) + +#define I40E_TXD_FLTR_QW1_CMD_SHIFT	4 +#define I40E_TXD_FLTR_QW1_CMD_MASK	(0xFFFFULL << \ +					 I40E_TXD_FLTR_QW1_CMD_SHIFT) + +#define I40E_TXD_FLTR_QW1_PCMD_SHIFT	(0x0ULL + I40E_TXD_FLTR_QW1_CMD_SHIFT) +#define I40E_TXD_FLTR_QW1_PCMD_MASK	(0x7ULL << I40E_TXD_FLTR_QW1_PCMD_SHIFT) + +enum i40e_filter_program_desc_pcmd { +	I40E_FILTER_PROGRAM_DESC_PCMD_ADD_UPDATE	= 0x1, +	I40E_FILTER_PROGRAM_DESC_PCMD_REMOVE		= 0x2, +}; + +#define I40E_TXD_FLTR_QW1_DEST_SHIFT	(0x3ULL + I40E_TXD_FLTR_QW1_CMD_SHIFT) +#define I40E_TXD_FLTR_QW1_DEST_MASK	(0x3ULL << I40E_TXD_FLTR_QW1_DEST_SHIFT) + +#define I40E_TXD_FLTR_QW1_CNT_ENA_SHIFT	(0x7ULL + I40E_TXD_FLTR_QW1_CMD_SHIFT) +#define I40E_TXD_FLTR_QW1_CNT_ENA_MASK	(0x1ULL << \ +					 I40E_TXD_FLTR_QW1_CNT_ENA_SHIFT) + +#define I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT	(0x9ULL + \ +						 I40E_TXD_FLTR_QW1_CMD_SHIFT) +#define I40E_TXD_FLTR_QW1_FD_STATUS_MASK (0x3ULL << \ +					  I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT) + +#define I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT 20 +#define I40E_TXD_FLTR_QW1_CNTINDEX_MASK	(0x1FFUL << \ +					 I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT) + +enum i40e_filter_type { +	I40E_FLOW_DIRECTOR_FLTR = 0, +	I40E_PE_QUAD_HASH_FLTR = 1, +	I40E_ETHERTYPE_FLTR, +	I40E_FCOE_CTX_FLTR, +	I40E_MAC_VLAN_FLTR, +	I40E_HASH_FLTR +}; + +struct i40e_vsi_context { +	u16 seid; +	u16 uplink_seid; +	u16 vsi_number; +	u16 vsis_allocated; +	u16 vsis_unallocated; +	u16 flags; +	u8 pf_num; +	u8 vf_num; +	u8 connection_type; +	struct i40e_aqc_vsi_properties_data info; +}; + +struct i40e_veb_context { +	u16 seid; +	u16 uplink_seid; +	u16 veb_number; +	u16 vebs_allocated; +	u16 vebs_unallocated; +	u16 flags; +	struct i40e_aqc_get_veb_parameters_completion info; +}; + +/* Statistics collected by each port, VSI, VEB, and S-channel */ +struct i40e_eth_stats { +	u64 rx_bytes;			/* gorc */ +	u64 rx_unicast;			/* uprc */ +	u64 rx_multicast;		/* mprc */ +	u64 rx_broadcast;		/* bprc */ +	u64 rx_discards;		/* rdpc */ +	u64 rx_unknown_protocol;	/* rupp */ +	u64 tx_bytes;			/* gotc */ +	u64 tx_unicast;			/* uptc */ +	u64 tx_multicast;		/* mptc */ +	u64 tx_broadcast;		/* bptc */ +	u64 tx_discards;		/* tdpc */ +	u64 tx_errors;			/* tepc */ +}; + +/* Statistics collected by the MAC */ +struct i40e_hw_port_stats { +	/* eth stats collected by the port */ +	struct i40e_eth_stats eth; + +	/* additional port specific stats */ +	u64 tx_dropped_link_down;	/* tdold */ +	u64 crc_errors;			/* crcerrs */ +	u64 illegal_bytes;		/* illerrc */ +	u64 error_bytes;		/* errbc */ +	u64 mac_local_faults;		/* mlfc */ +	u64 mac_remote_faults;		/* mrfc */ +	u64 rx_length_errors;		/* rlec */ +	u64 link_xon_rx;		/* lxonrxc */ +	u64 link_xoff_rx;		/* lxoffrxc */ +	u64 priority_xon_rx[8];		/* pxonrxc[8] */ +	u64 priority_xoff_rx[8];	/* pxoffrxc[8] */ +	u64 link_xon_tx;		/* lxontxc */ +	u64 link_xoff_tx;		/* lxofftxc */ +	u64 priority_xon_tx[8];		/* pxontxc[8] */ +	u64 priority_xoff_tx[8];	/* pxofftxc[8] */ +	u64 priority_xon_2_xoff[8];	/* pxon2offc[8] */ +	u64 rx_size_64;			/* prc64 */ +	u64 rx_size_127;		/* prc127 */ +	u64 rx_size_255;		/* prc255 */ +	u64 rx_size_511;		/* prc511 */ +	u64 rx_size_1023;		/* prc1023 */ +	u64 rx_size_1522;		/* prc1522 */ +	u64 rx_size_big;		/* prc9522 */ +	u64 rx_undersize;		/* ruc */ +	u64 rx_fragments;		/* rfc */ +	u64 rx_oversize;		/* roc */ +	u64 rx_jabber;			/* rjc */ +	u64 tx_size_64;			/* ptc64 */ +	u64 tx_size_127;		/* ptc127 */ +	u64 tx_size_255;		/* ptc255 */ +	u64 tx_size_511;		/* ptc511 */ +	u64 tx_size_1023;		/* ptc1023 */ +	u64 tx_size_1522;		/* ptc1522 */ +	u64 tx_size_big;		/* ptc9522 */ +	u64 mac_short_packet_dropped;	/* mspdc */ +	u64 checksum_error;		/* xec */ +	/* flow director stats */ +	u64 fd_atr_match; +	u64 fd_sb_match; +	/* EEE LPI */ +	u32 tx_lpi_status; +	u32 rx_lpi_status; +	u64 tx_lpi_count;		/* etlpic */ +	u64 rx_lpi_count;		/* erlpic */ +}; + +/* Checksum and Shadow RAM pointers */ +#define I40E_SR_NVM_CONTROL_WORD		0x00 +#define I40E_SR_EMP_MODULE_PTR			0x0F +#define I40E_SR_NVM_IMAGE_VERSION		0x18 +#define I40E_SR_NVM_WAKE_ON_LAN			0x19 +#define I40E_SR_ALTERNATE_SAN_MAC_ADDRESS_PTR	0x27 +#define I40E_SR_NVM_EETRACK_LO			0x2D +#define I40E_SR_NVM_EETRACK_HI			0x2E +#define I40E_SR_VPD_PTR				0x2F +#define I40E_SR_PCIE_ALT_AUTO_LOAD_PTR		0x3E +#define I40E_SR_SW_CHECKSUM_WORD		0x3F + +/* Auxiliary field, mask and shift definition for Shadow RAM and NVM Flash */ +#define I40E_SR_VPD_MODULE_MAX_SIZE		1024 +#define I40E_SR_PCIE_ALT_MODULE_MAX_SIZE	1024 +#define I40E_SR_CONTROL_WORD_1_SHIFT		0x06 +#define I40E_SR_CONTROL_WORD_1_MASK	(0x03 << I40E_SR_CONTROL_WORD_1_SHIFT) + +/* Shadow RAM related */ +#define I40E_SR_SECTOR_SIZE_IN_WORDS	0x800 +#define I40E_SR_WORDS_IN_1KB		512 +/* Checksum should be calculated such that after adding all the words, + * including the checksum word itself, the sum should be 0xBABA. + */ +#define I40E_SR_SW_CHECKSUM_BASE	0xBABA + +#define I40E_SRRD_SRCTL_ATTEMPTS	100000 + +enum i40e_switch_element_types { +	I40E_SWITCH_ELEMENT_TYPE_MAC	= 1, +	I40E_SWITCH_ELEMENT_TYPE_PF	= 2, +	I40E_SWITCH_ELEMENT_TYPE_VF	= 3, +	I40E_SWITCH_ELEMENT_TYPE_EMP	= 4, +	I40E_SWITCH_ELEMENT_TYPE_BMC	= 6, +	I40E_SWITCH_ELEMENT_TYPE_PE	= 16, +	I40E_SWITCH_ELEMENT_TYPE_VEB	= 17, +	I40E_SWITCH_ELEMENT_TYPE_PA	= 18, +	I40E_SWITCH_ELEMENT_TYPE_VSI	= 19, +}; + +/* Supported EtherType filters */ +enum i40e_ether_type_index { +	I40E_ETHER_TYPE_1588		= 0, +	I40E_ETHER_TYPE_FIP		= 1, +	I40E_ETHER_TYPE_OUI_EXTENDED	= 2, +	I40E_ETHER_TYPE_MAC_CONTROL	= 3, +	I40E_ETHER_TYPE_LLDP		= 4, +	I40E_ETHER_TYPE_EVB_PROTOCOL1	= 5, +	I40E_ETHER_TYPE_EVB_PROTOCOL2	= 6, +	I40E_ETHER_TYPE_QCN_CNM		= 7, +	I40E_ETHER_TYPE_8021X		= 8, +	I40E_ETHER_TYPE_ARP		= 9, +	I40E_ETHER_TYPE_RSV1		= 10, +	I40E_ETHER_TYPE_RSV2		= 11, +}; + +/* Filter context base size is 1K */ +#define I40E_HASH_FILTER_BASE_SIZE	1024 +/* Supported Hash filter values */ +enum i40e_hash_filter_size { +	I40E_HASH_FILTER_SIZE_1K	= 0, +	I40E_HASH_FILTER_SIZE_2K	= 1, +	I40E_HASH_FILTER_SIZE_4K	= 2, +	I40E_HASH_FILTER_SIZE_8K	= 3, +	I40E_HASH_FILTER_SIZE_16K	= 4, +	I40E_HASH_FILTER_SIZE_32K	= 5, +	I40E_HASH_FILTER_SIZE_64K	= 6, +	I40E_HASH_FILTER_SIZE_128K	= 7, +	I40E_HASH_FILTER_SIZE_256K	= 8, +	I40E_HASH_FILTER_SIZE_512K	= 9, +	I40E_HASH_FILTER_SIZE_1M	= 10, +}; + +/* DMA context base size is 0.5K */ +#define I40E_DMA_CNTX_BASE_SIZE		512 +/* Supported DMA context values */ +enum i40e_dma_cntx_size { +	I40E_DMA_CNTX_SIZE_512		= 0, +	I40E_DMA_CNTX_SIZE_1K		= 1, +	I40E_DMA_CNTX_SIZE_2K		= 2, +	I40E_DMA_CNTX_SIZE_4K		= 3, +	I40E_DMA_CNTX_SIZE_8K		= 4, +	I40E_DMA_CNTX_SIZE_16K		= 5, +	I40E_DMA_CNTX_SIZE_32K		= 6, +	I40E_DMA_CNTX_SIZE_64K		= 7, +	I40E_DMA_CNTX_SIZE_128K		= 8, +	I40E_DMA_CNTX_SIZE_256K		= 9, +}; + +/* Supported Hash look up table (LUT) sizes */ +enum i40e_hash_lut_size { +	I40E_HASH_LUT_SIZE_128		= 0, +	I40E_HASH_LUT_SIZE_512		= 1, +}; + +/* Structure to hold a per PF filter control settings */ +struct i40e_filter_control_settings { +	/* number of PE Quad Hash filter buckets */ +	enum i40e_hash_filter_size pe_filt_num; +	/* number of PE Quad Hash contexts */ +	enum i40e_dma_cntx_size pe_cntx_num; +	/* number of FCoE filter buckets */ +	enum i40e_hash_filter_size fcoe_filt_num; +	/* number of FCoE DDP contexts */ +	enum i40e_dma_cntx_size fcoe_cntx_num; +	/* size of the Hash LUT */ +	enum i40e_hash_lut_size	hash_lut_size; +	/* enable FDIR filters for PF and its VFs */ +	bool enable_fdir; +	/* enable Ethertype filters for PF and its VFs */ +	bool enable_ethtype; +	/* enable MAC/VLAN filters for PF and its VFs */ +	bool enable_macvlan; +}; + +/* Structure to hold device level control filter counts */ +struct i40e_control_filter_stats { +	u16 mac_etype_used;   /* Used perfect match MAC/EtherType filters */ +	u16 etype_used;       /* Used perfect EtherType filters */ +	u16 mac_etype_free;   /* Un-used perfect match MAC/EtherType filters */ +	u16 etype_free;       /* Un-used perfect EtherType filters */ +}; + +enum i40e_reset_type { +	I40E_RESET_POR		= 0, +	I40E_RESET_CORER	= 1, +	I40E_RESET_GLOBR	= 2, +	I40E_RESET_EMPR		= 3, +}; +#endif /* _I40E_TYPE_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h b/drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h new file mode 100644 index 00000000000..cd18d568900 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h @@ -0,0 +1,363 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40E_VIRTCHNL_H_ +#define _I40E_VIRTCHNL_H_ + +#include "i40e_type.h" + +/* Description: + * This header file describes the VF-PF communication protocol used + * by the various i40e drivers. + * + * Admin queue buffer usage: + * desc->opcode is always i40e_aqc_opc_send_msg_to_pf + * flags, retval, datalen, and data addr are all used normally. + * Firmware copies the cookie fields when sending messages between the PF and + * VF, but uses all other fields internally. Due to this limitation, we + * must send all messages as "indirect", i.e. using an external buffer. + * + * All the vsi indexes are relative to the VF. Each VF can have maximum of + * three VSIs. All the queue indexes are relative to the VSI.  Each VF can + * have a maximum of sixteen queues for all of its VSIs. + * + * The PF is required to return a status code in v_retval for all messages + * except RESET_VF, which does not require any response. The return value is of + * i40e_status_code type, defined in the i40e_type.h. + * + * In general, VF driver initialization should roughly follow the order of these + * opcodes. The VF driver must first validate the API version of the PF driver, + * then request a reset, then get resources, then configure queues and + * interrupts. After these operations are complete, the VF driver may start + * its queues, optionally add MAC and VLAN filters, and process traffic. + */ + +/* Opcodes for VF-PF communication. These are placed in the v_opcode field + * of the virtchnl_msg structure. + */ +enum i40e_virtchnl_ops { +/* VF sends req. to pf for the following + * ops. + */ +	I40E_VIRTCHNL_OP_UNKNOWN = 0, +	I40E_VIRTCHNL_OP_VERSION = 1, /* must ALWAYS be 1 */ +	I40E_VIRTCHNL_OP_RESET_VF, +	I40E_VIRTCHNL_OP_GET_VF_RESOURCES, +	I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE, +	I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE, +	I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES, +	I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP, +	I40E_VIRTCHNL_OP_ENABLE_QUEUES, +	I40E_VIRTCHNL_OP_DISABLE_QUEUES, +	I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS, +	I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS, +	I40E_VIRTCHNL_OP_ADD_VLAN, +	I40E_VIRTCHNL_OP_DEL_VLAN, +	I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, +	I40E_VIRTCHNL_OP_GET_STATS, +	I40E_VIRTCHNL_OP_FCOE, +/* PF sends status change events to vfs using + * the following op. + */ +	I40E_VIRTCHNL_OP_EVENT, +}; + +/* Virtual channel message descriptor. This overlays the admin queue + * descriptor. All other data is passed in external buffers. + */ + +struct i40e_virtchnl_msg { +	u8 pad[8];			 /* AQ flags/opcode/len/retval fields */ +	enum i40e_virtchnl_ops v_opcode; /* avoid confusion with desc->opcode */ +	i40e_status v_retval;  /* ditto for desc->retval */ +	u32 vfid;			 /* used by PF when sending to VF */ +}; + +/* Message descriptions and data structures.*/ + +/* I40E_VIRTCHNL_OP_VERSION + * VF posts its version number to the PF. PF responds with its version number + * in the same format, along with a return code. + * Reply from PF has its major/minor versions also in param0 and param1. + * If there is a major version mismatch, then the VF cannot operate. + * If there is a minor version mismatch, then the VF can operate but should + * add a warning to the system log. + * + * This enum element MUST always be specified as == 1, regardless of other + * changes in the API. The PF must always respond to this message without + * error regardless of version mismatch. + */ +#define I40E_VIRTCHNL_VERSION_MAJOR		1 +#define I40E_VIRTCHNL_VERSION_MINOR		0 +struct i40e_virtchnl_version_info { +	u32 major; +	u32 minor; +}; + +/* I40E_VIRTCHNL_OP_RESET_VF + * VF sends this request to PF with no parameters + * PF does NOT respond! VF driver must delay then poll VFGEN_RSTAT register + * until reset completion is indicated. The admin queue must be reinitialized + * after this operation. + * + * When reset is complete, PF must ensure that all queues in all VSIs associated + * with the VF are stopped, all queue configurations in the HMC are set to 0, + * and all MAC and VLAN filters (except the default MAC address) on all VSIs + * are cleared. + */ + +/* I40E_VIRTCHNL_OP_GET_VF_RESOURCES + * VF sends this request to PF with no parameters + * PF responds with an indirect message containing + * i40e_virtchnl_vf_resource and one or more + * i40e_virtchnl_vsi_resource structures. + */ + +struct i40e_virtchnl_vsi_resource { +	u16 vsi_id; +	u16 num_queue_pairs; +	enum i40e_vsi_type vsi_type; +	u16 qset_handle; +	u8 default_mac_addr[ETH_ALEN]; +}; +/* VF offload flags */ +#define I40E_VIRTCHNL_VF_OFFLOAD_L2	0x00000001 +#define I40E_VIRTCHNL_VF_OFFLOAD_FCOE	0x00000004 +#define I40E_VIRTCHNL_VF_OFFLOAD_VLAN	0x00010000 + +struct i40e_virtchnl_vf_resource { +	u16 num_vsis; +	u16 num_queue_pairs; +	u16 max_vectors; +	u16 max_mtu; + +	u32 vf_offload_flags; +	u32 max_fcoe_contexts; +	u32 max_fcoe_filters; + +	struct i40e_virtchnl_vsi_resource vsi_res[1]; +}; + +/* I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE + * VF sends this message to set up parameters for one TX queue. + * External data buffer contains one instance of i40e_virtchnl_txq_info. + * PF configures requested queue and returns a status code. + */ + +/* Tx queue config info */ +struct i40e_virtchnl_txq_info { +	u16 vsi_id; +	u16 queue_id; +	u16 ring_len;		/* number of descriptors, multiple of 8 */ +	u16 headwb_enabled; +	u64 dma_ring_addr; +	u64 dma_headwb_addr; +}; + +/* I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE + * VF sends this message to set up parameters for one RX queue. + * External data buffer contains one instance of i40e_virtchnl_rxq_info. + * PF configures requested queue and returns a status code. + */ + +/* Rx queue config info */ +struct i40e_virtchnl_rxq_info { +	u16 vsi_id; +	u16 queue_id; +	u32 ring_len;		/* number of descriptors, multiple of 32 */ +	u16 hdr_size; +	u16 splithdr_enabled; +	u32 databuffer_size; +	u32 max_pkt_size; +	u64 dma_ring_addr; +	enum i40e_hmc_obj_rx_hsplit_0 rx_split_pos; +}; + +/* I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES + * VF sends this message to set parameters for all active TX and RX queues + * associated with the specified VSI. + * PF configures queues and returns status. + * If the number of queues specified is greater than the number of queues + * associated with the VSI, an error is returned and no queues are configured. + */ +struct i40e_virtchnl_queue_pair_info { +	/* NOTE: vsi_id and queue_id should be identical for both queues. */ +	struct i40e_virtchnl_txq_info txq; +	struct i40e_virtchnl_rxq_info rxq; +}; + +struct i40e_virtchnl_vsi_queue_config_info { +	u16 vsi_id; +	u16 num_queue_pairs; +	struct i40e_virtchnl_queue_pair_info qpair[1]; +}; + +/* I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP + * VF uses this message to map vectors to queues. + * The rxq_map and txq_map fields are bitmaps used to indicate which queues + * are to be associated with the specified vector. + * The "other" causes are always mapped to vector 0. + * PF configures interrupt mapping and returns status. + */ +struct i40e_virtchnl_vector_map { +	u16 vsi_id; +	u16 vector_id; +	u16 rxq_map; +	u16 txq_map; +	u16 rxitr_idx; +	u16 txitr_idx; +}; + +struct i40e_virtchnl_irq_map_info { +	u16 num_vectors; +	struct i40e_virtchnl_vector_map vecmap[1]; +}; + +/* I40E_VIRTCHNL_OP_ENABLE_QUEUES + * I40E_VIRTCHNL_OP_DISABLE_QUEUES + * VF sends these message to enable or disable TX/RX queue pairs. + * The queues fields are bitmaps indicating which queues to act upon. + * (Currently, we only support 16 queues per VF, but we make the field + * u32 to allow for expansion.) + * PF performs requested action and returns status. + */ +struct i40e_virtchnl_queue_select { +	u16 vsi_id; +	u16 pad; +	u32 rx_queues; +	u32 tx_queues; +}; + +/* I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS + * VF sends this message in order to add one or more unicast or multicast + * address filters for the specified VSI. + * PF adds the filters and returns status. + */ + +/* I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS + * VF sends this message in order to remove one or more unicast or multicast + * filters for the specified VSI. + * PF removes the filters and returns status. + */ + +struct i40e_virtchnl_ether_addr { +	u8 addr[ETH_ALEN]; +	u8 pad[2]; +}; + +struct i40e_virtchnl_ether_addr_list { +	u16 vsi_id; +	u16 num_elements; +	struct i40e_virtchnl_ether_addr list[1]; +}; + +/* I40E_VIRTCHNL_OP_ADD_VLAN + * VF sends this message to add one or more VLAN tag filters for receives. + * PF adds the filters and returns status. + * If a port VLAN is configured by the PF, this operation will return an + * error to the VF. + */ + +/* I40E_VIRTCHNL_OP_DEL_VLAN + * VF sends this message to remove one or more VLAN tag filters for receives. + * PF removes the filters and returns status. + * If a port VLAN is configured by the PF, this operation will return an + * error to the VF. + */ + +struct i40e_virtchnl_vlan_filter_list { +	u16 vsi_id; +	u16 num_elements; +	u16 vlan_id[1]; +}; + +/* I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE + * VF sends VSI id and flags. + * PF returns status code in retval. + * Note: we assume that broadcast accept mode is always enabled. + */ +struct i40e_virtchnl_promisc_info { +	u16 vsi_id; +	u16 flags; +}; + +#define I40E_FLAG_VF_UNICAST_PROMISC	0x00000001 +#define I40E_FLAG_VF_MULTICAST_PROMISC	0x00000002 + +/* I40E_VIRTCHNL_OP_GET_STATS + * VF sends this message to request stats for the selected VSI. VF uses + * the i40e_virtchnl_queue_select struct to specify the VSI. The queue_id + * field is ignored by the PF. + * + * PF replies with struct i40e_eth_stats in an external buffer. + */ + +/* I40E_VIRTCHNL_OP_EVENT + * PF sends this message to inform the VF driver of events that may affect it. + * No direct response is expected from the VF, though it may generate other + * messages in response to this one. + */ +enum i40e_virtchnl_event_codes { +	I40E_VIRTCHNL_EVENT_UNKNOWN = 0, +	I40E_VIRTCHNL_EVENT_LINK_CHANGE, +	I40E_VIRTCHNL_EVENT_RESET_IMPENDING, +	I40E_VIRTCHNL_EVENT_PF_DRIVER_CLOSE, +}; +#define I40E_PF_EVENT_SEVERITY_INFO		0 +#define I40E_PF_EVENT_SEVERITY_CERTAIN_DOOM	255 + +struct i40e_virtchnl_pf_event { +	enum i40e_virtchnl_event_codes event; +	union { +		struct { +			enum i40e_aq_link_speed link_speed; +			bool link_status; +		} link_event; +	} event_data; + +	int severity; +}; + +/* VF reset states - these are written into the RSTAT register: + * I40E_VFGEN_RSTAT1 on the PF + * I40E_VFGEN_RSTAT on the VF + * When the PF initiates a reset, it writes 0 + * When the reset is complete, it writes 1 + * When the PF detects that the VF has recovered, it writes 2 + * VF checks this register periodically to determine if a reset has occurred, + * then polls it to know when the reset is complete. + * If either the PF or VF reads the register while the hardware + * is in a reset state, it will return DEADBEEF, which, when masked + * will result in 3. + */ +enum i40e_vfr_states { +	I40E_VFR_INPROGRESS = 0, +	I40E_VFR_COMPLETED, +	I40E_VFR_VFACTIVE, +	I40E_VFR_UNKNOWN, +}; + +#endif /* _I40E_VIRTCHNL_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40evf.h b/drivers/net/ethernet/intel/i40evf/i40evf.h new file mode 100644 index 00000000000..30ef519d4b9 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40evf.h @@ -0,0 +1,298 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#ifndef _I40EVF_H_ +#define _I40EVF_H_ + +#include <linux/module.h> +#include <linux/pci.h> +#include <linux/aer.h> +#include <linux/netdevice.h> +#include <linux/vmalloc.h> +#include <linux/interrupt.h> +#include <linux/ethtool.h> +#include <linux/if_vlan.h> +#include <linux/ip.h> +#include <linux/tcp.h> +#include <linux/sctp.h> +#include <linux/ipv6.h> +#include <net/ip6_checksum.h> +#include <net/udp.h> + +#include "i40e_type.h" +#include "i40e_virtchnl.h" +#include "i40e_txrx.h" + +#define DEFAULT_DEBUG_LEVEL_SHIFT 3 +#define PFX "i40evf: " +#define DPRINTK(nlevel, klevel, fmt, args...) \ +	((void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \ +	printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \ +		__func__ , ## args))) + +/* dummy struct to make common code less painful */ +struct i40e_vsi { +	struct i40evf_adapter *back; +	struct net_device *netdev; +	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; +	u16 seid; +	u16 id; +	unsigned long state; +	int base_vector; +	u16 work_limit; +	/* high bit set means dynamic, use accessor routines to read/write. +	 * hardware only supports 2us resolution for the ITR registers. +	 * these values always store the USER setting, and must be converted +	 * before programming to a register. +	 */ +	u16 rx_itr_setting; +	u16 tx_itr_setting; +}; + +/* How many Rx Buffers do we bundle into one write to the hardware ? */ +#define I40EVF_RX_BUFFER_WRITE	16	/* Must be power of 2 */ +#define I40EVF_DEFAULT_TXD   512 +#define I40EVF_DEFAULT_RXD   512 +#define I40EVF_MAX_TXD       4096 +#define I40EVF_MIN_TXD       64 +#define I40EVF_MAX_RXD       4096 +#define I40EVF_MIN_RXD       64 +#define I40EVF_REQ_DESCRIPTOR_MULTIPLE  32 + +/* Supported Rx Buffer Sizes */ +#define I40EVF_RXBUFFER_64    64     /* Used for packet split */ +#define I40EVF_RXBUFFER_128   128    /* Used for packet split */ +#define I40EVF_RXBUFFER_256   256    /* Used for packet split */ +#define I40EVF_RXBUFFER_2048  2048 +#define I40EVF_MAX_RXBUFFER   16384  /* largest size for single descriptor */ +#define I40EVF_MAX_AQ_BUF_SIZE    4096 +#define I40EVF_AQ_LEN             32 +#define I40EVF_AQ_MAX_ERR         10 /* times to try before resetting AQ */ + +#define MAXIMUM_ETHERNET_VLAN_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN) + +#define I40E_RX_DESC(R, i) (&(((union i40e_32byte_rx_desc *)((R)->desc))[i])) +#define I40E_TX_DESC(R, i) (&(((struct i40e_tx_desc *)((R)->desc))[i])) +#define I40E_TX_CTXTDESC(R, i) \ +	(&(((struct i40e_tx_context_desc *)((R)->desc))[i])) +#define MAX_RX_QUEUES 8 +#define MAX_TX_QUEUES MAX_RX_QUEUES + +/* MAX_MSIX_Q_VECTORS of these are allocated, + * but we only use one per queue-specific vector. + */ +struct i40e_q_vector { +	struct i40evf_adapter *adapter; +	struct i40e_vsi *vsi; +	struct napi_struct napi; +	unsigned long reg_idx; +	struct i40e_ring_container rx; +	struct i40e_ring_container tx; +	u32 ring_mask; +	u8 num_ringpairs;	/* total number of ring pairs in vector */ +	int v_idx;	  /* vector index in list */ +	char name[IFNAMSIZ + 9]; +	cpumask_var_t affinity_mask; +}; + +/* Helper macros to switch between ints/sec and what the register uses. + * And yes, it's the same math going both ways.  The lowest value + * supported by all of the i40e hardware is 8. + */ +#define EITR_INTS_PER_SEC_TO_REG(_eitr) \ +	((_eitr) ? (1000000000 / ((_eitr) * 256)) : 8) +#define EITR_REG_TO_INTS_PER_SEC EITR_INTS_PER_SEC_TO_REG + +#define I40EVF_DESC_UNUSED(R) \ +	((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ +	(R)->next_to_clean - (R)->next_to_use - 1) + +#define I40EVF_RX_DESC_ADV(R, i)	    \ +	(&(((union i40e_adv_rx_desc *)((R).desc))[i])) +#define I40EVF_TX_DESC_ADV(R, i)	    \ +	(&(((union i40e_adv_tx_desc *)((R).desc))[i])) +#define I40EVF_TX_CTXTDESC_ADV(R, i)	    \ +	(&(((struct i40e_adv_tx_context_desc *)((R).desc))[i])) + +#define OTHER_VECTOR 1 +#define NONQ_VECS (OTHER_VECTOR) + +#define MAX_MSIX_Q_VECTORS 4 +#define MAX_MSIX_COUNT 5 + +#define MIN_MSIX_Q_VECTORS 1 +#define MIN_MSIX_COUNT (MIN_MSIX_Q_VECTORS + NONQ_VECS) + +#define I40EVF_QUEUE_END_OF_LIST 0x7FF +#define I40EVF_FREE_VECTOR 0x7FFF +struct i40evf_mac_filter { +	struct list_head list; +	u8 macaddr[ETH_ALEN]; +	bool remove;		/* filter needs to be removed */ +	bool add;		/* filter needs to be added */ +}; + +struct i40evf_vlan_filter { +	struct list_head list; +	u16 vlan; +	bool remove;		/* filter needs to be removed */ +	bool add;		/* filter needs to be added */ +}; + +/* Driver state. The order of these is important! */ +enum i40evf_state_t { +	__I40EVF_STARTUP,		/* driver loaded, probe complete */ +	__I40EVF_REMOVE,		/* driver is being unloaded */ +	__I40EVF_INIT_VERSION_CHECK,	/* aq msg sent, awaiting reply */ +	__I40EVF_INIT_GET_RESOURCES,	/* aq msg sent, awaiting reply */ +	__I40EVF_INIT_SW,		/* got resources, setting up structs */ +	__I40EVF_RESETTING,		/* in reset */ +	/* Below here, watchdog is running */ +	__I40EVF_DOWN,			/* ready, can be opened */ +	__I40EVF_TESTING,		/* in ethtool self-test */ +	__I40EVF_RUNNING,		/* opened, working */ +}; + +enum i40evf_critical_section_t { +	__I40EVF_IN_CRITICAL_TASK,	/* cannot be interrupted */ +}; +/* make common code happy */ +#define __I40E_DOWN __I40EVF_DOWN + +/* board specific private data structure */ +struct i40evf_adapter { +	struct timer_list watchdog_timer; +	struct work_struct reset_task; +	struct work_struct adminq_task; +	struct delayed_work init_task; +	struct i40e_q_vector *q_vector[MAX_MSIX_Q_VECTORS]; +	struct list_head vlan_filter_list; +	char misc_vector_name[IFNAMSIZ + 9]; + +	/* TX */ +	struct i40e_ring *tx_rings[I40E_MAX_VSI_QP]; +	u32 tx_timeout_count; +	struct list_head mac_filter_list; +	u32 tx_desc_count; + +	/* RX */ +	struct i40e_ring *rx_rings[I40E_MAX_VSI_QP]; +	u64 hw_csum_rx_error; +	u32 rx_desc_count; +	int num_msix_vectors; +	struct msix_entry *msix_entries; + +	u32 flags; +#define I40EVF_FLAG_RX_CSUM_ENABLED              (u32)(1) +#define I40EVF_FLAG_RX_1BUF_CAPABLE              (u32)(1 << 1) +#define I40EVF_FLAG_RX_PS_CAPABLE                (u32)(1 << 2) +#define I40EVF_FLAG_RX_PS_ENABLED                (u32)(1 << 3) +#define I40EVF_FLAG_IN_NETPOLL                   (u32)(1 << 4) +#define I40EVF_FLAG_IMIR_ENABLED                 (u32)(1 << 5) +#define I40EVF_FLAG_MQ_CAPABLE                   (u32)(1 << 6) +#define I40EVF_FLAG_NEED_LINK_UPDATE             (u32)(1 << 7) +#define I40EVF_FLAG_PF_COMMS_FAILED              (u32)(1 << 8) +#define I40EVF_FLAG_RESET_PENDING                (u32)(1 << 9) +#define I40EVF_FLAG_RESET_NEEDED                 (u32)(1 << 10) +/* duplcates for common code */ +#define I40E_FLAG_FDIR_ATR_ENABLED		 0 +#define I40E_FLAG_DCB_ENABLED			 0 +#define I40E_FLAG_IN_NETPOLL			 I40EVF_FLAG_IN_NETPOLL +#define I40E_FLAG_RX_CSUM_ENABLED                I40EVF_FLAG_RX_CSUM_ENABLED +	/* flags for admin queue service task */ +	u32 aq_required; +	u32 aq_pending; +#define I40EVF_FLAG_AQ_ENABLE_QUEUES		(u32)(1) +#define I40EVF_FLAG_AQ_DISABLE_QUEUES		(u32)(1 << 1) +#define I40EVF_FLAG_AQ_ADD_MAC_FILTER		(u32)(1 << 2) +#define I40EVF_FLAG_AQ_ADD_VLAN_FILTER		(u32)(1 << 3) +#define I40EVF_FLAG_AQ_DEL_MAC_FILTER		(u32)(1 << 4) +#define I40EVF_FLAG_AQ_DEL_VLAN_FILTER		(u32)(1 << 5) +#define I40EVF_FLAG_AQ_CONFIGURE_QUEUES		(u32)(1 << 6) +#define I40EVF_FLAG_AQ_MAP_VECTORS		(u32)(1 << 7) +#define I40EVF_FLAG_AQ_HANDLE_RESET		(u32)(1 << 8) + +	/* OS defined structs */ +	struct net_device *netdev; +	struct pci_dev *pdev; +	struct net_device_stats net_stats; + +	struct i40e_hw hw; /* defined in i40e_type.h */ + +	enum i40evf_state_t state; +	volatile unsigned long crit_section; + +	struct work_struct watchdog_task; +	bool netdev_registered; +	bool link_up; +	enum i40e_virtchnl_ops current_op; +	struct i40e_virtchnl_vf_resource *vf_res; /* incl. all VSIs */ +	struct i40e_virtchnl_vsi_resource *vsi_res; /* our LAN VSI */ +	u16 msg_enable; +	struct i40e_eth_stats current_stats; +	struct i40e_vsi vsi; +	u32 aq_wait_count; +}; + + +/* needed by i40evf_ethtool.c */ +extern char i40evf_driver_name[]; +extern const char i40evf_driver_version[]; + +int i40evf_up(struct i40evf_adapter *adapter); +void i40evf_down(struct i40evf_adapter *adapter); +void i40evf_reinit_locked(struct i40evf_adapter *adapter); +void i40evf_reset(struct i40evf_adapter *adapter); +void i40evf_set_ethtool_ops(struct net_device *netdev); +void i40evf_update_stats(struct i40evf_adapter *adapter); +void i40evf_reset_interrupt_capability(struct i40evf_adapter *adapter); +int i40evf_init_interrupt_scheme(struct i40evf_adapter *adapter); +void i40evf_irq_enable_queues(struct i40evf_adapter *adapter, u32 mask); + +void i40e_napi_add_all(struct i40evf_adapter *adapter); +void i40e_napi_del_all(struct i40evf_adapter *adapter); + +int i40evf_send_api_ver(struct i40evf_adapter *adapter); +int i40evf_verify_api_ver(struct i40evf_adapter *adapter); +int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter); +int i40evf_get_vf_config(struct i40evf_adapter *adapter); +void i40evf_irq_enable(struct i40evf_adapter *adapter, bool flush); +void i40evf_configure_queues(struct i40evf_adapter *adapter); +void i40evf_deconfigure_queues(struct i40evf_adapter *adapter); +void i40evf_enable_queues(struct i40evf_adapter *adapter); +void i40evf_disable_queues(struct i40evf_adapter *adapter); +void i40evf_map_queues(struct i40evf_adapter *adapter); +void i40evf_add_ether_addrs(struct i40evf_adapter *adapter); +void i40evf_del_ether_addrs(struct i40evf_adapter *adapter); +void i40evf_add_vlans(struct i40evf_adapter *adapter); +void i40evf_del_vlans(struct i40evf_adapter *adapter); +void i40evf_set_promiscuous(struct i40evf_adapter *adapter, int flags); +void i40evf_request_stats(struct i40evf_adapter *adapter); +void i40evf_request_reset(struct i40evf_adapter *adapter); +void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, +				enum i40e_virtchnl_ops v_opcode, +				i40e_status v_retval, u8 *msg, u16 msglen); +#endif /* _I40EVF_H_ */ diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c new file mode 100644 index 00000000000..60407a9df0c --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c @@ -0,0 +1,704 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +/* ethtool support for i40evf */ +#include "i40evf.h" + +#include <linux/uaccess.h> + + +struct i40evf_stats { +	char stat_string[ETH_GSTRING_LEN]; +	int stat_offset; +}; + +#define I40EVF_STAT(_name, _stat) { \ +	.stat_string = _name, \ +	.stat_offset = offsetof(struct i40evf_adapter, _stat) \ +} + +/* All stats are u64, so we don't need to track the size of the field. */ +static const struct i40evf_stats i40evf_gstrings_stats[] = { +	I40EVF_STAT("rx_bytes", current_stats.rx_bytes), +	I40EVF_STAT("rx_unicast", current_stats.rx_unicast), +	I40EVF_STAT("rx_multicast", current_stats.rx_multicast), +	I40EVF_STAT("rx_broadcast", current_stats.rx_broadcast), +	I40EVF_STAT("rx_discards", current_stats.rx_discards), +	I40EVF_STAT("rx_unknown_protocol", current_stats.rx_unknown_protocol), +	I40EVF_STAT("tx_bytes", current_stats.tx_bytes), +	I40EVF_STAT("tx_unicast", current_stats.tx_unicast), +	I40EVF_STAT("tx_multicast", current_stats.tx_multicast), +	I40EVF_STAT("tx_broadcast", current_stats.tx_broadcast), +	I40EVF_STAT("tx_discards", current_stats.tx_discards), +	I40EVF_STAT("tx_errors", current_stats.tx_errors), +}; + +#define I40EVF_GLOBAL_STATS_LEN ARRAY_SIZE(i40evf_gstrings_stats) +#define I40EVF_QUEUE_STATS_LEN(_dev) \ +	(((struct i40evf_adapter *) \ +		netdev_priv(_dev))->vsi_res->num_queue_pairs \ +		  * 2 * (sizeof(struct i40e_queue_stats) / sizeof(u64))) +#define I40EVF_STATS_LEN(_dev) \ +	(I40EVF_GLOBAL_STATS_LEN + I40EVF_QUEUE_STATS_LEN(_dev)) + +/** + * i40evf_get_settings - Get Link Speed and Duplex settings + * @netdev: network interface device structure + * @ecmd: ethtool command + * + * Reports speed/duplex settings. Because this is a VF, we don't know what + * kind of link we really have, so we fake it. + **/ +static int i40evf_get_settings(struct net_device *netdev, +			       struct ethtool_cmd *ecmd) +{ +	/* In the future the VF will be able to query the PF for +	 * some information - for now use a dummy value +	 */ +	ecmd->supported = 0; +	ecmd->autoneg = AUTONEG_DISABLE; +	ecmd->transceiver = XCVR_DUMMY1; +	ecmd->port = PORT_NONE; + +	return 0; +} + +/** + * i40evf_get_sset_count - Get length of string set + * @netdev: network interface device structure + * @sset: id of string set + * + * Reports size of string table. This driver only supports + * strings for statistics. + **/ +static int i40evf_get_sset_count(struct net_device *netdev, int sset) +{ +	if (sset == ETH_SS_STATS) +		return I40EVF_STATS_LEN(netdev); +	else +		return -EINVAL; +} + +/** + * i40evf_get_ethtool_stats - report device statistics + * @netdev: network interface device structure + * @stats: ethtool statistics structure + * @data: pointer to data buffer + * + * All statistics are added to the data buffer as an array of u64. + **/ +static void i40evf_get_ethtool_stats(struct net_device *netdev, +				     struct ethtool_stats *stats, u64 *data) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	int i, j; +	char *p; + +	for (i = 0; i < I40EVF_GLOBAL_STATS_LEN; i++) { +		p = (char *)adapter + i40evf_gstrings_stats[i].stat_offset; +		data[i] =  *(u64 *)p; +	} +	for (j = 0; j < adapter->vsi_res->num_queue_pairs; j++) { +		data[i++] = adapter->tx_rings[j]->stats.packets; +		data[i++] = adapter->tx_rings[j]->stats.bytes; +	} +	for (j = 0; j < adapter->vsi_res->num_queue_pairs; j++) { +		data[i++] = adapter->rx_rings[j]->stats.packets; +		data[i++] = adapter->rx_rings[j]->stats.bytes; +	} +} + +/** + * i40evf_get_strings - Get string set + * @netdev: network interface device structure + * @sset: id of string set + * @data: buffer for string data + * + * Builds stats string table. + **/ +static void i40evf_get_strings(struct net_device *netdev, u32 sset, u8 *data) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	u8 *p = data; +	int i; + +	if (sset == ETH_SS_STATS) { +		for (i = 0; i < I40EVF_GLOBAL_STATS_LEN; i++) { +			memcpy(p, i40evf_gstrings_stats[i].stat_string, +			       ETH_GSTRING_LEN); +			p += ETH_GSTRING_LEN; +		} +		for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +			snprintf(p, ETH_GSTRING_LEN, "tx-%u.packets", i); +			p += ETH_GSTRING_LEN; +			snprintf(p, ETH_GSTRING_LEN, "tx-%u.bytes", i); +			p += ETH_GSTRING_LEN; +		} +		for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +			snprintf(p, ETH_GSTRING_LEN, "rx-%u.packets", i); +			p += ETH_GSTRING_LEN; +			snprintf(p, ETH_GSTRING_LEN, "rx-%u.bytes", i); +			p += ETH_GSTRING_LEN; +		} +	} +} + +/** + * i40evf_get_msglevel - Get debug message level + * @netdev: network interface device structure + * + * Returns current debug message level. + **/ +static u32 i40evf_get_msglevel(struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	return adapter->msg_enable; +} + +/** + * i40evf_get_msglevel - Set debug message level + * @netdev: network interface device structure + * @data: message level + * + * Set current debug message level. Higher values cause the driver to + * be noisier. + **/ +static void i40evf_set_msglevel(struct net_device *netdev, u32 data) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	adapter->msg_enable = data; +} + +/** + * i40evf_get_drvinto - Get driver info + * @netdev: network interface device structure + * @drvinfo: ethool driver info structure + * + * Returns information about the driver and device for display to the user. + **/ +static void i40evf_get_drvinfo(struct net_device *netdev, +			       struct ethtool_drvinfo *drvinfo) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	strlcpy(drvinfo->driver, i40evf_driver_name, 32); +	strlcpy(drvinfo->version, i40evf_driver_version, 32); + +	strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); +} + +/** + * i40evf_get_ringparam - Get ring parameters + * @netdev: network interface device structure + * @ring: ethtool ringparam structure + * + * Returns current ring parameters. TX and RX rings are reported separately, + * but the number of rings is not reported. + **/ +static void i40evf_get_ringparam(struct net_device *netdev, +				  struct ethtool_ringparam *ring) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	ring->rx_max_pending = I40EVF_MAX_RXD; +	ring->tx_max_pending = I40EVF_MAX_TXD; +	ring->rx_pending = adapter->rx_desc_count; +	ring->tx_pending = adapter->tx_desc_count; +} + +/** + * i40evf_set_ringparam - Set ring parameters + * @netdev: network interface device structure + * @ring: ethtool ringparam structure + * + * Sets ring parameters. TX and RX rings are controlled separately, but the + * number of rings is not specified, so all rings get the same settings. + **/ +static int i40evf_set_ringparam(struct net_device *netdev, +				struct ethtool_ringparam *ring) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	u32 new_rx_count, new_tx_count; + +	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) +		return -EINVAL; + +	new_tx_count = clamp_t(u32, ring->tx_pending, +			       I40EVF_MIN_TXD, +			       I40EVF_MAX_TXD); +	new_tx_count = ALIGN(new_tx_count, I40EVF_REQ_DESCRIPTOR_MULTIPLE); + +	new_rx_count = clamp_t(u32, ring->rx_pending, +			       I40EVF_MIN_RXD, +			       I40EVF_MAX_RXD); +	new_rx_count = ALIGN(new_rx_count, I40EVF_REQ_DESCRIPTOR_MULTIPLE); + +	/* if nothing to do return success */ +	if ((new_tx_count == adapter->tx_desc_count) && +	    (new_rx_count == adapter->rx_desc_count)) +		return 0; + +	adapter->tx_desc_count = new_tx_count; +	adapter->rx_desc_count = new_rx_count; + +	if (netif_running(netdev)) +		i40evf_reinit_locked(adapter); + +	return 0; +} + +/** + * i40evf_get_coalesce - Get interrupt coalescing settings + * @netdev: network interface device structure + * @ec: ethtool coalesce structure + * + * Returns current coalescing settings. This is referred to elsewhere in the + * driver as Interrupt Throttle Rate, as this is how the hardware describes + * this functionality. + **/ +static int i40evf_get_coalesce(struct net_device *netdev, +			     struct ethtool_coalesce *ec) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_vsi *vsi = &adapter->vsi; + +	ec->tx_max_coalesced_frames = vsi->work_limit; +	ec->rx_max_coalesced_frames = vsi->work_limit; + +	if (ITR_IS_DYNAMIC(vsi->rx_itr_setting)) +		ec->use_adaptive_rx_coalesce = 1; + +	if (ITR_IS_DYNAMIC(vsi->tx_itr_setting)) +		ec->use_adaptive_tx_coalesce = 1; + +	ec->rx_coalesce_usecs = vsi->rx_itr_setting & ~I40E_ITR_DYNAMIC; +	ec->tx_coalesce_usecs = vsi->tx_itr_setting & ~I40E_ITR_DYNAMIC; + +	return 0; +} + +/** + * i40evf_set_coalesce - Set interrupt coalescing settings + * @netdev: network interface device structure + * @ec: ethtool coalesce structure + * + * Change current coalescing settings. + **/ +static int i40evf_set_coalesce(struct net_device *netdev, +			     struct ethtool_coalesce *ec) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_hw *hw = &adapter->hw; +	struct i40e_vsi *vsi = &adapter->vsi; +	struct i40e_q_vector *q_vector; +	int i; + +	if (ec->tx_max_coalesced_frames_irq || ec->rx_max_coalesced_frames_irq) +		vsi->work_limit = ec->tx_max_coalesced_frames_irq; + +	if ((ec->rx_coalesce_usecs >= (I40E_MIN_ITR << 1)) && +	    (ec->rx_coalesce_usecs <= (I40E_MAX_ITR << 1))) +		vsi->rx_itr_setting = ec->rx_coalesce_usecs; + +	else +		return -EINVAL; + +	if ((ec->tx_coalesce_usecs >= (I40E_MIN_ITR << 1)) && +	    (ec->tx_coalesce_usecs <= (I40E_MAX_ITR << 1))) +		vsi->tx_itr_setting = ec->tx_coalesce_usecs; +	else if (ec->use_adaptive_tx_coalesce) +		vsi->tx_itr_setting = (I40E_ITR_DYNAMIC | +				       ITR_REG_TO_USEC(I40E_ITR_RX_DEF)); +	else +		return -EINVAL; + +	if (ec->use_adaptive_rx_coalesce) +		vsi->rx_itr_setting |= I40E_ITR_DYNAMIC; +	else +		vsi->rx_itr_setting &= ~I40E_ITR_DYNAMIC; + +	if (ec->use_adaptive_tx_coalesce) +		vsi->tx_itr_setting |= I40E_ITR_DYNAMIC; +	else +		vsi->tx_itr_setting &= ~I40E_ITR_DYNAMIC; + +	for (i = 0; i < adapter->num_msix_vectors - NONQ_VECS; i++) { +		q_vector = adapter->q_vector[i]; +		q_vector->rx.itr = ITR_TO_REG(vsi->rx_itr_setting); +		wr32(hw, I40E_VFINT_ITRN1(0, i), q_vector->rx.itr); +		q_vector->tx.itr = ITR_TO_REG(vsi->tx_itr_setting); +		wr32(hw, I40E_VFINT_ITRN1(1, i), q_vector->tx.itr); +		i40e_flush(hw); +	} + +	return 0; +} + +/** + * i40e_get_rss_hash_opts - Get RSS hash Input Set for each flow type + * @adapter: board private structure + * @cmd: ethtool rxnfc command + * + * Returns Success if the flow is supported, else Invalid Input. + **/ +static int i40evf_get_rss_hash_opts(struct i40evf_adapter *adapter, +				    struct ethtool_rxnfc *cmd) +{ +	struct i40e_hw *hw = &adapter->hw; +	u64 hena = (u64)rd32(hw, I40E_VFQF_HENA(0)) | +		   ((u64)rd32(hw, I40E_VFQF_HENA(1)) << 32); + +	/* We always hash on IP src and dest addresses */ +	cmd->data = RXH_IP_SRC | RXH_IP_DST; + +	switch (cmd->flow_type) { +	case TCP_V4_FLOW: +		if (hena & ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP)) +			cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; +		break; +	case UDP_V4_FLOW: +		if (hena & ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_UDP)) +			cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; +		break; + +	case SCTP_V4_FLOW: +	case AH_ESP_V4_FLOW: +	case AH_V4_FLOW: +	case ESP_V4_FLOW: +	case IPV4_FLOW: +		break; + +	case TCP_V6_FLOW: +		if (hena & ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP)) +			cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; +		break; +	case UDP_V6_FLOW: +		if (hena & ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP)) +			cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; +		break; + +	case SCTP_V6_FLOW: +	case AH_ESP_V6_FLOW: +	case AH_V6_FLOW: +	case ESP_V6_FLOW: +	case IPV6_FLOW: +		break; +	default: +		cmd->data = 0; +		return -EINVAL; +	} + +	return 0; +} + +/** + * i40evf_get_rxnfc - command to get RX flow classification rules + * @netdev: network interface device structure + * @cmd: ethtool rxnfc command + * + * Returns Success if the command is supported. + **/ +static int i40evf_get_rxnfc(struct net_device *netdev, +			    struct ethtool_rxnfc *cmd, +			    u32 *rule_locs) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	int ret = -EOPNOTSUPP; + +	switch (cmd->cmd) { +	case ETHTOOL_GRXRINGS: +		cmd->data = adapter->vsi_res->num_queue_pairs; +		ret = 0; +		break; +	case ETHTOOL_GRXFH: +		ret = i40evf_get_rss_hash_opts(adapter, cmd); +		break; +	default: +		break; +	} + +	return ret; +} + +/** + * i40evf_set_rss_hash_opt - Enable/Disable flow types for RSS hash + * @adapter: board private structure + * @cmd: ethtool rxnfc command + * + * Returns Success if the flow input set is supported. + **/ +static int i40evf_set_rss_hash_opt(struct i40evf_adapter *adapter, +				   struct ethtool_rxnfc *nfc) +{ +	struct i40e_hw *hw = &adapter->hw; + +	u64 hena = (u64)rd32(hw, I40E_VFQF_HENA(0)) | +		   ((u64)rd32(hw, I40E_VFQF_HENA(1)) << 32); + +	/* RSS does not support anything other than hashing +	 * to queues on src and dst IPs and ports +	 */ +	if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST | +			  RXH_L4_B_0_1 | RXH_L4_B_2_3)) +		return -EINVAL; + +	/* We need at least the IP SRC and DEST fields for hashing */ +	if (!(nfc->data & RXH_IP_SRC) || +	    !(nfc->data & RXH_IP_DST)) +		return -EINVAL; + +	switch (nfc->flow_type) { +	case TCP_V4_FLOW: +		switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { +		case 0: +			hena &= ~((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP); +			break; +		case (RXH_L4_B_0_1 | RXH_L4_B_2_3): +			hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP); +			break; +		default: +			return -EINVAL; +		} +		break; +	case TCP_V6_FLOW: +		switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { +		case 0: +			hena &= ~((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP); +			break; +		case (RXH_L4_B_0_1 | RXH_L4_B_2_3): +			hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP); +			break; +		default: +			return -EINVAL; +		} +		break; +	case UDP_V4_FLOW: +		switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { +		case 0: +			hena &= ~(((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) | +				  ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4)); +			break; +		case (RXH_L4_B_0_1 | RXH_L4_B_2_3): +			hena |= (((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) | +				 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4)); +			break; +		default: +			return -EINVAL; +		} +		break; +	case UDP_V6_FLOW: +		switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { +		case 0: +			hena &= ~(((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | +				  ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6)); +			break; +		case (RXH_L4_B_0_1 | RXH_L4_B_2_3): +			hena |= (((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | +				 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6)); +			break; +		default: +			return -EINVAL; +		} +		break; +	case AH_ESP_V4_FLOW: +	case AH_V4_FLOW: +	case ESP_V4_FLOW: +	case SCTP_V4_FLOW: +		if ((nfc->data & RXH_L4_B_0_1) || +		    (nfc->data & RXH_L4_B_2_3)) +			return -EINVAL; +		hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER); +		break; +	case AH_ESP_V6_FLOW: +	case AH_V6_FLOW: +	case ESP_V6_FLOW: +	case SCTP_V6_FLOW: +		if ((nfc->data & RXH_L4_B_0_1) || +		    (nfc->data & RXH_L4_B_2_3)) +			return -EINVAL; +		hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER); +		break; +	case IPV4_FLOW: +		hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER) | +			((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4); +		break; +	case IPV6_FLOW: +		hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) | +			((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6); +		break; +	default: +		return -EINVAL; +	} + +	wr32(hw, I40E_VFQF_HENA(0), (u32)hena); +	wr32(hw, I40E_VFQF_HENA(1), (u32)(hena >> 32)); +	i40e_flush(hw); + +	return 0; +} + +/** + * i40evf_set_rxnfc - command to set RX flow classification rules + * @netdev: network interface device structure + * @cmd: ethtool rxnfc command + * + * Returns Success if the command is supported. + **/ +static int i40evf_set_rxnfc(struct net_device *netdev, +			    struct ethtool_rxnfc *cmd) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	int ret = -EOPNOTSUPP; + +	switch (cmd->cmd) { +	case ETHTOOL_SRXFH: +		ret = i40evf_set_rss_hash_opt(adapter, cmd); +		break; +	default: +		break; +	} + +	return ret; +} + +/** + * i40evf_get_channels: get the number of channels supported by the device + * @netdev: network interface device structure + * @ch: channel information structure + * + * For the purposes of our device, we only use combined channels, i.e. a tx/rx + * queue pair. Report one extra channel to match our "other" MSI-X vector. + **/ +static void i40evf_get_channels(struct net_device *netdev, +				struct ethtool_channels *ch) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	/* Report maximum channels */ +	ch->max_combined = adapter->vsi_res->num_queue_pairs; + +	ch->max_other = NONQ_VECS; +	ch->other_count = NONQ_VECS; + +	ch->combined_count = adapter->vsi_res->num_queue_pairs; +} + +/** + * i40evf_get_rxfh_indir_size - get the rx flow hash indirection table size + * @netdev: network interface device structure + * + * Returns the table size. + **/ +static u32 i40evf_get_rxfh_indir_size(struct net_device *netdev) +{ +	return (I40E_VFQF_HLUT_MAX_INDEX + 1) * 4; +} + +/** + * i40evf_get_rxfh - get the rx flow hash indirection table + * @netdev: network interface device structure + * @indir: indirection table + * @key: hash key (will be %NULL until get_rxfh_key_size is implemented) + * + * Reads the indirection table directly from the hardware. Always returns 0. + **/ +static int i40evf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_hw *hw = &adapter->hw; +	u32 hlut_val; +	int i, j; + +	for (i = 0, j = 0; i < I40E_VFQF_HLUT_MAX_INDEX; i++) { +		hlut_val = rd32(hw, I40E_VFQF_HLUT(i)); +		indir[j++] = hlut_val & 0xff; +		indir[j++] = (hlut_val >> 8) & 0xff; +		indir[j++] = (hlut_val >> 16) & 0xff; +		indir[j++] = (hlut_val >> 24) & 0xff; +	} +	return 0; +} + +/** + * i40evf_set_rxfh - set the rx flow hash indirection table + * @netdev: network interface device structure + * @indir: indirection table + * @key: hash key (will be %NULL until get_rxfh_key_size is implemented) + * + * Returns -EINVAL if the table specifies an inavlid queue id, otherwise + * returns 0 after programming the table. + **/ +static int i40evf_set_rxfh(struct net_device *netdev, const u32 *indir, +			   const u8 *key) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_hw *hw = &adapter->hw; +	u32 hlut_val; +	int i, j; + +	for (i = 0, j = 0; i < I40E_VFQF_HLUT_MAX_INDEX + 1; i++) { +		hlut_val = indir[j++]; +		hlut_val |= indir[j++] << 8; +		hlut_val |= indir[j++] << 16; +		hlut_val |= indir[j++] << 24; +		wr32(hw, I40E_VFQF_HLUT(i), hlut_val); +	} + +	return 0; +} + +static const struct ethtool_ops i40evf_ethtool_ops = { +	.get_settings		= i40evf_get_settings, +	.get_drvinfo		= i40evf_get_drvinfo, +	.get_link		= ethtool_op_get_link, +	.get_ringparam		= i40evf_get_ringparam, +	.set_ringparam		= i40evf_set_ringparam, +	.get_strings		= i40evf_get_strings, +	.get_ethtool_stats	= i40evf_get_ethtool_stats, +	.get_sset_count		= i40evf_get_sset_count, +	.get_msglevel		= i40evf_get_msglevel, +	.set_msglevel		= i40evf_set_msglevel, +	.get_coalesce		= i40evf_get_coalesce, +	.set_coalesce		= i40evf_set_coalesce, +	.get_rxnfc		= i40evf_get_rxnfc, +	.set_rxnfc		= i40evf_set_rxnfc, +	.get_rxfh_indir_size	= i40evf_get_rxfh_indir_size, +	.get_rxfh		= i40evf_get_rxfh, +	.set_rxfh		= i40evf_set_rxfh, +	.get_channels		= i40evf_get_channels, +}; + +/** + * i40evf_set_ethtool_ops - Initialize ethtool ops struct + * @netdev: network interface device structure + * + * Sets ethtool ops struct in our netdev so that ethtool can call + * our functions. + **/ +void i40evf_set_ethtool_ops(struct net_device *netdev) +{ +	netdev->ethtool_ops = &i40evf_ethtool_ops; +} diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c new file mode 100644 index 00000000000..7fc5f3b5d6b --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c @@ -0,0 +1,2475 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#include "i40evf.h" +#include "i40e_prototype.h" +static int i40evf_setup_all_tx_resources(struct i40evf_adapter *adapter); +static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter); +static void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter); +static void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter); +static int i40evf_close(struct net_device *netdev); + +char i40evf_driver_name[] = "i40evf"; +static const char i40evf_driver_string[] = +	"Intel(R) XL710 X710 Virtual Function Network Driver"; + +#define DRV_VERSION "0.9.34" +const char i40evf_driver_version[] = DRV_VERSION; +static const char i40evf_copyright[] = +	"Copyright (c) 2013 - 2014 Intel Corporation."; + +/* i40evf_pci_tbl - PCI Device ID Table + * + * Wildcard entries (PCI_ANY_ID) should come last + * Last entry must be all 0s + * + * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, + *   Class, Class Mask, private data (not used) } + */ +static DEFINE_PCI_DEVICE_TABLE(i40evf_pci_tbl) = { +	{PCI_VDEVICE(INTEL, I40E_DEV_ID_VF), 0}, +	/* required last entry */ +	{0, } +}; + +MODULE_DEVICE_TABLE(pci, i40evf_pci_tbl); + +MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>"); +MODULE_DESCRIPTION("Intel(R) XL710 X710 Virtual Function Network Driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_VERSION); + +/** + * i40evf_allocate_dma_mem_d - OS specific memory alloc for shared code + * @hw:   pointer to the HW structure + * @mem:  ptr to mem struct to fill out + * @size: size of memory requested + * @alignment: what to align the allocation to + **/ +i40e_status i40evf_allocate_dma_mem_d(struct i40e_hw *hw, +				      struct i40e_dma_mem *mem, +				      u64 size, u32 alignment) +{ +	struct i40evf_adapter *adapter = (struct i40evf_adapter *)hw->back; + +	if (!mem) +		return I40E_ERR_PARAM; + +	mem->size = ALIGN(size, alignment); +	mem->va = dma_alloc_coherent(&adapter->pdev->dev, mem->size, +				     (dma_addr_t *)&mem->pa, GFP_KERNEL); +	if (mem->va) +		return 0; +	else +		return I40E_ERR_NO_MEMORY; +} + +/** + * i40evf_free_dma_mem_d - OS specific memory free for shared code + * @hw:   pointer to the HW structure + * @mem:  ptr to mem struct to free + **/ +i40e_status i40evf_free_dma_mem_d(struct i40e_hw *hw, struct i40e_dma_mem *mem) +{ +	struct i40evf_adapter *adapter = (struct i40evf_adapter *)hw->back; + +	if (!mem || !mem->va) +		return I40E_ERR_PARAM; +	dma_free_coherent(&adapter->pdev->dev, mem->size, +			  mem->va, (dma_addr_t)mem->pa); +	return 0; +} + +/** + * i40evf_allocate_virt_mem_d - OS specific memory alloc for shared code + * @hw:   pointer to the HW structure + * @mem:  ptr to mem struct to fill out + * @size: size of memory requested + **/ +i40e_status i40evf_allocate_virt_mem_d(struct i40e_hw *hw, +				       struct i40e_virt_mem *mem, u32 size) +{ +	if (!mem) +		return I40E_ERR_PARAM; + +	mem->size = size; +	mem->va = kzalloc(size, GFP_KERNEL); + +	if (mem->va) +		return 0; +	else +		return I40E_ERR_NO_MEMORY; +} + +/** + * i40evf_free_virt_mem_d - OS specific memory free for shared code + * @hw:   pointer to the HW structure + * @mem:  ptr to mem struct to free + **/ +i40e_status i40evf_free_virt_mem_d(struct i40e_hw *hw, +				   struct i40e_virt_mem *mem) +{ +	if (!mem) +		return I40E_ERR_PARAM; + +	/* it's ok to kfree a NULL pointer */ +	kfree(mem->va); + +	return 0; +} + +/** + * i40evf_debug_d - OS dependent version of debug printing + * @hw:  pointer to the HW structure + * @mask: debug level mask + * @fmt_str: printf-type format description + **/ +void i40evf_debug_d(void *hw, u32 mask, char *fmt_str, ...) +{ +	char buf[512]; +	va_list argptr; + +	if (!(mask & ((struct i40e_hw *)hw)->debug_mask)) +		return; + +	va_start(argptr, fmt_str); +	vsnprintf(buf, sizeof(buf), fmt_str, argptr); +	va_end(argptr); + +	/* the debug string is already formatted with a newline */ +	pr_info("%s", buf); +} + +/** + * i40evf_tx_timeout - Respond to a Tx Hang + * @netdev: network interface device structure + **/ +static void i40evf_tx_timeout(struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	adapter->tx_timeout_count++; +	if (!(adapter->flags & I40EVF_FLAG_RESET_PENDING)) { +		adapter->flags |= I40EVF_FLAG_RESET_NEEDED; +		schedule_work(&adapter->reset_task); +	} +} + +/** + * i40evf_misc_irq_disable - Mask off interrupt generation on the NIC + * @adapter: board private structure + **/ +static void i40evf_misc_irq_disable(struct i40evf_adapter *adapter) +{ +	struct i40e_hw *hw = &adapter->hw; +	wr32(hw, I40E_VFINT_DYN_CTL01, 0); + +	/* read flush */ +	rd32(hw, I40E_VFGEN_RSTAT); + +	synchronize_irq(adapter->msix_entries[0].vector); +} + +/** + * i40evf_misc_irq_enable - Enable default interrupt generation settings + * @adapter: board private structure + **/ +static void i40evf_misc_irq_enable(struct i40evf_adapter *adapter) +{ +	struct i40e_hw *hw = &adapter->hw; +	wr32(hw, I40E_VFINT_DYN_CTL01, I40E_VFINT_DYN_CTL01_INTENA_MASK | +				       I40E_VFINT_DYN_CTL01_ITR_INDX_MASK); +	wr32(hw, I40E_VFINT_ICR0_ENA1, I40E_VFINT_ICR0_ENA_ADMINQ_MASK); + +	/* read flush */ +	rd32(hw, I40E_VFGEN_RSTAT); +} + +/** + * i40evf_irq_disable - Mask off interrupt generation on the NIC + * @adapter: board private structure + **/ +static void i40evf_irq_disable(struct i40evf_adapter *adapter) +{ +	int i; +	struct i40e_hw *hw = &adapter->hw; + +	if (!adapter->msix_entries) +		return; + +	for (i = 1; i < adapter->num_msix_vectors; i++) { +		wr32(hw, I40E_VFINT_DYN_CTLN1(i - 1), 0); +		synchronize_irq(adapter->msix_entries[i].vector); +	} +	/* read flush */ +	rd32(hw, I40E_VFGEN_RSTAT); + +} + +/** + * i40evf_irq_enable_queues - Enable interrupt for specified queues + * @adapter: board private structure + * @mask: bitmap of queues to enable + **/ +void i40evf_irq_enable_queues(struct i40evf_adapter *adapter, u32 mask) +{ +	struct i40e_hw *hw = &adapter->hw; +	int i; + +	for (i = 1; i < adapter->num_msix_vectors; i++) { +		if (mask & (1 << (i - 1))) { +			wr32(hw, I40E_VFINT_DYN_CTLN1(i - 1), +			     I40E_VFINT_DYN_CTLN1_INTENA_MASK | +			     I40E_VFINT_DYN_CTLN_CLEARPBA_MASK); +		} +	} +} + +/** + * i40evf_fire_sw_int - Generate SW interrupt for specified vectors + * @adapter: board private structure + * @mask: bitmap of vectors to trigger + **/ +static void i40evf_fire_sw_int(struct i40evf_adapter *adapter, +					    u32 mask) +{ +	struct i40e_hw *hw = &adapter->hw; +	int i; +	uint32_t dyn_ctl; + +	for (i = 1; i < adapter->num_msix_vectors; i++) { +		if (mask & (1 << i)) { +			dyn_ctl = rd32(hw, I40E_VFINT_DYN_CTLN1(i - 1)); +			dyn_ctl |= I40E_VFINT_DYN_CTLN_SWINT_TRIG_MASK | +				   I40E_VFINT_DYN_CTLN_CLEARPBA_MASK; +			wr32(hw, I40E_VFINT_DYN_CTLN1(i - 1), dyn_ctl); +		} +	} +} + +/** + * i40evf_irq_enable - Enable default interrupt generation settings + * @adapter: board private structure + **/ +void i40evf_irq_enable(struct i40evf_adapter *adapter, bool flush) +{ +	struct i40e_hw *hw = &adapter->hw; + +	i40evf_irq_enable_queues(adapter, ~0); + +	if (flush) +		rd32(hw, I40E_VFGEN_RSTAT); +} + +/** + * i40evf_msix_aq - Interrupt handler for vector 0 + * @irq: interrupt number + * @data: pointer to netdev + **/ +static irqreturn_t i40evf_msix_aq(int irq, void *data) +{ +	struct net_device *netdev = data; +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_hw *hw = &adapter->hw; +	u32 val; +	u32 ena_mask; + +	/* handle non-queue interrupts */ +	val = rd32(hw, I40E_VFINT_ICR01); +	ena_mask = rd32(hw, I40E_VFINT_ICR0_ENA1); + + +	val = rd32(hw, I40E_VFINT_DYN_CTL01); +	val = val | I40E_PFINT_DYN_CTL0_CLEARPBA_MASK; +	wr32(hw, I40E_VFINT_DYN_CTL01, val); + +	/* re-enable interrupt causes */ +	wr32(hw, I40E_VFINT_ICR0_ENA1, ena_mask); +	wr32(hw, I40E_VFINT_DYN_CTL01, I40E_VFINT_DYN_CTL01_INTENA_MASK); + +	/* schedule work on the private workqueue */ +	schedule_work(&adapter->adminq_task); + +	return IRQ_HANDLED; +} + +/** + * i40evf_msix_clean_rings - MSIX mode Interrupt Handler + * @irq: interrupt number + * @data: pointer to a q_vector + **/ +static irqreturn_t i40evf_msix_clean_rings(int irq, void *data) +{ +	struct i40e_q_vector *q_vector = data; + +	if (!q_vector->tx.ring && !q_vector->rx.ring) +		return IRQ_HANDLED; + +	napi_schedule(&q_vector->napi); + +	return IRQ_HANDLED; +} + +/** + * i40evf_map_vector_to_rxq - associate irqs with rx queues + * @adapter: board private structure + * @v_idx: interrupt number + * @r_idx: queue number + **/ +static void +i40evf_map_vector_to_rxq(struct i40evf_adapter *adapter, int v_idx, int r_idx) +{ +	struct i40e_q_vector *q_vector = adapter->q_vector[v_idx]; +	struct i40e_ring *rx_ring = adapter->rx_rings[r_idx]; + +	rx_ring->q_vector = q_vector; +	rx_ring->next = q_vector->rx.ring; +	rx_ring->vsi = &adapter->vsi; +	q_vector->rx.ring = rx_ring; +	q_vector->rx.count++; +	q_vector->rx.latency_range = I40E_LOW_LATENCY; +} + +/** + * i40evf_map_vector_to_txq - associate irqs with tx queues + * @adapter: board private structure + * @v_idx: interrupt number + * @t_idx: queue number + **/ +static void +i40evf_map_vector_to_txq(struct i40evf_adapter *adapter, int v_idx, int t_idx) +{ +	struct i40e_q_vector *q_vector = adapter->q_vector[v_idx]; +	struct i40e_ring *tx_ring = adapter->tx_rings[t_idx]; + +	tx_ring->q_vector = q_vector; +	tx_ring->next = q_vector->tx.ring; +	tx_ring->vsi = &adapter->vsi; +	q_vector->tx.ring = tx_ring; +	q_vector->tx.count++; +	q_vector->tx.latency_range = I40E_LOW_LATENCY; +	q_vector->num_ringpairs++; +	q_vector->ring_mask |= (1 << t_idx); +} + +/** + * i40evf_map_rings_to_vectors - Maps descriptor rings to vectors + * @adapter: board private structure to initialize + * + * This function maps descriptor rings to the queue-specific vectors + * we were allotted through the MSI-X enabling code.  Ideally, we'd have + * one vector per ring/queue, but on a constrained vector budget, we + * group the rings as "efficiently" as possible.  You would add new + * mapping configurations in here. + **/ +static int i40evf_map_rings_to_vectors(struct i40evf_adapter *adapter) +{ +	int q_vectors; +	int v_start = 0; +	int rxr_idx = 0, txr_idx = 0; +	int rxr_remaining = adapter->vsi_res->num_queue_pairs; +	int txr_remaining = adapter->vsi_res->num_queue_pairs; +	int i, j; +	int rqpv, tqpv; +	int err = 0; + +	q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	/* The ideal configuration... +	 * We have enough vectors to map one per queue. +	 */ +	if (q_vectors == (rxr_remaining * 2)) { +		for (; rxr_idx < rxr_remaining; v_start++, rxr_idx++) +			i40evf_map_vector_to_rxq(adapter, v_start, rxr_idx); + +		for (; txr_idx < txr_remaining; v_start++, txr_idx++) +			i40evf_map_vector_to_txq(adapter, v_start, txr_idx); +		goto out; +	} + +	/* If we don't have enough vectors for a 1-to-1 +	 * mapping, we'll have to group them so there are +	 * multiple queues per vector. +	 * Re-adjusting *qpv takes care of the remainder. +	 */ +	for (i = v_start; i < q_vectors; i++) { +		rqpv = DIV_ROUND_UP(rxr_remaining, q_vectors - i); +		for (j = 0; j < rqpv; j++) { +			i40evf_map_vector_to_rxq(adapter, i, rxr_idx); +			rxr_idx++; +			rxr_remaining--; +		} +	} +	for (i = v_start; i < q_vectors; i++) { +		tqpv = DIV_ROUND_UP(txr_remaining, q_vectors - i); +		for (j = 0; j < tqpv; j++) { +			i40evf_map_vector_to_txq(adapter, i, txr_idx); +			txr_idx++; +			txr_remaining--; +		} +	} + +out: +	adapter->aq_required |= I40EVF_FLAG_AQ_MAP_VECTORS; + +	return err; +} + +/** + * i40evf_request_traffic_irqs - Initialize MSI-X interrupts + * @adapter: board private structure + * + * Allocates MSI-X vectors for tx and rx handling, and requests + * interrupts from the kernel. + **/ +static int +i40evf_request_traffic_irqs(struct i40evf_adapter *adapter, char *basename) +{ +	int vector, err, q_vectors; +	int rx_int_idx = 0, tx_int_idx = 0; + +	i40evf_irq_disable(adapter); +	/* Decrement for Other and TCP Timer vectors */ +	q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	for (vector = 0; vector < q_vectors; vector++) { +		struct i40e_q_vector *q_vector = adapter->q_vector[vector]; + +		if (q_vector->tx.ring && q_vector->rx.ring) { +			snprintf(q_vector->name, sizeof(q_vector->name) - 1, +				 "i40evf-%s-%s-%d", basename, +				 "TxRx", rx_int_idx++); +			tx_int_idx++; +		} else if (q_vector->rx.ring) { +			snprintf(q_vector->name, sizeof(q_vector->name) - 1, +				 "i40evf-%s-%s-%d", basename, +				 "rx", rx_int_idx++); +		} else if (q_vector->tx.ring) { +			snprintf(q_vector->name, sizeof(q_vector->name) - 1, +				 "i40evf-%s-%s-%d", basename, +				 "tx", tx_int_idx++); +		} else { +			/* skip this unused q_vector */ +			continue; +		} +		err = request_irq( +			adapter->msix_entries[vector + NONQ_VECS].vector, +			i40evf_msix_clean_rings, +			0, +			q_vector->name, +			q_vector); +		if (err) { +			dev_info(&adapter->pdev->dev, +				 "%s: request_irq failed, error: %d\n", +				__func__, err); +			goto free_queue_irqs; +		} +		/* assign the mask for this irq */ +		irq_set_affinity_hint( +			adapter->msix_entries[vector + NONQ_VECS].vector, +			q_vector->affinity_mask); +	} + +	return 0; + +free_queue_irqs: +	while (vector) { +		vector--; +		irq_set_affinity_hint( +			adapter->msix_entries[vector + NONQ_VECS].vector, +			NULL); +		free_irq(adapter->msix_entries[vector + NONQ_VECS].vector, +			 adapter->q_vector[vector]); +	} +	return err; +} + +/** + * i40evf_request_misc_irq - Initialize MSI-X interrupts + * @adapter: board private structure + * + * Allocates MSI-X vector 0 and requests interrupts from the kernel. This + * vector is only for the admin queue, and stays active even when the netdev + * is closed. + **/ +static int i40evf_request_misc_irq(struct i40evf_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	int err; + +	sprintf(adapter->misc_vector_name, "i40evf:mbx"); +	err = request_irq(adapter->msix_entries[0].vector, +			  &i40evf_msix_aq, 0, +			  adapter->misc_vector_name, netdev); +	if (err) { +		dev_err(&adapter->pdev->dev, +			"request_irq for %s failed: %d\n", +			adapter->misc_vector_name, err); +		free_irq(adapter->msix_entries[0].vector, netdev); +	} +	return err; +} + +/** + * i40evf_free_traffic_irqs - Free MSI-X interrupts + * @adapter: board private structure + * + * Frees all MSI-X vectors other than 0. + **/ +static void i40evf_free_traffic_irqs(struct i40evf_adapter *adapter) +{ +	int i; +	int q_vectors; +	q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	for (i = 0; i < q_vectors; i++) { +		irq_set_affinity_hint(adapter->msix_entries[i+1].vector, +				      NULL); +		free_irq(adapter->msix_entries[i+1].vector, +			 adapter->q_vector[i]); +	} +} + +/** + * i40evf_free_misc_irq - Free MSI-X miscellaneous vector + * @adapter: board private structure + * + * Frees MSI-X vector 0. + **/ +static void i40evf_free_misc_irq(struct i40evf_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; + +	free_irq(adapter->msix_entries[0].vector, netdev); +} + +/** + * i40evf_configure_tx - Configure Transmit Unit after Reset + * @adapter: board private structure + * + * Configure the Tx unit of the MAC after a reset. + **/ +static void i40evf_configure_tx(struct i40evf_adapter *adapter) +{ +	struct i40e_hw *hw = &adapter->hw; +	int i; +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) +		adapter->tx_rings[i]->tail = hw->hw_addr + I40E_QTX_TAIL1(i); +} + +/** + * i40evf_configure_rx - Configure Receive Unit after Reset + * @adapter: board private structure + * + * Configure the Rx unit of the MAC after a reset. + **/ +static void i40evf_configure_rx(struct i40evf_adapter *adapter) +{ +	struct i40e_hw *hw = &adapter->hw; +	struct net_device *netdev = adapter->netdev; +	int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; +	int i; +	int rx_buf_len; + + +	adapter->flags &= ~I40EVF_FLAG_RX_PS_CAPABLE; +	adapter->flags |= I40EVF_FLAG_RX_1BUF_CAPABLE; + +	/* Decide whether to use packet split mode or not */ +	if (netdev->mtu > ETH_DATA_LEN) { +		if (adapter->flags & I40EVF_FLAG_RX_PS_CAPABLE) +			adapter->flags |= I40EVF_FLAG_RX_PS_ENABLED; +		else +			adapter->flags &= ~I40EVF_FLAG_RX_PS_ENABLED; +	} else { +		if (adapter->flags & I40EVF_FLAG_RX_1BUF_CAPABLE) +			adapter->flags &= ~I40EVF_FLAG_RX_PS_ENABLED; +		else +			adapter->flags |= I40EVF_FLAG_RX_PS_ENABLED; +	} + +	/* Set the RX buffer length according to the mode */ +	if (adapter->flags & I40EVF_FLAG_RX_PS_ENABLED) { +		rx_buf_len = I40E_RX_HDR_SIZE; +	} else { +		if (netdev->mtu <= ETH_DATA_LEN) +			rx_buf_len = I40EVF_RXBUFFER_2048; +		else +			rx_buf_len = ALIGN(max_frame, 1024); +	} + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +		adapter->rx_rings[i]->tail = hw->hw_addr + I40E_QRX_TAIL1(i); +		adapter->rx_rings[i]->rx_buf_len = rx_buf_len; +	} +} + +/** + * i40evf_find_vlan - Search filter list for specific vlan filter + * @adapter: board private structure + * @vlan: vlan tag + * + * Returns ptr to the filter object or NULL + **/ +static struct +i40evf_vlan_filter *i40evf_find_vlan(struct i40evf_adapter *adapter, u16 vlan) +{ +	struct i40evf_vlan_filter *f; + +	list_for_each_entry(f, &adapter->vlan_filter_list, list) { +		if (vlan == f->vlan) +			return f; +	} +	return NULL; +} + +/** + * i40evf_add_vlan - Add a vlan filter to the list + * @adapter: board private structure + * @vlan: VLAN tag + * + * Returns ptr to the filter object or NULL when no memory available. + **/ +static struct +i40evf_vlan_filter *i40evf_add_vlan(struct i40evf_adapter *adapter, u16 vlan) +{ +	struct i40evf_vlan_filter *f; + +	f = i40evf_find_vlan(adapter, vlan); +	if (NULL == f) { +		f = kzalloc(sizeof(*f), GFP_ATOMIC); +		if (NULL == f) +			return NULL; + +		f->vlan = vlan; + +		INIT_LIST_HEAD(&f->list); +		list_add(&f->list, &adapter->vlan_filter_list); +		f->add = true; +		adapter->aq_required |= I40EVF_FLAG_AQ_ADD_VLAN_FILTER; +	} + +	return f; +} + +/** + * i40evf_del_vlan - Remove a vlan filter from the list + * @adapter: board private structure + * @vlan: VLAN tag + **/ +static void i40evf_del_vlan(struct i40evf_adapter *adapter, u16 vlan) +{ +	struct i40evf_vlan_filter *f; + +	f = i40evf_find_vlan(adapter, vlan); +	if (f) { +		f->remove = true; +		adapter->aq_required |= I40EVF_FLAG_AQ_DEL_VLAN_FILTER; +	} +} + +/** + * i40evf_vlan_rx_add_vid - Add a VLAN filter to a device + * @netdev: network device struct + * @vid: VLAN tag + **/ +static int i40evf_vlan_rx_add_vid(struct net_device *netdev, +			 __always_unused __be16 proto, u16 vid) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	if (i40evf_add_vlan(adapter, vid) == NULL) +		return -ENOMEM; +	return 0; +} + +/** + * i40evf_vlan_rx_kill_vid - Remove a VLAN filter from a device + * @netdev: network device struct + * @vid: VLAN tag + **/ +static int i40evf_vlan_rx_kill_vid(struct net_device *netdev, +			  __always_unused __be16 proto, u16 vid) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	i40evf_del_vlan(adapter, vid); +	return 0; +} + +/** + * i40evf_find_filter - Search filter list for specific mac filter + * @adapter: board private structure + * @macaddr: the MAC address + * + * Returns ptr to the filter object or NULL + **/ +static struct +i40evf_mac_filter *i40evf_find_filter(struct i40evf_adapter *adapter, +				      u8 *macaddr) +{ +	struct i40evf_mac_filter *f; + +	if (!macaddr) +		return NULL; + +	list_for_each_entry(f, &adapter->mac_filter_list, list) { +		if (ether_addr_equal(macaddr, f->macaddr)) +			return f; +	} +	return NULL; +} + +/** + * i40e_add_filter - Add a mac filter to the filter list + * @adapter: board private structure + * @macaddr: the MAC address + * + * Returns ptr to the filter object or NULL when no memory available. + **/ +static struct +i40evf_mac_filter *i40evf_add_filter(struct i40evf_adapter *adapter, +				     u8 *macaddr) +{ +	struct i40evf_mac_filter *f; + +	if (!macaddr) +		return NULL; + +	while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, +				&adapter->crit_section)) +		mdelay(1); + +	f = i40evf_find_filter(adapter, macaddr); +	if (NULL == f) { +		f = kzalloc(sizeof(*f), GFP_ATOMIC); +		if (NULL == f) { +			clear_bit(__I40EVF_IN_CRITICAL_TASK, +				  &adapter->crit_section); +			return NULL; +		} + +		ether_addr_copy(f->macaddr, macaddr); + +		list_add(&f->list, &adapter->mac_filter_list); +		f->add = true; +		adapter->aq_required |= I40EVF_FLAG_AQ_ADD_MAC_FILTER; +	} + +	clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section); +	return f; +} + +/** + * i40evf_set_mac - NDO callback to set port mac address + * @netdev: network interface device structure + * @p: pointer to an address structure + * + * Returns 0 on success, negative on failure + **/ +static int i40evf_set_mac(struct net_device *netdev, void *p) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_hw *hw = &adapter->hw; +	struct i40evf_mac_filter *f; +	struct sockaddr *addr = p; + +	if (!is_valid_ether_addr(addr->sa_data)) +		return -EADDRNOTAVAIL; + +	if (ether_addr_equal(netdev->dev_addr, addr->sa_data)) +		return 0; + +	f = i40evf_add_filter(adapter, addr->sa_data); +	if (f) { +		ether_addr_copy(hw->mac.addr, addr->sa_data); +		ether_addr_copy(netdev->dev_addr, adapter->hw.mac.addr); +	} + +	return (f == NULL) ? -ENOMEM : 0; +} + +/** + * i40evf_set_rx_mode - NDO callback to set the netdev filters + * @netdev: network interface device structure + **/ +static void i40evf_set_rx_mode(struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40evf_mac_filter *f, *ftmp; +	struct netdev_hw_addr *uca; +	struct netdev_hw_addr *mca; + +	/* add addr if not already in the filter list */ +	netdev_for_each_uc_addr(uca, netdev) { +		i40evf_add_filter(adapter, uca->addr); +	} +	netdev_for_each_mc_addr(mca, netdev) { +		i40evf_add_filter(adapter, mca->addr); +	} + +	while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, +				&adapter->crit_section)) +		mdelay(1); +	/* remove filter if not in netdev list */ +	list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) { +		bool found = false; + +		if (is_multicast_ether_addr(f->macaddr)) { +			netdev_for_each_mc_addr(mca, netdev) { +				if (ether_addr_equal(mca->addr, f->macaddr)) { +					found = true; +					break; +				} +			} +		} else { +			netdev_for_each_uc_addr(uca, netdev) { +				if (ether_addr_equal(uca->addr, f->macaddr)) { +					found = true; +					break; +				} +			} +		} +		if (found) { +			f->remove = true; +			adapter->aq_required |= I40EVF_FLAG_AQ_DEL_MAC_FILTER; +		} +	} +	clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section); +} + +/** + * i40evf_napi_enable_all - enable NAPI on all queue vectors + * @adapter: board private structure + **/ +static void i40evf_napi_enable_all(struct i40evf_adapter *adapter) +{ +	int q_idx; +	struct i40e_q_vector *q_vector; +	int q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	for (q_idx = 0; q_idx < q_vectors; q_idx++) { +		struct napi_struct *napi; +		q_vector = adapter->q_vector[q_idx]; +		napi = &q_vector->napi; +		napi_enable(napi); +	} +} + +/** + * i40evf_napi_disable_all - disable NAPI on all queue vectors + * @adapter: board private structure + **/ +static void i40evf_napi_disable_all(struct i40evf_adapter *adapter) +{ +	int q_idx; +	struct i40e_q_vector *q_vector; +	int q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	for (q_idx = 0; q_idx < q_vectors; q_idx++) { +		q_vector = adapter->q_vector[q_idx]; +		napi_disable(&q_vector->napi); +	} +} + +/** + * i40evf_configure - set up transmit and receive data structures + * @adapter: board private structure + **/ +static void i40evf_configure(struct i40evf_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	int i; + +	i40evf_set_rx_mode(netdev); + +	i40evf_configure_tx(adapter); +	i40evf_configure_rx(adapter); +	adapter->aq_required |= I40EVF_FLAG_AQ_CONFIGURE_QUEUES; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +		struct i40e_ring *ring = adapter->rx_rings[i]; +		i40evf_alloc_rx_buffers(ring, ring->count); +		ring->next_to_use = ring->count - 1; +		writel(ring->next_to_use, ring->tail); +	} +} + +/** + * i40evf_up_complete - Finish the last steps of bringing up a connection + * @adapter: board private structure + **/ +static int i40evf_up_complete(struct i40evf_adapter *adapter) +{ +	adapter->state = __I40EVF_RUNNING; +	clear_bit(__I40E_DOWN, &adapter->vsi.state); + +	i40evf_napi_enable_all(adapter); + +	adapter->aq_required |= I40EVF_FLAG_AQ_ENABLE_QUEUES; +	mod_timer_pending(&adapter->watchdog_timer, jiffies + 1); +	return 0; +} + +/** + * i40evf_clean_all_rx_rings - Free Rx Buffers for all queues + * @adapter: board private structure + **/ +static void i40evf_clean_all_rx_rings(struct i40evf_adapter *adapter) +{ +	int i; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) +		i40evf_clean_rx_ring(adapter->rx_rings[i]); +} + +/** + * i40evf_clean_all_tx_rings - Free Tx Buffers for all queues + * @adapter: board private structure + **/ +static void i40evf_clean_all_tx_rings(struct i40evf_adapter *adapter) +{ +	int i; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) +		i40evf_clean_tx_ring(adapter->tx_rings[i]); +} + +/** + * i40e_down - Shutdown the connection processing + * @adapter: board private structure + **/ +void i40evf_down(struct i40evf_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	struct i40evf_mac_filter *f; + +	if (adapter->state == __I40EVF_DOWN) +		return; + +	/* remove all MAC filters */ +	list_for_each_entry(f, &adapter->mac_filter_list, list) { +		f->remove = true; +	} +	/* remove all VLAN filters */ +	list_for_each_entry(f, &adapter->vlan_filter_list, list) { +		f->remove = true; +	} +	if (!(adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) && +	    adapter->state != __I40EVF_RESETTING) { +		adapter->aq_required |= I40EVF_FLAG_AQ_DEL_MAC_FILTER; +		adapter->aq_required |= I40EVF_FLAG_AQ_DEL_VLAN_FILTER; +		/* disable receives */ +		adapter->aq_required |= I40EVF_FLAG_AQ_DISABLE_QUEUES; +		mod_timer_pending(&adapter->watchdog_timer, jiffies + 1); +		msleep(20); +	} +	netif_tx_disable(netdev); + +	netif_tx_stop_all_queues(netdev); + +	i40evf_irq_disable(adapter); + +	i40evf_napi_disable_all(adapter); + +	netif_carrier_off(netdev); + +	i40evf_clean_all_tx_rings(adapter); +	i40evf_clean_all_rx_rings(adapter); +} + +/** + * i40evf_acquire_msix_vectors - Setup the MSIX capability + * @adapter: board private structure + * @vectors: number of vectors to request + * + * Work with the OS to set up the MSIX vectors needed. + * + * Returns 0 on success, negative on failure + **/ +static int +i40evf_acquire_msix_vectors(struct i40evf_adapter *adapter, int vectors) +{ +	int err, vector_threshold; + +	/* We'll want at least 3 (vector_threshold): +	 * 0) Other (Admin Queue and link, mostly) +	 * 1) TxQ[0] Cleanup +	 * 2) RxQ[0] Cleanup +	 */ +	vector_threshold = MIN_MSIX_COUNT; + +	/* The more we get, the more we will assign to Tx/Rx Cleanup +	 * for the separate queues...where Rx Cleanup >= Tx Cleanup. +	 * Right now, we simply care about how many we'll get; we'll +	 * set them up later while requesting irq's. +	 */ +	err = pci_enable_msix_range(adapter->pdev, adapter->msix_entries, +				    vector_threshold, vectors); +	if (err < 0) { +		dev_err(&adapter->pdev->dev, "Unable to allocate MSI-X interrupts\n"); +		kfree(adapter->msix_entries); +		adapter->msix_entries = NULL; +		return err; +	} + +	/* Adjust for only the vectors we'll use, which is minimum +	 * of max_msix_q_vectors + NONQ_VECS, or the number of +	 * vectors we were allocated. +	 */ +	adapter->num_msix_vectors = err; +	return 0; +} + +/** + * i40evf_free_queues - Free memory for all rings + * @adapter: board private structure to initialize + * + * Free all of the memory associated with queue pairs. + **/ +static void i40evf_free_queues(struct i40evf_adapter *adapter) +{ +	int i; + +	if (!adapter->vsi_res) +		return; +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +		if (adapter->tx_rings[i]) +			kfree_rcu(adapter->tx_rings[i], rcu); +		adapter->tx_rings[i] = NULL; +		adapter->rx_rings[i] = NULL; +	} +} + +/** + * i40evf_alloc_queues - Allocate memory for all rings + * @adapter: board private structure to initialize + * + * We allocate one ring per queue at run-time since we don't know the + * number of queues at compile-time.  The polling_netdev array is + * intended for Multiqueue, but should work fine with a single queue. + **/ +static int i40evf_alloc_queues(struct i40evf_adapter *adapter) +{ +	int i; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +		struct i40e_ring *tx_ring; +		struct i40e_ring *rx_ring; + +		tx_ring = kzalloc(sizeof(struct i40e_ring) * 2, GFP_KERNEL); +		if (!tx_ring) +			goto err_out; + +		tx_ring->queue_index = i; +		tx_ring->netdev = adapter->netdev; +		tx_ring->dev = &adapter->pdev->dev; +		tx_ring->count = adapter->tx_desc_count; +		adapter->tx_rings[i] = tx_ring; + +		rx_ring = &tx_ring[1]; +		rx_ring->queue_index = i; +		rx_ring->netdev = adapter->netdev; +		rx_ring->dev = &adapter->pdev->dev; +		rx_ring->count = adapter->rx_desc_count; +		adapter->rx_rings[i] = rx_ring; +	} + +	return 0; + +err_out: +	i40evf_free_queues(adapter); +	return -ENOMEM; +} + +/** + * i40evf_set_interrupt_capability - set MSI-X or FAIL if not supported + * @adapter: board private structure to initialize + * + * Attempt to configure the interrupts using the best available + * capabilities of the hardware and the kernel. + **/ +static int i40evf_set_interrupt_capability(struct i40evf_adapter *adapter) +{ +	int vector, v_budget; +	int pairs = 0; +	int err = 0; + +	if (!adapter->vsi_res) { +		err = -EIO; +		goto out; +	} +	pairs = adapter->vsi_res->num_queue_pairs; + +	/* It's easy to be greedy for MSI-X vectors, but it really +	 * doesn't do us much good if we have a lot more vectors +	 * than CPU's.  So let's be conservative and only ask for +	 * (roughly) twice the number of vectors as there are CPU's. +	 */ +	v_budget = min_t(int, pairs, (int)(num_online_cpus() * 2)) + NONQ_VECS; +	v_budget = min_t(int, v_budget, (int)adapter->vf_res->max_vectors); + +	adapter->msix_entries = kcalloc(v_budget, +					sizeof(struct msix_entry), GFP_KERNEL); +	if (!adapter->msix_entries) { +		err = -ENOMEM; +		goto out; +	} + +	for (vector = 0; vector < v_budget; vector++) +		adapter->msix_entries[vector].entry = vector; + +	i40evf_acquire_msix_vectors(adapter, v_budget); + +out: +	adapter->netdev->real_num_tx_queues = pairs; +	return err; +} + +/** + * i40evf_alloc_q_vectors - Allocate memory for interrupt vectors + * @adapter: board private structure to initialize + * + * We allocate one q_vector per queue interrupt.  If allocation fails we + * return -ENOMEM. + **/ +static int i40evf_alloc_q_vectors(struct i40evf_adapter *adapter) +{ +	int q_idx, num_q_vectors; +	struct i40e_q_vector *q_vector; + +	num_q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	for (q_idx = 0; q_idx < num_q_vectors; q_idx++) { +		q_vector = kzalloc(sizeof(struct i40e_q_vector), GFP_KERNEL); +		if (!q_vector) +			goto err_out; +		q_vector->adapter = adapter; +		q_vector->vsi = &adapter->vsi; +		q_vector->v_idx = q_idx; +		netif_napi_add(adapter->netdev, &q_vector->napi, +				       i40evf_napi_poll, NAPI_POLL_WEIGHT); +		adapter->q_vector[q_idx] = q_vector; +	} + +	return 0; + +err_out: +	while (q_idx) { +		q_idx--; +		q_vector = adapter->q_vector[q_idx]; +		netif_napi_del(&q_vector->napi); +		kfree(q_vector); +		adapter->q_vector[q_idx] = NULL; +	} +	return -ENOMEM; +} + +/** + * i40evf_free_q_vectors - Free memory allocated for interrupt vectors + * @adapter: board private structure to initialize + * + * This function frees the memory allocated to the q_vectors.  In addition if + * NAPI is enabled it will delete any references to the NAPI struct prior + * to freeing the q_vector. + **/ +static void i40evf_free_q_vectors(struct i40evf_adapter *adapter) +{ +	int q_idx, num_q_vectors; +	int napi_vectors; + +	num_q_vectors = adapter->num_msix_vectors - NONQ_VECS; +	napi_vectors = adapter->vsi_res->num_queue_pairs; + +	for (q_idx = 0; q_idx < num_q_vectors; q_idx++) { +		struct i40e_q_vector *q_vector = adapter->q_vector[q_idx]; + +		adapter->q_vector[q_idx] = NULL; +		if (q_idx < napi_vectors) +			netif_napi_del(&q_vector->napi); +		kfree(q_vector); +	} +} + +/** + * i40evf_reset_interrupt_capability - Reset MSIX setup + * @adapter: board private structure + * + **/ +void i40evf_reset_interrupt_capability(struct i40evf_adapter *adapter) +{ +	pci_disable_msix(adapter->pdev); +	kfree(adapter->msix_entries); +	adapter->msix_entries = NULL; +} + +/** + * i40evf_init_interrupt_scheme - Determine if MSIX is supported and init + * @adapter: board private structure to initialize + * + **/ +int i40evf_init_interrupt_scheme(struct i40evf_adapter *adapter) +{ +	int err; + +	err = i40evf_set_interrupt_capability(adapter); +	if (err) { +		dev_err(&adapter->pdev->dev, +			"Unable to setup interrupt capabilities\n"); +		goto err_set_interrupt; +	} + +	err = i40evf_alloc_q_vectors(adapter); +	if (err) { +		dev_err(&adapter->pdev->dev, +			"Unable to allocate memory for queue vectors\n"); +		goto err_alloc_q_vectors; +	} + +	err = i40evf_alloc_queues(adapter); +	if (err) { +		dev_err(&adapter->pdev->dev, +			"Unable to allocate memory for queues\n"); +		goto err_alloc_queues; +	} + +	dev_info(&adapter->pdev->dev, "Multiqueue %s: Queue pair count = %u", +		(adapter->vsi_res->num_queue_pairs > 1) ? "Enabled" : +		"Disabled", adapter->vsi_res->num_queue_pairs); + +	return 0; +err_alloc_queues: +	i40evf_free_q_vectors(adapter); +err_alloc_q_vectors: +	i40evf_reset_interrupt_capability(adapter); +err_set_interrupt: +	return err; +} + +/** + * i40evf_watchdog_timer - Periodic call-back timer + * @data: pointer to adapter disguised as unsigned long + **/ +static void i40evf_watchdog_timer(unsigned long data) +{ +	struct i40evf_adapter *adapter = (struct i40evf_adapter *)data; +	schedule_work(&adapter->watchdog_task); +	/* timer will be rescheduled in watchdog task */ +} + +/** + * i40evf_watchdog_task - Periodic call-back task + * @work: pointer to work_struct + **/ +static void i40evf_watchdog_task(struct work_struct *work) +{ +	struct i40evf_adapter *adapter = container_of(work, +					  struct i40evf_adapter, +					  watchdog_task); +	struct i40e_hw *hw = &adapter->hw; + +	if (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section)) +		goto restart_watchdog; + +	if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) { +		if ((rd32(hw, I40E_VFGEN_RSTAT) & 0x3) == I40E_VFR_VFACTIVE) { +			/* A chance for redemption! */ +			dev_err(&adapter->pdev->dev, "Hardware came out of reset. Attempting reinit.\n"); +			adapter->state = __I40EVF_STARTUP; +			adapter->flags &= ~I40EVF_FLAG_PF_COMMS_FAILED; +			schedule_delayed_work(&adapter->init_task, 10); +			clear_bit(__I40EVF_IN_CRITICAL_TASK, +				  &adapter->crit_section); +			/* Don't reschedule the watchdog, since we've restarted +			 * the init task. When init_task contacts the PF and +			 * gets everything set up again, it'll restart the +			 * watchdog for us. Down, boy. Sit. Stay. Woof. +			 */ +			return; +		} +		adapter->aq_pending = 0; +		adapter->aq_required = 0; +		adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; +		goto watchdog_done; +	} + +	if ((adapter->state < __I40EVF_DOWN) || +	    (adapter->flags & I40EVF_FLAG_RESET_PENDING)) +		goto watchdog_done; + +	/* check for reset */ +	if (!(adapter->flags & I40EVF_FLAG_RESET_PENDING) && +	    (rd32(hw, I40E_VFGEN_RSTAT) & 0x3) != I40E_VFR_VFACTIVE) { +		adapter->state = __I40EVF_RESETTING; +		adapter->flags |= I40EVF_FLAG_RESET_PENDING; +		dev_err(&adapter->pdev->dev, "Hardware reset detected\n"); +		schedule_work(&adapter->reset_task); +		adapter->aq_pending = 0; +		adapter->aq_required = 0; +		adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; +		goto watchdog_done; +	} + +	/* Process admin queue tasks. After init, everything gets done +	 * here so we don't race on the admin queue. +	 */ +	if (adapter->aq_pending) +		goto watchdog_done; + +	if (adapter->aq_required & I40EVF_FLAG_AQ_MAP_VECTORS) { +		i40evf_map_queues(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_ADD_MAC_FILTER) { +		i40evf_add_ether_addrs(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_ADD_VLAN_FILTER) { +		i40evf_add_vlans(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_DEL_MAC_FILTER) { +		i40evf_del_ether_addrs(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_DEL_VLAN_FILTER) { +		i40evf_del_vlans(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_DISABLE_QUEUES) { +		i40evf_disable_queues(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_CONFIGURE_QUEUES) { +		i40evf_configure_queues(adapter); +		goto watchdog_done; +	} + +	if (adapter->aq_required & I40EVF_FLAG_AQ_ENABLE_QUEUES) { +		i40evf_enable_queues(adapter); +		goto watchdog_done; +	} + +	if (adapter->state == __I40EVF_RUNNING) +		i40evf_request_stats(adapter); + +	i40evf_irq_enable(adapter, true); +	i40evf_fire_sw_int(adapter, 0xFF); + +watchdog_done: +	clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section); +restart_watchdog: +	if (adapter->aq_required) +		mod_timer(&adapter->watchdog_timer, +			  jiffies + msecs_to_jiffies(20)); +	else +		mod_timer(&adapter->watchdog_timer, jiffies + (HZ * 2)); +	schedule_work(&adapter->adminq_task); +} + +/** + * next_queue - increment to next available tx queue + * @adapter: board private structure + * @j: queue counter + * + * Helper function for RSS programming to increment through available + * queus. Returns the next queue value. + **/ +static int next_queue(struct i40evf_adapter *adapter, int j) +{ +	j += 1; + +	return j >= adapter->vsi_res->num_queue_pairs ? 0 : j; +} + +/** + * i40evf_configure_rss - Prepare for RSS if used + * @adapter: board private structure + **/ +static void i40evf_configure_rss(struct i40evf_adapter *adapter) +{ +	struct i40e_hw *hw = &adapter->hw; +	u32 lut = 0; +	int i, j; +	u64 hena; + +	/* Set of random keys generated using kernel random number generator */ +	static const u32 seed[I40E_VFQF_HKEY_MAX_INDEX + 1] = { +			0x794221b4, 0xbca0c5ab, 0x6cd5ebd9, 0x1ada6127, +			0x983b3aa1, 0x1c4e71eb, 0x7f6328b2, 0xfcdc0da0, +			0xc135cafa, 0x7a6f7e2d, 0xe7102d28, 0x163cd12e, +			0x4954b126 }; + +	/* Hash type is configured by the PF - we just supply the key */ + +	/* Fill out hash function seed */ +	for (i = 0; i <= I40E_VFQF_HKEY_MAX_INDEX; i++) +		wr32(hw, I40E_VFQF_HKEY(i), seed[i]); + +	/* Enable PCTYPES for RSS, TCP/UDP with IPv4/IPv6 */ +	hena = I40E_DEFAULT_RSS_HENA; +	wr32(hw, I40E_VFQF_HENA(0), (u32)hena); +	wr32(hw, I40E_VFQF_HENA(1), (u32)(hena >> 32)); + +	/* Populate the LUT with max no. of queues in round robin fashion */ +	j = adapter->vsi_res->num_queue_pairs; +	for (i = 0; i <= I40E_VFQF_HLUT_MAX_INDEX; i++) { +		j = next_queue(adapter, j); +		lut = j; +		j = next_queue(adapter, j); +		lut |= j << 8; +		j = next_queue(adapter, j); +		lut |= j << 16; +		j = next_queue(adapter, j); +		lut |= j << 24; +		wr32(hw, I40E_VFQF_HLUT(i), lut); +	} +	i40e_flush(hw); +} + +#define I40EVF_RESET_WAIT_MS 100 +#define I40EVF_RESET_WAIT_COUNT 200 +/** + * i40evf_reset_task - Call-back task to handle hardware reset + * @work: pointer to work_struct + * + * During reset we need to shut down and reinitialize the admin queue + * before we can use it to communicate with the PF again. We also clear + * and reinit the rings because that context is lost as well. + **/ +static void i40evf_reset_task(struct work_struct *work) +{ +	struct i40evf_adapter *adapter = container_of(work, +						      struct i40evf_adapter, +						      reset_task); +	struct i40e_hw *hw = &adapter->hw; +	int i = 0, err; +	uint32_t rstat_val; + +	while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, +				&adapter->crit_section)) +		udelay(500); + +	if (adapter->flags & I40EVF_FLAG_RESET_NEEDED) { +		dev_info(&adapter->pdev->dev, "Requesting reset from PF\n"); +		i40evf_request_reset(adapter); +	} + +	/* poll until we see the reset actually happen */ +	for (i = 0; i < I40EVF_RESET_WAIT_COUNT; i++) { +		rstat_val = rd32(hw, I40E_VFGEN_RSTAT) & +			    I40E_VFGEN_RSTAT_VFR_STATE_MASK; +		if (rstat_val != I40E_VFR_VFACTIVE) +			break; +		else +			msleep(I40EVF_RESET_WAIT_MS); +	} +	if (i == I40EVF_RESET_WAIT_COUNT) { +		adapter->flags &= ~I40EVF_FLAG_RESET_PENDING; +		goto continue_reset; /* act like the reset happened */ +	} + +	/* wait until the reset is complete and the PF is responding to us */ +	for (i = 0; i < I40EVF_RESET_WAIT_COUNT; i++) { +		rstat_val = rd32(hw, I40E_VFGEN_RSTAT) & +			    I40E_VFGEN_RSTAT_VFR_STATE_MASK; +		if (rstat_val == I40E_VFR_VFACTIVE) +			break; +		else +			msleep(I40EVF_RESET_WAIT_MS); +	} +	if (i == I40EVF_RESET_WAIT_COUNT) { +		/* reset never finished */ +		dev_err(&adapter->pdev->dev, "Reset never finished (%x)\n", +			rstat_val); +		adapter->flags |= I40EVF_FLAG_PF_COMMS_FAILED; + +		if (netif_running(adapter->netdev)) { +			set_bit(__I40E_DOWN, &adapter->vsi.state); +			i40evf_down(adapter); +			i40evf_free_traffic_irqs(adapter); +			i40evf_free_all_tx_resources(adapter); +			i40evf_free_all_rx_resources(adapter); +		} +		i40evf_free_misc_irq(adapter); +		i40evf_reset_interrupt_capability(adapter); +		i40evf_free_queues(adapter); +		kfree(adapter->vf_res); +		i40evf_shutdown_adminq(hw); +		adapter->netdev->flags &= ~IFF_UP; +		clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section); +		return; /* Do not attempt to reinit. It's dead, Jim. */ +	} + +continue_reset: +	adapter->flags &= ~I40EVF_FLAG_RESET_PENDING; + +	i40evf_down(adapter); +	adapter->state = __I40EVF_RESETTING; + +	/* kill and reinit the admin queue */ +	if (i40evf_shutdown_adminq(hw)) +		dev_warn(&adapter->pdev->dev, +			"%s: Failed to destroy the Admin Queue resources\n", +			__func__); +	err = i40evf_init_adminq(hw); +	if (err) +		dev_info(&adapter->pdev->dev, "%s: init_adminq failed: %d\n", +			__func__, err); + +	adapter->aq_pending = 0; +	adapter->aq_required = 0; +	i40evf_map_queues(adapter); +	clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section); + +	mod_timer(&adapter->watchdog_timer, jiffies + 2); + +	if (netif_running(adapter->netdev)) { +		/* allocate transmit descriptors */ +		err = i40evf_setup_all_tx_resources(adapter); +		if (err) +			goto reset_err; + +		/* allocate receive descriptors */ +		err = i40evf_setup_all_rx_resources(adapter); +		if (err) +			goto reset_err; + +		i40evf_configure(adapter); + +		err = i40evf_up_complete(adapter); +		if (err) +			goto reset_err; + +		i40evf_irq_enable(adapter, true); +	} +	return; +reset_err: +	dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n"); +	i40evf_close(adapter->netdev); +} + +/** + * i40evf_adminq_task - worker thread to clean the admin queue + * @work: pointer to work_struct containing our data + **/ +static void i40evf_adminq_task(struct work_struct *work) +{ +	struct i40evf_adapter *adapter = +		container_of(work, struct i40evf_adapter, adminq_task); +	struct i40e_hw *hw = &adapter->hw; +	struct i40e_arq_event_info event; +	struct i40e_virtchnl_msg *v_msg; +	i40e_status ret; +	u32 val, oldval; +	u16 pending; + +	if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) +		return; + +	event.msg_size = I40EVF_MAX_AQ_BUF_SIZE; +	event.msg_buf = kzalloc(event.msg_size, GFP_KERNEL); +	if (!event.msg_buf) +		return; + +	v_msg = (struct i40e_virtchnl_msg *)&event.desc; +	do { +		ret = i40evf_clean_arq_element(hw, &event, &pending); +		if (ret) +			break; /* No event to process or error cleaning ARQ */ + +		i40evf_virtchnl_completion(adapter, v_msg->v_opcode, +					   v_msg->v_retval, event.msg_buf, +					   event.msg_size); +		if (pending != 0) { +			dev_info(&adapter->pdev->dev, +				 "%s: ARQ: Pending events %d\n", +				 __func__, pending); +			memset(event.msg_buf, 0, I40EVF_MAX_AQ_BUF_SIZE); +		} +	} while (pending); + +	/* check for error indications */ +	val = rd32(hw, hw->aq.arq.len); +	oldval = val; +	if (val & I40E_VF_ARQLEN_ARQVFE_MASK) { +		dev_info(&adapter->pdev->dev, "ARQ VF Error detected\n"); +		val &= ~I40E_VF_ARQLEN_ARQVFE_MASK; +	} +	if (val & I40E_VF_ARQLEN_ARQOVFL_MASK) { +		dev_info(&adapter->pdev->dev, "ARQ Overflow Error detected\n"); +		val &= ~I40E_VF_ARQLEN_ARQOVFL_MASK; +	} +	if (val & I40E_VF_ARQLEN_ARQCRIT_MASK) { +		dev_info(&adapter->pdev->dev, "ARQ Critical Error detected\n"); +		val &= ~I40E_VF_ARQLEN_ARQCRIT_MASK; +	} +	if (oldval != val) +		wr32(hw, hw->aq.arq.len, val); + +	val = rd32(hw, hw->aq.asq.len); +	oldval = val; +	if (val & I40E_VF_ATQLEN_ATQVFE_MASK) { +		dev_info(&adapter->pdev->dev, "ASQ VF Error detected\n"); +		val &= ~I40E_VF_ATQLEN_ATQVFE_MASK; +	} +	if (val & I40E_VF_ATQLEN_ATQOVFL_MASK) { +		dev_info(&adapter->pdev->dev, "ASQ Overflow Error detected\n"); +		val &= ~I40E_VF_ATQLEN_ATQOVFL_MASK; +	} +	if (val & I40E_VF_ATQLEN_ATQCRIT_MASK) { +		dev_info(&adapter->pdev->dev, "ASQ Critical Error detected\n"); +		val &= ~I40E_VF_ATQLEN_ATQCRIT_MASK; +	} +	if (oldval != val) +		wr32(hw, hw->aq.asq.len, val); + +	/* re-enable Admin queue interrupt cause */ +	i40evf_misc_irq_enable(adapter); + +	kfree(event.msg_buf); +} + +/** + * i40evf_free_all_tx_resources - Free Tx Resources for All Queues + * @adapter: board private structure + * + * Free all transmit software resources + **/ +static void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter) +{ +	int i; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) +		if (adapter->tx_rings[i]->desc) +			i40evf_free_tx_resources(adapter->tx_rings[i]); + +} + +/** + * i40evf_setup_all_tx_resources - allocate all queues Tx resources + * @adapter: board private structure + * + * If this function returns with an error, then it's possible one or + * more of the rings is populated (while the rest are not).  It is the + * callers duty to clean those orphaned rings. + * + * Return 0 on success, negative on failure + **/ +static int i40evf_setup_all_tx_resources(struct i40evf_adapter *adapter) +{ +	int i, err = 0; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +		adapter->tx_rings[i]->count = adapter->tx_desc_count; +		err = i40evf_setup_tx_descriptors(adapter->tx_rings[i]); +		if (!err) +			continue; +		dev_err(&adapter->pdev->dev, +			"%s: Allocation for Tx Queue %u failed\n", +			__func__, i); +		break; +	} + +	return err; +} + +/** + * i40evf_setup_all_rx_resources - allocate all queues Rx resources + * @adapter: board private structure + * + * If this function returns with an error, then it's possible one or + * more of the rings is populated (while the rest are not).  It is the + * callers duty to clean those orphaned rings. + * + * Return 0 on success, negative on failure + **/ +static int i40evf_setup_all_rx_resources(struct i40evf_adapter *adapter) +{ +	int i, err = 0; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) { +		adapter->rx_rings[i]->count = adapter->rx_desc_count; +		err = i40evf_setup_rx_descriptors(adapter->rx_rings[i]); +		if (!err) +			continue; +		dev_err(&adapter->pdev->dev, +			"%s: Allocation for Rx Queue %u failed\n", +			__func__, i); +		break; +	} +	return err; +} + +/** + * i40evf_free_all_rx_resources - Free Rx Resources for All Queues + * @adapter: board private structure + * + * Free all receive software resources + **/ +static void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter) +{ +	int i; + +	for (i = 0; i < adapter->vsi_res->num_queue_pairs; i++) +		if (adapter->rx_rings[i]->desc) +			i40evf_free_rx_resources(adapter->rx_rings[i]); +} + +/** + * i40evf_open - Called when a network interface is made active + * @netdev: network interface device structure + * + * Returns 0 on success, negative value on failure + * + * The open entry point is called when a network interface is made + * active by the system (IFF_UP).  At this point all resources needed + * for transmit and receive operations are allocated, the interrupt + * handler is registered with the OS, the watchdog timer is started, + * and the stack is notified that the interface is ready. + **/ +static int i40evf_open(struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	int err; + +	if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) { +		dev_err(&adapter->pdev->dev, "Unable to open device due to PF driver failure.\n"); +		return -EIO; +	} +	if (adapter->state != __I40EVF_DOWN) +		return -EBUSY; + +	/* allocate transmit descriptors */ +	err = i40evf_setup_all_tx_resources(adapter); +	if (err) +		goto err_setup_tx; + +	/* allocate receive descriptors */ +	err = i40evf_setup_all_rx_resources(adapter); +	if (err) +		goto err_setup_rx; + +	/* clear any pending interrupts, may auto mask */ +	err = i40evf_request_traffic_irqs(adapter, netdev->name); +	if (err) +		goto err_req_irq; + +	i40evf_configure(adapter); + +	err = i40evf_up_complete(adapter); +	if (err) +		goto err_req_irq; + +	i40evf_irq_enable(adapter, true); + +	return 0; + +err_req_irq: +	i40evf_down(adapter); +	i40evf_free_traffic_irqs(adapter); +err_setup_rx: +	i40evf_free_all_rx_resources(adapter); +err_setup_tx: +	i40evf_free_all_tx_resources(adapter); + +	return err; +} + +/** + * i40evf_close - Disables a network interface + * @netdev: network interface device structure + * + * Returns 0, this is not allowed to fail + * + * The close entry point is called when an interface is de-activated + * by the OS.  The hardware is still under the drivers control, but + * needs to be disabled. All IRQs except vector 0 (reserved for admin queue) + * are freed, along with all transmit and receive resources. + **/ +static int i40evf_close(struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	if (adapter->state <= __I40EVF_DOWN) +		return 0; + + +	set_bit(__I40E_DOWN, &adapter->vsi.state); + +	i40evf_down(adapter); +	adapter->state = __I40EVF_DOWN; +	i40evf_free_traffic_irqs(adapter); + +	i40evf_free_all_tx_resources(adapter); +	i40evf_free_all_rx_resources(adapter); + +	return 0; +} + +/** + * i40evf_get_stats - Get System Network Statistics + * @netdev: network interface device structure + * + * Returns the address of the device statistics structure. + * The statistics are actually updated from the timer callback. + **/ +static struct net_device_stats *i40evf_get_stats(struct net_device *netdev) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); + +	/* only return the current stats */ +	return &adapter->net_stats; +} + +/** + * i40evf_reinit_locked - Software reinit + * @adapter: board private structure + * + * Reinititalizes the ring structures in response to a software configuration + * change. Roughly the same as close followed by open, but skips releasing + * and reallocating the interrupts. + **/ +void i40evf_reinit_locked(struct i40evf_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	int err; + +	WARN_ON(in_interrupt()); + +	i40evf_down(adapter); + +	/* allocate transmit descriptors */ +	err = i40evf_setup_all_tx_resources(adapter); +	if (err) +		goto err_reinit; + +	/* allocate receive descriptors */ +	err = i40evf_setup_all_rx_resources(adapter); +	if (err) +		goto err_reinit; + +	i40evf_configure(adapter); + +	err = i40evf_up_complete(adapter); +	if (err) +		goto err_reinit; + +	i40evf_irq_enable(adapter, true); +	return; + +err_reinit: +	dev_err(&adapter->pdev->dev, "failed to allocate resources during reinit\n"); +	i40evf_close(netdev); +} + +/** + * i40evf_change_mtu - Change the Maximum Transfer Unit + * @netdev: network interface device structure + * @new_mtu: new value for maximum frame size + * + * Returns 0 on success, negative on failure + **/ +static int i40evf_change_mtu(struct net_device *netdev, int new_mtu) +{ +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; + +	if ((new_mtu < 68) || (max_frame > I40E_MAX_RXBUFFER)) +		return -EINVAL; + +	/* must set new MTU before calling down or up */ +	netdev->mtu = new_mtu; +	i40evf_reinit_locked(adapter); +	return 0; +} + +static const struct net_device_ops i40evf_netdev_ops = { +	.ndo_open		= i40evf_open, +	.ndo_stop		= i40evf_close, +	.ndo_start_xmit		= i40evf_xmit_frame, +	.ndo_get_stats		= i40evf_get_stats, +	.ndo_set_rx_mode	= i40evf_set_rx_mode, +	.ndo_validate_addr	= eth_validate_addr, +	.ndo_set_mac_address	= i40evf_set_mac, +	.ndo_change_mtu		= i40evf_change_mtu, +	.ndo_tx_timeout		= i40evf_tx_timeout, +	.ndo_vlan_rx_add_vid	= i40evf_vlan_rx_add_vid, +	.ndo_vlan_rx_kill_vid	= i40evf_vlan_rx_kill_vid, +}; + +/** + * i40evf_check_reset_complete - check that VF reset is complete + * @hw: pointer to hw struct + * + * Returns 0 if device is ready to use, or -EBUSY if it's in reset. + **/ +static int i40evf_check_reset_complete(struct i40e_hw *hw) +{ +	u32 rstat; +	int i; + +	for (i = 0; i < 100; i++) { +		rstat = rd32(hw, I40E_VFGEN_RSTAT); +		if (rstat == I40E_VFR_VFACTIVE) +			return 0; +		udelay(10); +	} +	return -EBUSY; +} + +/** + * i40evf_init_task - worker thread to perform delayed initialization + * @work: pointer to work_struct containing our data + * + * This task completes the work that was begun in probe. Due to the nature + * of VF-PF communications, we may need to wait tens of milliseconds to get + * reponses back from the PF. Rather than busy-wait in probe and bog down the + * whole system, we'll do it in a task so we can sleep. + * This task only runs during driver init. Once we've established + * communications with the PF driver and set up our netdev, the watchdog + * takes over. + **/ +static void i40evf_init_task(struct work_struct *work) +{ +	struct i40evf_adapter *adapter = container_of(work, +						      struct i40evf_adapter, +						      init_task.work); +	struct net_device *netdev = adapter->netdev; +	struct i40evf_mac_filter *f; +	struct i40e_hw *hw = &adapter->hw; +	struct pci_dev *pdev = adapter->pdev; +	int i, err, bufsz; + +	switch (adapter->state) { +	case __I40EVF_STARTUP: +		/* driver loaded, probe complete */ +		adapter->flags &= ~I40EVF_FLAG_PF_COMMS_FAILED; +		adapter->flags &= ~I40EVF_FLAG_RESET_PENDING; +		err = i40e_set_mac_type(hw); +		if (err) { +			dev_err(&pdev->dev, "Failed to set MAC type (%d)\n", +				err); +		goto err; +		} +		err = i40evf_check_reset_complete(hw); +		if (err) { +			dev_info(&pdev->dev, "Device is still in reset (%d), retrying\n", +				err); +			goto err; +		} +		hw->aq.num_arq_entries = I40EVF_AQ_LEN; +		hw->aq.num_asq_entries = I40EVF_AQ_LEN; +		hw->aq.arq_buf_size = I40EVF_MAX_AQ_BUF_SIZE; +		hw->aq.asq_buf_size = I40EVF_MAX_AQ_BUF_SIZE; + +		err = i40evf_init_adminq(hw); +		if (err) { +			dev_err(&pdev->dev, "Failed to init Admin Queue (%d)\n", +				err); +			goto err; +		} +		err = i40evf_send_api_ver(adapter); +		if (err) { +			dev_err(&pdev->dev, "Unable to send to PF (%d)\n", err); +			i40evf_shutdown_adminq(hw); +			goto err; +		} +		adapter->state = __I40EVF_INIT_VERSION_CHECK; +		goto restart; +		break; +	case __I40EVF_INIT_VERSION_CHECK: +		if (!i40evf_asq_done(hw)) { +			dev_err(&pdev->dev, "Admin queue command never completed\n"); +			goto err; +		} + +		/* aq msg sent, awaiting reply */ +		err = i40evf_verify_api_ver(adapter); +		if (err) { +			dev_info(&pdev->dev, "Unable to verify API version (%d), retrying\n", +				err); +			goto err; +		} +		err = i40evf_send_vf_config_msg(adapter); +		if (err) { +			dev_err(&pdev->dev, "Unable send config request (%d)\n", +				err); +			goto err; +		} +		adapter->state = __I40EVF_INIT_GET_RESOURCES; +		goto restart; +		break; +	case __I40EVF_INIT_GET_RESOURCES: +		/* aq msg sent, awaiting reply */ +		if (!adapter->vf_res) { +			bufsz = sizeof(struct i40e_virtchnl_vf_resource) + +				(I40E_MAX_VF_VSI * +				 sizeof(struct i40e_virtchnl_vsi_resource)); +			adapter->vf_res = kzalloc(bufsz, GFP_KERNEL); +			if (!adapter->vf_res) +				goto err; +		} +		err = i40evf_get_vf_config(adapter); +		if (err == I40E_ERR_ADMIN_QUEUE_NO_WORK) +			goto restart; +		if (err) { +			dev_err(&pdev->dev, "Unable to get VF config (%d)\n", +				err); +			goto err_alloc; +		} +		adapter->state = __I40EVF_INIT_SW; +		break; +	default: +		goto err_alloc; +	} +	/* got VF config message back from PF, now we can parse it */ +	for (i = 0; i < adapter->vf_res->num_vsis; i++) { +		if (adapter->vf_res->vsi_res[i].vsi_type == I40E_VSI_SRIOV) +			adapter->vsi_res = &adapter->vf_res->vsi_res[i]; +	} +	if (!adapter->vsi_res) { +		dev_err(&pdev->dev, "No LAN VSI found\n"); +		goto err_alloc; +	} + +	adapter->flags |= I40EVF_FLAG_RX_CSUM_ENABLED; + +	netdev->netdev_ops = &i40evf_netdev_ops; +	i40evf_set_ethtool_ops(netdev); +	netdev->watchdog_timeo = 5 * HZ; +	netdev->features |= NETIF_F_HIGHDMA | +			    NETIF_F_SG | +			    NETIF_F_IP_CSUM | +			    NETIF_F_SCTP_CSUM | +			    NETIF_F_IPV6_CSUM | +			    NETIF_F_TSO | +			    NETIF_F_TSO6 | +			    NETIF_F_RXCSUM | +			    NETIF_F_GRO; + +	if (adapter->vf_res->vf_offload_flags +	    & I40E_VIRTCHNL_VF_OFFLOAD_VLAN) { +		netdev->vlan_features = netdev->features; +		netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | +				    NETIF_F_HW_VLAN_CTAG_RX | +				    NETIF_F_HW_VLAN_CTAG_FILTER; +	} + +	/* copy netdev features into list of user selectable features */ +	netdev->hw_features |= netdev->features; +	netdev->hw_features &= ~NETIF_F_RXCSUM; + +	if (!is_valid_ether_addr(adapter->hw.mac.addr)) { +		dev_info(&pdev->dev, "Invalid MAC address %pM, using random\n", +			 adapter->hw.mac.addr); +		random_ether_addr(adapter->hw.mac.addr); +	} +	ether_addr_copy(netdev->dev_addr, adapter->hw.mac.addr); +	ether_addr_copy(netdev->perm_addr, adapter->hw.mac.addr); + +	INIT_LIST_HEAD(&adapter->mac_filter_list); +	INIT_LIST_HEAD(&adapter->vlan_filter_list); +	f = kzalloc(sizeof(*f), GFP_ATOMIC); +	if (NULL == f) +		goto err_sw_init; + +	ether_addr_copy(f->macaddr, adapter->hw.mac.addr); +	f->add = true; +	adapter->aq_required |= I40EVF_FLAG_AQ_ADD_MAC_FILTER; + +	list_add(&f->list, &adapter->mac_filter_list); + +	init_timer(&adapter->watchdog_timer); +	adapter->watchdog_timer.function = &i40evf_watchdog_timer; +	adapter->watchdog_timer.data = (unsigned long)adapter; +	mod_timer(&adapter->watchdog_timer, jiffies + 1); + +	adapter->tx_desc_count = I40EVF_DEFAULT_TXD; +	adapter->rx_desc_count = I40EVF_DEFAULT_RXD; +	err = i40evf_init_interrupt_scheme(adapter); +	if (err) +		goto err_sw_init; +	i40evf_map_rings_to_vectors(adapter); +	i40evf_configure_rss(adapter); +	err = i40evf_request_misc_irq(adapter); +	if (err) +		goto err_sw_init; + +	netif_carrier_off(netdev); + +	adapter->vsi.id = adapter->vsi_res->vsi_id; +	adapter->vsi.seid = adapter->vsi_res->vsi_id; /* dummy */ +	adapter->vsi.back = adapter; +	adapter->vsi.base_vector = 1; +	adapter->vsi.work_limit = I40E_DEFAULT_IRQ_WORK; +	adapter->vsi.rx_itr_setting = (I40E_ITR_DYNAMIC | +				       ITR_REG_TO_USEC(I40E_ITR_RX_DEF)); +	adapter->vsi.tx_itr_setting = (I40E_ITR_DYNAMIC | +				       ITR_REG_TO_USEC(I40E_ITR_TX_DEF)); +	adapter->vsi.netdev = adapter->netdev; + +	if (!adapter->netdev_registered) { +		err = register_netdev(netdev); +		if (err) +			goto err_register; +	} + +	adapter->netdev_registered = true; + +	netif_tx_stop_all_queues(netdev); + +	dev_info(&pdev->dev, "MAC address: %pM\n", adapter->hw.mac.addr); +	if (netdev->features & NETIF_F_GRO) +		dev_info(&pdev->dev, "GRO is enabled\n"); + +	dev_info(&pdev->dev, "%s\n", i40evf_driver_string); +	adapter->state = __I40EVF_DOWN; +	set_bit(__I40E_DOWN, &adapter->vsi.state); +	i40evf_misc_irq_enable(adapter); +	return; +restart: +	schedule_delayed_work(&adapter->init_task, +			      msecs_to_jiffies(50)); +	return; + +err_register: +	i40evf_free_misc_irq(adapter); +err_sw_init: +	i40evf_reset_interrupt_capability(adapter); +err_alloc: +	kfree(adapter->vf_res); +	adapter->vf_res = NULL; +err: +	/* Things went into the weeds, so try again later */ +	if (++adapter->aq_wait_count > I40EVF_AQ_MAX_ERR) { +		dev_err(&pdev->dev, "Failed to communicate with PF; giving up\n"); +		adapter->flags |= I40EVF_FLAG_PF_COMMS_FAILED; +		return; /* do not reschedule */ +	} +	schedule_delayed_work(&adapter->init_task, HZ * 3); +} + +/** + * i40evf_shutdown - Shutdown the device in preparation for a reboot + * @pdev: pci device structure + **/ +static void i40evf_shutdown(struct pci_dev *pdev) +{ +	struct net_device *netdev = pci_get_drvdata(pdev); + +	netif_device_detach(netdev); + +	if (netif_running(netdev)) +		i40evf_close(netdev); + +#ifdef CONFIG_PM +	pci_save_state(pdev); + +#endif +	pci_disable_device(pdev); +} + +/** + * i40evf_probe - Device Initialization Routine + * @pdev: PCI device information struct + * @ent: entry in i40evf_pci_tbl + * + * Returns 0 on success, negative on failure + * + * i40evf_probe initializes an adapter identified by a pci_dev structure. + * The OS initialization, configuring of the adapter private structure, + * and a hardware reset occur. + **/ +static int i40evf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ +	struct net_device *netdev; +	struct i40evf_adapter *adapter = NULL; +	struct i40e_hw *hw = NULL; +	int err; + +	err = pci_enable_device(pdev); +	if (err) +		return err; + +	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); +	if (err) { +		err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); +		if (err) { +			dev_err(&pdev->dev, +				"DMA configuration failed: 0x%x\n", err); +			goto err_dma; +		} +	} + +	err = pci_request_regions(pdev, i40evf_driver_name); +	if (err) { +		dev_err(&pdev->dev, +			"pci_request_regions failed 0x%x\n", err); +		goto err_pci_reg; +	} + +	pci_enable_pcie_error_reporting(pdev); + +	pci_set_master(pdev); + +	netdev = alloc_etherdev_mq(sizeof(struct i40evf_adapter), +				   MAX_TX_QUEUES); +	if (!netdev) { +		err = -ENOMEM; +		goto err_alloc_etherdev; +	} + +	SET_NETDEV_DEV(netdev, &pdev->dev); + +	pci_set_drvdata(pdev, netdev); +	adapter = netdev_priv(netdev); + +	adapter->netdev = netdev; +	adapter->pdev = pdev; + +	hw = &adapter->hw; +	hw->back = adapter; + +	adapter->msg_enable = (1 << DEFAULT_DEBUG_LEVEL_SHIFT) - 1; +	adapter->state = __I40EVF_STARTUP; + +	/* Call save state here because it relies on the adapter struct. */ +	pci_save_state(pdev); + +	hw->hw_addr = ioremap(pci_resource_start(pdev, 0), +			      pci_resource_len(pdev, 0)); +	if (!hw->hw_addr) { +		err = -EIO; +		goto err_ioremap; +	} +	hw->vendor_id = pdev->vendor; +	hw->device_id = pdev->device; +	pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); +	hw->subsystem_vendor_id = pdev->subsystem_vendor; +	hw->subsystem_device_id = pdev->subsystem_device; +	hw->bus.device = PCI_SLOT(pdev->devfn); +	hw->bus.func = PCI_FUNC(pdev->devfn); + +	INIT_WORK(&adapter->reset_task, i40evf_reset_task); +	INIT_WORK(&adapter->adminq_task, i40evf_adminq_task); +	INIT_WORK(&adapter->watchdog_task, i40evf_watchdog_task); +	INIT_DELAYED_WORK(&adapter->init_task, i40evf_init_task); +	schedule_delayed_work(&adapter->init_task, 10); + +	return 0; + +err_ioremap: +	free_netdev(netdev); +err_alloc_etherdev: +	pci_release_regions(pdev); +err_pci_reg: +err_dma: +	pci_disable_device(pdev); +	return err; +} + +#ifdef CONFIG_PM +/** + * i40evf_suspend - Power management suspend routine + * @pdev: PCI device information struct + * @state: unused + * + * Called when the system (VM) is entering sleep/suspend. + **/ +static int i40evf_suspend(struct pci_dev *pdev, pm_message_t state) +{ +	struct net_device *netdev = pci_get_drvdata(pdev); +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	int retval = 0; + +	netif_device_detach(netdev); + +	if (netif_running(netdev)) { +		rtnl_lock(); +		i40evf_down(adapter); +		rtnl_unlock(); +	} +	i40evf_free_misc_irq(adapter); +	i40evf_reset_interrupt_capability(adapter); + +	retval = pci_save_state(pdev); +	if (retval) +		return retval; + +	pci_disable_device(pdev); + +	return 0; +} + +/** + * i40evf_resume - Power managment resume routine + * @pdev: PCI device information struct + * + * Called when the system (VM) is resumed from sleep/suspend. + **/ +static int i40evf_resume(struct pci_dev *pdev) +{ +	struct i40evf_adapter *adapter = pci_get_drvdata(pdev); +	struct net_device *netdev = adapter->netdev; +	u32 err; + +	pci_set_power_state(pdev, PCI_D0); +	pci_restore_state(pdev); +	/* pci_restore_state clears dev->state_saved so call +	 * pci_save_state to restore it. +	 */ +	pci_save_state(pdev); + +	err = pci_enable_device_mem(pdev); +	if (err) { +		dev_err(&pdev->dev, "Cannot enable PCI device from suspend.\n"); +		return err; +	} +	pci_set_master(pdev); + +	rtnl_lock(); +	err = i40evf_set_interrupt_capability(adapter); +	if (err) { +		dev_err(&pdev->dev, "Cannot enable MSI-X interrupts.\n"); +		return err; +	} +	err = i40evf_request_misc_irq(adapter); +	rtnl_unlock(); +	if (err) { +		dev_err(&pdev->dev, "Cannot get interrupt vector.\n"); +		return err; +	} + +	schedule_work(&adapter->reset_task); + +	netif_device_attach(netdev); + +	return err; +} + +#endif /* CONFIG_PM */ +/** + * i40evf_remove - Device Removal Routine + * @pdev: PCI device information struct + * + * i40evf_remove is called by the PCI subsystem to alert the driver + * that it should release a PCI device.  The could be caused by a + * Hot-Plug event, or because the driver is going to be removed from + * memory. + **/ +static void i40evf_remove(struct pci_dev *pdev) +{ +	struct net_device *netdev = pci_get_drvdata(pdev); +	struct i40evf_adapter *adapter = netdev_priv(netdev); +	struct i40e_hw *hw = &adapter->hw; + +	cancel_delayed_work_sync(&adapter->init_task); +	cancel_work_sync(&adapter->reset_task); + +	if (adapter->netdev_registered) { +		unregister_netdev(netdev); +		adapter->netdev_registered = false; +	} +	adapter->state = __I40EVF_REMOVE; + +	if (adapter->msix_entries) { +		i40evf_misc_irq_disable(adapter); +		i40evf_free_misc_irq(adapter); +		i40evf_reset_interrupt_capability(adapter); +	} + +	del_timer_sync(&adapter->watchdog_timer); +	flush_scheduled_work(); + +	if (hw->aq.asq.count) +		i40evf_shutdown_adminq(hw); + +	iounmap(hw->hw_addr); +	pci_release_regions(pdev); + +	i40evf_free_queues(adapter); +	kfree(adapter->vf_res); + +	free_netdev(netdev); + +	pci_disable_pcie_error_reporting(pdev); + +	pci_disable_device(pdev); +} + +static struct pci_driver i40evf_driver = { +	.name     = i40evf_driver_name, +	.id_table = i40evf_pci_tbl, +	.probe    = i40evf_probe, +	.remove   = i40evf_remove, +#ifdef CONFIG_PM +	.suspend  = i40evf_suspend, +	.resume   = i40evf_resume, +#endif +	.shutdown = i40evf_shutdown, +}; + +/** + * i40e_init_module - Driver Registration Routine + * + * i40e_init_module is the first routine called when the driver is + * loaded. All it does is register with the PCI subsystem. + **/ +static int __init i40evf_init_module(void) +{ +	int ret; +	pr_info("i40evf: %s - version %s\n", i40evf_driver_string, +	       i40evf_driver_version); + +	pr_info("%s\n", i40evf_copyright); + +	ret = pci_register_driver(&i40evf_driver); +	return ret; +} + +module_init(i40evf_init_module); + +/** + * i40e_exit_module - Driver Exit Cleanup Routine + * + * i40e_exit_module is called just before the driver is removed + * from memory. + **/ +static void __exit i40evf_exit_module(void) +{ +	pci_unregister_driver(&i40evf_driver); +} + +module_exit(i40evf_exit_module); + +/* i40evf_main.c */ diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c b/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c new file mode 100644 index 00000000000..2dc0bac7671 --- /dev/null +++ b/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c @@ -0,0 +1,781 @@ +/******************************************************************************* + * + * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver + * Copyright(c) 2013 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program.  If not, see <http://www.gnu.org/licenses/>. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + * + ******************************************************************************/ + +#include "i40evf.h" +#include "i40e_prototype.h" + +/* busy wait delay in msec */ +#define I40EVF_BUSY_WAIT_DELAY 10 +#define I40EVF_BUSY_WAIT_COUNT 50 + +/** + * i40evf_send_pf_msg + * @adapter: adapter structure + * @op: virtual channel opcode + * @msg: pointer to message buffer + * @len: message length + * + * Send message to PF and print status if failure. + **/ +static int i40evf_send_pf_msg(struct i40evf_adapter *adapter, +			      enum i40e_virtchnl_ops op, u8 *msg, u16 len) +{ +	struct i40e_hw *hw = &adapter->hw; +	i40e_status err; + +	if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) +		return 0; /* nothing to see here, move along */ + +	err = i40e_aq_send_msg_to_pf(hw, op, 0, msg, len, NULL); +	if (err) +		dev_err(&adapter->pdev->dev, "Unable to send opcode %d to PF, error %d, aq status %d\n", +			op, err, hw->aq.asq_last_status); +	return err; +} + +/** + * i40evf_send_api_ver + * @adapter: adapter structure + * + * Send API version admin queue message to the PF. The reply is not checked + * in this function. Returns 0 if the message was successfully + * sent, or one of the I40E_ADMIN_QUEUE_ERROR_ statuses if not. + **/ +int i40evf_send_api_ver(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_version_info vvi; + +	vvi.major = I40E_VIRTCHNL_VERSION_MAJOR; +	vvi.minor = I40E_VIRTCHNL_VERSION_MINOR; + +	return i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_VERSION, (u8 *)&vvi, +				  sizeof(vvi)); +} + +/** + * i40evf_verify_api_ver + * @adapter: adapter structure + * + * Compare API versions with the PF. Must be called after admin queue is + * initialized. Returns 0 if API versions match, -EIO if + * they do not, or I40E_ERR_ADMIN_QUEUE_NO_WORK if the admin queue is empty. + **/ +int i40evf_verify_api_ver(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_version_info *pf_vvi; +	struct i40e_hw *hw = &adapter->hw; +	struct i40e_arq_event_info event; +	i40e_status err; + +	event.msg_size = I40EVF_MAX_AQ_BUF_SIZE; +	event.msg_buf = kzalloc(event.msg_size, GFP_KERNEL); +	if (!event.msg_buf) { +		err = -ENOMEM; +		goto out; +	} + +	err = i40evf_clean_arq_element(hw, &event, NULL); +	if (err == I40E_ERR_ADMIN_QUEUE_NO_WORK) +		goto out_alloc; + +	err = (i40e_status)le32_to_cpu(event.desc.cookie_low); +	if (err) { +		err = -EIO; +		goto out_alloc; +	} + +	if ((enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high) != +	    I40E_VIRTCHNL_OP_VERSION) { +		err = -EIO; +		goto out_alloc; +	} + +	pf_vvi = (struct i40e_virtchnl_version_info *)event.msg_buf; +	if ((pf_vvi->major != I40E_VIRTCHNL_VERSION_MAJOR) || +	    (pf_vvi->minor != I40E_VIRTCHNL_VERSION_MINOR)) +		err = -EIO; + +out_alloc: +	kfree(event.msg_buf); +out: +	return err; +} + +/** + * i40evf_send_vf_config_msg + * @adapter: adapter structure + * + * Send VF configuration request admin queue message to the PF. The reply + * is not checked in this function. Returns 0 if the message was + * successfully sent, or one of the I40E_ADMIN_QUEUE_ERROR_ statuses if not. + **/ +int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter) +{ +	return i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_GET_VF_RESOURCES, +				  NULL, 0); +} + +/** + * i40evf_get_vf_config + * @hw: pointer to the hardware structure + * @len: length of buffer + * + * Get VF configuration from PF and populate hw structure. Must be called after + * admin queue is initialized. Busy waits until response is received from PF, + * with maximum timeout. Response from PF is returned in the buffer for further + * processing by the caller. + **/ +int i40evf_get_vf_config(struct i40evf_adapter *adapter) +{ +	struct i40e_hw *hw = &adapter->hw; +	struct i40e_arq_event_info event; +	u16 len; +	i40e_status err; + +	len =  sizeof(struct i40e_virtchnl_vf_resource) + +		I40E_MAX_VF_VSI * sizeof(struct i40e_virtchnl_vsi_resource); +	event.msg_size = len; +	event.msg_buf = kzalloc(event.msg_size, GFP_KERNEL); +	if (!event.msg_buf) { +		err = -ENOMEM; +		goto out; +	} + +	err = i40evf_clean_arq_element(hw, &event, NULL); +	if (err == I40E_ERR_ADMIN_QUEUE_NO_WORK) +		goto out_alloc; + +	err = (i40e_status)le32_to_cpu(event.desc.cookie_low); +	if (err) { +		dev_err(&adapter->pdev->dev, +			"%s: Error returned from PF, %d, %d\n", __func__, +			le32_to_cpu(event.desc.cookie_high), +			le32_to_cpu(event.desc.cookie_low)); +		err = -EIO; +		goto out_alloc; +	} + +	if ((enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high) != +	    I40E_VIRTCHNL_OP_GET_VF_RESOURCES) { +		dev_err(&adapter->pdev->dev, +			"%s: Invalid response from PF, %d, %d\n", __func__, +			le32_to_cpu(event.desc.cookie_high), +			le32_to_cpu(event.desc.cookie_low)); +		err = -EIO; +		goto out_alloc; +	} +	memcpy(adapter->vf_res, event.msg_buf, min(event.msg_size, len)); + +	i40e_vf_parse_hw_config(hw, adapter->vf_res); +out_alloc: +	kfree(event.msg_buf); +out: +	return err; +} + +/** + * i40evf_configure_queues + * @adapter: adapter structure + * + * Request that the PF set up our (previously allocated) queues. + **/ +void i40evf_configure_queues(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_vsi_queue_config_info *vqci; +	struct i40e_virtchnl_queue_pair_info *vqpi; +	int pairs = adapter->vsi_res->num_queue_pairs; +	int i, len; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES; +	len = sizeof(struct i40e_virtchnl_vsi_queue_config_info) + +		       (sizeof(struct i40e_virtchnl_queue_pair_info) * pairs); +	vqci = kzalloc(len, GFP_ATOMIC); +	if (!vqci) +		return; + +	vqci->vsi_id = adapter->vsi_res->vsi_id; +	vqci->num_queue_pairs = pairs; +	vqpi = vqci->qpair; +	/* Size check is not needed here - HW max is 16 queue pairs, and we +	 * can fit info for 31 of them into the AQ buffer before it overflows. +	 */ +	for (i = 0; i < pairs; i++) { +		vqpi->txq.vsi_id = vqci->vsi_id; +		vqpi->txq.queue_id = i; +		vqpi->txq.ring_len = adapter->tx_rings[i]->count; +		vqpi->txq.dma_ring_addr = adapter->tx_rings[i]->dma; +		vqpi->txq.headwb_enabled = 1; +		vqpi->txq.dma_headwb_addr = vqpi->txq.dma_ring_addr + +		    (vqpi->txq.ring_len * sizeof(struct i40e_tx_desc)); + +		vqpi->rxq.vsi_id = vqci->vsi_id; +		vqpi->rxq.queue_id = i; +		vqpi->rxq.ring_len = adapter->rx_rings[i]->count; +		vqpi->rxq.dma_ring_addr = adapter->rx_rings[i]->dma; +		vqpi->rxq.max_pkt_size = adapter->netdev->mtu +					+ ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN; +		vqpi->rxq.databuffer_size = adapter->rx_rings[i]->rx_buf_len; +		vqpi++; +	} + +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES, +			   (u8 *)vqci, len); +	kfree(vqci); +	adapter->aq_pending |= I40EVF_FLAG_AQ_CONFIGURE_QUEUES; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_CONFIGURE_QUEUES; +} + +/** + * i40evf_enable_queues + * @adapter: adapter structure + * + * Request that the PF enable all of our queues. + **/ +void i40evf_enable_queues(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_queue_select vqs; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_ENABLE_QUEUES; +	vqs.vsi_id = adapter->vsi_res->vsi_id; +	vqs.tx_queues = (1 << adapter->vsi_res->num_queue_pairs) - 1; +	vqs.rx_queues = vqs.tx_queues; +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ENABLE_QUEUES, +			   (u8 *)&vqs, sizeof(vqs)); +	adapter->aq_pending |= I40EVF_FLAG_AQ_ENABLE_QUEUES; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_ENABLE_QUEUES; +} + +/** + * i40evf_disable_queues + * @adapter: adapter structure + * + * Request that the PF disable all of our queues. + **/ +void i40evf_disable_queues(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_queue_select vqs; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_DISABLE_QUEUES; +	vqs.vsi_id = adapter->vsi_res->vsi_id; +	vqs.tx_queues = (1 << adapter->vsi_res->num_queue_pairs) - 1; +	vqs.rx_queues = vqs.tx_queues; +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DISABLE_QUEUES, +			   (u8 *)&vqs, sizeof(vqs)); +	adapter->aq_pending |= I40EVF_FLAG_AQ_DISABLE_QUEUES; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_DISABLE_QUEUES; +} + +/** + * i40evf_map_queues + * @adapter: adapter structure + * + * Request that the PF map queues to interrupt vectors. Misc causes, including + * admin queue, are always mapped to vector 0. + **/ +void i40evf_map_queues(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_irq_map_info *vimi; +	int v_idx, q_vectors, len; +	struct i40e_q_vector *q_vector; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP; + +	q_vectors = adapter->num_msix_vectors - NONQ_VECS; + +	len = sizeof(struct i40e_virtchnl_irq_map_info) + +	      (adapter->num_msix_vectors * +		sizeof(struct i40e_virtchnl_vector_map)); +	vimi = kzalloc(len, GFP_ATOMIC); +	if (!vimi) +		return; + +	vimi->num_vectors = adapter->num_msix_vectors; +	/* Queue vectors first */ +	for (v_idx = 0; v_idx < q_vectors; v_idx++) { +		q_vector = adapter->q_vector[v_idx]; +		vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id; +		vimi->vecmap[v_idx].vector_id = v_idx + NONQ_VECS; +		vimi->vecmap[v_idx].txq_map = q_vector->ring_mask; +		vimi->vecmap[v_idx].rxq_map = q_vector->ring_mask; +	} +	/* Misc vector last - this is only for AdminQ messages */ +	vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id; +	vimi->vecmap[v_idx].vector_id = 0; +	vimi->vecmap[v_idx].txq_map = 0; +	vimi->vecmap[v_idx].rxq_map = 0; + +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP, +			   (u8 *)vimi, len); +	kfree(vimi); +	adapter->aq_pending |= I40EVF_FLAG_AQ_MAP_VECTORS; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_MAP_VECTORS; +} + +/** + * i40evf_add_ether_addrs + * @adapter: adapter structure + * @addrs: the MAC address filters to add (contiguous) + * @count: number of filters + * + * Request that the PF add one or more addresses to our filters. + **/ +void i40evf_add_ether_addrs(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_ether_addr_list *veal; +	int len, i = 0, count = 0; +	struct i40evf_mac_filter *f; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	list_for_each_entry(f, &adapter->mac_filter_list, list) { +		if (f->add) +			count++; +	} +	if (!count) { +		adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER; +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS; + +	len = sizeof(struct i40e_virtchnl_ether_addr_list) + +	      (count * sizeof(struct i40e_virtchnl_ether_addr)); +	if (len > I40EVF_MAX_AQ_BUF_SIZE) { +		dev_warn(&adapter->pdev->dev, "%s: Too many MAC address changes in one request\n", +			__func__); +		count = (I40EVF_MAX_AQ_BUF_SIZE - +			 sizeof(struct i40e_virtchnl_ether_addr_list)) / +			sizeof(struct i40e_virtchnl_ether_addr); +		len = I40EVF_MAX_AQ_BUF_SIZE; +	} + +	veal = kzalloc(len, GFP_ATOMIC); +	if (!veal) +		return; + +	veal->vsi_id = adapter->vsi_res->vsi_id; +	veal->num_elements = count; +	list_for_each_entry(f, &adapter->mac_filter_list, list) { +		if (f->add) { +			ether_addr_copy(veal->list[i].addr, f->macaddr); +			i++; +			f->add = false; +		} +	} +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS, +			   (u8 *)veal, len); +	kfree(veal); +	adapter->aq_pending |= I40EVF_FLAG_AQ_ADD_MAC_FILTER; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER; + +} + +/** + * i40evf_del_ether_addrs + * @adapter: adapter structure + * @addrs: the MAC address filters to remove (contiguous) + * @count: number of filtes + * + * Request that the PF remove one or more addresses from our filters. + **/ +void i40evf_del_ether_addrs(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_ether_addr_list *veal; +	struct i40evf_mac_filter *f, *ftmp; +	int len, i = 0, count = 0; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	list_for_each_entry(f, &adapter->mac_filter_list, list) { +		if (f->remove) +			count++; +	} +	if (!count) { +		adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER; +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS; + +	len = sizeof(struct i40e_virtchnl_ether_addr_list) + +	      (count * sizeof(struct i40e_virtchnl_ether_addr)); +	if (len > I40EVF_MAX_AQ_BUF_SIZE) { +		dev_warn(&adapter->pdev->dev, "%s: Too many MAC address changes in one request\n", +			__func__); +		count = (I40EVF_MAX_AQ_BUF_SIZE - +			 sizeof(struct i40e_virtchnl_ether_addr_list)) / +			sizeof(struct i40e_virtchnl_ether_addr); +		len = I40EVF_MAX_AQ_BUF_SIZE; +	} +	veal = kzalloc(len, GFP_ATOMIC); +	if (!veal) +		return; + +	veal->vsi_id = adapter->vsi_res->vsi_id; +	veal->num_elements = count; +	list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) { +		if (f->remove) { +			ether_addr_copy(veal->list[i].addr, f->macaddr); +			i++; +			list_del(&f->list); +			kfree(f); +		} +	} +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS, +			   (u8 *)veal, len); +	kfree(veal); +	adapter->aq_pending |= I40EVF_FLAG_AQ_DEL_MAC_FILTER; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER; +} + +/** + * i40evf_add_vlans + * @adapter: adapter structure + * @vlans: the VLANs to add + * @count: number of VLANs + * + * Request that the PF add one or more VLAN filters to our VSI. + **/ +void i40evf_add_vlans(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_vlan_filter_list *vvfl; +	int len, i = 0, count = 0; +	struct i40evf_vlan_filter *f; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} + +	list_for_each_entry(f, &adapter->vlan_filter_list, list) { +		if (f->add) +			count++; +	} +	if (!count) { +		adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER; +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_ADD_VLAN; + +	len = sizeof(struct i40e_virtchnl_vlan_filter_list) + +	      (count * sizeof(u16)); +	if (len > I40EVF_MAX_AQ_BUF_SIZE) { +		dev_warn(&adapter->pdev->dev, "%s: Too many VLAN changes in one request\n", +			__func__); +		count = (I40EVF_MAX_AQ_BUF_SIZE - +			 sizeof(struct i40e_virtchnl_vlan_filter_list)) / +			sizeof(u16); +		len = I40EVF_MAX_AQ_BUF_SIZE; +	} +	vvfl = kzalloc(len, GFP_ATOMIC); +	if (!vvfl) +		return; + +	vvfl->vsi_id = adapter->vsi_res->vsi_id; +	vvfl->num_elements = count; +	list_for_each_entry(f, &adapter->vlan_filter_list, list) { +		if (f->add) { +			vvfl->vlan_id[i] = f->vlan; +			i++; +			f->add = false; +		} +	} +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_VLAN, (u8 *)vvfl, len); +	kfree(vvfl); +	adapter->aq_pending |= I40EVF_FLAG_AQ_ADD_VLAN_FILTER; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER; +} + +/** + * i40evf_del_vlans + * @adapter: adapter structure + * @vlans: the VLANs to remove + * @count: number of VLANs + * + * Request that the PF remove one or more VLAN filters from our VSI. + **/ +void i40evf_del_vlans(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_vlan_filter_list *vvfl; +	struct i40evf_vlan_filter *f, *ftmp; +	int len, i = 0, count = 0; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} + +	list_for_each_entry(f, &adapter->vlan_filter_list, list) { +		if (f->remove) +			count++; +	} +	if (!count) { +		adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER; +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_DEL_VLAN; + +	len = sizeof(struct i40e_virtchnl_vlan_filter_list) + +	      (count * sizeof(u16)); +	if (len > I40EVF_MAX_AQ_BUF_SIZE) { +		dev_warn(&adapter->pdev->dev, "%s: Too many VLAN changes in one request\n", +			__func__); +		count = (I40EVF_MAX_AQ_BUF_SIZE - +			 sizeof(struct i40e_virtchnl_vlan_filter_list)) / +			sizeof(u16); +		len = I40EVF_MAX_AQ_BUF_SIZE; +	} +	vvfl = kzalloc(len, GFP_ATOMIC); +	if (!vvfl) +		return; + +	vvfl->vsi_id = adapter->vsi_res->vsi_id; +	vvfl->num_elements = count; +	list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { +		if (f->remove) { +			vvfl->vlan_id[i] = f->vlan; +			i++; +			list_del(&f->list); +			kfree(f); +		} +	} +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_VLAN, (u8 *)vvfl, len); +	kfree(vvfl); +	adapter->aq_pending |= I40EVF_FLAG_AQ_DEL_VLAN_FILTER; +	adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER; +} + +/** + * i40evf_set_promiscuous + * @adapter: adapter structure + * @flags: bitmask to control unicast/multicast promiscuous. + * + * Request that the PF enable promiscuous mode for our VSI. + **/ +void i40evf_set_promiscuous(struct i40evf_adapter *adapter, int flags) +{ +	struct i40e_virtchnl_promisc_info vpi; + +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* bail because we already have a command pending */ +		dev_err(&adapter->pdev->dev, "%s: command %d pending\n", +			__func__, adapter->current_op); +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE; +	vpi.vsi_id = adapter->vsi_res->vsi_id; +	vpi.flags = flags; +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, +			   (u8 *)&vpi, sizeof(vpi)); +} + +/** + * i40evf_request_stats + * @adapter: adapter structure + * + * Request VSI statistics from PF. + **/ +void i40evf_request_stats(struct i40evf_adapter *adapter) +{ +	struct i40e_virtchnl_queue_select vqs; +	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) { +		/* no error message, this isn't crucial */ +		return; +	} +	adapter->current_op = I40E_VIRTCHNL_OP_GET_STATS; +	vqs.vsi_id = adapter->vsi_res->vsi_id; +	/* queue maps are ignored for this message - only the vsi is used */ +	if (i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_GET_STATS, +			       (u8 *)&vqs, sizeof(vqs))) +		/* if the request failed, don't lock out others */ +		adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; +} +/** + * i40evf_request_reset + * @adapter: adapter structure + * + * Request that the PF reset this VF. No response is expected. + **/ +void i40evf_request_reset(struct i40evf_adapter *adapter) +{ +	/* Don't check CURRENT_OP - this is always higher priority */ +	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_RESET_VF, NULL, 0); +	adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; +} + +/** + * i40evf_virtchnl_completion + * @adapter: adapter structure + * @v_opcode: opcode sent by PF + * @v_retval: retval sent by PF + * @msg: message sent by PF + * @msglen: message length + * + * Asynchronous completion function for admin queue messages. Rather than busy + * wait, we fire off our requests and assume that no errors will be returned. + * This function handles the reply messages. + **/ +void i40evf_virtchnl_completion(struct i40evf_adapter *adapter, +				enum i40e_virtchnl_ops v_opcode, +				i40e_status v_retval, +				u8 *msg, u16 msglen) +{ +	struct net_device *netdev = adapter->netdev; + +	if (v_opcode == I40E_VIRTCHNL_OP_EVENT) { +		struct i40e_virtchnl_pf_event *vpe = +			(struct i40e_virtchnl_pf_event *)msg; +		switch (vpe->event) { +		case I40E_VIRTCHNL_EVENT_LINK_CHANGE: +			adapter->link_up = +				vpe->event_data.link_event.link_status; +			if (adapter->link_up && !netif_carrier_ok(netdev)) { +				dev_info(&adapter->pdev->dev, "NIC Link is Up\n"); +				netif_carrier_on(netdev); +				netif_tx_wake_all_queues(netdev); +			} else if (!adapter->link_up) { +				dev_info(&adapter->pdev->dev, "NIC Link is Down\n"); +				netif_carrier_off(netdev); +				netif_tx_stop_all_queues(netdev); +			} +			break; +		case I40E_VIRTCHNL_EVENT_RESET_IMPENDING: +			dev_info(&adapter->pdev->dev, "PF reset warning received\n"); +			if (!(adapter->flags & I40EVF_FLAG_RESET_PENDING)) { +				adapter->flags |= I40EVF_FLAG_RESET_PENDING; +				dev_info(&adapter->pdev->dev, "Scheduling reset task\n"); +				schedule_work(&adapter->reset_task); +			} +			break; +		default: +			dev_err(&adapter->pdev->dev, +				"%s: Unknown event %d from pf\n", +				__func__, vpe->event); +			break; + +		} +		return; +	} +	if (v_opcode != adapter->current_op) { +		dev_err(&adapter->pdev->dev, "%s: Pending op is %d, received %d\n", +			__func__, adapter->current_op, v_opcode); +		/* We're probably completely screwed at this point, but clear +		 * the current op and try to carry on.... +		 */ +		adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; +		return; +	} +	if (v_retval) { +		dev_err(&adapter->pdev->dev, "%s: PF returned error %d to our request %d\n", +			__func__, v_retval, v_opcode); +	} +	switch (v_opcode) { +	case I40E_VIRTCHNL_OP_GET_STATS: { +		struct i40e_eth_stats *stats = +			(struct i40e_eth_stats *)msg; +		adapter->net_stats.rx_packets = stats->rx_unicast + +						 stats->rx_multicast + +						 stats->rx_broadcast; +		adapter->net_stats.tx_packets = stats->tx_unicast + +						 stats->tx_multicast + +						 stats->tx_broadcast; +		adapter->net_stats.rx_bytes = stats->rx_bytes; +		adapter->net_stats.tx_bytes = stats->tx_bytes; +		adapter->net_stats.tx_errors = stats->tx_errors; +		adapter->net_stats.rx_dropped = stats->rx_discards; +		adapter->net_stats.tx_dropped = stats->tx_discards; +		adapter->current_stats = *stats; +		} +		break; +	case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_ADD_MAC_FILTER); +		break; +	case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_DEL_MAC_FILTER); +		break; +	case I40E_VIRTCHNL_OP_ADD_VLAN: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_ADD_VLAN_FILTER); +		break; +	case I40E_VIRTCHNL_OP_DEL_VLAN: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_DEL_VLAN_FILTER); +		break; +	case I40E_VIRTCHNL_OP_ENABLE_QUEUES: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_ENABLE_QUEUES); +		/* enable transmits */ +		i40evf_irq_enable(adapter, true); +		netif_tx_start_all_queues(adapter->netdev); +		netif_carrier_on(adapter->netdev); +		break; +	case I40E_VIRTCHNL_OP_DISABLE_QUEUES: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_DISABLE_QUEUES); +		break; +	case I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_CONFIGURE_QUEUES); +		break; +	case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP: +		adapter->aq_pending &= ~(I40EVF_FLAG_AQ_MAP_VECTORS); +		break; +	default: +		dev_warn(&adapter->pdev->dev, "%s: Received unexpected message %d from PF\n", +			__func__, v_opcode); +		break; +	} /* switch v_opcode */ +	adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN; +}  | 
