net/i40e/base: new AQ commands for cloud filter
Add new admin queue function and extended fields for cloud filter: - Add admin queue function for Replace filter command (Opcode: 0x025F) - Define big buffer for extended general fields in Add/Remove Cloud filters command Signed-off-by: Laura Stroe <laura.stroe@intel.com> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com> Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
This commit is contained in:
parent
1661615d9a
commit
de2cd512b1
@ -194,6 +194,7 @@ enum i40e_admin_queue_opc {
|
||||
i40e_aqc_opc_add_cloud_filters = 0x025C,
|
||||
i40e_aqc_opc_remove_cloud_filters = 0x025D,
|
||||
i40e_aqc_opc_clear_wol_switch_filters = 0x025E,
|
||||
i40e_aqc_opc_replace_cloud_filters = 0x025F,
|
||||
|
||||
i40e_aqc_opc_add_mirror_rule = 0x0260,
|
||||
i40e_aqc_opc_delete_mirror_rule = 0x0261,
|
||||
@ -1329,7 +1330,9 @@ struct i40e_aqc_add_remove_cloud_filters {
|
||||
#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];
|
||||
u8 big_buffer_flag;
|
||||
#define I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER 1
|
||||
u8 reserved2[3];
|
||||
__le32 addr_high;
|
||||
__le32 addr_low;
|
||||
};
|
||||
@ -1366,6 +1369,7 @@ struct i40e_aqc_add_remove_cloud_filters_element_data {
|
||||
#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
|
||||
/* 0x0010 to 0x0017 is for custom filters */
|
||||
|
||||
#define I40E_AQC_ADD_CLOUD_FLAGS_TO_QUEUE 0x0080
|
||||
#define I40E_AQC_ADD_CLOUD_VNK_SHIFT 6
|
||||
@ -1400,6 +1404,46 @@ struct i40e_aqc_add_remove_cloud_filters_element_data {
|
||||
u8 response_reserved[7];
|
||||
};
|
||||
|
||||
/* i40e_aqc_add_rm_cloud_filt_elem_ext is used when
|
||||
* I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER flag is set. refer to
|
||||
* DCR288
|
||||
*/
|
||||
struct i40e_aqc_add_rm_cloud_filt_elem_ext {
|
||||
struct i40e_aqc_add_remove_cloud_filters_element_data element;
|
||||
u16 general_fields[32];
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X10_WORD0 0
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X10_WORD1 1
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X10_WORD2 2
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X11_WORD0 3
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X11_WORD1 4
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X11_WORD2 5
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X12_WORD0 6
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X12_WORD1 7
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X12_WORD2 8
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X13_WORD0 9
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X13_WORD1 10
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X13_WORD2 11
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X14_WORD0 12
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X14_WORD1 13
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X14_WORD2 14
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD0 15
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD1 16
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD2 17
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD3 18
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD4 19
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD5 20
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD6 21
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X16_WORD7 22
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD0 23
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD1 24
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD2 25
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD3 26
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD4 27
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD5 28
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD6 29
|
||||
#define I40E_AQC_ADD_CLOUD_FV_FLU_0X17_WORD7 30
|
||||
};
|
||||
|
||||
struct i40e_aqc_remove_cloud_filters_completion {
|
||||
__le16 perfect_ovlan_used;
|
||||
__le16 perfect_ovlan_free;
|
||||
@ -1411,6 +1455,54 @@ struct i40e_aqc_remove_cloud_filters_completion {
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_remove_cloud_filters_completion);
|
||||
|
||||
/* Replace filter Command 0x025F
|
||||
* uses the i40e_aqc_replace_cloud_filters,
|
||||
* and the generic indirect completion structure
|
||||
*/
|
||||
struct i40e_filter_data {
|
||||
u8 filter_type;
|
||||
u8 input[3];
|
||||
};
|
||||
|
||||
struct i40e_aqc_replace_cloud_filters_cmd {
|
||||
u8 valid_flags;
|
||||
#define I40E_AQC_REPLACE_L1_FILTER 0x0
|
||||
#define I40E_AQC_REPLACE_CLOUD_FILTER 0x1
|
||||
#define I40E_AQC_GET_CLOUD_FILTERS 0x2
|
||||
#define I40E_AQC_MIRROR_CLOUD_FILTER 0x4
|
||||
#define I40E_AQC_HIGH_PRIORITY_CLOUD_FILTER 0x8
|
||||
u8 old_filter_type;
|
||||
u8 new_filter_type;
|
||||
u8 tr_bit;
|
||||
u8 reserved[4];
|
||||
__le32 addr_high;
|
||||
__le32 addr_low;
|
||||
};
|
||||
|
||||
struct i40e_aqc_replace_cloud_filters_cmd_buf {
|
||||
u8 data[32];
|
||||
/* Filter type INPUT codes*/
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_ENTRIES_MAX 3
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_VALIDATED (1 << 7UL)
|
||||
|
||||
/* Field Vector offsets */
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_MAC_DA 0
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_STAG_ETH 6
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_STAG 7
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_VLAN 8
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_STAG_OVLAN 9
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_STAG_IVLAN 10
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_TUNNLE_KEY 11
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_IMAC 12
|
||||
/* big FLU */
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_IP_DA 14
|
||||
/* big FLU */
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_OIP_DA 15
|
||||
|
||||
#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_INNER_VLAN 37
|
||||
struct i40e_filter_data filters[8];
|
||||
};
|
||||
|
||||
/* 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.
|
||||
|
@ -5632,6 +5632,59 @@ enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_add_cloud_filters_big_buffer
|
||||
* @hw: pointer to the hardware structure
|
||||
* @seid: VSI seid to add cloud filters from
|
||||
* @filters: Buffer which contains the filters in big buffer to be added
|
||||
* @filter_count: number of filters contained in the buffer
|
||||
*
|
||||
* Set the cloud filters for a given VSI. The contents of the
|
||||
* i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
|
||||
* the function.
|
||||
*
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_add_cloud_filters_big_buffer(struct i40e_hw *hw,
|
||||
u16 seid,
|
||||
struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
|
||||
u8 filter_count)
|
||||
{
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_add_remove_cloud_filters *cmd =
|
||||
(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
|
||||
enum i40e_status_code status;
|
||||
u16 buff_len;
|
||||
int i;
|
||||
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_add_cloud_filters);
|
||||
|
||||
buff_len = filter_count * sizeof(*filters);
|
||||
desc.datalen = CPU_TO_LE16(buff_len);
|
||||
desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
|
||||
cmd->num_filters = filter_count;
|
||||
cmd->seid = CPU_TO_LE16(seid);
|
||||
cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
|
||||
|
||||
/* adjust Geneve VNI for HW issue */
|
||||
for (i = 0; i < filter_count; i++) {
|
||||
u16 tnl_type;
|
||||
u32 ti;
|
||||
|
||||
tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
|
||||
I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
|
||||
I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
|
||||
if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
|
||||
ti = LE32_TO_CPU(filters[i].element.tenant_id);
|
||||
filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
|
||||
}
|
||||
}
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_remove_cloud_filters
|
||||
* @hw: pointer to the hardware structure
|
||||
@ -5645,9 +5698,9 @@ enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
|
||||
*
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
|
||||
u16 seid,
|
||||
struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
|
||||
u8 filter_count)
|
||||
u16 seid,
|
||||
struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
|
||||
u8 filter_count)
|
||||
{
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_add_remove_cloud_filters *cmd =
|
||||
@ -5671,6 +5724,103 @@ enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_remove_cloud_filters_big_buffer
|
||||
* @hw: pointer to the hardware structure
|
||||
* @seid: VSI seid to remove cloud filters from
|
||||
* @filters: Buffer which contains the filters in big buffer to be removed
|
||||
* @filter_count: number of filters contained in the buffer
|
||||
*
|
||||
* Remove the cloud filters for a given VSI. The contents of the
|
||||
* i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
|
||||
* the function.
|
||||
*
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_remove_cloud_filters_big_buffer(
|
||||
struct i40e_hw *hw,
|
||||
u16 seid,
|
||||
struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
|
||||
u8 filter_count)
|
||||
{
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_add_remove_cloud_filters *cmd =
|
||||
(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
|
||||
enum i40e_status_code status;
|
||||
u16 buff_len;
|
||||
int i;
|
||||
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_remove_cloud_filters);
|
||||
|
||||
buff_len = filter_count * sizeof(*filters);
|
||||
desc.datalen = CPU_TO_LE16(buff_len);
|
||||
desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
|
||||
cmd->num_filters = filter_count;
|
||||
cmd->seid = CPU_TO_LE16(seid);
|
||||
cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
|
||||
|
||||
/* adjust Geneve VNI for HW issue */
|
||||
for (i = 0; i < filter_count; i++) {
|
||||
u16 tnl_type;
|
||||
u32 ti;
|
||||
|
||||
tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
|
||||
I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
|
||||
I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
|
||||
if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
|
||||
ti = LE32_TO_CPU(filters[i].element.tenant_id);
|
||||
filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
|
||||
}
|
||||
}
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_replace_cloud_filters - Replace cloud filter command
|
||||
* @hw: pointer to the hw struct
|
||||
* @filters: pointer to the i40e_aqc_replace_cloud_filter_cmd struct
|
||||
* @cmd_buf: pointer to the i40e_aqc_replace_cloud_filter_cmd_buf struct
|
||||
*
|
||||
**/
|
||||
enum
|
||||
i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
|
||||
struct i40e_aqc_replace_cloud_filters_cmd *filters,
|
||||
struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf)
|
||||
{
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_replace_cloud_filters_cmd *cmd =
|
||||
(struct i40e_aqc_replace_cloud_filters_cmd *)&desc.params.raw;
|
||||
enum i40e_status_code status = I40E_SUCCESS;
|
||||
int i = 0;
|
||||
|
||||
i40e_fill_default_direct_cmd_desc(&desc,
|
||||
i40e_aqc_opc_replace_cloud_filters);
|
||||
|
||||
desc.datalen = CPU_TO_LE16(32);
|
||||
desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
|
||||
cmd->old_filter_type = filters->old_filter_type;
|
||||
cmd->new_filter_type = filters->new_filter_type;
|
||||
cmd->valid_flags = filters->valid_flags;
|
||||
cmd->tr_bit = filters->tr_bit;
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, cmd_buf,
|
||||
sizeof(struct i40e_aqc_replace_cloud_filters_cmd_buf), NULL);
|
||||
|
||||
/* for get cloud filters command */
|
||||
for (i = 0; i < 32; i += 4) {
|
||||
cmd_buf->filters[i / 4].filter_type = cmd_buf->data[i];
|
||||
cmd_buf->filters[i / 4].input[0] = cmd_buf->data[i + 1];
|
||||
cmd_buf->filters[i / 4].input[1] = cmd_buf->data[i + 2];
|
||||
cmd_buf->filters[i / 4].input[2] = cmd_buf->data[i + 3];
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* i40e_aq_alternate_write
|
||||
* @hw: pointer to the hardware structure
|
||||
|
@ -404,11 +404,21 @@ enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
|
||||
u16 vsi,
|
||||
struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
|
||||
u8 filter_count);
|
||||
|
||||
enum i40e_status_code i40e_aq_add_cloud_filters_big_buffer(struct i40e_hw *hw,
|
||||
u16 seid,
|
||||
struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
|
||||
u8 filter_count);
|
||||
enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
|
||||
u16 vsi,
|
||||
struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
|
||||
u8 filter_count);
|
||||
enum i40e_status_code i40e_aq_remove_cloud_filters_big_buffer(
|
||||
struct i40e_hw *hw, u16 seid,
|
||||
struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
|
||||
u8 filter_count);
|
||||
enum i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
|
||||
struct i40e_aqc_replace_cloud_filters_cmd *filters,
|
||||
struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf);
|
||||
enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
|
||||
u32 reg_addr0, u32 *reg_val0,
|
||||
u32 reg_addr1, u32 *reg_val1);
|
||||
|
Loading…
Reference in New Issue
Block a user