diff --git a/fw/wmi_services.h b/fw/wmi_services.h index da9fbbecc4..6dc55812d8 100644 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -428,6 +428,7 @@ typedef enum { WMI_SERVICE_PEER_DELETE_NO_PEER_FLUSH_TIDS_CMD = 237, /* Host should not send WMI_PEER_FLUSH_TIDS_CMD as part of peer delete */ WMI_SERVICE_NSS_RATIO_TO_HOST_SUPPORT = 238, /* Indicates firmware supports sending NSS ratio info to host */ WMI_SERVICE_WPA3_SUITEB_ROAM_SUPPORT = 239, /* Indicates FW supports WPA3 SUITE B roaming */ + WMI_SERVICE_PERIODIC_FRAME_INJECT_SUPPORT = 240, /* Indicates FW supports periodic frame injection */ /******* ADD NEW SERVICES HERE *******/ diff --git a/fw/wmi_tlv_defs.h b/fw/wmi_tlv_defs.h index f36aee2541..6a8660e05d 100644 --- a/fw/wmi_tlv_defs.h +++ b/fw/wmi_tlv_defs.h @@ -1049,6 +1049,7 @@ typedef enum { WMITLV_TAG_STRUC_wmi_vdev_get_big_data_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_vdev_send_big_data_event_fixed_param, WMITLV_TAG_STRUC_wmi_nan_dmesg_event_fixed_param, + WMITLV_TAG_STRUC_wmi_frame_inject_cmd_fixed_param, } WMITLV_TAG_ID; /* @@ -1478,6 +1479,7 @@ typedef enum { OP(WMI_VDEV_SET_PCL_CMDID) \ OP(WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID) \ OP(WMI_VDEV_GET_BIG_DATA_CMDID) \ + OP(WMI_PDEV_FRAME_INJECT_CMDID) \ /* add new CMD_LIST elements above this line */ @@ -4293,6 +4295,12 @@ WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_vdev_get_big_data_cmd_fixed_param, wmi_vdev_get_big_data_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_VDEV_GET_BIG_DATA_CMDID); +/* Frame inject command */ +#define WMITLV_TABLE_WMI_PDEV_FRAME_INJECT_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_frame_inject_cmd_fixed_param, wmi_frame_inject_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, bufp, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_FRAME_INJECT_CMDID); + /************************** TLV definitions of WMI events *******************************/ diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index bd3713ac08..0386edca19 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -412,6 +412,8 @@ typedef enum { WMI_PDEV_SET_RAP_CONFIG_CMDID, /** Specify DSM filters along with disallow bssid filters */ WMI_PDEV_DSM_FILTER_CMDID, + /** enable/disable periodic frame injection */ + WMI_PDEV_FRAME_INJECT_CMDID, /* VDEV (virtual device) specific commands */ /** vdev create */ @@ -10920,6 +10922,46 @@ typedef struct { /** app IE */ } wmi_bcn_prb_info; +enum wmi_frame_inject_type { + /* Transmit QoS null frame each period */ + WMI_FRAME_INJECT_TYPE_QOS_NULL, + /* Transmit CTS to self each period */ + WMI_FRAME_INJECT_TYPE_CTS_TO_SELF, + /* Transmit HOST provided buffer instead of forming frame in FW */ + WMI_FRAME_INJECT_TYPE_HOST_BUFFER, + /* Max valid frame inject type for sanity checks*/ + WMI_FRAME_INJECT_TYPE_MAX, +}; + +typedef struct { + /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_frame_inject_cmd_fixed_param */ + A_UINT32 tlv_header; + /** unique id identifying the VDEV, generated by the caller. + * At any time only one vdev per mac can have this feature enabled. + * Two consecutive enable commands on same mac will result in previous + * command being disabled and new one being enabled. + */ + A_UINT32 vdev_id; + /** enable or disable injection */ + A_UINT32 enable; + /** frame type to be used for frame injection. possible values are + * defined in enum wmi_frame_inject_type. + */ + A_UINT32 frame_type; + /** periodicity of frame injection in milliseconds */ + A_UINT32 frame_inject_period; + /** Destination address of frame */ + wmi_mac_addr frame_addr1; + /** variable buffer length. Can be used for frame template. + * data is in TLV data[] + */ + A_UINT32 buf_len; + /* + * The TLVs follows: + * A_UINT8 data[]; <-- Variable length data + */ +} wmi_frame_inject_cmd_fixed_param; + typedef struct { A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_bcn_tmpl_cmd_fixed_param */ /** unique id identifying the VDEV, generated by the caller */ @@ -25371,6 +25413,7 @@ static INLINE A_UINT8 *wmi_id_to_name(A_UINT32 wmi_command) WMI_RETURN_STRING(WMI_VDEV_AUDIO_SYNC_QTIMER_CMDID); WMI_RETURN_STRING(WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID); WMI_RETURN_STRING(WMI_VDEV_GET_BIG_DATA_CMDID); + WMI_RETURN_STRING(WMI_PDEV_FRAME_INJECT_CMDID); } return "Invalid WMI cmd"; diff --git a/fw/wmi_version.h b/fw/wmi_version.h index 91e462d6d8..6d48a9c30a 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 780 +#define __WMI_REVISION_ 781 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work