[PATCH ath-next 6/6] wifi: ath11k: Register handler for CFR capture event
Baochen Qiang
baochen.qiang at oss.qualcomm.com
Thu Oct 30 20:05:35 PDT 2025
On 10/30/2025 12:31 PM, Yu Zhang(Yuriy) wrote:
> From: Venkateswara Naralasetty <quic_vnaralas at quicinc.com>
>
> Firmware sends CFR meta data through the WMI event
> WMI_PEER_CFR_CAPTURE_EVENT. Parse the meta data coming from the firmware
> and invoke correlate_and_relay function to correlate the CFR meta data
> with the CFR payload coming from the other WMI event
> WMI_PDEV_DMA_RING_BUF_RELEASE_EVENT.
>
> Release the buffer to user space once correlate and relay return
> success.
>
> Tested-on: IPQ8074 hw2.0 PCI IPQ8074 WLAN.HK.2.5.0.1-00991-QCAHKSWPL_SILICONZ-1
> Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-04685-QCAHSPSWPL_V1_V2_SILICONZ_IOE-1
>
> Signed-off-by: Venkateswara Naralasetty <quic_vnaralas at quicinc.com>
> Co-developed-by: Yu Zhang(Yuriy) <yu.zhang at oss.qualcomm.com>
> Signed-off-by: Yu Zhang(Yuriy) <yu.zhang at oss.qualcomm.com>
> ---
> drivers/net/wireless/ath/ath11k/cfr.c | 145 ++++++++++++++++++++++++++
> drivers/net/wireless/ath/ath11k/cfr.h | 62 ++++++++++-
> drivers/net/wireless/ath/ath11k/wmi.c | 90 ++++++++++++++++
> drivers/net/wireless/ath/ath11k/wmi.h | 44 ++++++++
> 4 files changed, 340 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/ath/ath11k/cfr.c b/drivers/net/wireless/ath/ath11k/cfr.c
> index e8a976d64733..61eeb02af6c5 100644
> --- a/drivers/net/wireless/ath/ath11k/cfr.c
> +++ b/drivers/net/wireless/ath/ath11k/cfr.c
> @@ -247,6 +247,151 @@ static int ath11k_cfr_process_data(struct ath11k *ar,
> return status;
> }
>
> +static void ath11k_cfr_fill_hdr_info(struct ath11k *ar,
> + struct ath11k_csi_cfr_header *header,
> + struct ath11k_cfr_peer_tx_param *params)
> +{
> + header->cfr_metadata_version = ATH11K_CFR_META_VERSION_4;
> + header->cfr_data_version = ATH11K_CFR_DATA_VERSION_1;
> + header->cfr_metadata_len = sizeof(struct cfr_metadata);
> + header->chip_type = ar->ab->hw_rev;
> + header->meta_data.status = FIELD_GET(WMI_CFR_PEER_CAPTURE_STATUS,
> + params->status);
> + header->meta_data.capture_bw = params->bandwidth;
> + header->meta_data.phy_mode = params->phy_mode;
> + header->meta_data.prim20_chan = params->primary_20mhz_chan;
> + header->meta_data.center_freq1 = params->band_center_freq1;
> + header->meta_data.center_freq2 = params->band_center_freq2;
> +
> + /* Currently CFR data is captured on ACK of a Qos NULL frame.
> + * For 20 MHz, ACK is Legacy and for 40/80/160, ACK is DUP Legacy.
> + */
please check comment style
> + header->meta_data.capture_mode = params->bandwidth ?
> + ATH11K_CFR_CAPTURE_DUP_LEGACY_ACK : ATH11K_CFR_CAPTURE_LEGACY_ACK;
> + header->meta_data.capture_type = params->capture_method;
> + header->meta_data.num_rx_chain = ar->num_rx_chains;
> + header->meta_data.sts_count = params->spatial_streams;
> + header->meta_data.timestamp = params->timestamp_us;
> + ether_addr_copy(header->meta_data.peer_addr, params->peer_mac_addr);
> + memcpy(header->meta_data.chain_rssi, params->chain_rssi,
> + sizeof(params->chain_rssi));
> + memcpy(header->meta_data.chain_phase, params->chain_phase,
> + sizeof(params->chain_phase));
> + memcpy(header->meta_data.agc_gain, params->agc_gain,
> + sizeof(params->agc_gain));
> +}
> +
> +int ath11k_process_cfr_capture_event(struct ath11k_base *ab,
> + struct ath11k_cfr_peer_tx_param *params)
> +{
> + struct ath11k_look_up_table *lut = NULL;
> + u32 end_magic = ATH11K_CFR_END_MAGIC;
> + struct ath11k_csi_cfr_header *header;
> + struct ath11k_dbring_element *buff;
> + struct ath11k_vif *arvif;
> + struct ath11k_cfr *cfr;
> + dma_addr_t buf_addr;
> + struct ath11k *ar;
> + u8 tx_status;
> + int status;
> + int i;
> +
> + rcu_read_lock();
> + arvif = ath11k_mac_get_arvif_by_vdev_id(ab, params->vdev_id);
> + if (!arvif) {
> + rcu_read_unlock();
> + ath11k_warn(ab, "Failed to get arvif for vdev id %d\n",
> + params->vdev_id);
> + return -ENOENT;
> + }
> +
> + ar = arvif->ar;
ath11k_mac_get_ar_by_vdev_id() is better?
More information about the ath11k
mailing list