i40e/base: support WOL config for X722
Adds admin q function for "Set Wake on LAN Filter AQ" and "Get Wake Up Reason AQ". Signed-off-by: Jingjing Wu <jingjing.wu@intel.com> Acked-by: Helin Zhang <helin.zhang@intel.com> Tested-by: Huilong Xu <huilongx.xu@intel.com>
This commit is contained in:
parent
788fc17b2d
commit
3c89193a36
@ -270,6 +270,10 @@ enum i40e_admin_queue_opc {
|
||||
i40e_aqc_opc_set_rss_lut = 0x0B03,
|
||||
i40e_aqc_opc_get_rss_key = 0x0B04,
|
||||
i40e_aqc_opc_get_rss_lut = 0x0B05,
|
||||
|
||||
/* WoL commands */
|
||||
i40e_aqc_opc_set_wol_filter = 0x0120,
|
||||
i40e_aqc_opc_get_wake_reason = 0x0121,
|
||||
#endif
|
||||
|
||||
/* Proxy commands */
|
||||
@ -2458,5 +2462,48 @@ struct i40e_aqc_set_ns_proxy_table_entry_resp {
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_set_ns_proxy_table_entry_resp);
|
||||
|
||||
struct i40e_aqc_set_wol_filter {
|
||||
__le16 filter_index;
|
||||
#define I40E_AQC_MAX_NUM_WOL_FILTERS 8
|
||||
__le16 cmd_flags;
|
||||
#define I40E_AQC_SET_WOL_FILTER 0x8000
|
||||
#define I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL 0x4000
|
||||
__le16 valid_flags;
|
||||
#define I40E_AQC_SET_WOL_FILTER_ACTION_VALID 0x8000
|
||||
#define I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID 0x4000
|
||||
u8 reserved[2];
|
||||
__le32 address_high;
|
||||
__le32 address_low;
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_set_wol_filter);
|
||||
|
||||
struct i40e_aqc_set_wol_filter_resp {
|
||||
u8 reserved[8];
|
||||
__le32 address_high;
|
||||
__le32 address_low;
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_set_wol_filter_resp);
|
||||
|
||||
struct i40e_aqc_get_wol_wake_reason {
|
||||
u8 reserved[16];
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_get_wol_wake_reason);
|
||||
|
||||
struct i40e_aqc_get_wake_reason_completion {
|
||||
u8 reserved_1[2];
|
||||
__le16 wake_reason;
|
||||
u8 reserved_2[12];
|
||||
};
|
||||
|
||||
I40E_CHECK_CMD_LENGTH(i40e_aqc_get_wake_reason_completion);
|
||||
|
||||
struct i40e_aqc_set_wol_filter_data {
|
||||
u8 filter[128];
|
||||
u8 mask[16];
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif /* _I40E_ADMINQ_CMD_H_ */
|
||||
|
@ -5839,4 +5839,91 @@ enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_set_clear_wol_filter
|
||||
* @hw: pointer to the hw struct
|
||||
* @filter_index: index of filter to modify (0-7)
|
||||
* @filter: buffer containing filter to be set
|
||||
* @set_filter: true to set filter, false to clear filter
|
||||
* @no_wol_tco: if true, pass through packets cannot cause wake-up
|
||||
* if false, pass through packets may cause wake-up
|
||||
* @filter_valid: true if filter action is valid
|
||||
* @no_wol_tco_valid: true if no WoL in TCO traffic action valid
|
||||
* @cmd_details: pointer to command details structure or NULL
|
||||
*
|
||||
* Set or clear WoL filter for port attached to the PF
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
|
||||
u8 filter_index,
|
||||
struct i40e_aqc_set_wol_filter_data *filter,
|
||||
bool set_filter, bool no_wol_tco,
|
||||
bool filter_valid, bool no_wol_tco_valid,
|
||||
struct i40e_asq_cmd_details *cmd_details)
|
||||
{
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_set_wol_filter *cmd =
|
||||
(struct i40e_aqc_set_wol_filter *)&desc.params.raw;
|
||||
enum i40e_status_code status;
|
||||
u16 cmd_flags = 0;
|
||||
u16 valid_flags = 0;
|
||||
u16 buff_len = 0;
|
||||
|
||||
i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
|
||||
|
||||
if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
|
||||
return I40E_ERR_PARAM;
|
||||
cmd->filter_index = CPU_TO_LE16(filter_index);
|
||||
|
||||
if (set_filter) {
|
||||
if (!filter)
|
||||
return I40E_ERR_PARAM;
|
||||
cmd_flags |= I40E_AQC_SET_WOL_FILTER;
|
||||
buff_len = sizeof(*filter);
|
||||
}
|
||||
if (no_wol_tco)
|
||||
cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
|
||||
cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
|
||||
|
||||
if (filter_valid)
|
||||
valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
|
||||
if (no_wol_tco_valid)
|
||||
valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
|
||||
cmd->valid_flags = CPU_TO_LE16(valid_flags);
|
||||
|
||||
cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
|
||||
cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, filter,
|
||||
buff_len, cmd_details);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_aq_get_wake_event_reason
|
||||
* @hw: pointer to the hw struct
|
||||
* @wake_reason: return value, index of matching filter
|
||||
* @cmd_details: pointer to command details structure or NULL
|
||||
*
|
||||
* Get information for the reason of a Wake Up event
|
||||
**/
|
||||
enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
|
||||
u16 *wake_reason,
|
||||
struct i40e_asq_cmd_details *cmd_details)
|
||||
{
|
||||
struct i40e_aq_desc desc;
|
||||
struct i40e_aqc_get_wake_reason_completion *resp =
|
||||
(struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
|
||||
enum i40e_status_code status;
|
||||
|
||||
i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
|
||||
|
||||
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
|
||||
|
||||
if (status == I40E_SUCCESS)
|
||||
*wake_reason = LE16_TO_CPU(resp->wake_reason);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
#endif /* X722_SUPPORT */
|
||||
|
@ -498,5 +498,14 @@ enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
|
||||
enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
|
||||
struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
|
||||
struct i40e_asq_cmd_details *cmd_details);
|
||||
enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
|
||||
u8 filter_index,
|
||||
struct i40e_aqc_set_wol_filter_data *filter,
|
||||
bool set_filter, bool no_wol_tco,
|
||||
bool filter_valid, bool no_wol_tco_valid,
|
||||
struct i40e_asq_cmd_details *cmd_details);
|
||||
enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
|
||||
u16 *wake_reason,
|
||||
struct i40e_asq_cmd_details *cmd_details);
|
||||
#endif
|
||||
#endif /* _I40E_PROTOTYPE_H_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user