Files
linux-nv-oot/drivers/net/wireless/realtek/rtl8852ce/phl/phl_ie.h
Shobek Attupurath 7dd632ff96 rtl8852ce: Add base driver v1.19.16.1-0-g1fe335ba1.20240815_PC
- support Android-14
- support Linux kernel 6.9
- support 6G regulation
- support Thermal protection
- support TX shortcut to reduce CPU loading
- fix some coverity issues
- Use RTW regulatory version rtk_8852CE_M.2_2230-67-52
- default enable con-current and MCC

Bug 4667769
Bug 4667981

Change-Id: Iee069ecdd1f00a0b78285d0a4ef5778ed9ace478
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3195601
Tested-by: Shobek Attupurath <sattupurath@nvidia.com>
Reviewed-by: Revanth Kumar Uppala <ruppala@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: Ashutosh Jha <ajha@nvidia.com>
2025-07-24 10:19:08 +00:00

682 lines
21 KiB
C

/******************************************************************************
*
* Copyright(c) 2019 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that 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.
*
*****************************************************************************/
#ifndef _PHL_IE_H_
#define _PHL_IE_H_
#define MAX_ELE_SZ 768
#define MAX_ELE_LEN 255
/* Element ID */
enum wlan_eid {
EID_SSID = 0,
EID_SUPP_RATES = 1,
EID_FH_PARAMS = 2, /* reserved now */
EID_DS_PARAMS = 3,
EID_CF_PARAMS = 4,
EID_TIM = 5,
EID_IBSS_PARAMS = 6,
EID_COUNTRY = 7,
/* 8, 9 reserved */
EID_REQUEST = 10,
EID_QBSS_LOAD = 11,
EID_EDCA_PARAM_SET = 12,
EID_TSPEC = 13,
EID_TCLAS = 14,
EID_SCHEDULE = 15,
EID_CHALLENGE = 16,
/* 17-31 reserved for challenge text extension */
EID_PWR_CONSTRAINT = 32,
EID_PWR_CAPABILITY = 33,
EID_TPC_REQUEST = 34,
EID_TPC_REPORT = 35,
EID_SUPPORTED_CHANNELS = 36,
EID_CHANNEL_SWITCH = 37,
EID_MEASURE_REQUEST = 38,
EID_MEASURE_REPORT = 39,
EID_QUIET = 40,
EID_IBSS_DFS = 41,
EID_ERP_INFO = 42,
EID_TS_DELAY = 43,
EID_TCLAS_PROCESSING = 44,
EID_HT_CAPABILITY = 45,
EID_QOS_CAPA = 46,
/* 47 reserved for Broadcom */
EID_RSN = 48,
EID_802_15_COEX = 49,
EID_EXT_SUPP_RATES = 50,
EID_AP_CHAN_REPORT = 51,
EID_NEIGHBOR_REPORT = 52,
EID_RCPI = 53,
EID_MOBILITY_DOMAIN = 54,
EID_FAST_BSS_TRANSITION = 55,
EID_TIMEOUT_INTERVAL = 56,
EID_RIC_DATA = 57,
EID_DSE_REGISTERED_LOCATION = 58,
EID_SUPPORTED_REGULATORY_CLASSES = 59,
EID_EXT_CHANSWITCH_ANN = 60,
EID_HT_OPERATION = 61,
EID_SECONDARY_CHANNEL_OFFSET = 62,
EID_BSS_AVG_ACCESS_DELAY = 63,
EID_ANTENNA_INFO = 64,
EID_RSNI = 65,
EID_MEASUREMENT_PILOT_TX_INFO = 66,
EID_BSS_AVAILABLE_CAPACITY = 67,
EID_BSS_AC_ACCESS_DELAY = 68,
EID_TIME_ADVERTISEMENT = 69,
EID_RRM_ENABLED_CAPABILITIES = 70,
EID_MULTIPLE_BSSID = 71,
EID_BSS_COEX_2040 = 72,
EID_BSS_INTOLERANT_CHL_REPORT = 73,
EID_OVERLAP_BSS_SCAN_PARAM = 74,
EID_RIC_DESCRIPTOR = 75,
EID_MMIE = 76,
EID_ASSOC_COMEBACK_TIME = 77,
EID_EVENT_REQUEST = 78,
EID_EVENT_REPORT = 79,
EID_DIAGNOSTIC_REQUEST = 80,
EID_DIAGNOSTIC_REPORT = 81,
EID_LOCATION_PARAMS = 82,
EID_NON_TX_BSSID_CAP = 83,
EID_SSID_LIST = 84,
EID_MULTI_BSSID_IDX = 85,
EID_FMS_DESCRIPTOR = 86,
EID_FMS_REQUEST = 87,
EID_FMS_RESPONSE = 88,
EID_QOS_TRAFFIC_CAPA = 89,
EID_BSS_MAX_IDLE_PERIOD = 90,
EID_TSF_REQUEST = 91,
EID_TSF_RESPOSNE = 92,
EID_WNM_SLEEP_MODE = 93,
EID_TIM_BCAST_REQ = 94,
EID_TIM_BCAST_RESP = 95,
EID_COLL_IF_REPORT = 96,
EID_CHANNEL_USAGE = 97,
EID_TIME_ZONE = 98,
EID_DMS_REQUEST = 99,
EID_DMS_RESPONSE = 100,
EID_LINK_ID = 101,
EID_WAKEUP_SCHEDUL = 102,
/* 103 reserved */
EID_CHAN_SWITCH_TIMING = 104,
EID_PTI_CONTROL = 105,
EID_PU_BUFFER_STATUS = 106,
EID_INTERWORKING = 107,
EID_ADVERTISEMENT_PROTOCOL = 108,
EID_EXPEDITED_BW_REQ = 109,
EID_QOS_MAP_SET = 110,
EID_ROAMING_CONSORTIUM = 111,
EID_EMERGENCY_ALERT = 112,
EID_MESH_CONFIG = 113,
EID_MESH_ID = 114,
EID_LINK_METRIC_REPORT = 115,
EID_CONGESTION_NOTIFICATION = 116,
EID_PEER_MGMT = 117,
EID_CHAN_SWITCH_PARAM = 118,
EID_MESH_AWAKE_WINDOW = 119,
EID_BEACON_TIMING = 120,
EID_MCCAOP_SETUP_REQ = 121,
EID_MCCAOP_SETUP_RESP = 122,
EID_MCCAOP_ADVERT = 123,
EID_MCCAOP_TEARDOWN = 124,
EID_GANN = 125,
EID_RANN = 126,
EID_EXT_CAPABILITY = 127,
/* 128, 129 reserved for Agere */
EID_PREQ = 130,
EID_PREP = 131,
EID_PERR = 132,
/* 133-136 reserved for Cisco */
EID_PXU = 137,
EID_PXUC = 138,
EID_AUTH_MESH_PEER_EXCH = 139,
EID_MIC = 140,
EID_DESTINATION_URI = 141,
EID_UAPSD_COEX = 142,
EID_WAKEUP_SCHEDULE = 143,
EID_EXT_SCHEDULE = 144,
EID_STA_AVAILABILITY = 145,
EID_DMG_TSPEC = 146,
EID_DMG_AT = 147,
EID_DMG_CAP = 148,
/* 149 reserved for Cisco */
EID_CISCO_VENDOR_SPECIFIC = 150,
EID_DMG_OPERATION = 151,
EID_DMG_BSS_PARAM_CHANGE = 152,
EID_DMG_BEAM_REFINEMENT = 153,
EID_CHANNEL_MEASURE_FEEDBACK = 154,
/* 155-156 reserved for Cisco */
EID_AWAKE_WINDOW = 157,
EID_MULTI_BAND = 158,
EID_ADDBA_EXT = 159,
EID_NEXT_PCP_LIST = 160,
EID_PCP_HANDOVER = 161,
EID_DMG_LINK_MARGIN = 162,
EID_SWITCHING_STREAM = 163,
EID_SESSION_TRANSITION = 164,
EID_DYN_TONE_PAIRING_REPORT = 165,
EID_CLUSTER_REPORT = 166,
EID_RELAY_CAP = 167,
EID_RELAY_XFER_PARAM_SET = 168,
EID_BEAM_LINK_MAINT = 169,
EID_MULTIPLE_MAC_ADDR = 170,
EID_U_PID = 171,
EID_DMG_LINK_ADAPT_ACK = 172,
/* 173 reserved for Symbol */
EID_MCCAOP_ADV_OVERVIEW = 174,
EID_QUIET_PERIOD_REQ = 175,
/* 176 reserved for Symbol */
EID_QUIET_PERIOD_RESP = 177,
/* 178-179 reserved for Symbol */
/* 180 reserved for ISO/IEC 20011 */
EID_EPAC_POLICY = 182,
EID_CLISTER_TIME_OFF = 183,
EID_INTER_AC_PRIO = 184,
EID_SCS_DESCRIPTOR = 185,
EID_QLOAD_REPORT = 186,
EID_HCCA_TXOP_UPDATE_COUNT = 187,
EID_HL_STREAM_ID = 188,
EID_GCR_GROUP_ADDR = 189,
EID_ANTENNA_SECTOR_ID_PATTERN = 190,
EID_VHT_CAPABILITY = 191,
EID_VHT_OPERATION = 192,
EID_EXTENDED_BSS_LOAD = 193,
EID_WIDE_BW_CHANNEL_SWITCH = 194,
EID_TX_POWER_ENVELOPE = 195,
EID_CHANNEL_SWITCH_WRAPPER = 196,
EID_AID = 197,
EID_QUIET_CHANNEL = 198,
EID_OPMODE_NOTIF = 199,
EID_REDUCED_NEIGHBOR_REPORT = 201,
EID_AID_REQUEST = 210,
EID_AID_RESPONSE = 211,
EID_S1G_BCN_COMPAT = 213,
EID_S1G_SHORT_BCN_INTERVAL = 214,
EID_S1G_TWT = 216,
EID_S1G_CAPABILITIES = 217,
EID_VENDOR_SPECIFIC = 221,
EID_QOS_PARAMETER = 222,
EID_S1G_OPERATION = 232,
EID_CAG_NUMBER = 237,
EID_AP_CSN = 239,
EID_FILS_INDICATION = 240,
EID_DILS = 241,
EID_FRAGMENT = 242,
EID_RSN_EXTENSION = 244,
EID_EXTENSION = 255
};
/* Element ID Extension */
enum wlan_eid_ext {
EID_EXT_ASSOC_DELAY_INFO = 1,
EID_EXT_FILS_REQ_PARAMS = 2,
EID_EXT_FILS_KEY_CONFIRM = 3,
EID_EXT_FILS_SESSION = 4,
EID_EXT_FILS_HLP_CONTAINER = 5,
EID_EXT_FILS_IP_ADDR_ASSIGN = 6,
EID_EXT_KEY_DELIVERY = 7,
EID_EXT_FILS_WRAPPED_DATA = 8,
EID_EXT_FILS_PUBLIC_KEY = 12,
EID_EXT_FILS_NONCE = 13,
EID_EXT_FUTURE_CHAN_GUIDANCE = 14,
EID_EXT_CDMG_EXTEND_SCHEDULE = 19,
EID_EXT_SSW_REPORT = 20,
EID_EXT_SPSH_REPORT = 25,
EID_EXT_HE_CAPABILITY = 35,
EID_EXT_HE_OPERATION = 36,
EID_EXT_UORA = 37,
EID_EXT_MU_EDCA_PARAM_SET = 38,
EID_EXT_SPATIAL_REUSE_PARAM_SET = 39,
EID_EXT_GAS_EXTENSION = 40,
EID_EXT_NDP_FEEDBACK_REPORT_PARAM_SET = 41,
EID_EXT_BSS_COLOR_CHG_ANN = 42,
EID_EXT_QUIET_TIME_PERIOD_SETUP = 43,
EID_EXT_ESS_REPORT = 45,
EID_EXT_OPS = 46,
EID_EXT_HE_BSS_LOAD = 47,
EID_EXT_MAX_CHANNEL_SWITCH_TIME = 52,
EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55,
EID_EXT_NON_INHERITANCE = 56,
EID_EXT_KNOWN_BSSID = 57,
EID_EXT_SHORT_SSID_LIST = 58,
EID_EXT_HE_6GHZ_CAPABILITY = 59,
EID_EXT_UL_MU_POWER_CAPABILITY = 60,
EID_EXT_EHT_OPERATION = 106,
EID_EXT_MULTI_LINK = 107,
EID_EXT_EHT_CAPABILITY = 108,
EID_EXT_TID_TO_LINK_MAPPING = 109,
EID_EXT_MULTI_LINK_TRAFFIC = 110,
};
/* Subelement ID for ML */
#define WLAN_SUBEID_PER_STA_PROFILE 0
/*****************************************************************************
* Multi-Link (ML) Element
*****************************************************************************/
#define STA_CTRL_LEN 2
#define MAX_STA_INFO_LEN 13
enum ml_ele_type {
BASIC_ML = 0,
PROBE_REQUEST_ML = 1,
RESERVED
};
struct mld_cap {
u16 max_num_sl:4;
u16 srs_support:1;
u16 tid_to_link_nego_support:2;
u16 freq_sep_for_str:5;
u16 aar_support:1;
u16 rsvd:3;
};
struct basic_ml {
bool link_id_info_present;
bool bss_param_chg_cnt_present;
bool msd_info_present;
bool eml_cap_present;
bool mld_cap_present;
u8 *mld_address;
u8 link_id;
u8 bss_param_chg_cnt;
/* TODO: msd info */
/* TODO: eml cap */
struct mld_cap mld_cap;
};
struct probe_req_ml {
bool mld_id_present;
u8 mld_id;
};
struct rtw_phl_per_sta_profile_element {
/* sta ctrl */
u8 link_id;
bool complete_profile;
bool mac_addr_present;
bool bcn_interval_present;
bool dtim_info_present;
bool nstr_link_pair_present;
u8 nstr_bitmap_size;
/* sta info */
u8 mac_addr[MAC_ALEN];
u16 bcn_interval;
u8 dtim_cnt;
u8 dtim_period;
u16 nstr_indication_bitmap;
/* sta profile */
u8 *sta_profile;
u8 sta_profile_len;
u8 *sta_profile_frag;
u8 sta_profile_frag_len;
};
struct rtw_phl_ml_element {
enum ml_ele_type type;
union {
struct basic_ml basic_ml;
struct probe_req_ml probe_req_ml;
} common_info;
struct rtw_phl_per_sta_profile_element profile[MAX_MLD_LINK_NUM];
u8 profile_num;
};
/*****************************************************************************
* Reduced Neighbor Report Element
*****************************************************************************/
#define MAX_TBTT_INFO_NUM 3
#define MAX_NEIGHBOR_AP_NUM 3
struct rtw_phl_tbtt_info {
u8 offset;
u8 bssid[MAC_ALEN];
u8 short_ssid[4];
struct bss_param_t {
u8 oct_recomm:1,
same_ssid:1,
multi_bssid:1,
transmitted_bssid:1,
mem_24G_5G_colated_ap:1,
unsolicited_probe_resp_act:1,
colated_ap:1,
resv:1;
} bss_param;
u8 max_tx_pwr;
struct mld_param_t {
u8 mld_id;
u8 link_id;
u8 bss_params_chg_cnt;
} mld_param;
};
struct tbtt_info_header {
u8 type;
u8 cnt;
u8 len;
bool filtered_nb_ap;
/* self-defined variable*/
u8 is_legal;
u8 bssid_is_present:1,
short_ssid_is_present:1,
bss_param_is_present:1,
max_tx_pwr_is_present:1,
mld_param_is_present:1;
};
struct rtw_phl_neighbor_ap {
struct tbtt_info_header tbtt_info_hdr;
u8 op_class;
u8 ch;
struct rtw_phl_tbtt_info tbtt_infos[MAX_TBTT_INFO_NUM];
/* self-defined variable*/
struct rtw_chan_def chan_def;
};
struct rtw_phl_rnb_rpt_element {
struct rtw_phl_neighbor_ap nb_aps[MAX_NEIGHBOR_AP_NUM];
u8 nb_ap_num;
};
/******************************************************************************
* WLAN Element APIs
*****************************************************************************/
/*
rtw_phl_build_ml_ie(): API for building ML element
@ info: information that needs to build a ML element
@ pbuf: buffer for the element
@ return: length of the element
*/
u8 rtw_phl_build_ml_ie(struct rtw_phl_com_t *phl_com,
struct rtw_phl_ml_ie_info *info,
u8 *pbuf);
/*
rtw_phl_build_per_sta_profile(): API for building Per-STA Profile
@ info: the information that needs to build a Per-STA Profile
@ pbuf: the buffer for the Per-STA Profile
@ return: the length of the element
*/
u8 rtw_phl_build_per_sta_profile(struct rtw_phl_com_t *phl_com,
struct rtw_phl_per_sta_profile_info *info,
u8 *pbuf);
/*
rtw_phl_parse_tid2link(): Parse Tid-To-Link Mapping element
@ ele_pos: start of tid-to-link mapping element
@ ele_len: length of tid-to-link mapping element
*/
void rtw_phl_parse_tid2link(struct rtw_phl_stainfo_t *sta,
u8 *ele_start,
u16 ele_len);
void rtw_phl_tid2link_not_present(struct rtw_phl_stainfo_t *sta, u8 nego);
u8 rtw_phl_build_tid2link(struct rtw_wifi_role_link_t *rlink,
u8 *ele_start);
void
rtw_phl_parse_ml_ie(struct rtw_phl_com_t *phl_com,
u8 *ele_pos,
u16 ele_len,
struct rtw_phl_ml_element *ml_ele
);
u16
rtw_phl_get_ie(u8 *ie_start,
u16 ies_len,
u8 target_id,
u8 target_ext_id,
u8 **out_ele
);
bool
rtw_phl_is_ie_fragmentable(u32 eid,
u32 eid_ext
);
u8 rtw_phl_build_reduced_nb_rpt(struct rtw_wifi_role_t *wrole,
struct rtw_wifi_role_link_t *rlink,
u8 *pbuf);
/*
rtw_phl_parse_reduced_nb_rpt(): Parse Reduced Neighbor Report element
@ ele_start: start of reduced neighbor report element
@ ele_len: length of reduced neighbor report element
@ rnr: the reduced neighbor report structure
*/
void
rtw_phl_parse_reduced_nb_rpt(struct rtw_phl_com_t *phl_com,
u8 *ele_start,
u16 ele_len,
struct rtw_phl_rnb_rpt_element *reduced_nb_rpt);
/************************************************************
* SET ML Control field: _pStart = start of ML Control field
************************************************************/
/* Basic ML */
#define SET_ML_ELE_ML_CTRL_TYPE(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 0, 3, _val)
#define SET_ML_ELE_ML_CTRL_LINK_ID_INFO_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 4, 1, _val)
#define SET_ML_ELE_ML_CTRL_BSS_PARAMS_CHG_CNT_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 5, 1, _val)
#define SET_ML_ELE_ML_CTRL_MEDIUM_SYNC_DELAY_INFO_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 6, 1, _val)
#define SET_ML_ELE_ML_CTRL_EML_CAP_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 7, 1, _val)
#define SET_ML_ELE_ML_CTRL_MLD_CAP_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 8, 1, _val)
/* Probe Request ML */
#define SET_ML_ELE_ML_CTRL_MLD_ID_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 4, 1, _val)
/************************************************************
GET ML Control field: _pStart = start of ML Control field
************************************************************/
/* Basic ML */
#define GET_ML_ELE_ML_CTRL_TYPE(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 0, 3)
#define GET_ML_ELE_ML_CTRL_LINK_ID_INFO_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 4, 1)
#define GET_ML_ELE_ML_CTRL_BSS_PARAMS_CHG_CNT_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 5, 1)
#define GET_ML_ELE_ML_CTRL_MEDIUM_SYNC_DELAY_INFO_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 6, 1)
#define GET_ML_ELE_ML_CTRL_EML_CAP_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 7, 1)
#define GET_ML_ELE_ML_CTRL_MLD_CAP_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 8, 1)
/* Probe Request ML */
#define GET_ML_ELE_ML_CTRL_MLD_ID_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 4, 1)
/************************************************************
SET Common Info field: _pStart = start of each subfield
************************************************************/
/* Basic ML */
#define SET_ML_ELE_COMMON_INFO_LINK_ID(_pStart, _val) \
SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val)
#define SET_ML_ELE_COMMON_INFO_BSS_PARAMS_CHG_CNT(_pStart, _val) \
SET_BITS_TO_LE_1BYTE(_pStart, 0, 8, _val)
/* Probe Request ML */
#define SET_ML_ELE_COMMON_INFO_MLD_ID(_pStart, _val) \
SET_BITS_TO_LE_1BYTE(_pStart, 0, 8, _val)
/************************************************************
GET MLD Capabilities subfield: _pStart = start of MLD Capabilities subfield
************************************************************/
#define GET_MLD_CAP_MAX_NUM_OF_SL(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 0, 4)
#define GET_MLD_CAP_SRS_SUPPORT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 4, 1)
#define GET_MLD_CAP_TID_TO_LINK_NEGO_SUPPORT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 5, 2)
#define GET_MLD_CAP_FREQ_SEP_FOR_STR(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 7, 5)
#define GET_MLD_CAP_AAR_SUPPORT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 12, 1)
/************************************************************
SET MLD Capabilities subfield: _pStart = start of MLD Capabilities subfield
************************************************************/
#define SET_MLD_CAP_MAX_NUM_OF_SL(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 0, 4, _val)
#define SET_MLD_CAP_SRS_SUPPORT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 4, 1, _val)
#define SET_MLD_CAP_TID_TO_LINK_NEGO_SUPPORT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 5, 2, _val)
#define SET_MLD_CAP_FREQ_SEP_FOR_STR(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 7, 5, _val)
#define SET_MLD_CAP_AAR_SUPPORT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 12, 1, _val)
/************************************************************
SET STA Control: _pStart = start of STA Control field
************************************************************/
#define SET_STA_CTRL_LINK_ID(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 0, 4, _val)
#define SET_STA_CTRL_COMPLETE_PROFILE(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 4, 1, _val)
#define SET_STA_CTRL_MAC_ADDR_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 5, 1, _val)
#define SET_STA_CTRL_BEACON_INTEREVAL_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 6, 1, _val)
#define SET_STA_CTRL_DTIM_INFO_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 7, 1, _val)
#define SET_STA_CTRL_NSTR_LINK_PAIR_PRESENT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 8, 1, _val)
#define SET_STA_CTRL_NSTR_BITMAP_SIZE(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 9, 1, _val)
/************************************************************
GET STA Control: _pStart = start of STA Control field
************************************************************/
#define GET_STA_CTRL_LINK_ID(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 0, 4)
#define GET_STA_CTRL_COMPLETE_PROFILE(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 4, 1)
#define GET_STA_CTRL_MAC_ADDR_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 5, 1)
#define GET_STA_CTRL_BEACON_INTEREVAL_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 6, 1)
#define GET_STA_CTRL_DTIM_INFO_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 7, 1)
#define GET_STA_CTRL_NSTR_LINK_PAIR_PRESENT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 8, 1)
#define GET_STA_CTRL_NSTR_BITMAP_SIZE(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 9, 1)
/************************************************************
SET TID-To-Link Mapping element: _pStart = start of tid2link control field
************************************************************/
#define SET_TID2LINK_CTRL_DIRECT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 0, 2, _val)
#define SET_TID2LINK_CTRL_DEFAULT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 2, 1, _val)
#define SET_TID2LINK_CTRL_INDIC(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 8, 8, _val)
/* SET Link Mapping of TID n field: _pStart = start of Link Mapping of TID field */
#define SET_LINK_MAPPING_TID(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 0, 16, _val)
/************************************************************
GET TID-To-Link Mapping element: _pStart = start of tid2link control field
************************************************************/
#define GET_TID2LINK_CTRL_DIRECT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 0, 2)
#define GET_TID2LINK_CTRL_DEFAULT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 2, 1)
#define GET_TID2LINK_CTRL_INDIC(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 8, 8)
/* GET Link Mapping of TID n field: _pStart = start of Link Mapping of TID field */
#define GET_LINK_MAPPING_TID(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 0, 16)
/************************************************************
Reduced Neighbor Report
SET TBTT Info Header subfield: _pStart = start of TBTT Info Header subfield
************************************************************/
#define SET_TBTT_INFO_FIELD_TYPE(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 0, 2, _val)
#define SET_FILTED_NB_AP(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 2, 1, _val)
#define SET_TBTT_INFO_CNT(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 4, 4, _val)
#define SET_TBTT_INFO_LEN(_pStart, _val) \
SET_BITS_TO_LE_2BYTE(_pStart, 8, 8, _val)
/************************************************************
Reduced Neighbor Report
SET MLD Parameters: _pStart = start of MLD Parameters subfield
************************************************************/
#define SET_MLD_PARAMS_MLD_ID(_pStart, _val) \
SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val)
#define SET_MLD_PARAMS_LINK_ID(_pStart, _val) \
SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val)
#define SET_MLD_PARAMS_BSS_PARAMS_CHG_CNT(_pStart, _val) \
SET_BITS_TO_LE_4BYTE(_pStart, 12, 8, _val)
/************************************************************
Reduced Neighbor Report
GET TBTT Info Header subfield: _pStart = start of TBTT Info Header subfield
************************************************************/
#define GET_TBTT_INFO_FIELD_TYPE(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 0, 2)
#define GET_FILTED_NB_AP(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 2, 1)
#define GET_TBTT_INFO_CNT(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 4, 4)
#define GET_TBTT_INFO_LEN(_pStart) \
LE_BITS_TO_2BYTE(_pStart, 8, 8)
/************************************************************
Reduced Neighbor Report
GET TBTT Info BSS Parameters subfield: _pStart = start of TBTT BSS Parameters subfield
************************************************************/
#define GET_BSS_PARAMS_OCT_RECOMM(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 0, 1)
#define GET_BSS_PARAMS_SAME_SSID(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 1, 1)
#define GET_BSS_PARAMS_MULTI_BSSID(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 2, 1)
#define GET_BSS_PARAMS_TRANSMITTED_BSSID(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 3, 1)
#define GET_BSS_PARAMS_MEM_24G_5G_COLOCATED_AP(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 4, 1)
#define GET_BSS_PARAMS_UNSOLICITED_PROBE_RESP_ACTIVE(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 5, 1)
#define GET_BSS_PARAMS_COLOACTED_AP(_pEleStart) \
LE_BITS_TO_1BYTE(_pEleStart, 6, 1)
/************************************************************
Reduced Neighbor Report
GET MLD Parameters: _pStart = start of MLD Parameters subfield
************************************************************/
#define GET_MLD_PARAMS_MLD_ID(_pStart) \
LE_BITS_TO_4BYTE(_pStart, 0, 8)
#define GET_MLD_PARAMS_LINK_ID(_pStart) \
LE_BITS_TO_4BYTE(_pStart, 8, 4)
#define GET_MLD_PARAMS_BSS_PARAMS_CHG_CNT(_pStart) \
LE_BITS_TO_4BYTE(_pStart, 12, 8)
#endif /*_PHL_STA_H_*/