[PATCH ath-next v5 10/11] wifi: ath12k: derive WBM RX drv_link_id per device via HAL ops
Baochen Qiang
baochen.qiang at oss.qualcomm.com
Mon Nov 9 22:40:31 PST 2026
The WBM error path also stores a driver link id in
ath12k_skb_rxcb::drv_link_id, previously derived from the source link id
via rx_desc_get_msdu_src_link_id(). Like the REO path, the source of
this id differs per device.
Add a HAL op rx_msdu_desc_get_drv_link_id() to let each device provide its
own driver link id on the WBM error path. For QCN9274 keep the existing
behavior; for WCN7850/QCC2072 extract the logical link id from the peer
metadata via ath12k_wifi7_dp_rx_get_logical_link_id().
This replaces the old rx_desc_get_msdu_src_link_id op, which had no
other user and is removed along with its per-device implementations.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c7-00108-QCAHMTSWPL_V1.0_V2.0_SILICONZ_UPSTREAM-3
Tested-on: QCC2072 hw1.0 PCI WLAN.COL.1.0.c2-00068-QCACOLSWPL_V1_TO_SILICONZ-1
Tested-by: Burke Cates <burke.cates at gmail.com> # ASUS Zenbook A16 (UX3607OA)
Signed-off-by: Baochen Qiang <baochen.qiang at oss.qualcomm.com>
---
drivers/net/wireless/ath/ath12k/dp_rx.h | 15 +++++++++------
drivers/net/wireless/ath/ath12k/hal.h | 4 +++-
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c | 22 +++++++++++-----------
.../net/wireless/ath/ath12k/wifi7/hal_qcc2072.c | 7 +------
.../net/wireless/ath/ath12k/wifi7/hal_qcn9274.c | 7 +++++--
.../net/wireless/ath/ath12k/wifi7/hal_qcn9274.h | 1 -
.../net/wireless/ath/ath12k/wifi7/hal_wcn7850.c | 8 +++++---
.../net/wireless/ath/ath12k/wifi7/hal_wcn7850.h | 4 +++-
8 files changed, 37 insertions(+), 31 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.h b/drivers/net/wireless/ath/ath12k/dp_rx.h
index fcad6a7ad6ba..a78efa1d9569 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.h
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.h
@@ -164,12 +164,6 @@ static inline void ath12k_dp_rx_desc_get_crypto_header(struct ath12k_hal *hal,
hal->ops->rx_desc_get_crypto_header(desc, crypto_hdr, enctype);
}
-static inline u8 ath12k_dp_rx_get_msdu_src_link(struct ath12k_hal *hal,
- struct hal_rx_desc *desc)
-{
- return hal->ops->rx_desc_get_msdu_src_link_id(desc);
-}
-
static inline u8
ath12k_dp_rx_reo_get_drv_link_id(struct ath12k_dp *dp,
struct hal_reo_dest_ring *reo_desc)
@@ -177,6 +171,15 @@ ath12k_dp_rx_reo_get_drv_link_id(struct ath12k_dp *dp,
return dp->hal->ops->rx_reo_desc_get_drv_link_id(dp, reo_desc);
}
+static inline u8
+ath12k_dp_rx_wbm_get_drv_link_id(struct ath12k_dp *dp,
+ struct hal_rx_desc *rx_desc,
+ __le32 peer_metadata)
+{
+ return dp->hal->ops->rx_msdu_desc_get_drv_link_id(dp, rx_desc,
+ peer_metadata);
+}
+
static inline void ath12k_dp_clean_up_skb_list(struct sk_buff_head *skb_list)
{
struct sk_buff *skb;
diff --git a/drivers/net/wireless/ath/ath12k/hal.h b/drivers/net/wireless/ath/ath12k/hal.h
index c8bb63d92bfd..343e1636b4cc 100644
--- a/drivers/net/wireless/ath/ath12k/hal.h
+++ b/drivers/net/wireless/ath/ath12k/hal.h
@@ -1378,9 +1378,11 @@ struct hal_ops {
enum hal_encrypt_type enctype);
void (*rx_desc_copy_end_tlv)(struct hal_rx_desc *fdesc,
struct hal_rx_desc *ldesc);
- u8 (*rx_desc_get_msdu_src_link_id)(struct hal_rx_desc *desc);
u8 (*rx_reo_desc_get_drv_link_id)(struct ath12k_dp *dp,
struct hal_reo_dest_ring *reo_desc);
+ u8 (*rx_msdu_desc_get_drv_link_id)(struct ath12k_dp *dp,
+ struct hal_rx_desc *rx_desc,
+ __le32 peer_metadata);
void (*extract_rx_desc_data)(struct hal_rx_desc_data *rx_desc_data,
struct hal_rx_desc *rx_desc,
struct hal_rx_desc *ldesc);
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c b/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c
index 312c7ac74b3b..4132578085cc 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c
@@ -1961,7 +1961,7 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp,
struct ath12k_rx_desc_info *desc_info;
struct ath12k_device_dp_stats *device_stats = &dp->device_stats;
struct ath12k_hw_link *hw_links = ag->hw_links;
- u8 hw_link_id, device_id;
+ u8 drv_link_id, device_id;
int ret, pdev_idx;
struct hal_rx_desc *msdu_data;
@@ -2057,9 +2057,9 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp,
continue;
}
- hw_link_id = ath12k_dp_rx_get_msdu_src_link(partner_dp->hal,
- msdu_data);
- if (hw_link_id >= ATH12K_GROUP_MAX_RADIO) {
+ drv_link_id = ath12k_dp_rx_wbm_get_drv_link_id(partner_dp, msdu_data,
+ err_info.peer_metadata);
+ if (drv_link_id >= ATH12K_GROUP_MAX_RADIO) {
ath12k_wifi7_dp_rx_wbm_err_free_skb(dp, msdu,
WBM_ERR_DROP_INV_HW_ID);
@@ -2075,7 +2075,7 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp,
skb_queue_walk(&scatter_msdu_list, msdu) {
rxcb = ATH12K_SKB_RXCB(msdu);
- rxcb->drv_link_id = hw_link_id;
+ rxcb->drv_link_id = drv_link_id;
}
skb_queue_splice_tail_init(&scatter_msdu_list,
@@ -2083,7 +2083,7 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp,
}
rxcb = ATH12K_SKB_RXCB(msdu);
- rxcb->drv_link_id = hw_link_id;
+ rxcb->drv_link_id = drv_link_id;
__skb_queue_tail(&msdu_list, msdu);
}
@@ -2114,21 +2114,21 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp,
rcu_read_lock();
while ((msdu = __skb_dequeue(&msdu_list))) {
rxcb = ATH12K_SKB_RXCB(msdu);
- hw_link_id = rxcb->drv_link_id;
+ drv_link_id = rxcb->drv_link_id;
- device_id = ath12k_dp_drv_link_id_to_device_id(ag, hw_link_id);
+ device_id = ath12k_dp_drv_link_id_to_device_id(ag, drv_link_id);
partner_dp = ath12k_dp_hw_grp_to_dp(dp_hw_grp, device_id);
if (unlikely(!partner_dp)) {
ath12k_dbg(ab, ATH12K_DBG_DATA,
- "Unable to process WBM error msdu due to invalid hw link id %d device id %d\n",
- hw_link_id, device_id);
+ "Unable to process WBM error msdu due to invalid drv link id %d device id %d\n",
+ drv_link_id, device_id);
ath12k_wifi7_dp_rx_wbm_err_free_skb(dp, msdu,
WBM_ERR_DROP_NULL_PROC_DP);
continue;
}
pdev_idx = ath12k_hw_mac_id_to_pdev_id(partner_dp->hw_params,
- hw_links[hw_link_id].pdev_idx);
+ hw_links[drv_link_id].pdev_idx);
dp_pdev = ath12k_dp_to_pdev_dp(partner_dp, pdev_idx);
if (!dp_pdev) {
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c
index edf122fd46b5..bad2b60409d9 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c
@@ -173,11 +173,6 @@ static void ath12k_hal_rx_desc_copy_end_tlv_qcc2072(struct hal_rx_desc *fdesc,
sizeof(struct rx_msdu_end_qcn9274));
}
-static u8 ath12k_hal_rx_desc_get_msdu_src_link_qcc2072(struct hal_rx_desc *desc)
-{
- return 0;
-}
-
static u8 ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072(struct hal_rx_desc *desc)
{
return le16_get_bits(desc->u.qcc2072.msdu_end.info5,
@@ -471,8 +466,8 @@ const struct hal_ops hal_qcc2072_ops = {
.rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_qcc2072,
.rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_qcc2072,
.rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_qcc2072,
- .rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_qcc2072,
.rx_reo_desc_get_drv_link_id = ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850,
+ .rx_msdu_desc_get_drv_link_id = ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850,
.extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_qcc2072,
.rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072,
.rx_desc_get_mpdu_start_tag = ath12k_hal_rx_desc_get_mpdu_start_tag_qcc2072,
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
index 7c19098f06c7..0f85ae69b5e0 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
@@ -892,7 +892,10 @@ u32 ath12k_hal_get_rx_desc_size_qcn9274(void)
return sizeof(struct hal_rx_desc_qcn9274_compact);
}
-u8 ath12k_hal_rx_desc_get_msdu_src_link_qcn9274(struct hal_rx_desc *desc)
+static u8
+ath12k_hal_rx_msdu_desc_get_drv_link_id_qcn9274(struct ath12k_dp *dp,
+ struct hal_rx_desc *desc,
+ __le32 peer_metadata)
{
return le64_get_bits(desc->u.qcn9274_compact.msdu_end.msdu_end_tag,
RX_MSDU_END_64_TLV_SRC_LINK_ID);
@@ -1206,8 +1209,8 @@ const struct hal_ops hal_qcn9274_ops = {
.rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_qcn9274,
.rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_qcn9274,
.rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_qcn9274,
- .rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_qcn9274,
.rx_reo_desc_get_drv_link_id = ath12k_hal_rx_reo_desc_get_drv_link_id_qcn9274,
+ .rx_msdu_desc_get_drv_link_id = ath12k_hal_rx_msdu_desc_get_drv_link_id_qcn9274,
.extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_qcn9274,
.rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_qcn9274,
.rx_desc_get_mpdu_ppdu_id = ath12k_hal_rx_desc_get_mpdu_ppdu_id_qcn9274,
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h
index 5c593773109d..b9c2b97105fe 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h
@@ -33,7 +33,6 @@ u8 *ath12k_hal_rx_desc_get_msdu_payload_qcn9274(struct hal_rx_desc *desc);
u32 ath12k_hal_rx_desc_get_mpdu_start_offset_qcn9274(void);
u32 ath12k_hal_rx_desc_get_msdu_end_offset_qcn9274(void);
u32 ath12k_hal_get_rx_desc_size_qcn9274(void);
-u8 ath12k_hal_rx_desc_get_msdu_src_link_qcn9274(struct hal_rx_desc *desc);
u16 ath12k_hal_rx_mpdu_start_wmask_get_qcn9274(void);
u32 ath12k_hal_rx_msdu_end_wmask_get_qcn9274(void);
void ath12k_hal_rx_desc_get_crypto_hdr_qcn9274(struct hal_rx_desc *desc,
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c
index fec625a0ea0b..2d66d71d1b9b 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c
@@ -505,9 +505,11 @@ u32 ath12k_hal_get_rx_desc_size_wcn7850(void)
return sizeof(struct hal_rx_desc_wcn7850);
}
-u8 ath12k_hal_rx_desc_get_msdu_src_link_wcn7850(struct hal_rx_desc *desc)
+u8 ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp,
+ struct hal_rx_desc *desc,
+ __le32 peer_metadata)
{
- return 0;
+ return ath12k_wifi7_dp_rx_get_logical_link_id(dp, peer_metadata);
}
u8 ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp,
@@ -803,8 +805,8 @@ const struct hal_ops hal_wcn7850_ops = {
.rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_wcn7850,
.rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_wcn7850,
.rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_wcn7850,
- .rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_wcn7850,
.rx_reo_desc_get_drv_link_id = ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850,
+ .rx_msdu_desc_get_drv_link_id = ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850,
.extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_wcn7850,
.rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_wcn7850,
.rx_desc_get_mpdu_start_tag = ath12k_hal_rx_desc_get_mpdu_start_tag_wcn7850,
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h
index c7e1fba9bb4b..3fa919352686 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h
+++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h
@@ -27,9 +27,11 @@ u8 *ath12k_hal_rx_desc_get_msdu_payload_wcn7850(struct hal_rx_desc *desc);
u32 ath12k_hal_rx_desc_get_mpdu_start_offset_wcn7850(void);
u32 ath12k_hal_rx_desc_get_msdu_end_offset_wcn7850(void);
u32 ath12k_hal_get_rx_desc_size_wcn7850(void);
-u8 ath12k_hal_rx_desc_get_msdu_src_link_wcn7850(struct hal_rx_desc *desc);
u8 ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp,
struct hal_reo_dest_ring *reo_desc);
+u8 ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp,
+ struct hal_rx_desc *desc,
+ __le32 peer_metadata);
void ath12k_hal_rx_desc_get_crypto_hdr_wcn7850(struct hal_rx_desc *desc,
u8 *crypto_hdr,
enum hal_encrypt_type enctype);
--
2.25.1
More information about the ath12k
mailing list