]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: refactor REO status ring handling
authorBaochen Qiang <baochen.qiang@oss.qualcomm.com>
Mon, 12 Jan 2026 07:36:23 +0000 (15:36 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 16 Jan 2026 01:19:39 +0000 (17:19 -0800)
The entry of REO status ring of existing chips has a 64 bit TLV header,
hence below functions take a 64 bit TLV assumption by default

        ath12k_wifi7_dp_rx_process_reo_status()
        ath12k_wifi7_hal_reo_status_queue_stats()
        ath12k_wifi7_hal_reo_flush_queue_status()
        ath12k_wifi7_hal_reo_flush_cache_status()
        ath12k_wifi7_hal_reo_unblk_cache_status()
        ath12k_wifi7_hal_reo_flush_timeout_list_status()
        ath12k_wifi7_hal_reo_desc_thresh_reached_status()
        ath12k_wifi7_hal_reo_update_rx_reo_queue_status()

However this is not the case for QCC2072 of which the TLV is 32 bit.

Refactor above functions to prepare for QCC2072 support, this is done by
removing TLV length assumption and offloading TLV decoding work to a newly
added callback _reo_status_dec_tlv_hdr. This way each chip can register
its own handler hence can do the work accordingly.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00302-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.115823

Signed-off-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20260112-ath12k-support-qcc2072-v2-3-fc8ce1e43969@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/hal.c
drivers/net/wireless/ath/ath12k/hal.h
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c
drivers/net/wireless/ath/ath12k/wifi7/hal.h
drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c
drivers/net/wireless/ath/ath12k/wifi7/hal_rx.c
drivers/net/wireless/ath/ath12k/wifi7/hal_rx.h
drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c

index b19bec8ea082d0831b57a719e29b265591fd9039..bafb49ab5475fc2f68c3cd71028b819c74960726 100644 (file)
@@ -834,3 +834,15 @@ void *ath12k_hal_encode_tlv64_hdr(void *tlv, u64 tag, u64 len)
        return tlv64->value;
 }
 EXPORT_SYMBOL(ath12k_hal_encode_tlv64_hdr);
+
+u16 ath12k_hal_decode_tlv64_hdr(void *tlv, void **desc)
+{
+       struct hal_tlv_64_hdr *tlv64 = tlv;
+       u16 tag;
+
+       tag = le64_get_bits(tlv64->tl, HAL_SRNG_TLV_HDR_TAG);
+       *desc = tlv64->value;
+
+       return tag;
+}
+EXPORT_SYMBOL(ath12k_hal_decode_tlv64_hdr);
index 595e4904647150b56d945c4500c5af6540978328..81b0cb002b38cead90025095f110f4090c94c84b 100644 (file)
@@ -1427,6 +1427,7 @@ struct hal_ops {
                                         struct ath12k_buffer_addr **pp_buf_addr,
                                         u8 *rbm, u32 *msdu_cnt);
        void *(*reo_cmd_enc_tlv_hdr)(void *tlv, u64 tag, u64 len);
+       u16 (*reo_status_dec_tlv_hdr)(void *tlv, void **desc);
 };
 
 #define HAL_TLV_HDR_TAG                GENMASK(9, 1)
@@ -1450,6 +1451,9 @@ struct hal_tlv_64_hdr {
        u8 value[];
 } __packed;
 
