Re: [PATCH ath-next 6/6] wifi: ath11k: Register handler for CFR capture event
Baochen Qiang <[email protected]>
| Newsgroups | org.infradead.lists.ath11k,org.kernel.vger.linux-kernel,org.kernel.vger.linux-wireless |
|---|---|
| Message-ID | <[email protected]> |
On 10/30/2025 12:31 PM, Yu Zhang(Yuriy) wrote: > From: Venkateswara Naralasetty <[email protected]> > > 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 <[email protected]> > Co-developed-by: Yu Zhang(Yuriy) <[email protected]> > Signed-off-by: Yu Zhang(Yuriy) <[email protected]> > --- > 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?