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