diff --git a/fw/wmi_services.h b/fw/wmi_services.h index d07ff2b84767..56482ac65d82 100644 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -631,6 +631,7 @@ typedef enum { WMI_SERVICE_NAN_PAIRING_PEER_CREATE_BY_HOST = 378, /* Indicate FW supports creation of PASN Peer by Host for NAN pairing usecase */ WMI_SERVICE_MLO_TID_TO_LINK_MAPPING_SUPPORT = 379, /* Indicates FW supports TID-TO-LINK mapping */ WMI_SERVICE_PER_LINK_STATS_SUPPORT = 380, /* Indicates FW supports per link stats for MLO */ + WMI_SERVICE_N_LINK_MLO_SUPPORT = 381, /* Indicate FW supports N MLO link & vdev re-purpose between links */ WMI_MAX_EXT2_SERVICE diff --git a/fw/wmi_tlv_defs.h b/fw/wmi_tlv_defs.h index c8d4a77fb522..409ac89f6d84 100644 --- a/fw/wmi_tlv_defs.h +++ b/fw/wmi_tlv_defs.h @@ -1377,6 +1377,10 @@ typedef enum { WMITLV_TAG_STRUC_wmi_gpio_state_res_event_fixed_param, WMITLV_TAG_STRUC_wmi_ctrl_path_vdev_stats_struct, WMITLV_TAG_STRUC_wmi_pdev_set_rf_path_event_fixed_param, + WMITLV_TAG_STRUC_wmi_mlo_link_bss_param, + WMITLV_TAG_STRUC_wmi_mlo_set_link_bss_params_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_mlo_link_switch_req_evt_fixed_param, + WMITLV_TAG_STRUC_wmi_mlo_link_switch_cnf_fixed_param, } WMITLV_TAG_ID; /* * IMPORTANT: Please add _ALL_ WMI Commands Here. @@ -5105,7 +5109,9 @@ WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_ENABLE_DURATION_BASED_TX_MODE_SELECTION_CMDID WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_mlo_link_set_active_cmd_fixed_param, wmi_mlo_link_set_active_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_mlo_set_active_link_number_param, link_number_param, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, vdev_id_bitmap, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, vdev_id_bitmap2, WMITLV_SIZE_VAR) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, vdev_id_bitmap2, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, ieee_link_id_bitmap, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, ieee_link_id_bitmap2, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_MLO_LINK_SET_ACTIVE_CMDID); /* Request DPD Status */ @@ -5397,6 +5403,17 @@ WMITLV_CREATE_PARAM_STRUC(WMI_VENDOR_VDEV_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_vendor_cmd_fixed_param, wmi_peer_vendor_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_VENDOR_PEER_CMDID); +/* SET MLO link BSS param */ +#define WMITLV_TABLE_WMI_MLO_LINK_SET_BSS_PARAMS_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_mlo_set_link_bss_params_cmd_fixed_param, wmi_mlo_set_link_bss_params_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_mlo_link_bss_param, link_bss_params, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_MLO_LINK_SET_BSS_PARAMS_CMDID); + +/* MLO link switch confirmation command to inform FW about host side status and reason code */ +#define WMITLV_TABLE_WMI_MLO_LINK_SWITCH_CONF_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_mlo_link_switch_cnf_fixed_param, wmi_mlo_link_switch_cnf_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_MLO_LINK_SWITCH_CONF_CMDID); + /************************** TLV definitions of WMI events *******************************/ @@ -7154,7 +7171,9 @@ WMITLV_CREATE_PARAM_STRUC(WMI_TWT_SESSION_STATS_EVENTID); #define WMITLV_TABLE_WMI_MLO_LINK_SET_ACTIVE_RESP_EVENTID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_mlo_link_set_active_resp_event_fixed_param, wmi_mlo_link_set_active_resp_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, force_active_vdev_bitmap, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, force_inactive_vdev_bitmap, WMITLV_SIZE_VAR) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, force_inactive_vdev_bitmap, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, force_active_ieee_link_id_bitmap, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, force_inactive_ieee_link_id_bitmap, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_MLO_LINK_SET_ACTIVE_RESP_EVENTID); /* Get DPD status Event */ @@ -7341,6 +7360,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_VENDOR_VDEV_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_vendor_event_fixed_param, wmi_peer_vendor_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_VENDOR_PEER_EVENTID); +/* link switch event */ +#define WMITLV_TABLE_WMI_MLO_LINK_SWITCH_REQUEST_EVENTID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_mlo_link_switch_req_evt_fixed_param, wmi_mlo_link_switch_req_evt_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_MLO_LINK_SWITCH_REQUEST_EVENTID); + #ifdef __cplusplus } diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 3b68ab060c89..5f1aa67ee3a5 100644 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -1563,6 +1563,10 @@ typedef enum { WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_CMDID, /** WMI cmd used to get mlo link information */ WMI_MLO_VDEV_GET_LINK_INFO_CMDID, + /** WMI cmd used to set link BSS parameters */ + WMI_MLO_LINK_SET_BSS_PARAMS_CMDID, + /** WMI cmd to confirm the status of link switch request handling */ + WMI_MLO_LINK_SWITCH_CONF_CMDID, /** WMI commands specific to Service Aware WiFi (SAWF) */ /** configure or reconfigure the parameters for a service class */ @@ -2398,6 +2402,8 @@ typedef enum { WMI_MLO_VDEV_LINK_INFO_EVENTID, /** request host to do T2LM neg to the un-disabled link */ WMI_MLO_LINK_DISABLE_REQUEST_EVENTID, + /** request host to switch to new link for specified vdev */ + WMI_MLO_LINK_SWITCH_REQUEST_EVENTID, /* WMI event specific to Quiet handling */ WMI_QUIET_HANDLING_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_QUIET_OFL), @@ -3536,6 +3542,11 @@ typedef struct { */ A_UINT32 rx_aggr_ba_win_size_max; + /* + * max link number per MLD FW supports. + */ + A_UINT32 num_max_mlo_link_per_ml_bss_supp; + /* Followed by next TLVs: * WMI_DMA_RING_CAPABILITIES dma_ring_caps[]; * wmi_spectral_bin_scaling_params wmi_bin_scaling_params[]; @@ -4647,6 +4658,18 @@ typedef struct { * number of max active virtual devices (VAPs) to support */ A_UINT32 num_max_active_vdevs; + + /** + * @brief num_max_mlo_link_per_ml_bss + * number of max partner links of a ML BSS + */ + A_UINT32 num_max_mlo_link_per_ml_bss; + + /** + * @brief num_max_active_mlo_link_per_ml_bss + * number of max active partner links of a ML BSS + */ + A_UINT32 num_max_active_mlo_link_per_ml_bss; } wmi_resource_config; #define WMI_MSDU_FLOW_AST_ENABLE_GET(msdu_flow_config0, ast_x) \ @@ -15882,6 +15905,8 @@ typedef struct { #define WMI_MLO_FLAGS_SET_NSTR_BITMAP_PRESENT(mlo_flags, value) WMI_SET_BITS(mlo_flags, 11, 1, value) #define WMI_MLO_FLAGS_GET_NSTR_BITMAP_SIZE(mlo_flags) WMI_GET_BITS(mlo_flags, 12, 1) #define WMI_MLO_FLAGS_SET_NSTR_BITMAP_SIZE(mlo_flags, value) WMI_SET_BITS(mlo_flags, 12, 1, value) +#define WMI_MLO_FLAGS_GET_MLO_LINK_SWITCH(mlo_flags) WMI_GET_BITS(mlo_flags, 13, 1) +#define WMI_MLO_FLAGS_SET_MLO_LINK_SWITCH(mlo_flags, value) WMI_SET_BITS(mlo_flags, 13, 1, value) /* this structure used for pass mlo flags*/ typedef struct { @@ -15906,7 +15931,8 @@ typedef struct { * Indication Bitmap subfield is equal to 1 octet. */ nstr_bitmap_size:1, - unused: 19; + mlo_link_switch: 1, /* indicate the command is a part of link switch procedure */ + unused: 18; }; A_UINT32 mlo_flags; }; @@ -20284,10 +20310,14 @@ enum WMI_PEER_STA_TYPE { typedef struct { A_UINT32 tlv_header; /** TLV tag (MITLV_TAG_STRUC_wmi_peer_assoc_mlo_partner_link_params) and len */ - A_UINT32 vdev_id; /** unique id identifying the VDEV, generated by the caller */ + A_UINT32 vdev_id; /** unique id identifying the VDEV, generated by the caller. Set to 0xFFFFFFFF if no vdev is allocated. */ A_UINT32 hw_mld_link_id; /** Unique link id across SOCs, got as part of QMI handshake. */ wmi_mlo_flags mlo_flags; /** MLO flags */ A_UINT32 logical_link_index; /** Unique index for links of the mlo. Starts with Zero */ + A_UINT32 ieee_link_id; /*link id in the 802.11 frames*/ + wmi_mac_addr bss_id; + wmi_channel wmi_chan; + wmi_mac_addr self_mac; } wmi_peer_assoc_mlo_partner_link_params; /* This TLV structure used to pass mlo Parameters on peer assoc, only apply for mlo-peers */ @@ -43593,6 +43623,28 @@ typedef enum { WMI_MLO_LINK_FORCE_REASON_TDLS = 4, /* Set force specific links because of 11BE MLO TDLS setup/teardown */ } WMI_MLO_LINK_FORCE_REASON; +#define WMI_MLO_CONTROL_FLAGS_GET_OVERWRITE_FORCE_ACTIVE(mlo_flags) WMI_GET_BITS(control_flags, 0, 1) +#define WMI_MLO_CONTROL_FLAGS_SET_OVERWRITE_FORCE_ACTIVE(mlo_flags, value) WMI_SET_BITS(control_flags, 0, 1, value) +#define WMI_MLO_CONTROL_FLAGS_GET_OVERWRITE_FORCE_INACTIVE(mlo_flags) WMI_GET_BITS(control_flags, 1, 1) +#define WMI_MLO_CONTROL_FLAGS_SET_OVERWRITE_FORCE_INACTIVE(mlo_flags, value) WMI_SET_BITS(control_flags, 1, 1, value) + +/* + * This structure is used for passing wmi_mlo_control_flags. + * When force_mode is WMI_MLO_LINK_FORCE_ACTIVE or WMI_MLO_LINK_FORCE_INACTIVE + * host can pass below control flags, to indicate if FW need to clear earlier + * force bitmap config. + */ +typedef struct { + union { + struct { + A_UINT32 overwrite_force_active_bitmap:1, /* indicate overwrite all earlier force_active bitmaps */ + overwrite_force_inactive_bitmap:1, /* indicate overwrite all earlier force_inactive bitmaps */ + unused: 30; + }; + A_UINT32 control_flags; + }; +} wmi_mlo_control_flags; + typedef struct wmi_mlo_link_set_active_cmd { /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_mlo_link_set_active_cmd_fixed_param; */ @@ -43601,12 +43653,21 @@ typedef struct wmi_mlo_link_set_active_cmd A_UINT32 force_mode; /** reason of force link active / inactive, enum WMI_MLO_LINK_FORCE_REASON */ A_UINT32 reason; + /* indicate use vdev_id bitmap or link_id_bitmap */ + A_UINT32 use_ieee_link_id_bitmap; + + wmi_mac_addr ap_mld_mac_addr; + + wmi_mlo_control_flags ctrl_flags; /* The TLVs follows this structure: * wmi_mlo_set_active_link_number_param link_number_param[]; * Link number parameters, optional TLV. * Present when force type is WMI_MLO_LINK_FORCE_ACTIVE_LINK_NUM or * WMI_MLO_LINK_FORCE_INACTIVE_LINK_NUM. * In other cases the length of array should be 0. + *--- + * If use_ieee_link_id_bitmap equals 0 vdev_id_bitmap[] & vdev_id_bitmap2[] + * are valid. * A_UINT32 vdev_id_bitmap[]; * Optional TLV, present when force type is WMI_MLO_LINK_FORCE_ACTIVE * or WMI_MLO_LINK_FORCE_INACTIVE or WMI_MLO_LINK_NO_FORCE, @@ -43618,6 +43679,18 @@ typedef struct wmi_mlo_link_set_active_cmd * For force mode WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE vdev_id_bitmap2[] * carry the inactive vdev bitmap. * In other cases the length of the array should be 0. + *--- + * If use_ieee_link_id_bitmap equals 1 ieee_link_id_bitmap[] & + * ieee_link_id_bitmap2[] are valid. + * A_UINT32 ieee_link_id_bitmap[]; + * present for WMI_MLO_LINK_FORCE_ACTIVE + * or WMI_MLO_LINK_FORCE_INACTIVE or WMI_MLO_LINK_NO_FORCE + * or WMI_MLO_LINK_FORCE_ACTIVE_LINK_NUM or + * WMI_MLO_LINK_FORCE_INACTIVE_LINK_NUM + * A_UINT32 ieee_link_id_bitmap2[]; + * For force mode WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE ieee_link_id_bitmap2[] + * carry the inactive linkid bitmap. + * In other cases the length of the array should be 0. */ } wmi_mlo_link_set_active_cmd_fixed_param; @@ -43647,9 +43720,20 @@ typedef struct wmi_mlo_link_set_active_resp_event /** Return status. 0 for success, non-zero otherwise */ A_UINT32 status; + /* indicate use vdev_id bitmap or link_id_bitmap */ + A_UINT32 use_ieee_link_id_bitmap; + + wmi_mac_addr ap_mld_mac_addr; + /* The TLVs follows this structure: + *--- + * If use_ieee_link_id_bitmap equals 0, vdev_bitmap[] are valid. * A_UINT32 force_active_vdev_bitmap[]; <-- current force active vdev. * A_UINT32 force_inactive_vdev_bitmap[]; <-- current force inactive vdevs + *--- + * If use_ieee_link_id_bitmap equals 1, ieee_link_id_bitmap[] are valid. + * A_UINT32 force_active_ieee_link_id_bitmap[]; + * A_UINT32 force_inactive_ieee_link_id_bitmap[]; */ } wmi_mlo_link_set_active_resp_event_fixed_param; @@ -45449,6 +45533,62 @@ typedef struct { A_UINT32 pause_dur_ms; } wmi_vdev_pause_cmd_fixed_param; +typedef struct { + A_UINT32 tlv_header; + A_UINT32 ieee_link_id; /* key to identify a link */ + wmi_channel wmi_chan; +} wmi_mlo_link_bss_param; + +typedef struct { + A_UINT32 tlv_header; + wmi_mac_addr ap_mld_macaddr; + + /* + * The TLVs listed below follow this fixed_param TLV: + * wmi_mlo_link_bss_param link_bss_params[]: + * an array of links to be updated + */ +} wmi_mlo_set_link_bss_params_cmd_fixed_param; + +typedef enum _WMI_LINK_SWITCH_REASON{ + WMI_MLO_LINK_SWITCH_REASON_RSSI_CHANGE = 1, + WMI_MLO_LINK_SWITCH_REASON_LOW_QUALITY = 2, + WMI_MLO_LINK_SWITCH_REASON_C2_CHANGE = 3, + WMI_MLO_LINK_SWITCH_REASON_HOST_FORCE = 4, + WMI_MLO_LINK_SWITCH_REASON_T2LM = 5, + WMI_MLO_LINK_SWITCH_REASON_MAX, +} WMI_LINK_SWITCH_REASON; + +typedef struct { + A_UINT32 tlv_header; + + A_UINT32 vdev_id; /*the vdev id assigned to curr_ieee_link_id*/ + A_UINT32 curr_ieee_link_id; /*current link id on above vdev_id*/ + A_UINT32 new_ieee_link_id; /*new link id on above vdev_id*/ + A_UINT32 new_primary_freq; /*primay_freq for the new link on the vdev, in units of MHZ*/ + A_UINT32 new_phymode; /*phymode for the new link on the vdev, see WLAN_PHY_MODE for definitions*/ + A_UINT32 reason; /*see WMI_LINK_SWITCH_REASON for definition*/ +} wmi_mlo_link_switch_req_evt_fixed_param; + +typedef enum _WMI_LINK_SWITCH_CNF_REASON{ + WMI_MLO_LINK_SWITCH_CNF_REASON_BSS_PARAMS_CHANGED = 1, + WMI_MLO_LINK_SWITCH_CNF_REASON_CONCURRECNY_CONFLICT = 2, + WMI_MLO_LINK_SWITCH_CNF_REASON_HOST_INTERNAL_ERROR = 3, + WMI_MLO_LINK_SWITCH_CNF_REASON_MAX, +} WMI_LINK_SWITCH_CNF_REASON; + +typedef enum _WMI_LINK_SWITCH_CNF_STATUS{ + WMI_MLO_LINK_SWITCH_CNF_STATUS_ACCEPT = 0, + WMI_MLO_LINK_SWITCH_CNF_STATUS_REJECT = 1, +} WMI_LINK_SWITCH_CNF_STATUS; + +typedef struct { + A_UINT32 tlv_header; + + A_UINT32 vdev_id; + A_UINT32 status; /*see definition of WMI_LINK_SWITCH_CNF_STATUS*/ + A_UINT32 reason; /*see definition of WMI_LINK_SWITCH_CNF_REASON*/ +} wmi_mlo_link_switch_cnf_fixed_param; /* ADD NEW DEFS HERE */ diff --git a/fw/wmi_version.h b/fw/wmi_version.h index b31c88e54980..22194a87ffb6 100644 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -37,7 +37,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_ 1334 +#define __WMI_REVISION_ 1335 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work