From nobody Mon Feb 9 16:02:54 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1A6633BBCE for ; Wed, 5 Nov 2025 17:22:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762363359; cv=none; b=AOvjp/eEfTMs7TtJksnsMMYrS78k9wPYkKpwoICMg15rSqEK0H0twoXvdt6ID37cp9bj0/j1AFIhATuiWVMPRqV6V9KG7FcO5tdOZk0JZlSZSUffzwIy6JfhhBBv1wT5wj8euSztm4ndcZzO/UExvZyqGJi6lzaEEHDqm6TIe/M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762363359; c=relaxed/simple; bh=RNp6w+k7RL3TVxMV0cZ9A1hYDd6+hGugRf845/M5PEg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=m1oGkWnXgPeHtt1X47TAbeY5mtD7H9YGMdJ07BC0JcFosR40/DQlqRP6gRoDOtl2ODSPtxhS3N0Rkm6R4uM9zDT0RaBeR6XdYt58onSd/Ecz/wVP70zQIauDvJfsSJTxiWWDEzUbK3K9sCjlL+M8Rj0vfukHnRfLyr6DJI13rB0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=EGkKtQWq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Ddirl1GS; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="EGkKtQWq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Ddirl1GS" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5A599iGA356694 for ; Wed, 5 Nov 2025 17:22:37 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=NRavOzXI5iU /UskpcOXH8hDApcUTgjxol6w5awACPP8=; b=EGkKtQWq9dfVO1qjFivl1o30ucs NlS4kP5ChFYom0NrMopV0ZEBQ77JHnymD0+6PjytItM7QkJ8tTavZ6vmXv1izeey hDZXm5mbYBP5kKzy4vTf8LeScrQV5AhABkHfVm4Y44r1cAxvtn9Rd5gvnsEoDfCl hb0N1Te5GiLQ3eLT4MWiBZp81TfqD0+nz9CFVndqaW2vux0HXa96zkxneQVnIJ3x 0HwZ1aItLQhDA3Ape/IFzoHzMR1poiQNR9gwVJ6tHQqechtgpSKFxc+vKpC+dH2e wjCVR7FtOqGS/vaqKNvugo8mfXg8VXSZAtbYpzl39nNYSX4PiWS7DSwlpZA== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4a83q5hd8d-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 05 Nov 2025 17:22:36 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-7a675fbd6c7so110919b3a.2 for ; Wed, 05 Nov 2025 09:22:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1762363356; x=1762968156; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NRavOzXI5iU/UskpcOXH8hDApcUTgjxol6w5awACPP8=; b=Ddirl1GSonHMJjZIKeWaHWtjmgzv+TJidIkQWbQEo7qQgGOBOqjj96yG7ljUcKosKR 79VFXtJauRP7KG4gqFin8qSiWyUONvbD7y2g9mnYoTA5RjRL+G9qX39NxWP3ah47/WFs 3Rr7xjQ7209V5FdcD6/lBzJw5w8rFJe2CnCRzqYffbNo6lGeIV2NSaHIVeLppPftfJJL 5UMjhYAjEKWC6cb5q9DweIm8DzEwrC9TCBKdPtlxuCjaC+aBm1WhkGx3i0K/aZqdeZjw 6FDBByziWZk0z9UY6xRfmH3ealFAOvFbxuRYh2SLVSBK8HmKrbYilzt0Tf+SQ4gdrvK/ Yakw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762363356; x=1762968156; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NRavOzXI5iU/UskpcOXH8hDApcUTgjxol6w5awACPP8=; b=LrXXG3wGVF+kHsePBvhWsZvnYdl4ss0BKZY8c/5KC8R7nAZtigbFq9IRNWEnZJTAGA 9z8ihvURStcxTklof+buSc9UJApSi1zNea/JG3sl/B2n8599lTw4Cn0vHpoDKXIvhN85 v44NTO4CEJ3azLFJFJTpIu6IM4Vf7zWJ13qjX2QpauYoR5eTlVFFKO2lvEzXH+icqnSj 97KVaY+aQtJ6d2HxSH93R0O5bIfmi/erI4KleNDC7wiHmcBPo7yo62lGUnFmojAk60vL NgQpMCL1QuOspmDORv6vncJEW48tqEYc/nPTP2dqdBd1RjVEc5/mDO+dC8RILsERKBNS E3rw== X-Forwarded-Encrypted: i=1; AJvYcCUGhWU3rRaJHNHUmFpOxZBp/PIP2jaPFBEQsCMo8A4uCIGivk4+hommVof+sUkDtO4s/DgJrfRhPViEY5w=@vger.kernel.org X-Gm-Message-State: AOJu0Yxh+5YJTCWnkrlc1GETplv6qOPPRyMJNlpa7l1RGZIuNFnSI0pE WRcIdMCqa0Jq+FkC5fE+/bj+ljEJhgXWsjhubiD30ABIKbhQp8hVSbutobpnIg36SydbOLgSbhA qBxwUJXxFL7wYGjZPFLAqhlVrzs2Cu1uSXmLHnXRKNPyjSABq/YG4YqMeZxPg5zJiIKH7kW1yqr HwygC5 X-Gm-Gg: ASbGncumJxCVA0hPULxwonzcljyAIpFkRPOBzl3nQZSFqPG4OmR8J+uGgH8Nr90oB5O yrZx6Io0g7devqajQJE4AcyItKrRf7tqk6Sp6kp+6+H3G22SuQHCl5C+SlK0FFtT4YxxQYalEVb xdaItqss3rAa8Y4SNSfnxi+kHTIM4fpOWIYX5Ym1vjSuqwzlUMv7UhgjFc3T+TCLDinQvwKr+lo 1KJzTy76c7+rwNG6ew68eIrmYimCjsquMBfLAdm0SoFskqW+YFL2d7gp1U0w5MH5MC5enOs3kck 6rj6ET+C8q5qR5lcVmA9l+MjIj6N+bEMVvyrsdF7hNPbzetnFnzVTfFy4tTDD8UM0FSsxhOjZ4b 4vSeFZFKbXpFSBWWYdclXRVuEQC+4oeZZOp4lsaxx4cpf X-Received: by 2002:a05:6a00:2d10:b0:781:16de:cc1a with SMTP id d2e1a72fcca58-7ae1fc7d8b0mr5465547b3a.32.1762363355831; Wed, 05 Nov 2025 09:22:35 -0800 (PST) X-Google-Smtp-Source: AGHT+IEkW2uiqjIaRIMXu/EAGpvLes8wJXNeJ8AzJU9vR6LWLaKChq/rAqHi16zdwVz1pw+DPTpq6A== X-Received: by 2002:a05:6a00:2d10:b0:781:16de:cc1a with SMTP id d2e1a72fcca58-7ae1fc7d8b0mr5465497b3a.32.1762363355225; Wed, 05 Nov 2025 09:22:35 -0800 (PST) Received: from hu-yuzha-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7af48d83c20sm518014b3a.62.2025.11.05.09.22.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Nov 2025 09:22:34 -0800 (PST) From: "Yu Zhang(Yuriy)" To: jjohnson@kernel.org Cc: baochen.qiang@oss.qualcomm.com, linux-kernel@vger.kernel.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, Yu Zhang , Vasanthakumar Thiagarajan Subject: [PATCH ath-next v3 5/6] wifi: ath11k: Register DBR event handler for CFR data Date: Wed, 5 Nov 2025 09:22:25 -0800 Message-Id: <20251105172226.3182968-6-yu.zhang@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251105172226.3182968-1-yu.zhang@oss.qualcomm.com> References: <20251105172226.3182968-1-yu.zhang@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: jW_ntyUqCxtEf7w5MwIXiR3aPyfNxxs2 X-Proofpoint-GUID: jW_ntyUqCxtEf7w5MwIXiR3aPyfNxxs2 X-Authority-Analysis: v=2.4 cv=YZKwJgRf c=1 sm=1 tr=0 ts=690b87dc cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=COk6AnOGAAAA:8 a=EUspDBNiAAAA:8 a=X6MYPc9AQ2pAf6QSHKQA:9 a=zc0IvFSfCIW2DFIPzwfm:22 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTA1MDEzNSBTYWx0ZWRfX6B1DeHT20vOj BjE3TJV/ZU4ddiMguz1Zr92Dd5QoVJ2PDYJLm+kL96vJhKe4bRpkSvQgDiInSH4oZYATD9gfie+ 3vjPg7ecYvjWvZUVvmiQfcqkWXC+I4rh61Y/D8Mn74Rhh5lNIHzT4zWUzNxUM20iZZS0W8vZiw1 LHLShYBwdJE469DGwri87ebwRzVtGaevNtjoFon4O3U8fAPxNti5gefxr6V8ewD9xEeotwxAsGn At5JRWh7c2m1UFeriXK9lW+aF0MKpPx6H1daMkGrZllwPC3HSWnECFfEUJN3UxdQ4wKd1jIhEq8 G8u5Qxvb/U7Fvvx40YpLDW1Ku1LiwkocYQfXqF6xp5Vj1g2EvrDyxvx930KE+It3wlL7PWm/3mP Rwz48txDiUwWll/bTCX43dR+Rx8U4A== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-05_06,2025-11-03_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 impostorscore=0 adultscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 bulkscore=0 suspectscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511050135 Content-Type: text/plain; charset="utf-8" From: Venkateswara Naralasetty Add handler for WMI_PDEV_DMA_RING_BUF_RELEASE_EVENT which indicates CFR data availability in the DB ring. Add CFR data processing from DB ring buffers. Use correlate_and_relay API to match CFR data with metadata from WMI_PEER_CFR_CAPTURE_EVENT. Release buffer to userspace through relayfs on successful correlation, otherwise hold buffer waiting for matching WMI event from firmware. Add new debug masks: - ATH11K_DBG_CFR: Enables CFR-related debug logs. - ATH11K_DBG_CFR_DUMP: Enables detailed CFR data dump for analysis. Tested-on: IPQ8074 hw2.0 PCI IPQ8074 WLAN.HK.2.5.0.1-00991-QCAHKSWPL_SILICO= NZ-1 Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-04685-QCAHSPSWPL_V1_V2_SILICONZ_I= OE-1 Signed-off-by: Venkateswara Naralasetty Co-developed-by: Yu Zhang (Yuriy) Signed-off-by: Yu Zhang (Yuriy) Reviewed-by: Vasanthakumar Thiagarajan --- drivers/net/wireless/ath/ath11k/cfr.c | 240 ++++++++++++++++++++++- drivers/net/wireless/ath/ath11k/cfr.h | 82 ++++++++ drivers/net/wireless/ath/ath11k/dbring.c | 10 +- drivers/net/wireless/ath/ath11k/dbring.h | 2 + drivers/net/wireless/ath/ath11k/debug.h | 8 +- 5 files changed, 339 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/cfr.c b/drivers/net/wireless/a= th/ath11k/cfr.c index 495b2c6742aa..ee7626bd4b1a 100644 --- a/drivers/net/wireless/ath/ath11k/cfr.c +++ b/drivers/net/wireless/ath/ath11k/cfr.c @@ -8,10 +8,248 @@ #include "core.h" #include "debug.h" =20 +struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar) +{ + if (ar->cfr_enabled) + return &ar->cfr.rx_ring; + + return NULL; +} + +static int ath11k_cfr_calculate_tones_from_dma_hdr(struct ath11k_cfr_dma_h= dr *hdr) +{ + u8 bw =3D FIELD_GET(CFIR_DMA_HDR_INFO1_UPLOAD_PKT_BW, hdr->info1); + u8 preamble =3D FIELD_GET(CFIR_DMA_HDR_INFO1_PREAMBLE_TYPE, hdr->info1); + + switch (preamble) { + case ATH11K_CFR_PREAMBLE_TYPE_LEGACY: + fallthrough; + case ATH11K_CFR_PREAMBLE_TYPE_VHT: + switch (bw) { + case 0: + return TONES_IN_20MHZ; + case 1: /* DUP40/VHT40 */ + return TONES_IN_40MHZ; + case 2: /* DUP80/VHT80 */ + return TONES_IN_80MHZ; + case 3: /* DUP160/VHT160 */ + return TONES_IN_160MHZ; + default: + return TONES_INVALID; + } + case ATH11K_CFR_PREAMBLE_TYPE_HT: + switch (bw) { + case 0: + return TONES_IN_20MHZ; + case 1: + return TONES_IN_40MHZ; + default: + return TONES_INVALID; + } + default: + return TONES_INVALID; + } +} + +void ath11k_cfr_release_lut_entry(struct ath11k_look_up_table *lut) +{ + memset(lut, 0, sizeof(*lut)); +} + +static void ath11k_cfr_rfs_write(struct ath11k *ar, const void *head, + u32 head_len, const void *data, u32 data_len, + const void *tail, int tail_data) +{ + struct ath11k_cfr *cfr =3D &ar->cfr; + + if (!cfr->rfs_cfr_capture) + return; + + relay_write(cfr->rfs_cfr_capture, head, head_len); + relay_write(cfr->rfs_cfr_capture, data, data_len); + relay_write(cfr->rfs_cfr_capture, tail, tail_data); + relay_flush(cfr->rfs_cfr_capture); +} + +static void ath11k_cfr_free_pending_dbr_events(struct ath11k *ar) +{ + struct ath11k_cfr *cfr =3D &ar->cfr; + struct ath11k_look_up_table *lut; + int i; + + if (!cfr->lut) + return; + + for (i =3D 0; i < cfr->lut_num; i++) { + lut =3D &cfr->lut[i]; + if (lut->dbr_recv && !lut->tx_recv && + lut->dbr_tstamp < cfr->last_success_tstamp) { + ath11k_dbring_bufs_replenish(ar, &cfr->rx_ring, lut->buff, + WMI_DIRECT_BUF_CFR); + ath11k_cfr_release_lut_entry(lut); + cfr->flush_dbr_cnt++; + } + } +} + +/** + * ath11k_cfr_correlate_and_relay() - Correlate and relay CFR events + * @ar: Pointer to ath11k structure + * @lut: Lookup table for correlation + * @event_type: Type of event received (TX or DBR) + * + * Correlates WMI_PDEV_DMA_RING_BUF_RELEASE_EVENT (DBR) and + * WMI_PEER_CFR_CAPTURE_EVENT (TX capture) by PPDU ID. If both events + * are present and the PPDU IDs match, returns CORRELATE_STATUS_RELEASE + * to relay thecorrelated data to userspace. Otherwise returns + * CORRELATE_STATUS_HOLD to wait for the other event. + * + * Also checks pending DBR events and clears them when no corresponding TX + * capture event is received for the PPDU. + * + * Return: CORRELATE_STATUS_RELEASE or CORRELATE_STATUS_HOLD + */ + +static enum ath11k_cfr_correlate_status +ath11k_cfr_correlate_and_relay(struct ath11k *ar, + struct ath11k_look_up_table *lut, + u8 event_type) +{ + enum ath11k_cfr_correlate_status status; + struct ath11k_cfr *cfr =3D &ar->cfr; + u64 diff; + + if (event_type =3D=3D ATH11K_CORRELATE_TX_EVENT) { + if (lut->tx_recv) + cfr->cfr_dma_aborts++; + cfr->tx_evt_cnt++; + lut->tx_recv =3D true; + } else if (event_type =3D=3D ATH11K_CORRELATE_DBR_EVENT) { + cfr->dbr_evt_cnt++; + lut->dbr_recv =3D true; + } + + if (lut->dbr_recv && lut->tx_recv) { + if (lut->dbr_ppdu_id =3D=3D lut->tx_ppdu_id) { + /* + * 64-bit counters make wraparound highly improbable, + * wraparound handling is omitted. + */ + cfr->last_success_tstamp =3D lut->dbr_tstamp; + if (lut->dbr_tstamp > lut->txrx_tstamp) { + diff =3D lut->dbr_tstamp - lut->txrx_tstamp; + ath11k_dbg(ar->ab, ATH11K_DBG_CFR, + "txrx event -> dbr event delay =3D %u ms", + jiffies_to_msecs(diff)); + } else if (lut->txrx_tstamp > lut->dbr_tstamp) { + diff =3D lut->txrx_tstamp - lut->dbr_tstamp; + ath11k_dbg(ar->ab, ATH11K_DBG_CFR, + "dbr event -> txrx event delay =3D %u ms", + jiffies_to_msecs(diff)); + } + + ath11k_cfr_free_pending_dbr_events(ar); + + cfr->release_cnt++; + status =3D ATH11K_CORRELATE_STATUS_RELEASE; + } else { + /* + * Discard TXRX event on PPDU ID mismatch because multiple PPDUs + * may share the same DMA address due to ucode aborts. + */ + + ath11k_dbg(ar->ab, ATH11K_DBG_CFR, + "Received dbr event twice for the same lut entry"); + lut->tx_recv =3D false; + lut->tx_ppdu_id =3D 0; + cfr->clear_txrx_event++; + cfr->cfr_dma_aborts++; + status =3D ATH11K_CORRELATE_STATUS_HOLD; + } + } else { + status =3D ATH11K_CORRELATE_STATUS_HOLD; + } + + return status; +} + static int ath11k_cfr_process_data(struct ath11k *ar, struct ath11k_dbring_data *param) { - return 0; + u32 end_magic =3D ATH11K_CFR_END_MAGIC; + struct ath11k_csi_cfr_header *header; + struct ath11k_cfr_dma_hdr *dma_hdr; + struct ath11k_cfr *cfr =3D &ar->cfr; + struct ath11k_look_up_table *lut; + struct ath11k_base *ab =3D ar->ab; + u32 buf_id, tones, length; + u8 num_chains; + int status; + u8 *data; + + data =3D param->data; + buf_id =3D param->buf_id; + + if (param->data_sz < sizeof(*dma_hdr)) + return -EINVAL; + + dma_hdr =3D (struct ath11k_cfr_dma_hdr *)data; + + tones =3D ath11k_cfr_calculate_tones_from_dma_hdr(dma_hdr); + if (tones =3D=3D TONES_INVALID) { + ath11k_warn(ar->ab, "Number of tones received is invalid\n"); + return -EINVAL; + } + + num_chains =3D FIELD_GET(CFIR_DMA_HDR_INFO1_NUM_CHAINS, + dma_hdr->info1); + + length =3D sizeof(*dma_hdr); + length +=3D tones * (num_chains + 1); + + spin_lock_bh(&cfr->lut_lock); + + if (!cfr->lut) { + spin_unlock_bh(&cfr->lut_lock); + return -EINVAL; + } + + lut =3D &cfr->lut[buf_id]; + + ath11k_dbg_dump(ab, ATH11K_DBG_CFR_DUMP, "data_from_buf_rel:", "", + data, length); + + lut->buff =3D param->buff; + lut->data =3D data; + lut->data_len =3D length; + lut->dbr_ppdu_id =3D dma_hdr->phy_ppdu_id; + lut->dbr_tstamp =3D jiffies; + + memcpy(&lut->hdr, dma_hdr, sizeof(*dma_hdr)); + + header =3D &lut->header; + header->meta_data.channel_bw =3D FIELD_GET(CFIR_DMA_HDR_INFO1_UPLOAD_PKT_= BW, + dma_hdr->info1); + header->meta_data.length =3D length; + + status =3D ath11k_cfr_correlate_and_relay(ar, lut, + ATH11K_CORRELATE_DBR_EVENT); + if (status =3D=3D ATH11K_CORRELATE_STATUS_RELEASE) { + ath11k_dbg(ab, ATH11K_DBG_CFR, + "releasing CFR data to user space"); + ath11k_cfr_rfs_write(ar, &lut->header, + sizeof(struct ath11k_csi_cfr_header), + lut->data, lut->data_len, + &end_magic, sizeof(u32)); + ath11k_cfr_release_lut_entry(lut); + } else if (status =3D=3D ATH11K_CORRELATE_STATUS_HOLD) { + ath11k_dbg(ab, ATH11K_DBG_CFR, + "tx event is not yet received holding the buf"); + } + + spin_unlock_bh(&cfr->lut_lock); + + return status; } =20 /* Helper function to check whether the given peer mac address diff --git a/drivers/net/wireless/ath/ath11k/cfr.h b/drivers/net/wireless/a= th/ath11k/cfr.h index 19f136d34c65..c8e5086674d2 100644 --- a/drivers/net/wireless/ath/ath11k/cfr.h +++ b/drivers/net/wireless/ath/ath11k/cfr.h @@ -19,9 +19,78 @@ =20 #define HOST_MAX_CHAINS 8 =20 +enum ath11k_cfr_correlate_event_type { + ATH11K_CORRELATE_DBR_EVENT, + ATH11K_CORRELATE_TX_EVENT, +}; + struct ath11k_sta; struct ath11k_per_peer_cfr_capture; =20 +#define ATH11K_CFR_END_MAGIC 0xBEAFDEAD + +enum ath11k_cfr_correlate_status { + ATH11K_CORRELATE_STATUS_RELEASE, + ATH11K_CORRELATE_STATUS_HOLD, + ATH11K_CORRELATE_STATUS_ERR, +}; + +enum ath11k_cfr_preamble_type { + ATH11K_CFR_PREAMBLE_TYPE_LEGACY, + ATH11K_CFR_PREAMBLE_TYPE_HT, + ATH11K_CFR_PREAMBLE_TYPE_VHT, +}; + +struct cfr_metadata { + u8 peer_addr[ETH_ALEN]; + u8 status; + u8 capture_bw; + u8 channel_bw; + u8 phy_mode; + u16 prim20_chan; + u16 center_freq1; + u16 center_freq2; + u8 capture_mode; + u8 capture_type; + u8 sts_count; + u8 num_rx_chain; + u32 timestamp; + u32 length; + u32 chain_rssi[HOST_MAX_CHAINS]; + u16 chain_phase[HOST_MAX_CHAINS]; + u32 cfo_measurement; + u8 agc_gain[HOST_MAX_CHAINS]; + u32 rx_start_ts; +} __packed; + +struct ath11k_csi_cfr_header { + u32 start_magic_num; + u32 vendorid; + u8 cfr_metadata_version; + u8 cfr_data_version; + u8 chip_type; + u8 platform_type; + u32 reserved; + struct cfr_metadata meta_data; +} __packed; + +#define TONES_IN_20MHZ 256 +#define TONES_IN_40MHZ 512 +#define TONES_IN_80MHZ 1024 +#define TONES_IN_160MHZ 2048 /* 160 MHz isn't supported yet */ +#define TONES_INVALID 0 + +#define CFIR_DMA_HDR_INFO0_TAG GENMASK(7, 0) +#define CFIR_DMA_HDR_INFO0_LEN GENMASK(13, 8) + +#define CFIR_DMA_HDR_INFO1_UPLOAD_DONE GENMASK(0, 0) +#define CFIR_DMA_HDR_INFO1_CAPTURE_TYPE GENMASK(3, 1) +#define CFIR_DMA_HDR_INFO1_PREAMBLE_TYPE GENMASK(5, 4) +#define CFIR_DMA_HDR_INFO1_NSS GENMASK(8, 6) +#define CFIR_DMA_HDR_INFO1_NUM_CHAINS GENMASK(11, 9) +#define CFIR_DMA_HDR_INFO1_UPLOAD_PKT_BW GENMASK(14, 12) +#define CFIR_DMA_HDR_INFO1_SW_PEER_ID_VALID GENMASK(15, 15) + struct ath11k_cfr_dma_hdr { u16 info0; u16 info1; @@ -37,6 +106,7 @@ struct ath11k_look_up_table { u16 dbr_ppdu_id; u16 tx_ppdu_id; dma_addr_t dbr_address; + struct ath11k_csi_cfr_header header; struct ath11k_cfr_dma_hdr hdr; u64 txrx_tstamp; u64 dbr_tstamp; @@ -109,6 +179,8 @@ int ath11k_cfr_send_peer_cfr_capture_cmd(struct ath11k = *ar, struct ath11k_sta *arsta, struct ath11k_per_peer_cfr_capture *params, const u8 *peer_mac); +struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar); +void ath11k_cfr_release_lut_entry(struct ath11k_look_up_table *lut); =20 #else static inline int ath11k_cfr_init(struct ath11k_base *ab) @@ -156,5 +228,15 @@ ath11k_cfr_send_peer_cfr_capture_cmd(struct ath11k *ar, { return 0; } + +static inline void ath11k_cfr_release_lut_entry(struct ath11k_look_up_tabl= e *lut) +{ +} + +static inline +struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar) +{ + return NULL; +} #endif /* CONFIG_ATH11K_CFR */ #endif /* ATH11K_CFR_H */ diff --git a/drivers/net/wireless/ath/ath11k/dbring.c b/drivers/net/wireles= s/ath/ath11k/dbring.c index ed2b781a6bab..d6994ce6ebff 100644 --- a/drivers/net/wireless/ath/ath11k/dbring.c +++ b/drivers/net/wireless/ath/ath11k/dbring.c @@ -295,6 +295,7 @@ int ath11k_dbring_buffer_release_event(struct ath11k_ba= se *ab, int size; dma_addr_t paddr; int ret =3D 0; + int status; =20 pdev_idx =3D ev->fixed.pdev_id; module_id =3D ev->fixed.module_id; @@ -328,6 +329,9 @@ int ath11k_dbring_buffer_release_event(struct ath11k_ba= se *ab, case WMI_DIRECT_BUF_SPECTRAL: ring =3D ath11k_spectral_get_dbring(ar); break; + case WMI_DIRECT_BUF_CFR: + ring =3D ath11k_cfr_get_dbring(ar); + break; default: ring =3D NULL; ath11k_warn(ab, "Recv dma buffer release ev on unsupp module %d\n", @@ -378,8 +382,12 @@ int ath11k_dbring_buffer_release_event(struct ath11k_b= ase *ab, handler_data.data =3D PTR_ALIGN(vaddr_unalign, ring->buf_align); handler_data.data_sz =3D ring->buf_sz; + handler_data.buff =3D buff; + handler_data.buf_id =3D buf_id; =20 - ring->handler(ar, &handler_data); + status =3D ring->handler(ar, &handler_data); + if (status =3D=3D ATH11K_CORRELATE_STATUS_HOLD) + continue; } =20 buff->paddr =3D 0; diff --git a/drivers/net/wireless/ath/ath11k/dbring.h b/drivers/net/wireles= s/ath/ath11k/dbring.h index 0a380120f7a0..e5f244dfa963 100644 --- a/drivers/net/wireless/ath/ath11k/dbring.h +++ b/drivers/net/wireless/ath/ath11k/dbring.h @@ -21,6 +21,8 @@ struct ath11k_dbring_data { void *data; u32 data_sz; struct wmi_dma_buf_release_meta_data meta; + struct ath11k_dbring_element *buff; + u32 buf_id; }; =20 struct ath11k_dbring_buf_release_event { diff --git a/drivers/net/wireless/ath/ath11k/debug.h b/drivers/net/wireless= /ath/ath11k/debug.h index cc8934d15697..aaa0034527a5 100644 --- a/drivers/net/wireless/ath/ath11k/debug.h +++ b/drivers/net/wireless/ath/ath11k/debug.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. - * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights res= erved. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ =20 #ifndef _ATH11K_DEBUG_H_ @@ -27,6 +27,8 @@ enum ath11k_debug_mask { ATH11K_DBG_DP_TX =3D 0x00002000, ATH11K_DBG_DP_RX =3D 0x00004000, ATH11K_DBG_CE =3D 0x00008000, + ATH11K_DBG_CFR =3D 0x00010000, + ATH11K_DBG_CFR_DUMP =3D 0x00020000, }; =20 static inline const char *ath11k_dbg_str(enum ath11k_debug_mask mask) @@ -64,6 +66,10 @@ static inline const char *ath11k_dbg_str(enum ath11k_deb= ug_mask mask) return "dp_rx"; case ATH11K_DBG_CE: return "ce"; + case ATH11K_DBG_CFR: + return "cfr"; + case ATH11K_DBG_CFR_DUMP: + return "cfr_dump"; =20 /* no default handler to allow compiler to check that the * enum is fully handled --=20 2.34.1