+#define HAL_SRNG_TLV_HDR_TAG           GENMASK(9, 1)
+#define HAL_SRNG_TLV_HDR_LEN           GENMASK(25, 10)
+
 dma_addr_t ath12k_hal_srng_get_tp_addr(struct ath12k_base *ab,
                                       struct hal_srng *srng);
 dma_addr_t ath12k_hal_srng_get_hp_addr(struct ath12k_base *ab,
@@ -1538,4 +1542,5 @@ void ath12k_hal_rx_reo_ent_buf_paddr_get(struct ath12k_hal *hal, void *rx_desc,
                                         struct ath12k_buffer_addr **pp_buf_addr,
                                         u8 *rbm, u32 *msdu_cnt);
 void *ath12k_hal_encode_tlv64_hdr(void *tlv, u64 tag, u64 len);
+u16 ath12k_hal_decode_tlv64_hdr(void *tlv, void **desc);
 #endif
index a1ca55fe51c06a51d56bbd8c5f89d6e2901e408b..dc8d72aeca4574a4a062c5b90d400498a900fb4e 100644 (file)
@@ -2114,12 +2114,12 @@ void ath12k_wifi7_dp_rx_process_reo_status(struct ath12k_dp *dp)
 {
        struct ath12k_base *ab = dp->ab;
        struct ath12k_hal *hal = dp->hal;
-       struct hal_tlv_64_hdr *hdr;
        struct hal_srng *srng;
        struct ath12k_dp_rx_reo_cmd *cmd, *tmp;
        bool found = false;
        u16 tag;
        struct hal_reo_status reo_status;
+       void *hdr, *desc;
 
        srng = &hal->srng_list[dp->reo_status_ring.ring_id];
 
@@ -2130,35 +2130,35 @@ void ath12k_wifi7_dp_rx_process_reo_status(struct ath12k_dp *dp)
        ath12k_hal_srng_access_begin(ab, srng);
 
        while ((hdr = ath12k_hal_srng_dst_get_next_entry(ab, srng))) {
-               tag = le64_get_bits(hdr->tl, HAL_SRNG_TLV_HDR_TAG);
+               tag = hal->ops->reo_status_dec_tlv_hdr(hdr, &desc);
 
                switch (tag) {
                case HAL_REO_GET_QUEUE_STATS_STATUS:
-                       ath12k_wifi7_hal_reo_status_queue_stats(ab, hdr,
+                       ath12k_wifi7_hal_reo_status_queue_stats(ab, desc,
                                                                &reo_status);
                        break;
                case HAL_REO_FLUSH_QUEUE_STATUS:
-                       ath12k_wifi7_hal_reo_flush_queue_status(ab, hdr,
+                       ath12k_wifi7_hal_reo_flush_queue_status(ab, desc,
                                                                &reo_status);
                        break;
                case HAL_REO_FLUSH_CACHE_STATUS:
-                       ath12k_wifi7_hal_reo_flush_cache_status(ab, hdr,
+                       ath12k_wifi7_hal_reo_flush_cache_status(ab, desc,
                                                                &reo_status);
                        break;
                case HAL_REO_UNBLOCK_CACHE_STATUS:
-                       ath12k_wifi7_hal_reo_unblk_cache_status(ab, hdr,
+                       ath12k_wifi7_hal_reo_unblk_cache_status(ab, desc,
                                                                &reo_status);
                        break;
                case HAL_REO_FLUSH_TIMEOUT_LIST_STATUS:
-                       ath12k_wifi7_hal_reo_flush_timeout_list_status(ab, hdr,
+                       ath12k_wifi7_hal_reo_flush_timeout_list_status(ab, desc,
                                                                       &reo_status);
                        break;
                case HAL_REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS:
-                       ath12k_wifi7_hal_reo_desc_thresh_reached_status(ab, hdr,
+                       ath12k_wifi7_hal_reo_desc_thresh_reached_status(ab, desc,
                                                                        &reo_status);
                        break;
                case HAL_REO_UPDATE_RX_REO_QUEUE_STATUS:
-                       ath12k_wifi7_hal_reo_update_rx_reo_queue_status(ab, hdr,
+                       ath12k_wifi7_hal_reo_update_rx_reo_queue_status(ab, desc,
                                                                        &reo_status);
                        break;
                default:
index 7d65b82c61f25a3b038f5af0acd536aad1fb49dd..9337225a52533d7f16deff3f71b22e431f55291a 100644 (file)
 #define HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_USEC  (100 * 1000)
 #define HAL_DEFAULT_VO_REO_TIMEOUT_USEC                (40 * 1000)
 
-#define HAL_SRNG_TLV_HDR_TAG           GENMASK(9, 1)
-#define HAL_SRNG_TLV_HDR_LEN           GENMASK(25, 10)
-
 #define HAL_SRNG_DESC_LOOP_CNT         0xf0000000
 
 #define HAL_REO_CMD_FLG_NEED_STATUS            BIT(0)
index ff26e9684e9e3808a163f064fbc961c23ef85cc6..95850e6dc6c7214bedd979a655c0cf5eb220e8ac 100644 (file)
@@ -1030,4 +1030,5 @@ const struct hal_ops hal_qcn9274_ops = {
        .rx_msdu_list_get = ath12k_wifi7_hal_rx_msdu_list_get,
        .rx_reo_ent_buf_paddr_get = ath12k_wifi7_hal_rx_reo_ent_buf_paddr_get,
        .reo_cmd_enc_tlv_hdr = ath12k_hal_encode_tlv64_hdr,
+       .reo_status_dec_tlv_hdr = ath12k_hal_decode_tlv64_hdr,
 };
index 3b8710a3b6ad2b03b94d88008b1e5709c015685b..a88ef126aadaba8aeadb71f380561f7613706def 100644 (file)
@@ -543,12 +543,9 @@ ath12k_wifi7_hal_rx_msdu_link_desc_set(struct ath12k_base *ab,
 }
 
 void ath12k_wifi7_hal_reo_status_queue_stats(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_get_queue_stats_status *desc,
                                             struct hal_reo_status *status)
 {
-       struct hal_reo_get_queue_stats_status *desc =
-               (struct hal_reo_get_queue_stats_status *)tlv->value;
-
        status->uniform_hdr.cmd_num =
                                le32_get_bits(desc->hdr.info0,
                                              HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
@@ -607,12 +604,9 @@ void ath12k_wifi7_hal_reo_status_queue_stats(struct ath12k_base *ab,
 }
 
 void ath12k_wifi7_hal_reo_flush_queue_status(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_flush_queue_status *desc,
                                             struct hal_reo_status *status)
 {
-       struct hal_reo_flush_queue_status *desc =
-               (struct hal_reo_flush_queue_status *)tlv->value;
-
        status->uniform_hdr.cmd_num =
                        le32_get_bits(desc->hdr.info0,
                                      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
@@ -626,12 +620,10 @@ void ath12k_wifi7_hal_reo_flush_queue_status(struct ath12k_base *ab,
 
 void
 ath12k_wifi7_hal_reo_flush_cache_status(struct ath12k_base *ab,
-                                       struct hal_tlv_64_hdr *tlv,
+                                       struct hal_reo_flush_cache_status *desc,
                                        struct hal_reo_status *status)
 {
        struct ath12k_hal *hal = &ab->hal;
-       struct hal_reo_flush_cache_status *desc =
-               (struct hal_reo_flush_cache_status *)tlv->value;
 
        status->uniform_hdr.cmd_num =
                        le32_get_bits(desc->hdr.info0,
@@ -668,12 +660,10 @@ ath12k_wifi7_hal_reo_flush_cache_status(struct ath12k_base *ab,
 }
 
 void ath12k_wifi7_hal_reo_unblk_cache_status(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_unblock_cache_status *desc,
                                             struct hal_reo_status *status)
 {
        struct ath12k_hal *hal = &ab->hal;
-       struct hal_reo_unblock_cache_status *desc =
-               (struct hal_reo_unblock_cache_status *)tlv->value;
 
        status->uniform_hdr.cmd_num =
                        le32_get_bits(desc->hdr.info0,
@@ -697,12 +687,9 @@ void ath12k_wifi7_hal_reo_unblk_cache_status(struct ath12k_base *ab,
 
 void
 ath12k_wifi7_hal_reo_flush_timeout_list_status(struct ath12k_base *ab,
-                                              struct hal_tlv_64_hdr *tlv,
+                                              struct hal_reo_flush_timeout_list_status *desc,
                                               struct hal_reo_status *status)
 {
-       struct hal_reo_flush_timeout_list_status *desc =
-               (struct hal_reo_flush_timeout_list_status *)tlv->value;
-
        status->uniform_hdr.cmd_num =
                        le32_get_bits(desc->hdr.info0,
                                      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
@@ -727,12 +714,9 @@ ath12k_wifi7_hal_reo_flush_timeout_list_status(struct ath12k_base *ab,
 
 void
 ath12k_wifi7_hal_reo_desc_thresh_reached_status(struct ath12k_base *ab,
-                                               struct hal_tlv_64_hdr *tlv,
+                                               struct hal_reo_desc_thresh_reached_status *desc,
                                                struct hal_reo_status *status)
 {
-       struct hal_reo_desc_thresh_reached_status *desc =
-               (struct hal_reo_desc_thresh_reached_status *)tlv->value;
-
        status->uniform_hdr.cmd_num =
                        le32_get_bits(desc->hdr.info0,
                                      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
@@ -762,12 +746,9 @@ ath12k_wifi7_hal_reo_desc_thresh_reached_status(struct ath12k_base *ab,
 }
 
 void ath12k_wifi7_hal_reo_update_rx_reo_queue_status(struct ath12k_base *ab,
-                                                    struct hal_tlv_64_hdr *tlv,
+                                                    struct hal_reo_status_hdr *desc,
                                                     struct hal_reo_status *status)
 {
-       struct hal_reo_status_hdr *desc =
-               (struct hal_reo_status_hdr *)tlv->value;
-
        status->uniform_hdr.cmd_num =
                        le32_get_bits(desc->info0,
                                      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
index aa1bca81395571db0a7fd9adabb99a546ea0beca..95f5595b30ad125f7788e32bc415faee41012a97 100644 (file)
@@ -813,25 +813,27 @@ enum hal_mon_reception_type {
                        (HAL_RU(ru_per80, num_80mhz, ru_idx_per80mhz))
 
 void ath12k_wifi7_hal_reo_status_queue_stats(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_get_queue_stats_status *desc,
                                             struct hal_reo_status *status);
 void ath12k_wifi7_hal_reo_flush_queue_status(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_flush_queue_status *desc,
                                             struct hal_reo_status *status);
 void ath12k_wifi7_hal_reo_flush_cache_status(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_flush_cache_status *desc,
                                             struct hal_reo_status *status);
 void ath12k_wifi7_hal_reo_unblk_cache_status(struct ath12k_base *ab,
-                                            struct hal_tlv_64_hdr *tlv,
+                                            struct hal_reo_unblock_cache_status *desc,
                                             struct hal_reo_status *status);
-void ath12k_wifi7_hal_reo_flush_timeout_list_status(struct ath12k_base *ab,
-                                                   struct hal_tlv_64_hdr *tlv,
-                                                   struct hal_reo_status *status);
-void ath12k_wifi7_hal_reo_desc_thresh_reached_status(struct ath12k_base *ab,
-                                                    struct hal_tlv_64_hdr *tlv,
-                                                    struct hal_reo_status *status);
+void
+ath12k_wifi7_hal_reo_flush_timeout_list_status(struct ath12k_base *ab,
+                                              struct hal_reo_flush_timeout_list_status *desc,
+                                              struct hal_reo_status *status);
+void
+ath12k_wifi7_hal_reo_desc_thresh_reached_status(struct ath12k_base *ab,
+                                               struct hal_reo_desc_thresh_reached_status *desc,
+                                               struct hal_reo_status *status);
 void ath12k_wifi7_hal_reo_update_rx_reo_queue_status(struct ath12k_base *ab,
-                                                    struct hal_tlv_64_hdr *tlv,
+                                                    struct hal_reo_status_hdr *desc,
                                                     struct hal_reo_status *status);
 void ath12k_wifi7_hal_rx_msdu_link_info_get(struct hal_rx_msdu_link *link, u32 *num_msdus,
                                            u32 *msdu_cookies,
index 49c45431c0c79dfb15ba75f0c48e9957ad63f809..c3093c01af878ef951c84df8c6c818fc25bbe24f 100644 (file)
@@ -803,4 +803,5 @@ const struct hal_ops hal_wcn7850_ops = {
        .rx_msdu_list_get = ath12k_wifi7_hal_rx_msdu_list_get,
        .rx_reo_ent_buf_paddr_get = ath12k_wifi7_hal_rx_reo_ent_buf_paddr_get,
        .reo_cmd_enc_tlv_hdr = ath12k_hal_encode_tlv64_hdr,
+       .reo_status_dec_tlv_hdr = ath12k_hal_decode_tlv64_hdr,
 };