1*5113495bSYour Name /* 2*5113495bSYour Name * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. 3*5113495bSYour Name * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4*5113495bSYour Name * 5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for 6*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the 7*5113495bSYour Name * above copyright notice and this permission notice appear in all 8*5113495bSYour Name * copies. 9*5113495bSYour Name * 10*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE. 18*5113495bSYour Name */ 19*5113495bSYour Name 20*5113495bSYour Name #ifndef _WLAN_CFR_UTILS_API_H_ 21*5113495bSYour Name #define _WLAN_CFR_UTILS_API_H_ 22*5113495bSYour Name 23*5113495bSYour Name #include <wlan_objmgr_cmn.h> 24*5113495bSYour Name #include <qdf_streamfs.h> 25*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 26*5113495bSYour Name #include <qdf_timer.h> 27*5113495bSYour Name #endif 28*5113495bSYour Name 29*5113495bSYour Name #define cfr_alert(format, args...) \ 30*5113495bSYour Name QDF_TRACE_FATAL(QDF_MODULE_ID_CFR, format, ## args) 31*5113495bSYour Name 32*5113495bSYour Name #define cfr_err(format, args...) \ 33*5113495bSYour Name QDF_TRACE_ERROR(QDF_MODULE_ID_CFR, format, ## args) 34*5113495bSYour Name 35*5113495bSYour Name #define cfr_warn(format, args...) \ 36*5113495bSYour Name QDF_TRACE_WARN(QDF_MODULE_ID_CFR, format, ## args) 37*5113495bSYour Name 38*5113495bSYour Name #define cfr_info(format, args...) \ 39*5113495bSYour Name QDF_TRACE_INFO(QDF_MODULE_ID_CFR, format, ## args) 40*5113495bSYour Name 41*5113495bSYour Name #define cfr_debug(format, args...) \ 42*5113495bSYour Name QDF_TRACE_DEBUG(QDF_MODULE_ID_CFR, format, ## args) 43*5113495bSYour Name 44*5113495bSYour Name #define DBR_EVENT_TIMEOUT_IN_MS_CFR 1 45*5113495bSYour Name #define DBR_NUM_RESP_PER_EVENT_CFR 1 46*5113495bSYour Name #define MAX_CFR_ENABLED_CLIENTS 10 47*5113495bSYour Name #define CFR_CAPTURE_HOST_MEM_REQ_ID 9 48*5113495bSYour Name #define CFR_HOST_MEM_READ_INDEX_DEFAULT 8 49*5113495bSYour Name #define CFR_VENDOR_ID 0x8cfdf0 50*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 51*5113495bSYour Name #define MAX_CFR_MU_USERS 4 52*5113495bSYour Name #define NUM_CHAN_CAPTURE_STATUS 4 53*5113495bSYour Name #define NUM_CHAN_CAPTURE_REASON 6 54*5113495bSYour Name #if defined(QCA_WIFI_QCA6750) || defined(QCA_WIFI_QCA6490) || \ 55*5113495bSYour Name defined(QCA_WIFI_WCN6450) 56*5113495bSYour Name #define MAX_TA_RA_ENTRIES 4 57*5113495bSYour Name #define MAX_RESET_CFG_ENTRY 0xF 58*5113495bSYour Name #else 59*5113495bSYour Name #define MAX_TA_RA_ENTRIES 16 60*5113495bSYour Name #define MAX_RESET_CFG_ENTRY 0xFFFF 61*5113495bSYour Name #endif 62*5113495bSYour Name #define CFR_INVALID_VDEV_ID 0xff 63*5113495bSYour Name #define DEFAULT_SRNGID_CFR 0 64*5113495bSYour Name #endif 65*5113495bSYour Name 66*5113495bSYour Name #define MAX_CFR_PRD (10 * 60 * 1000) /* 10 minutes */ 67*5113495bSYour Name #define CFR_MOD_PRD 10 /* CFR period to be multiples of 10ms */ 68*5113495bSYour Name 69*5113495bSYour Name #define MAX_AGC_GAIN 62 70*5113495bSYour Name #define INVALID_AGC_GAIN 0xFFFF 71*5113495bSYour Name 72*5113495bSYour Name enum cfrmetaversion { 73*5113495bSYour Name CFR_META_VERSION_NONE, 74*5113495bSYour Name CFR_META_VERSION_1, /* initial version for legacy_cfr_metadata */ 75*5113495bSYour Name CFR_META_VERSION_2, /* initial version for dbr_cfr_metadata */ 76*5113495bSYour Name CFR_META_VERSION_3, /* initial version for enh_cfr_metadata */ 77*5113495bSYour Name CFR_META_VERSION_4, /* agc gain, cfo, rx_start_ts in dbr_cfr_metadata */ 78*5113495bSYour Name CFR_META_VERSION_5, /* agc gain, cfo, rx_start_ts in enh_cfr_metadata */ 79*5113495bSYour Name CFR_META_VERSION_6, /* mcs, gi_type in dbr_cfr_metadata */ 80*5113495bSYour Name CFR_META_VERSION_7, /* mcs, gi_type, sig_info in enh_cfr_metadata */ 81*5113495bSYour Name CFR_META_VERSION_8, /* agc gain table index in dbr_cfr_metadata */ 82*5113495bSYour Name CFR_META_VERSION_9, /* agc gain table index in enh_cfr_metadata */ 83*5113495bSYour Name CFR_META_VERSION_MAX = 0xFF, 84*5113495bSYour Name }; 85*5113495bSYour Name 86*5113495bSYour Name enum cfrdataversion { 87*5113495bSYour Name CFR_DATA_VERSION_NONE, 88*5113495bSYour Name CFR_DATA_VERSION_1, 89*5113495bSYour Name CFR_DATA_VERSION_MAX = 0xFF, 90*5113495bSYour Name }; 91*5113495bSYour Name 92*5113495bSYour Name enum cfrplatformtype { 93*5113495bSYour Name CFR_PLATFORM_TYPE_NONE, 94*5113495bSYour Name CFR_PLATFORM_TYPE_MIPS, 95*5113495bSYour Name CFR_PLATFORM_TYPE_ARM, 96*5113495bSYour Name CFR_PLATFFORM_TYPE_MAX = 0xFF, 97*5113495bSYour Name }; 98*5113495bSYour Name 99*5113495bSYour Name enum cfrradiotype { 100*5113495bSYour Name CFR_CAPTURE_RADIO_NONE, 101*5113495bSYour Name CFR_CAPTURE_RADIO_OSPREY, 102*5113495bSYour Name CFR_CAPTURE_RADIO_PEAKCOCK, 103*5113495bSYour Name CFR_CAPTURE_RADIO_SCORPION, 104*5113495bSYour Name CFR_CAPTURE_RADIO_HONEYBEE, 105*5113495bSYour Name CFR_CAPTURE_RADIO_DRAGONFLY, 106*5113495bSYour Name CFR_CAPTURE_RADIO_JET, 107*5113495bSYour Name CFR_CAPTURE_RADIO_PEREGRINE = 17, 108*5113495bSYour Name CFR_CAPTURE_RADIO_SWIFT, 109*5113495bSYour Name CFR_CAPTURE_RADIO_BEELINER, 110*5113495bSYour Name CFR_CAPTURE_RADIO_CASCADE, 111*5113495bSYour Name CFR_CAPTURE_RADIO_DAKOTA, 112*5113495bSYour Name CFR_CAPTURE_RADIO_BESRA, 113*5113495bSYour Name CFR_CAPTURE_RADIO_HKV2, 114*5113495bSYour Name CFR_CAPTURE_RADIO_CYP, 115*5113495bSYour Name CFR_CAPTURE_RADIO_HSP, 116*5113495bSYour Name CFR_CAPTURE_RADIO_PINE, 117*5113495bSYour Name CFR_CAPTURE_RADIO_ADRASTEA, 118*5113495bSYour Name CFR_CAPTURE_RADIO_MAPLE, 119*5113495bSYour Name CFR_CAPTURE_RADIO_MOSELLE, 120*5113495bSYour Name CFR_CAPTURE_RADIO_SPRUCE, 121*5113495bSYour Name CFR_CAPTURE_RADIO_ALDER, 122*5113495bSYour Name CFR_CAPTURE_RADIO_WAIKIKI, 123*5113495bSYour Name CFR_CAPTURE_RADIO_KIWI, 124*5113495bSYour Name CFR_CAPTURE_RADIO_MANGO, 125*5113495bSYour Name CFR_CAPTURE_RADIO_MIAMI, 126*5113495bSYour Name CFR_CAPTURE_RADIO_YORK, 127*5113495bSYour Name CFR_CAPTURE_RADIO_PEACH, 128*5113495bSYour Name CFR_CAPTURE_RADIO_PEBBLE, 129*5113495bSYour Name CFR_CAPTURE_RADIO_EVROS, 130*5113495bSYour Name CFR_CAPTURE_RADIO_MAX = 0xFF, 131*5113495bSYour Name }; 132*5113495bSYour Name 133*5113495bSYour Name enum ack_capture_mode { 134*5113495bSYour Name CFR_LEGACY_ACK = 0, 135*5113495bSYour Name CFR_DUP_LEGACY_ACK = 1, 136*5113495bSYour Name CFR_HT_ACK = 2, 137*5113495bSYour Name CFR_VHT_ACK = 3, 138*5113495bSYour Name CFR_INVALID_ACK, /*Always keep this at last*/ 139*5113495bSYour Name }; 140*5113495bSYour Name 141*5113495bSYour Name /* Similar to WMI_PEER_CFR_CAPTURE_METHOD used in one-shot capture */ 142*5113495bSYour Name enum cfr_capture_type { 143*5113495bSYour Name CFR_TYPE_METHOD_NULL_FRAME = 0, 144*5113495bSYour Name CFR_TYPE_METHOD_NULL_FRAME_WITH_PHASE = 1, 145*5113495bSYour Name CFR_TYPE_METHOD_PROBE_RESP = 2, 146*5113495bSYour Name CFR_TYPE_METHOD_TM = 3, 147*5113495bSYour Name CFR_TYPE_METHOD_FTM = 4, 148*5113495bSYour Name CFR_TYPE_METHOD_ACK_RESP_TO_TM_FTM = 5, 149*5113495bSYour Name CFR_TYPE_METHOD_TA_RA_TYPE_FILTER = 6, 150*5113495bSYour Name CFR_TYPE_METHOD_NDPA_NDP = 7, 151*5113495bSYour Name CFR_TYPE_METHOD_ALL_PACKET = 8, 152*5113495bSYour Name /* Add new capture methods before this line */ 153*5113495bSYour Name CFR_TYPE_METHOD_LAST_VALID, 154*5113495bSYour Name CFR_TYPE_METHOD_AUTO = 0xff, 155*5113495bSYour Name CFR_TYPE_METHOD_MAX, 156*5113495bSYour Name }; 157*5113495bSYour Name 158*5113495bSYour Name #define HOST_MAX_CHAINS 8 159*5113495bSYour Name 160*5113495bSYour Name /* ensure to add new members at the end of the structure only */ 161*5113495bSYour Name struct dbr_cfr_metadata { 162*5113495bSYour Name u_int8_t peer_addr[QDF_MAC_ADDR_SIZE]; 163*5113495bSYour Name u_int8_t status; 164*5113495bSYour Name u_int8_t capture_bw; 165*5113495bSYour Name u_int8_t channel_bw; 166*5113495bSYour Name u_int8_t phy_mode; 167*5113495bSYour Name u_int16_t prim20_chan; 168*5113495bSYour Name u_int16_t center_freq1; 169*5113495bSYour Name u_int16_t center_freq2; 170*5113495bSYour Name u_int8_t capture_mode; 171*5113495bSYour Name u_int8_t capture_type; 172*5113495bSYour Name u_int8_t sts_count; 173*5113495bSYour Name u_int8_t num_rx_chain; 174*5113495bSYour Name u_int32_t timestamp; 175*5113495bSYour Name u_int32_t length; 176*5113495bSYour Name u_int32_t chain_rssi[HOST_MAX_CHAINS]; 177*5113495bSYour Name u_int16_t chain_phase[HOST_MAX_CHAINS]; 178*5113495bSYour Name u_int32_t rtt_cfo_measurement; 179*5113495bSYour Name u_int8_t agc_gain[HOST_MAX_CHAINS]; 180*5113495bSYour Name u_int32_t rx_start_ts; 181*5113495bSYour Name u_int16_t mcs_rate; 182*5113495bSYour Name u_int16_t gi_type; 183*5113495bSYour Name u_int8_t agc_gain_tbl_index[HOST_MAX_CHAINS]; 184*5113495bSYour Name } __attribute__ ((__packed__)); 185*5113495bSYour Name 186*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 187*5113495bSYour Name struct cfr_su_sig_info { 188*5113495bSYour Name u_int8_t coding; 189*5113495bSYour Name u_int8_t stbc; 190*5113495bSYour Name u_int8_t beamformed; 191*5113495bSYour Name u_int8_t dcm; 192*5113495bSYour Name u_int8_t ltf_size; 193*5113495bSYour Name u_int8_t sgi; 194*5113495bSYour Name u_int16_t reserved; 195*5113495bSYour Name } __attribute__ ((__packed__)); 196*5113495bSYour Name 197*5113495bSYour Name /* ensure to add new members at the end of the structure only */ 198*5113495bSYour Name struct enh_cfr_metadata { 199*5113495bSYour Name u_int8_t status; 200*5113495bSYour Name u_int8_t capture_bw; 201*5113495bSYour Name u_int8_t channel_bw; 202*5113495bSYour Name u_int8_t phy_mode; 203*5113495bSYour Name u_int16_t prim20_chan; 204*5113495bSYour Name u_int16_t center_freq1; 205*5113495bSYour Name u_int16_t center_freq2; 206*5113495bSYour Name u_int8_t capture_mode; /* ack_capture_mode */ 207*5113495bSYour Name u_int8_t capture_type; /* cfr_capture_type */ 208*5113495bSYour Name u_int8_t sts_count; 209*5113495bSYour Name u_int8_t num_rx_chain; 210*5113495bSYour Name u_int64_t timestamp; 211*5113495bSYour Name u_int32_t length; 212*5113495bSYour Name u_int8_t is_mu_ppdu; 213*5113495bSYour Name u_int8_t num_mu_users; 214*5113495bSYour Name union { 215*5113495bSYour Name u_int8_t su_peer_addr[QDF_MAC_ADDR_SIZE]; 216*5113495bSYour Name u_int8_t mu_peer_addr[MAX_CFR_MU_USERS][QDF_MAC_ADDR_SIZE]; 217*5113495bSYour Name } peer_addr; 218*5113495bSYour Name u_int32_t chain_rssi[HOST_MAX_CHAINS]; 219*5113495bSYour Name u_int16_t chain_phase[HOST_MAX_CHAINS]; 220*5113495bSYour Name u_int32_t rtt_cfo_measurement; 221*5113495bSYour Name u_int8_t agc_gain[HOST_MAX_CHAINS]; 222*5113495bSYour Name u_int32_t rx_start_ts; 223*5113495bSYour Name u_int16_t mcs_rate; 224*5113495bSYour Name u_int16_t gi_type; 225*5113495bSYour Name struct cfr_su_sig_info sig_info; 226*5113495bSYour Name u_int8_t agc_gain_tbl_index[HOST_MAX_CHAINS]; 227*5113495bSYour Name } __attribute__ ((__packed__)); 228*5113495bSYour Name #endif 229*5113495bSYour Name 230*5113495bSYour Name #define CFR_META_DATA_LEN \ 231*5113495bSYour Name (sizeof(struct csi_cfr_header) - sizeof(struct cfr_header_cmn)) 232*5113495bSYour Name 233*5113495bSYour Name struct cfr_header_cmn { 234*5113495bSYour Name u_int32_t start_magic_num; 235*5113495bSYour Name u_int32_t vendorid; 236*5113495bSYour Name u_int8_t cfr_metadata_version; 237*5113495bSYour Name u_int8_t cfr_data_version; 238*5113495bSYour Name u_int8_t chip_type; 239*5113495bSYour Name u_int8_t pltform_type; 240*5113495bSYour Name u_int32_t cfr_metadata_len; 241*5113495bSYour Name u_int64_t host_real_ts; 242*5113495bSYour Name } __attribute__ ((__packed__)); 243*5113495bSYour Name 244*5113495bSYour Name struct csi_cfr_header { 245*5113495bSYour Name struct cfr_header_cmn cmn; 246*5113495bSYour Name union { 247*5113495bSYour Name struct dbr_cfr_metadata meta_dbr; 248*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 249*5113495bSYour Name struct enh_cfr_metadata meta_enh; 250*5113495bSYour Name #endif 251*5113495bSYour Name } u; 252*5113495bSYour Name } __attribute__ ((__packed__)); 253*5113495bSYour Name 254*5113495bSYour Name /** 255*5113495bSYour Name * struct cfr_capture_params - structure to store cfr config param 256*5113495bSYour Name * @bandwidth: bandwidth of capture 257*5113495bSYour Name * @period: period of capture 258*5113495bSYour Name * @method: enum of method being followed to capture cfr data. 0-QoS null data 259*5113495bSYour Name */ 260*5113495bSYour Name struct cfr_capture_params { 261*5113495bSYour Name u_int8_t bandwidth; 262*5113495bSYour Name u_int32_t period; 263*5113495bSYour Name u_int8_t method; 264*5113495bSYour Name }; 265*5113495bSYour Name 266*5113495bSYour Name /** 267*5113495bSYour Name * struct psoc_cfr - private psoc object for cfr 268*5113495bSYour Name * @psoc_obj: pointer to psoc object 269*5113495bSYour Name * @is_cfr_capable: flag to determine if cfr is enabled or not 270*5113495bSYour Name * @is_cfr_pdev_id_soc: flag to send cfr request with PDEV_ID_SOC 271*5113495bSYour Name * @is_cap_interval_mode_sel_support: flag to determine if target supports both 272*5113495bSYour Name * capture_count and capture_duration modes 273*5113495bSYour Name * with a nob provided to configure 274*5113495bSYour Name * @is_mo_marking_support: flag to determine if MO marking is supported or not 275*5113495bSYour Name * @is_aoa_for_rcc_support: 276*5113495bSYour Name */ 277*5113495bSYour Name struct psoc_cfr { 278*5113495bSYour Name struct wlan_objmgr_psoc *psoc_obj; 279*5113495bSYour Name uint8_t is_cfr_capable; 280*5113495bSYour Name uint8_t is_cfr_pdev_id_soc; 281*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 282*5113495bSYour Name uint8_t is_cap_interval_mode_sel_support; 283*5113495bSYour Name uint8_t is_mo_marking_support; 284*5113495bSYour Name uint8_t is_aoa_for_rcc_support; 285*5113495bSYour Name #endif 286*5113495bSYour Name }; 287*5113495bSYour Name 288*5113495bSYour Name /** 289*5113495bSYour Name * struct cfr_wmi_host_mem_chunk - wmi mem chunk related 290*5113495bSYour Name * @vaddr: pointer to virtual address 291*5113495bSYour Name * @paddr: physical address 292*5113495bSYour Name * @len: len of the mem chunk allocated 293*5113495bSYour Name * @req_id: reqid related to the mem chunk 294*5113495bSYour Name */ 295*5113495bSYour Name struct cfr_wmi_host_mem_chunk { 296*5113495bSYour Name uint32_t *vaddr; 297*5113495bSYour Name qdf_dma_addr_t paddr; 298*5113495bSYour Name uint32_t len; 299*5113495bSYour Name uint32_t req_id; 300*5113495bSYour Name }; 301*5113495bSYour Name 302*5113495bSYour Name struct whal_cfir_dma_hdr { 303*5113495bSYour Name uint16_t 304*5113495bSYour Name // 'BA' 305*5113495bSYour Name tag : 8, 306*5113495bSYour Name // '02', length of header in 4 octet units 307*5113495bSYour Name length : 6, 308*5113495bSYour Name // 00 309*5113495bSYour Name reserved : 2; 310*5113495bSYour Name uint16_t 311*5113495bSYour Name // [16] 312*5113495bSYour Name upload_done : 1, 313*5113495bSYour Name // [17:18], 0: invalid, 1: CFR, 2: CIR, 3: DebugH 314*5113495bSYour Name capture_type : 3, 315*5113495bSYour Name // [19:20], 0: Legacy, 1: HT, 2: VHT, 3: HE 316*5113495bSYour Name preamble_type : 2, 317*5113495bSYour Name // [21:23], 0: 1-stream, 1: 2-stream, ..., 7: 8-stream 318*5113495bSYour Name nss : 3, 319*5113495bSYour Name // [24:27], 0: invalid, 1: 1-chain, 2: 2-chain, etc. 320*5113495bSYour Name num_chains : 3, 321*5113495bSYour Name // [28:30], 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160 MHz 322*5113495bSYour Name upload_pkt_bw : 3, // [31] 323*5113495bSYour Name sw_peer_id_valid : 1; 324*5113495bSYour Name uint16_t 325*5113495bSYour Name sw_peer_id : 16; // [15:0] 326*5113495bSYour Name uint16_t 327*5113495bSYour Name phy_ppdu_id : 16; // [15:0] 328*5113495bSYour Name }; 329*5113495bSYour Name 330*5113495bSYour Name #define MAX_LUT_ENTRIES 140 /* For HKv2 136 is max */ 331*5113495bSYour Name 332*5113495bSYour Name /** 333*5113495bSYour Name * struct look_up_table - Placeholder for 2 asynchronous events (DBR and 334*5113495bSYour Name * TXRX event) 335*5113495bSYour Name * @dbr_recv: Indicates whether WMI for DBR completion is received or not 336*5113495bSYour Name * @tx_recv: Indicates whether WMI for TX completion (or) WDI event for RX 337*5113495bSYour Name * status is received or not 338*5113495bSYour Name * @data: pointer to CFR data that ucode DMAs to host memory 339*5113495bSYour Name * @data_len: length of CFR data DMAed by ucode 340*5113495bSYour Name * @dbr_ppdu_id: PPDU id retrieved from DBR completion WMI event 341*5113495bSYour Name * @tx_ppdu_id: PPDU id retrieved from WMI TX completion event (or) PPDU status 342*5113495bSYour Name * TLV 343*5113495bSYour Name * @dbr_address: Physical address of the CFR data dump retrieved from DBR 344*5113495bSYour Name * completion WMI event 345*5113495bSYour Name * @tx_address1: Physical address of the CFR data from TX/RX event 346*5113495bSYour Name * @tx_address2: Physical address of the CFR data from TX/RX event 347*5113495bSYour Name * @header: CFR header constructed by host 348*5113495bSYour Name * @dma_hdr: CFR header constructed by ucode 349*5113495bSYour Name * @txrx_tstamp: Timestamp when TX/RX event was received 350*5113495bSYour Name * @dbr_tstamp: Timestamp when DBR completion event was received 351*5113495bSYour Name * @header_length: Length of header DMAed by ucode in words 352*5113495bSYour Name * @payload_length: Length of CFR payload 353*5113495bSYour Name */ 354*5113495bSYour Name struct look_up_table { 355*5113495bSYour Name bool dbr_recv; 356*5113495bSYour Name bool tx_recv; 357*5113495bSYour Name uint8_t *data; /* capture payload */ 358*5113495bSYour Name uint32_t data_len; /* capture len */ 359*5113495bSYour Name uint16_t dbr_ppdu_id; /* ppdu id from dbr */ 360*5113495bSYour Name uint16_t tx_ppdu_id; /* ppdu id from TX event */ 361*5113495bSYour Name qdf_dma_addr_t dbr_address; /* capture len */ 362*5113495bSYour Name uint32_t tx_address1; /* capture len */ 363*5113495bSYour Name uint32_t tx_address2; /* capture len */ 364*5113495bSYour Name struct csi_cfr_header header; 365*5113495bSYour Name struct whal_cfir_dma_hdr dma_hdr; 366*5113495bSYour Name uint64_t txrx_tstamp; 367*5113495bSYour Name uint64_t dbr_tstamp; 368*5113495bSYour Name uint32_t header_length; 369*5113495bSYour Name uint32_t payload_length; 370*5113495bSYour Name }; 371*5113495bSYour Name 372*5113495bSYour Name struct unassoc_pool_entry { 373*5113495bSYour Name struct qdf_mac_addr mac; 374*5113495bSYour Name struct cfr_capture_params cfr_params; 375*5113495bSYour Name bool is_valid; 376*5113495bSYour Name }; 377*5113495bSYour Name 378*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 379*5113495bSYour Name /** 380*5113495bSYour Name * struct ta_ra_cfr_cfg - structure to store configuration of 16 groups in 381*5113495bSYour Name * M_TA_RA mode 382*5113495bSYour Name * @filter_group_id: Filter group number for which the below filters needs to be 383*5113495bSYour Name * applied 384*5113495bSYour Name * @bw: CFR capture will be done for packets matching the bandwidths specified 385*5113495bSYour Name * within this bitmask 386*5113495bSYour Name * @nss: CFR capture will be done for packets matching the Nss specified within 387*5113495bSYour Name * this bitmask 388*5113495bSYour Name * @rsvd0: reserved bits 389*5113495bSYour Name * @valid_ta: Ta_addr is valid if set 390*5113495bSYour Name * @valid_ta_mask: Ta_addr_mask is valid if set 391*5113495bSYour Name * @valid_ra: Ra_addr is valid if set 392*5113495bSYour Name * @valid_ra_mask: Ra_addr_mask is valid if set 393*5113495bSYour Name * @valid_bw_mask: Bandwidth is valid if set 394*5113495bSYour Name * @valid_nss_mask: NSS is valid if set 395*5113495bSYour Name * @valid_mgmt_subtype: Mgmt_subtype is valid if set 396*5113495bSYour Name * @valid_ctrl_subtype: Ctrl_subtype is valid if set 397*5113495bSYour Name * @valid_data_subtype: Data_subtype is valid if set 398*5113495bSYour Name * @rsvd1: reserved bits 399*5113495bSYour Name * @mgmt_subtype_filter: Managments Packets matching the subtype filter 400*5113495bSYour Name * categories will be filtered in by MAC for CFR capture. 401*5113495bSYour Name * @ctrl_subtype_filter: Control Packets matching the subtype filter 402*5113495bSYour Name * categories will be filtered in by MAC for CFR capture. 403*5113495bSYour Name * @data_subtype_filter: Data Packets matching the subtype filter 404*5113495bSYour Name * categories will be filtered in by MAC for CFR capture. 405*5113495bSYour Name * @tx_addr: Packets whose transmitter address matches (tx_addr & tx_addr_mask) 406*5113495bSYour Name * will be filtered in by MAC 407*5113495bSYour Name * @tx_addr_mask: Packets whose transmitter address matches (tx_addr & 408*5113495bSYour Name * tx_addr_mask) will be filtered in by MAC 409*5113495bSYour Name * @rx_addr: Packets whose receiver address matches (rx_addr & rx_addr_mask) 410*5113495bSYour Name * will be filtered in by MAC 411*5113495bSYour Name * @rx_addr_mask: Packets whose receiver address matches (rx_addr & 412*5113495bSYour Name * rx_addr_mask) will be filtered in by MAC 413*5113495bSYour Name */ 414*5113495bSYour Name struct ta_ra_cfr_cfg { 415*5113495bSYour Name uint8_t filter_group_id; 416*5113495bSYour Name uint16_t bw :6, 417*5113495bSYour Name nss :8, 418*5113495bSYour Name rsvd0 :2; 419*5113495bSYour Name uint16_t valid_ta :1, 420*5113495bSYour Name valid_ta_mask :1, 421*5113495bSYour Name valid_ra :1, 422*5113495bSYour Name valid_ra_mask :1, 423*5113495bSYour Name valid_bw_mask :1, 424*5113495bSYour Name valid_nss_mask :1, 425*5113495bSYour Name valid_mgmt_subtype :1, 426*5113495bSYour Name valid_ctrl_subtype :1, 427*5113495bSYour Name valid_data_subtype :1, 428*5113495bSYour Name rsvd1 :7; 429*5113495bSYour Name uint16_t mgmt_subtype_filter; 430*5113495bSYour Name uint16_t ctrl_subtype_filter; 431*5113495bSYour Name uint16_t data_subtype_filter; 432*5113495bSYour Name uint8_t tx_addr[QDF_MAC_ADDR_SIZE]; 433*5113495bSYour Name uint8_t rx_addr[QDF_MAC_ADDR_SIZE]; 434*5113495bSYour Name uint8_t tx_addr_mask[QDF_MAC_ADDR_SIZE]; 435*5113495bSYour Name uint8_t rx_addr_mask[QDF_MAC_ADDR_SIZE]; 436*5113495bSYour Name 437*5113495bSYour Name } qdf_packed; 438*5113495bSYour Name 439*5113495bSYour Name /** 440*5113495bSYour Name * struct cfr_rcc_param - structure to store cfr config param 441*5113495bSYour Name * @pdev_id: pdev_id for identifying the MAC 442*5113495bSYour Name * @vdev_id: vdev_id of current rcc configures 443*5113495bSYour Name * @srng_id: srng id of current rcc configures 444*5113495bSYour Name * @capture_duration: Capture Duration field for which CFR capture has to 445*5113495bSYour Name * happen, in microsecond units 446*5113495bSYour Name * @capture_interval: Capture interval field which is time in between 447*5113495bSYour Name * consecutive CFR capture, in microsecond units 448*5113495bSYour Name * @ul_mu_user_mask_lower: Bitfields indicates which of the users in the current 449*5113495bSYour Name * UL MU transmission are enabled for CFR capture. 450*5113495bSYour Name * @ul_mu_user_mask_upper: This is continuation of the above lower mask. 451*5113495bSYour Name * @freeze_tlv_delay_cnt_en: Enable Freeze TLV delay counter in MAC 452*5113495bSYour Name * @freeze_tlv_delay_cnt_thr: Indicates the number of consecutive Rx packets to 453*5113495bSYour Name * be skipped before CFR capture is enabled again. 454*5113495bSYour Name * @rsvd0: reserved bits 455*5113495bSYour Name * @filter_group_bitmap: Bitfields set indicates which of the CFR group config 456*5113495bSYour Name * is enabled 457*5113495bSYour Name * @m_directed_ftm: Filter Directed FTM ACK frames for CFR capture 458*5113495bSYour Name * @m_all_ftm_ack: Filter All FTM ACK frames for CFR capture 459*5113495bSYour Name * @m_ndpa_ndp_directed: Filter NDPA NDP Directed Frames for CFR capture 460*5113495bSYour Name * @m_ndpa_ndp_all: Filter all NDPA NDP for CFR capture 461*5113495bSYour Name * @m_ta_ra_filter: Filter Frames based on TA/RA/Subtype as provided in CFR 462*5113495bSYour Name * Group config 463*5113495bSYour Name * @m_all_packet: Filter in All packets for CFR Capture 464*5113495bSYour Name * @en_ta_ra_filter_in_as_fp: Filter in frames as FP/MO in m_ta_ra_filter mode 465*5113495bSYour Name * @rsvd1: reserved bits 466*5113495bSYour Name * @num_grp_tlvs: Indicates the number of groups in M_TA_RA mode, that have 467*5113495bSYour Name * changes in the current commit session, use to construct WMI group TLV(s) 468*5113495bSYour Name * @curr: Placeholder for M_TA_RA group config in current commit session 469*5113495bSYour Name * @modified_in_curr_session: Bitmap indicating number of groups in M_TA_RA mode 470*5113495bSYour Name * that have changed in current commit session. 471*5113495bSYour Name * @capture_count: After capture_count+1 number of captures, MAC stops RCC and 472*5113495bSYour Name * waits for capture_interval duration before enabling again 473*5113495bSYour Name * @capture_intval_mode_sel: 0 indicates capture_duration mode, 1 indicates the 474*5113495bSYour Name * capture_count mode. 475*5113495bSYour Name * @rsvd2: reserved bits 476*5113495bSYour Name */ 477*5113495bSYour Name struct cfr_rcc_param { 478*5113495bSYour Name uint8_t pdev_id; 479*5113495bSYour Name uint8_t vdev_id; 480*5113495bSYour Name uint8_t srng_id; 481*5113495bSYour Name uint32_t capture_duration; 482*5113495bSYour Name uint32_t capture_interval; 483*5113495bSYour Name uint32_t ul_mu_user_mask_lower; 484*5113495bSYour Name uint32_t ul_mu_user_mask_upper; 485*5113495bSYour Name uint16_t freeze_tlv_delay_cnt_en :1, 486*5113495bSYour Name freeze_tlv_delay_cnt_thr :8, 487*5113495bSYour Name rsvd0 :7; 488*5113495bSYour Name uint16_t filter_group_bitmap; 489*5113495bSYour Name uint8_t m_directed_ftm : 1, 490*5113495bSYour Name m_all_ftm_ack : 1, 491*5113495bSYour Name m_ndpa_ndp_directed : 1, 492*5113495bSYour Name m_ndpa_ndp_all : 1, 493*5113495bSYour Name m_ta_ra_filter : 1, 494*5113495bSYour Name m_all_packet : 1, 495*5113495bSYour Name en_ta_ra_filter_in_as_fp : 1, 496*5113495bSYour Name rsvd1 : 1; 497*5113495bSYour Name uint8_t num_grp_tlvs; 498*5113495bSYour Name 499*5113495bSYour Name struct ta_ra_cfr_cfg curr[MAX_TA_RA_ENTRIES]; 500*5113495bSYour Name unsigned long modified_in_curr_session; 501*5113495bSYour Name uint32_t capture_count :16, 502*5113495bSYour Name capture_intval_mode_sel :1, 503*5113495bSYour Name rsvd2 :15; 504*5113495bSYour Name }; 505*5113495bSYour Name #endif /* WLAN_ENH_CFR_ENABLE */ 506*5113495bSYour Name 507*5113495bSYour Name /** 508*5113495bSYour Name * struct nl_event_cb - nl event cb for cfr data 509*5113495bSYour Name * @vdev_id: vdev id 510*5113495bSYour Name * @pid: PID to which data is sent via unicast nl event 511*5113495bSYour Name * @cfr_nl_cb: callback to send nl event 512*5113495bSYour Name */ 513*5113495bSYour Name struct nl_event_cb { 514*5113495bSYour Name uint8_t vdev_id; 515*5113495bSYour Name uint32_t pid; 516*5113495bSYour Name void (*cfr_nl_cb)(uint8_t vdev_id, uint32_t pid, 517*5113495bSYour Name const void *data, uint32_t data_len); 518*5113495bSYour Name }; 519*5113495bSYour Name 520*5113495bSYour Name /** 521*5113495bSYour Name * struct pdev_cfr - private pdev object for cfr 522*5113495bSYour Name * @pdev_obj: pointer to pdev object 523*5113495bSYour Name * @is_cfr_capable: flag to determine if cfr is enabled or not 524*5113495bSYour Name * @cfr_timer_enable: flag to enable/disable timer 525*5113495bSYour Name * @chip_type: chip type which is defined in enum cfrradiotype 526*5113495bSYour Name * @cfr_mem_chunk: Region of memory used for storing cfr data 527*5113495bSYour Name * @cfr_max_sta_count: Maximum stations supported in one-shot capture mode 528*5113495bSYour Name * @cfr_current_sta_count: 529*5113495bSYour Name * @num_subbufs: No. of sub-buffers used in relayfs 530*5113495bSYour Name * @subbuf_size: Size of sub-buffer used in relayfs 531*5113495bSYour Name * @chan_ptr: Channel in relayfs 532*5113495bSYour Name * @dir_ptr: Parent directory of relayfs file 533*5113495bSYour Name * @lut: lookup table used to store asynchronous DBR and TX/RX events for 534*5113495bSYour Name * correlation 535*5113495bSYour Name * @lut_num: Number of lut 536*5113495bSYour Name * @dbr_buf_size: Size of DBR completion buffer 537*5113495bSYour Name * @dbr_num_bufs: No. of DBR completions 538*5113495bSYour Name * @max_mu_users: Max number of MU users 539*5113495bSYour Name * @tx_evt_cnt: No. of TX completion events till CFR stop was issued 540*5113495bSYour Name * @total_tx_evt_cnt: No. of Tx completion events since wifi was up 541*5113495bSYour Name * @dbr_evt_cnt: No. of WMI DBR completion events 542*5113495bSYour Name * @release_cnt: No. of CFR data buffers relayed to userspace 543*5113495bSYour Name * @tx_peer_status_cfr_fail: No. of tx events without tx status set to 544*5113495bSYour Name * PEER_CFR_CAPTURE_EVT_STATUS_MASK indicating CFR capture failure on a peer. 545*5113495bSYour Name * @tx_evt_status_cfr_fail: No. of tx events without tx status set to 546*5113495bSYour Name * CFR_TX_EVT_STATUS_MASK indicating CFR capture status failure. 547*5113495bSYour Name * @tx_dbr_cookie_lookup_fail: No. of dbr cookie lookup failures during tx event 548*5113495bSYour Name * process. 549*5113495bSYour Name * @rcc_param: Structure to store CFR config for the current commit session 550*5113495bSYour Name * @global: Structure to store accumulated CFR config 551*5113495bSYour Name * @rx_tlv_evt_cnt: Number of CFR WDI events from datapath 552*5113495bSYour Name * @lut_age_timer: Timer to flush pending TXRX/DBR events in lookup table 553*5113495bSYour Name * @lut_timer_init: flag to determine if lut_age_timer is initialized or not 554*5113495bSYour Name * @is_cfr_rcc_capable: Flag to determine if RCC is enabled or not. 555*5113495bSYour Name * @flush_dbr_cnt: No. of un-correlated DBR completions flushed when a newer 556*5113495bSYour Name * PPDU is correlated successfully with newer DBR completion 557*5113495bSYour Name * @invalid_dma_length_cnt: No. of buffers for which CFR DMA header length (or) 558*5113495bSYour Name * data length was invalid 559*5113495bSYour Name * @flush_timeout_dbr_cnt: No. of DBR completion flushed out in ageout logic 560*5113495bSYour Name * @clear_txrx_event: No. of PPDU status TLVs over-written in LUT 561*5113495bSYour Name * @last_success_tstamp: DBR timestamp which indicates that both DBR and TX/RX 562*5113495bSYour Name * events have been received successfully. 563*5113495bSYour Name * @cfr_dma_aborts: No. of CFR DMA aborts in ucode 564*5113495bSYour Name * @is_cap_interval_mode_sel_support: flag to determine if target supports both 565*5113495bSYour Name * @is_mo_marking_support: flag to determine if MO marking is supported or not 566*5113495bSYour Name * @is_aoa_for_rcc_support: flag to determine if AoA is available for RCC or not 567*5113495bSYour Name * capture_count and capture_duration modes with a nob provided to configure. 568*5113495bSYour Name * @unassoc_pool: Pool of un-associated clients used when capture method is 569*5113495bSYour Name * CFR_CAPTURE_METHOD_PROBE_RESPONSE 570*5113495bSYour Name * @nl_cb: call back to register for nl event for cfr data 571*5113495bSYour Name * @lut_lock: Lock to protect access to cfr lookup table 572*5113495bSYour Name * @lut_lock_initialised: Check lut_lock initialised or not. 573*5113495bSYour Name * @is_prevent_suspend: CFR wake lock acquired or not 574*5113495bSYour Name * @wake_lock: wake lock for cfr 575*5113495bSYour Name * @runtime_lock: runtime lock for cfr 576*5113495bSYour Name * @freq: current operating freq for which AoA Phase delta values reported by FW 577*5113495bSYour Name * @max_aoa_chains: Indicate the max number of chains to which target supports 578*5113495bSYour Name * AoA data. 579*5113495bSYour Name * @phase_delta: per chain phase delta associated with 62 gain values reported 580*5113495bSYour Name * by FW via WMI_PDEV_AOA_PHASEDELTA_EVENTID. This is for the targets which 581*5113495bSYour Name * supports only default gain table. 582*5113495bSYour Name * @ibf_cal_val: Per chain IBF cal value from FW. 583*5113495bSYour Name * @is_enh_aoa_data: flag to indicate the pdev supports enhanced AoA. 584*5113495bSYour Name * @max_agc_gain_tbls: Max rx AGC gain tables supported & advertised by target. 585*5113495bSYour Name * @max_agc_gain_per_tbl_2g: Max possible rx AGC gain per table on 2GHz band. 586*5113495bSYour Name * @max_agc_gain_per_tbl_5g: Max possible rx AGC gain per table on 5GHz band. 587*5113495bSYour Name * @max_agc_gain_per_tbl_6g: Max possbile rx AGC gain per table on 6GHz band. 588*5113495bSYour Name * @max_bdf_entries_per_tbl: Max entries per table in gain & phase array. 589*5113495bSYour Name * @max_entries_all_table: Max entries across table in gain & phase array. 590*5113495bSYour Name * @gain_stop_index_array: This array has optimized gain range values stored. 591*5113495bSYour Name * @enh_phase_delta_array: This array has optimized phase delta values stored 592*5113495bSYour Name * aligning with gain_stop_index_array. 593*5113495bSYour Name * @start_ent: array where each entry indicates the offset index per table to be 594*5113495bSYour Name * applied on gain_stop_index_array and enh_phase_delta_array 595*5113495bSYour Name * @xbar_config: xbar config to be used to map bb to rf chainmask. 596*5113495bSYour Name */ 597*5113495bSYour Name /* 598*5113495bSYour Name * To be extended if we get more capbality info 599*5113495bSYour Name * from FW's extended service ready event. 600*5113495bSYour Name */ 601*5113495bSYour Name struct pdev_cfr { 602*5113495bSYour Name struct wlan_objmgr_pdev *pdev_obj; 603*5113495bSYour Name uint8_t is_cfr_capable; 604*5113495bSYour Name uint8_t cfr_timer_enable; 605*5113495bSYour Name uint8_t chip_type; 606*5113495bSYour Name struct cfr_wmi_host_mem_chunk cfr_mem_chunk; 607*5113495bSYour Name uint16_t cfr_max_sta_count; 608*5113495bSYour Name uint16_t cfr_current_sta_count; 609*5113495bSYour Name uint32_t num_subbufs; 610*5113495bSYour Name uint32_t subbuf_size; 611*5113495bSYour Name qdf_streamfs_chan_t chan_ptr; 612*5113495bSYour Name qdf_dentry_t dir_ptr; 613*5113495bSYour Name struct look_up_table **lut; 614*5113495bSYour Name uint32_t lut_num; 615*5113495bSYour Name uint32_t dbr_buf_size; 616*5113495bSYour Name uint32_t dbr_num_bufs; 617*5113495bSYour Name uint32_t max_mu_users; 618*5113495bSYour Name uint64_t tx_evt_cnt; 619*5113495bSYour Name uint64_t total_tx_evt_cnt; 620*5113495bSYour Name uint64_t dbr_evt_cnt; 621*5113495bSYour Name uint64_t release_cnt; 622*5113495bSYour Name uint64_t tx_peer_status_cfr_fail; 623*5113495bSYour Name uint64_t tx_evt_status_cfr_fail; 624*5113495bSYour Name uint64_t tx_dbr_cookie_lookup_fail; 625*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 626*5113495bSYour Name struct cfr_rcc_param rcc_param; 627*5113495bSYour Name struct ta_ra_cfr_cfg global[MAX_TA_RA_ENTRIES]; 628*5113495bSYour Name uint64_t rx_tlv_evt_cnt; 629*5113495bSYour Name qdf_timer_t lut_age_timer; 630*5113495bSYour Name uint8_t lut_timer_init; 631*5113495bSYour Name uint8_t is_cfr_rcc_capable; 632*5113495bSYour Name uint64_t flush_dbr_cnt; 633*5113495bSYour Name uint64_t invalid_dma_length_cnt; 634*5113495bSYour Name uint64_t flush_timeout_dbr_cnt; 635*5113495bSYour Name uint64_t clear_txrx_event; 636*5113495bSYour Name uint64_t last_success_tstamp; 637*5113495bSYour Name uint64_t cfr_dma_aborts; 638*5113495bSYour Name uint8_t is_cap_interval_mode_sel_support; 639*5113495bSYour Name uint8_t is_mo_marking_support; 640*5113495bSYour Name uint8_t is_aoa_for_rcc_support; 641*5113495bSYour Name #endif 642*5113495bSYour Name struct unassoc_pool_entry unassoc_pool[MAX_CFR_ENABLED_CLIENTS]; 643*5113495bSYour Name struct nl_event_cb nl_cb; 644*5113495bSYour Name qdf_spinlock_t lut_lock; 645*5113495bSYour Name bool lut_lock_initialised; 646*5113495bSYour Name #ifdef WLAN_CFR_PM 647*5113495bSYour Name bool is_prevent_suspend; 648*5113495bSYour Name qdf_wake_lock_t wake_lock; 649*5113495bSYour Name qdf_runtime_lock_t runtime_lock; 650*5113495bSYour Name #endif 651*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 652*5113495bSYour Name uint32_t freq; 653*5113495bSYour Name uint32_t max_aoa_chains; 654*5113495bSYour Name uint16_t phase_delta[HOST_MAX_CHAINS][MAX_AGC_GAIN]; 655*5113495bSYour Name uint32_t ibf_cal_val[HOST_MAX_CHAINS]; 656*5113495bSYour Name #ifdef WLAN_RCC_ENHANCED_AOA_SUPPORT 657*5113495bSYour Name bool is_enh_aoa_data; 658*5113495bSYour Name uint32_t max_agc_gain_tbls; 659*5113495bSYour Name uint16_t max_agc_gain_per_tbl_2g[PSOC_MAX_NUM_AGC_GAIN_TBLS]; 660*5113495bSYour Name uint16_t max_agc_gain_per_tbl_5g[PSOC_MAX_NUM_AGC_GAIN_TBLS]; 661*5113495bSYour Name uint16_t max_agc_gain_per_tbl_6g[PSOC_MAX_NUM_AGC_GAIN_TBLS]; 662*5113495bSYour Name uint8_t max_bdf_entries_per_tbl[PSOC_MAX_NUM_AGC_GAIN_TBLS]; 663*5113495bSYour Name uint32_t max_entries_all_table; 664*5113495bSYour Name uint16_t *gain_stop_index_array; 665*5113495bSYour Name uint16_t *enh_phase_delta_array; 666*5113495bSYour Name uint8_t start_ent[PSOC_MAX_NUM_AGC_GAIN_TBLS]; 667*5113495bSYour Name uint32_t xbar_config; 668*5113495bSYour Name #endif /* WLAN_RCC_ENHANCED_AOA_SUPPORT */ 669*5113495bSYour Name #endif /* WLAN_ENH_CFR_ENABLE */ 670*5113495bSYour Name }; 671*5113495bSYour Name 672*5113495bSYour Name /** 673*5113495bSYour Name * enum cfr_capt_status - CFR capture status 674*5113495bSYour Name * @PEER_CFR_CAPTURE_DISABLE: Capture not in progress 675*5113495bSYour Name * @PEER_CFR_CAPTURE_ENABLE: Capture in progress 676*5113495bSYour Name */ 677*5113495bSYour Name enum cfr_capt_status { 678*5113495bSYour Name PEER_CFR_CAPTURE_DISABLE, 679*5113495bSYour Name PEER_CFR_CAPTURE_ENABLE, 680*5113495bSYour Name }; 681*5113495bSYour Name 682*5113495bSYour Name /** 683*5113495bSYour Name * struct peer_cfr - private peer object for cfr 684*5113495bSYour Name * @peer_obj: pointer to peer_obj 685*5113495bSYour Name * @request: Type of request (start/stop) 686*5113495bSYour Name * @bandwidth: bandwidth of capture for this peer 687*5113495bSYour Name * @period: period of capture for this peer 688*5113495bSYour Name * @capture_method: enum determining type of cfr data capture. 689*5113495bSYour Name * 0-Qos null data 690*5113495bSYour Name */ 691*5113495bSYour Name struct peer_cfr { 692*5113495bSYour Name struct wlan_objmgr_peer *peer_obj; 693*5113495bSYour Name u_int8_t request; /* start/stop */ 694*5113495bSYour Name u_int8_t bandwidth; 695*5113495bSYour Name u_int32_t period; 696*5113495bSYour Name u_int8_t capture_method; 697*5113495bSYour Name }; 698*5113495bSYour Name 699*5113495bSYour Name /** 700*5113495bSYour Name * cfr_initialize_pdev() - cfr initialize pdev 701*5113495bSYour Name * @pdev: Pointer to pdev_obj 702*5113495bSYour Name * 703*5113495bSYour Name * Return: status of cfr pdev init 704*5113495bSYour Name */ 705*5113495bSYour Name QDF_STATUS cfr_initialize_pdev(struct wlan_objmgr_pdev *pdev); 706*5113495bSYour Name 707*5113495bSYour Name /** 708*5113495bSYour Name * cfr_deinitialize_pdev() - cfr deinitialize pdev 709*5113495bSYour Name * @pdev: Pointer to pdev_obj 710*5113495bSYour Name * 711*5113495bSYour Name * Return: status of cfr pdev deinit 712*5113495bSYour Name */ 713*5113495bSYour Name QDF_STATUS cfr_deinitialize_pdev(struct wlan_objmgr_pdev *pdev); 714*5113495bSYour Name 715*5113495bSYour Name /** 716*5113495bSYour Name * wlan_cfr_init() - Global init for cfr. 717*5113495bSYour Name * 718*5113495bSYour Name * Return: status of global init pass/fail 719*5113495bSYour Name */ 720*5113495bSYour Name QDF_STATUS wlan_cfr_init(void); 721*5113495bSYour Name 722*5113495bSYour Name /** 723*5113495bSYour Name * wlan_cfr_deinit() - Global de-init for cfr. 724*5113495bSYour Name * 725*5113495bSYour Name * Return: status of global de-init pass/fail 726*5113495bSYour Name */ 727*5113495bSYour Name QDF_STATUS wlan_cfr_deinit(void); 728*5113495bSYour Name 729*5113495bSYour Name /** 730*5113495bSYour Name * wlan_cfr_pdev_open() - pdev_open function for cfr. 731*5113495bSYour Name * @pdev: pointer to pdev object 732*5113495bSYour Name * 733*5113495bSYour Name * Return: status of pdev_open pass/fail 734*5113495bSYour Name */ 735*5113495bSYour Name QDF_STATUS wlan_cfr_pdev_open(struct wlan_objmgr_pdev *pdev); 736*5113495bSYour Name 737*5113495bSYour Name /** 738*5113495bSYour Name * wlan_cfr_pdev_close() - pdev_close function for cfr. 739*5113495bSYour Name * @pdev: pointer to pdev object 740*5113495bSYour Name * 741*5113495bSYour Name * Return: status of pdev_close pass/fail 742*5113495bSYour Name */ 743*5113495bSYour Name QDF_STATUS wlan_cfr_pdev_close(struct wlan_objmgr_pdev *pdev); 744*5113495bSYour Name 745*5113495bSYour Name /** 746*5113495bSYour Name * count_set_bits() - function to count set bits in a bitmap 747*5113495bSYour Name * @value: input bitmap 748*5113495bSYour Name * 749*5113495bSYour Name * Return: No. of set bits 750*5113495bSYour Name */ 751*5113495bSYour Name uint8_t count_set_bits(unsigned long value); 752*5113495bSYour Name 753*5113495bSYour Name /** 754*5113495bSYour Name * wlan_cfr_is_feature_disabled() - Check if cfr feature is disabled 755*5113495bSYour Name * @pdev: the physical device object. 756*5113495bSYour Name * 757*5113495bSYour Name * Return : true if cfr is disabled, else false. 758*5113495bSYour Name */ 759*5113495bSYour Name bool wlan_cfr_is_feature_disabled(struct wlan_objmgr_pdev *pdev); 760*5113495bSYour Name 761*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE 762*5113495bSYour Name /** 763*5113495bSYour Name * wlan_cfr_rx_tlv_process() - Process PPDU status TLVs and store info in 764*5113495bSYour Name * lookup table 765*5113495bSYour Name * @pdev: PDEV object 766*5113495bSYour Name * @nbuf: ppdu info 767*5113495bSYour Name * 768*5113495bSYour Name * Return: none 769*5113495bSYour Name */ 770*5113495bSYour Name void wlan_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf); 771*5113495bSYour Name #endif 772*5113495bSYour Name #endif 773