Path: blob/main/sys/contrib/dev/athk/ath11k/cfr.h
283314 views
/* SPDX-License-Identifier: BSD-3-Clause-Clear */1/*2* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.3* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.4*/56#ifndef ATH11K_CFR_H7#define ATH11K_CFR_H89#include "dbring.h"10#include "wmi.h"1112#define ATH11K_CFR_NUM_RESP_PER_EVENT 113#define ATH11K_CFR_EVENT_TIMEOUT_MS 114#define ATH11K_CFR_NUM_RING_ENTRIES 11516#define ATH11K_MAX_CFR_ENABLED_CLIENTS 1017#define CFR_MAX_LUT_ENTRIES 1361819#define HOST_MAX_CHAINS 82021enum ath11k_cfr_correlate_event_type {22ATH11K_CORRELATE_DBR_EVENT,23ATH11K_CORRELATE_TX_EVENT,24};2526struct ath11k_sta;27struct ath11k_per_peer_cfr_capture;2829#define ATH11K_CFR_START_MAGIC 0xDEADBEAF30#define ATH11K_CFR_END_MAGIC 0xBEAFDEAD3132#define VENDOR_QCA 0x8cfdf033#define PLATFORM_TYPE_ARM 23435enum ath11k_cfr_meta_version {36ATH11K_CFR_META_VERSION_NONE,37ATH11K_CFR_META_VERSION_1,38ATH11K_CFR_META_VERSION_2,39ATH11K_CFR_META_VERSION_3,40ATH11K_CFR_META_VERSION_4,41ATH11K_CFR_META_VERSION_MAX = 0xFF,42};4344enum ath11k_cfr_data_version {45ATH11K_CFR_DATA_VERSION_NONE,46ATH11K_CFR_DATA_VERSION_1,47ATH11K_CFR_DATA_VERSION_MAX = 0xFF,48};4950enum ath11k_cfr_capture_ack_mode {51ATH11K_CFR_CAPTURE_LEGACY_ACK,52ATH11K_CFR_CAPTURE_DUP_LEGACY_ACK,53ATH11K_CFR_CAPTURE_HT_ACK,54ATH11K_CFR_CAPTURE_VHT_ACK,5556/*Always keep this at last*/57ATH11K_CFR_CAPTURE_INVALID_ACK58};5960enum ath11k_cfr_correlate_status {61ATH11K_CORRELATE_STATUS_RELEASE,62ATH11K_CORRELATE_STATUS_HOLD,63ATH11K_CORRELATE_STATUS_ERR,64};6566enum ath11k_cfr_preamble_type {67ATH11K_CFR_PREAMBLE_TYPE_LEGACY,68ATH11K_CFR_PREAMBLE_TYPE_HT,69ATH11K_CFR_PREAMBLE_TYPE_VHT,70};7172struct ath11k_cfr_peer_tx_param {73u32 capture_method;74u32 vdev_id;75u8 peer_mac_addr[ETH_ALEN];76u32 primary_20mhz_chan;77u32 bandwidth;78u32 phy_mode;79u32 band_center_freq1;80u32 band_center_freq2;81u32 spatial_streams;82u32 correlation_info_1;83u32 correlation_info_2;84u32 status;85u32 timestamp_us;86u32 counter;87u32 chain_rssi[WMI_MAX_CHAINS];88u16 chain_phase[WMI_MAX_CHAINS];89u32 cfo_measurement;90u8 agc_gain[HOST_MAX_CHAINS];91u32 rx_start_ts;92};9394struct cfr_metadata {95u8 peer_addr[ETH_ALEN];96u8 status;97u8 capture_bw;98u8 channel_bw;99u8 phy_mode;100u16 prim20_chan;101u16 center_freq1;102u16 center_freq2;103u8 capture_mode;104u8 capture_type;105u8 sts_count;106u8 num_rx_chain;107u32 timestamp;108u32 length;109u32 chain_rssi[HOST_MAX_CHAINS];110u16 chain_phase[HOST_MAX_CHAINS];111u32 cfo_measurement;112u8 agc_gain[HOST_MAX_CHAINS];113u32 rx_start_ts;114} __packed;115116struct ath11k_csi_cfr_header {117u32 start_magic_num;118u32 vendorid;119u8 cfr_metadata_version;120u8 cfr_data_version;121u8 chip_type;122u8 platform_type;123u32 cfr_metadata_len;124struct cfr_metadata meta_data;125} __packed;126127#define TONES_IN_20MHZ 256128#define TONES_IN_40MHZ 512129#define TONES_IN_80MHZ 1024130#define TONES_IN_160MHZ 2048 /* 160 MHz isn't supported yet */131#define TONES_INVALID 0132133#define CFIR_DMA_HDR_INFO0_TAG GENMASK(7, 0)134#define CFIR_DMA_HDR_INFO0_LEN GENMASK(13, 8)135136#define CFIR_DMA_HDR_INFO1_UPLOAD_DONE GENMASK(0, 0)137#define CFIR_DMA_HDR_INFO1_CAPTURE_TYPE GENMASK(3, 1)138#define CFIR_DMA_HDR_INFO1_PREAMBLE_TYPE GENMASK(5, 4)139#define CFIR_DMA_HDR_INFO1_NSS GENMASK(8, 6)140#define CFIR_DMA_HDR_INFO1_NUM_CHAINS GENMASK(11, 9)141#define CFIR_DMA_HDR_INFO1_UPLOAD_PKT_BW GENMASK(14, 12)142#define CFIR_DMA_HDR_INFO1_SW_PEER_ID_VALID GENMASK(15, 15)143144struct ath11k_cfr_dma_hdr {145u16 info0;146u16 info1;147u16 sw_peer_id;148u16 phy_ppdu_id;149};150151struct ath11k_look_up_table {152bool dbr_recv;153bool tx_recv;154u8 *data;155u32 data_len;156u16 dbr_ppdu_id;157u16 tx_ppdu_id;158dma_addr_t dbr_address;159struct ath11k_csi_cfr_header header;160struct ath11k_cfr_dma_hdr hdr;161u64 txrx_tstamp;162u64 dbr_tstamp;163u32 header_length;164u32 payload_length;165struct ath11k_dbring_element *buff;166};167168struct cfr_unassoc_pool_entry {169u8 peer_mac[ETH_ALEN];170u32 period;171bool is_valid;172};173174struct ath11k_cfr {175struct ath11k_dbring rx_ring;176/* Protects cfr data */177spinlock_t lock;178/* Protect for lut entries */179spinlock_t lut_lock;180struct ath11k_look_up_table *lut;181struct dentry *enable_cfr;182struct dentry *cfr_unassoc;183struct rchan *rfs_cfr_capture;184u8 cfr_enabled_peer_cnt;185u32 lut_num;186u64 tx_evt_cnt;187u64 dbr_evt_cnt;188u64 release_cnt;189u64 tx_peer_status_cfr_fail;190u64 tx_evt_status_cfr_fail;191u64 tx_dbr_lookup_fail;192u64 last_success_tstamp;193u64 flush_dbr_cnt;194u64 clear_txrx_event;195u64 cfr_dma_aborts;196bool enabled;197enum wmi_phy_mode phymode;198struct cfr_unassoc_pool_entry unassoc_pool[ATH11K_MAX_CFR_ENABLED_CLIENTS];199};200201enum ath11k_cfr_capture_method {202ATH11K_CFR_CAPTURE_METHOD_NULL_FRAME,203ATH11K_CFR_CAPTURE_METHOD_NULL_FRAME_WITH_PHASE,204ATH11K_CFR_CAPTURE_METHOD_PROBE_RESP,205ATH11K_CFR_CAPTURE_METHOD_MAX,206};207208enum ath11k_cfr_capture_bw {209ATH11K_CFR_CAPTURE_BW_20,210ATH11K_CFR_CAPTURE_BW_40,211ATH11K_CFR_CAPTURE_BW_80,212ATH11K_CFR_CAPTURE_BW_MAX,213};214215#ifdef CONFIG_ATH11K_CFR216int ath11k_cfr_init(struct ath11k_base *ab);217void ath11k_cfr_deinit(struct ath11k_base *ab);218void ath11k_cfr_lut_update_paddr(struct ath11k *ar, dma_addr_t paddr,219u32 buf_id);220void ath11k_cfr_decrement_peer_count(struct ath11k *ar,221struct ath11k_sta *arsta);222void ath11k_cfr_update_unassoc_pool_entry(struct ath11k *ar,223const u8 *peer_mac);224bool ath11k_cfr_peer_is_in_cfr_unassoc_pool(struct ath11k *ar,225const u8 *peer_mac);226void ath11k_cfr_update_unassoc_pool(struct ath11k *ar,227struct ath11k_per_peer_cfr_capture *params,228u8 *peer_mac);229int ath11k_cfr_send_peer_cfr_capture_cmd(struct ath11k *ar,230struct ath11k_sta *arsta,231struct ath11k_per_peer_cfr_capture *params,232const u8 *peer_mac);233struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar);234void ath11k_cfr_release_lut_entry(struct ath11k_look_up_table *lut);235int ath11k_process_cfr_capture_event(struct ath11k_base *ab,236struct ath11k_cfr_peer_tx_param *params);237void ath11k_cfr_update_phymode(struct ath11k *ar, enum wmi_phy_mode phymode);238#else239static inline void ath11k_cfr_update_phymode(struct ath11k *ar,240enum wmi_phy_mode phymode)241{242}243244static inline int ath11k_cfr_init(struct ath11k_base *ab)245{246return 0;247}248249static inline void ath11k_cfr_deinit(struct ath11k_base *ab)250{251}252253static inline void ath11k_cfr_lut_update_paddr(struct ath11k *ar,254dma_addr_t paddr, u32 buf_id)255{256}257258static inline void ath11k_cfr_decrement_peer_count(struct ath11k *ar,259struct ath11k_sta *arsta)260{261}262263static inline void ath11k_cfr_update_unassoc_pool_entry(struct ath11k *ar,264const u8 *peer_mac)265{266}267268static inline bool269ath11k_cfr_peer_is_in_cfr_unassoc_pool(struct ath11k *ar, const u8 *peer_mac)270{271return false;272}273274static inline void275ath11k_cfr_update_unassoc_pool(struct ath11k *ar,276struct ath11k_per_peer_cfr_capture *params,277u8 *peer_mac)278{279}280281static inline int282ath11k_cfr_send_peer_cfr_capture_cmd(struct ath11k *ar,283struct ath11k_sta *arsta,284struct ath11k_per_peer_cfr_capture *params,285const u8 *peer_mac)286{287return 0;288}289290static inline void ath11k_cfr_release_lut_entry(struct ath11k_look_up_table *lut)291{292}293294static inline295struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar)296{297return NULL;298}299300static inline301int ath11k_process_cfr_capture_event(struct ath11k_base *ab,302struct ath11k_cfr_peer_tx_param *params)303{304return 0;305}306#endif /* CONFIG_ATH11K_CFR */307#endif /* ATH11K_CFR_H */308309310