From: Goran Sustek <gsustek@gmail.com>
To: Jeff Johnson <jjohnson@kernel.org>
Cc: linux-wireless@vger.kernel.org, ath12k@lists.infradead.org,
linux-kernel@vger.kernel.org,
Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>,
Nazar Mokrynskyi <nazar@mokrynskyi.com>
Subject: [PATCH ath-next v3 2/2] wifi: ath12k: skip unknown direct buffer ring module IDs
Date: Tue, 10 Nov 2026 01:21:21 +0100 [thread overview]
Message-ID: <20261110002121.90167-3-gsustek@gmail.com> (raw)
In-Reply-To: <20261110002121.90167-1-gsustek@gmail.com>
QCN9274 firmware WLAN.WBE.1.6-01243 advertises direct buffer rings for
module IDs 2 (CV upload) and 3 (Wi-Fi radar). ath12k_wmi_dma_ring_caps()
treats any ID at or above WMI_DIRECT_BUF_MAX as fatal:
ath12k_wifi7_pci 0000:06:00.0: Invalid module id 2
ath12k_wifi7_pci 0000:06:00.0: failed to parse tlv -22
It frees the capabilities stored so far and aborts the parse of the
service ready ext event; initialisation continues only because the
service ready ext2 event completes it.
An unknown ID is not an error: the firmware uses a ring only after the
host configures it, and the host does that only for a feature it
implements. Skip such entries with a warning, as for an unsupported
memory type in ath12k_qmi_alloc_target_mem_chunk(). Store the accepted
entries contiguously and set num_db_cap to the stored count, so that a
skipped entry cannot read as a zero-sized spectral ring.
Based on Nazar Mokrynskyi's version, with the separate count that Jeff
Johnson suggested in its review.
Link: https://lore.kernel.org/linux-wireless/20260505172415.566328-3-nazar@mokrynskyi.com/
Suggested-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.6-01243-QCAHKSWPL_SILICONZ-1
Signed-off-by: Goran Sustek <gsustek@gmail.com>
---
v3: warning instead of a debug message for a skipped entry
v2: commit message and comment reworded
drivers/net/wireless/ath/ath12k/wmi.c | 43 +++++++++++++++++----------
1 file changed, 28 insertions(+), 15 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c
index f41138a7c68e..9720bed21631 100644
--- a/drivers/net/wireless/ath/ath12k/wmi.c
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
@@ -4988,8 +4988,8 @@ static int ath12k_wmi_dma_ring_caps(struct ath12k_base *ab,
struct ath12k_wmi_dma_ring_caps_parse *dma_caps_parse = data;
struct ath12k_wmi_dma_ring_caps_params *dma_caps;
struct ath12k_dbring_cap *dir_buff_caps;
+ u32 i, n = 0, module_id;
int ret;
- u32 i;
dma_caps_parse->n_dma_ring_caps = 0;
dma_caps = (struct ath12k_wmi_dma_ring_caps_params *)ptr;
@@ -5015,26 +5015,39 @@ static int ath12k_wmi_dma_ring_caps(struct ath12k_base *ab,
dir_buff_caps = ab->db_caps;
for (i = 0; i < dma_caps_parse->n_dma_ring_caps; i++) {
- if (le32_to_cpu(dma_caps[i].module_id) >= WMI_DIRECT_BUF_MAX) {
- ath12k_warn(ab, "Invalid module id %d\n",
- le32_to_cpu(dma_caps[i].module_id));
- ret = -EINVAL;
- goto free_dir_buff;
+ module_id = le32_to_cpu(dma_caps[i].module_id);
+
+ /* Firmware may advertise rings for modules this driver
+ * does not implement. It uses a ring only after the host
+ * configures it, so skipping the entry is safe. Warn, as
+ * for an unsupported memory type, so the gap is visible.
+ */
+ if (module_id >= WMI_DIRECT_BUF_MAX) {
+ ath12k_warn(ab, "dma ring caps for module id %u not supported, skipping\n",
+ module_id);
+ continue;
}
- dir_buff_caps[i].id = le32_to_cpu(dma_caps[i].module_id);
- dir_buff_caps[i].pdev_id =
+ dir_buff_caps[n].id = module_id;
+ dir_buff_caps[n].pdev_id =
DP_HW2SW_MACID(le32_to_cpu(dma_caps[i].pdev_id));
- dir_buff_caps[i].min_elem = le32_to_cpu(dma_caps[i].min_elem);
- dir_buff_caps[i].min_buf_sz = le32_to_cpu(dma_caps[i].min_buf_sz);
- dir_buff_caps[i].min_buf_align = le32_to_cpu(dma_caps[i].min_buf_align);
+ dir_buff_caps[n].min_elem = le32_to_cpu(dma_caps[i].min_elem);
+ dir_buff_caps[n].min_buf_sz = le32_to_cpu(dma_caps[i].min_buf_sz);
+ dir_buff_caps[n].min_buf_align = le32_to_cpu(dma_caps[i].min_buf_align);
+ n++;
}
- return 0;
+ if (!n) {
+ ath12k_wmi_free_dbring_caps(ab);
+ return 0;
+ }
-free_dir_buff:
- ath12k_wmi_free_dbring_caps(ab);
- return ret;
+ /* count only the entries stored, so no zeroed entry looks like
+ * a spectral ring
+ */
+ ab->num_db_cap = n;
+
+ return 0;
}
static void
--
2.56.0
next prev parent reply other threads:[~2026-11-10 0:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-10 0:21 [PATCH ath-next v3 0/2] wifi: ath12k: accept what newer QCN9274 firmware requests at boot Goran Sustek
2026-11-10 0:21 ` [PATCH ath-next v3 1/2] wifi: ath12k: report size 0 for unsupported target memory types Goran Sustek
2026-11-10 0:21 ` Goran Sustek [this message]
2026-11-10 7:36 ` [PATCH ath-next v3 0/2] wifi: ath12k: accept what newer QCN9274 firmware requests at boot Rameshkumar Sundaram
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261110002121.90167-3-gsustek@gmail.com \
--to=gsustek@gmail.com \
--cc=ath12k@lists.infradead.org \
--cc=jjohnson@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=nazar@mokrynskyi.com \
--cc=rameshkumar.sundaram@oss.qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.