]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: Move EHT SIG processing to Wi-Fi 7 module
authorAlok Singh <quic_aloksing@quicinc.com>
Mon, 10 Nov 2025 10:37:09 +0000 (16:07 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Tue, 11 Nov 2025 15:21:33 +0000 (07:21 -0800)
Split Wi-Fi 7 specific EHT SIG parsing out of ath12k common
code into the Wi-Fi 7 module to improve modularity.

Move the following EHT SIG processing functions to wifi7/dp_mon.c and
add the ath12k_wifi7 prefix to each relocated function.
- ath12k_dp_mon_hal_aggr_tlv()
- ath12k_dp_mon_hal_rx_is_frame_type_ndp()
- ath12k_dp_mon_hal_rx_is_non_ofdma()
- ath12k_dp_mon_hal_rx_is_ofdma()
- ath12k_dp_mon_hal_rx_parse_eht_sig_ndp()
- ath12k_dp_mon_hal_rx_parse_usig_overflow()
- ath12k_dp_mon_hal_rx_parse_non_ofdma_users()
- ath12k_dp_mon_hal_rx_parse_eht_mumimo_user()
- ath12k_dp_mon_hal_rx_parse_eht_non_mumimo_user()
- ath12k_dp_mon_hal_rx_is_mu_mimo_user()
- ath12k_dp_mon_hal_rx_parse_eht_sig_non_ofdma()
- ath12k_dp_mon_hal_rx_parse_ru_allocation()
- ath12k_dp_mon_hal_rx_parse_eht_sig_ofdma()
- ath12k_dp_mon_parse_eht_sig_hdr()

Export helper functions needed by the ath12k_wifi7 module.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.5-01651-QCAHKSWPL_SILICONZ-1

Signed-off-by: Alok Singh <quic_aloksing@quicinc.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Link: https://patch.msgid.link/20251110103713.3484779-9-quic_aloksing@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp_mon.c
drivers/net/wireless/ath/ath12k/dp_mon.h
drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c

index df9203d90f004278b44eeab62186c15843d786bd..1ad984cd561e635245823b6c5efe5ab3190f4825 100644 (file)
 #include "dp_tx.h"
 #include "peer.h"
 
-#define ATH12K_LE32_DEC_ENC(value, dec_bits, enc_bits) \
-               u32_encode_bits(le32_get_bits(value, dec_bits), enc_bits)
-
-#define ATH12K_LE64_DEC_ENC(value, dec_bits, enc_bits) \
-               u32_encode_bits(le64_get_bits(value, dec_bits), enc_bits)
-
 void
 ath12k_dp_mon_rx_handle_ofdma_info(const struct hal_rx_ppdu_end_user_stats *ppdu_end_user,
                                   struct hal_rx_user_status *rx_user_status)
@@ -346,389 +340,6 @@ ath12k_dp_mon_hal_rx_parse_u_sig_hdr(const struct hal_mon_usig_hdr *usig,
 }
 EXPORT_SYMBOL(ath12k_dp_mon_hal_rx_parse_u_sig_hdr);
 
-void
-ath12k_dp_mon_hal_aggr_tlv(struct hal_rx_mon_ppdu_info *ppdu_info,
-                          u16 tlv_len, const void *tlv_data)
-{
-       if (tlv_len <= HAL_RX_MON_MAX_AGGR_SIZE - ppdu_info->tlv_aggr.cur_len) {
-               memcpy(ppdu_info->tlv_aggr.buf + ppdu_info->tlv_aggr.cur_len,
-                      tlv_data, tlv_len);
-               ppdu_info->tlv_aggr.cur_len += tlv_len;
-       }
-}
-EXPORT_SYMBOL(ath12k_dp_mon_hal_aggr_tlv);
-
-static inline bool
-ath12k_dp_mon_hal_rx_is_frame_type_ndp(const struct hal_rx_u_sig_info *usig_info)
-{
-       if (usig_info->ppdu_type_comp_mode == 1 &&
-           usig_info->eht_sig_mcs == 0 &&
-           usig_info->num_eht_sig_sym == 0)
-               return true;
-
-       return false;
-}
-
-static inline bool
-ath12k_dp_mon_hal_rx_is_non_ofdma(const struct hal_rx_u_sig_info *usig_info)
-{
-       u32 ppdu_type_comp_mode = usig_info->ppdu_type_comp_mode;
-       u32 ul_dl = usig_info->ul_dl;
-
-       if ((ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_MU_MIMO && ul_dl == 0) ||
-           (ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_MU_OFDMA && ul_dl == 0) ||
-           (ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_MU_MIMO  && ul_dl == 1))
-               return true;
-
-       return false;
-}
-
-static inline bool
-ath12k_dp_mon_hal_rx_is_ofdma(const struct hal_rx_u_sig_info *usig_info)
-{
-       if (usig_info->ppdu_type_comp_mode == 0 && usig_info->ul_dl == 0)
-               return true;
-
-       return false;
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_eht_sig_ndp(const struct hal_eht_sig_ndp_cmn_eb *eht_sig_ndp,
-                                      struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
-       u32 known, data;
-
-       known = __le32_to_cpu(eht->known);
-       known |= IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE |
-                IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF |
-                IEEE80211_RADIOTAP_EHT_KNOWN_NSS_S |
-                IEEE80211_RADIOTAP_EHT_KNOWN_BEAMFORMED_S |
-                IEEE80211_RADIOTAP_EHT_KNOWN_DISREGARD_S |
-                IEEE80211_RADIOTAP_EHT_KNOWN_CRC1 |
-                IEEE80211_RADIOTAP_EHT_KNOWN_TAIL1;
-       eht->known = cpu_to_le32(known);
-
-       data = __le32_to_cpu(eht->data[0]);
-       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
-                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_SPATIAL_REUSE,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE);
-       /* GI and LTF size are separately indicated in radiotap header
-        * and hence will be parsed from other TLV
-        */
-       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
-                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_NUM_LTF_SYM,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF);
-
-       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
-                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_CRC,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_CRC1_O);
-
-       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
-                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_DISREGARD,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_DISREGARD_S);
-       eht->data[0] = cpu_to_le32(data);
-
-       data = __le32_to_cpu(eht->data[7]);
-       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
-                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_NSS,
-                                   IEEE80211_RADIOTAP_EHT_DATA7_NSS_S);
-
-       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
-                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_BEAMFORMED,
-                                   IEEE80211_RADIOTAP_EHT_DATA7_BEAMFORMED_S);
-       eht->data[7] = cpu_to_le32(data);
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_usig_overflow(const struct hal_eht_sig_usig_overflow *ovflow,
-                                        struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
-       u32 known, data;
-
-       known = __le32_to_cpu(eht->known);
-       known |= IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE |
-                IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF |
-                IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM |
-                IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM |
-                IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM |
-                IEEE80211_RADIOTAP_EHT_KNOWN_DISREGARD_O;
-       eht->known = cpu_to_le32(known);
-
-       data = __le32_to_cpu(eht->data[0]);
-       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
-                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_SPATIAL_REUSE,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE);
-
-       /* GI and LTF size are separately indicated in radiotap header
-        * and hence will be parsed from other TLV
-        */
-       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
-                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_NUM_LTF_SYM,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF);
-
-       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
-                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_LDPC_EXTA_SYM,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_LDPC_EXTRA_SYM_OM);
-
-       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
-                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_PRE_FEC_PAD_FACTOR,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM);
-
-       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
-                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_DISAMBIGUITY,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_PE_DISAMBIGUITY_OM);
-
-       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
-                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_DISREGARD,
-                                   IEEE80211_RADIOTAP_EHT_DATA0_DISREGARD_O);
-       eht->data[0] = cpu_to_le32(data);
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_non_ofdma_users(const struct hal_eht_sig_non_ofdma_cmn_eb *eb,
-                                          struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
-       u32 known, data;
-
-       known = __le32_to_cpu(eht->known);
-       known |= IEEE80211_RADIOTAP_EHT_KNOWN_NR_NON_OFDMA_USERS_M;
-       eht->known = cpu_to_le32(known);
-
-       data = __le32_to_cpu(eht->data[7]);
-       data |= ATH12K_LE32_DEC_ENC(eb->info0,
-                                   HAL_RX_EHT_SIG_NON_OFDMA_INFO0_NUM_USERS,
-                                   IEEE80211_RADIOTAP_EHT_DATA7_NUM_OF_NON_OFDMA_USERS);
-       eht->data[7] = cpu_to_le32(data);
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_eht_mumimo_user(const struct hal_eht_sig_mu_mimo *user,
-                                          struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       struct hal_rx_eht_info *eht_info = &ppdu_info->eht_info;
-       u32 user_idx;
-
-       if (eht_info->num_user_info >= ARRAY_SIZE(eht_info->user_info))
-               return;
-
-       user_idx = eht_info->num_user_info++;
-
-       eht_info->user_info[user_idx] |=
-               IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_SPATIAL_CONFIG_KNOWN_M |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_STA_ID,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_CODING,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_CODING) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_MCS,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_MCS) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_SPATIAL_CODING,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_SPATIAL_CONFIG_M);
-
-       ppdu_info->mcs = le32_get_bits(user->info0,
-                                      HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_MCS);
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_eht_non_mumimo_user(const struct hal_eht_sig_non_mu_mimo *user,
-                                              struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       struct hal_rx_eht_info *eht_info = &ppdu_info->eht_info;
-       u32 user_idx;
-
-       if (eht_info->num_user_info >= ARRAY_SIZE(eht_info->user_info))
-               return;
-
-       user_idx = eht_info->num_user_info++;
-
-       eht_info->user_info[user_idx] |=
-               IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_KNOWN_O |
-               IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_KNOWN_O |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_STA_ID,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_CODING,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_CODING) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_MCS,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_MCS) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_NSS,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O) |
-               ATH12K_LE32_DEC_ENC(user->info0,
-                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_BEAMFORMED,
-                                   IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_O);
-
-       ppdu_info->mcs = le32_get_bits(user->info0,
-                                      HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_MCS);
-
-       ppdu_info->nss = le32_get_bits(user->info0,
-                                      HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_NSS) + 1;
-}
-
-static inline bool
-ath12k_dp_mon_hal_rx_is_mu_mimo_user(const struct hal_rx_u_sig_info *usig_info)
-{
-       if (usig_info->ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_SU &&
-           usig_info->ul_dl == 1)
-               return true;
-
-       return false;
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_eht_sig_non_ofdma(const void *tlv,
-                                            struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       const struct hal_eht_sig_non_ofdma_cmn_eb *eb = tlv;
-
-       ath12k_dp_mon_hal_rx_parse_usig_overflow(tlv, ppdu_info);
-       ath12k_dp_mon_hal_rx_parse_non_ofdma_users(eb, ppdu_info);
-
-       if (ath12k_dp_mon_hal_rx_is_mu_mimo_user(&ppdu_info->u_sig_info))
-               ath12k_dp_mon_hal_rx_parse_eht_mumimo_user(&eb->user_field.mu_mimo,
-                                                          ppdu_info);
-       else
-               ath12k_dp_mon_hal_rx_parse_eht_non_mumimo_user(&eb->user_field.n_mu_mimo,
-                                                              ppdu_info);
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_ru_allocation(const struct hal_eht_sig_ofdma_cmn_eb *eb,
-                                        struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       const struct hal_eht_sig_ofdma_cmn_eb1 *ofdma_cmn_eb1 = &eb->eb1;
-       const struct hal_eht_sig_ofdma_cmn_eb2 *ofdma_cmn_eb2 = &eb->eb2;
-       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
-       enum ieee80211_radiotap_eht_data ru_123, ru_124, ru_125, ru_126;
-       enum ieee80211_radiotap_eht_data ru_121, ru_122, ru_112, ru_111;
-       u32 data;
-
-       ru_123 = IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_1_2_3;
-       ru_124 = IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_4;
-       ru_125 = IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_5;
-       ru_126 = IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_1_2_6;
-       ru_121 = IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_1;
-       ru_122 = IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_2;
-       ru_112 = IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_1_1_2;
-       ru_111 = IEEE80211_RADIOTAP_EHT_DATA1_RU_ALLOC_CC_1_1_1;
-
-       switch (ppdu_info->u_sig_info.bw) {
-       case HAL_EHT_BW_320_2:
-       case HAL_EHT_BW_320_1:
-               data = __le32_to_cpu(eht->data[4]);
-               /* CC1 2::3 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_1_2_3_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_3,
-                                           ru_123);
-               eht->data[4] = cpu_to_le32(data);
-
-               data = __le32_to_cpu(eht->data[5]);
-               /* CC1 2::4 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_4_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_4,
-                                           ru_124);
-
-               /* CC1 2::5 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_5_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_5,
-                                           ru_125);
-               eht->data[5] = cpu_to_le32(data);
-
-               data = __le32_to_cpu(eht->data[6]);
-               /* CC1 2::6 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_1_2_6_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_6,
-                                           ru_126);
-               eht->data[6] = cpu_to_le32(data);
-
-               fallthrough;
-       case HAL_EHT_BW_160:
-               data = __le32_to_cpu(eht->data[3]);
-               /* CC1 2::1 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_1_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_1,
-                                           ru_121);
-               /* CC1 2::2 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_2_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_2,
-                                           ru_122);
-               eht->data[3] = cpu_to_le32(data);
-
-               fallthrough;
-       case HAL_EHT_BW_80:
-               data = __le32_to_cpu(eht->data[2]);
-               /* CC1 1::2 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_1_1_2_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb1->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB1_RU_ALLOC_1_2,
-                                           ru_112);
-               eht->data[2] = cpu_to_le32(data);
-
-               fallthrough;
-       case HAL_EHT_BW_40:
-               fallthrough;
-       case HAL_EHT_BW_20:
-               data = __le32_to_cpu(eht->data[1]);
-               /* CC1 1::1 */
-               data |= IEEE80211_RADIOTAP_EHT_DATA1_RU_ALLOC_CC_1_1_1_KNOWN |
-                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb1->info0,
-                                           HAL_RX_EHT_SIG_OFDMA_EB1_RU_ALLOC_1_1,
-                                           ru_111);
-               eht->data[1] = cpu_to_le32(data);
-               break;
-       default:
-               break;
-       }
-}
-
-static void
-ath12k_dp_mon_hal_rx_parse_eht_sig_ofdma(const void *tlv,
-                                        struct hal_rx_mon_ppdu_info *ppdu_info)
-{
-       const struct hal_eht_sig_ofdma_cmn_eb *ofdma = tlv;
-
-       ath12k_dp_mon_hal_rx_parse_usig_overflow(tlv, ppdu_info);
-       ath12k_dp_mon_hal_rx_parse_ru_allocation(ofdma, ppdu_info);
-
-       ath12k_dp_mon_hal_rx_parse_eht_non_mumimo_user(&ofdma->user_field.n_mu_mimo,
-                                                      ppdu_info);
-}
-
-void
-ath12k_dp_mon_parse_eht_sig_hdr(struct hal_rx_mon_ppdu_info *ppdu_info,
-                               const void *tlv_data)
-{
-       ppdu_info->is_eht = true;
-
-       if (ath12k_dp_mon_hal_rx_is_frame_type_ndp(&ppdu_info->u_sig_info))
-               ath12k_dp_mon_hal_rx_parse_eht_sig_ndp(tlv_data, ppdu_info);
-       else if (ath12k_dp_mon_hal_rx_is_non_ofdma(&ppdu_info->u_sig_info))
-               ath12k_dp_mon_hal_rx_parse_eht_sig_non_ofdma(tlv_data, ppdu_info);
-       else if (ath12k_dp_mon_hal_rx_is_ofdma(&ppdu_info->u_sig_info))
-               ath12k_dp_mon_hal_rx_parse_eht_sig_ofdma(tlv_data, ppdu_info);
-}
-EXPORT_SYMBOL(ath12k_dp_mon_parse_eht_sig_hdr);
-
 static inline enum ath12k_eht_ru_size
 hal_rx_mon_hal_ru_size_to_ath12k_ru_size(u32 hal_ru_size)
 {
index 90811a2f75a73672ddadd51166ecb7157729af1b..d2bee88f561f4583caaba62c1024fd070d3a9d94 100644 (file)
 #define ATH12K_MON_RX_DOT11_OFFSET     5
 #define ATH12K_MON_RX_PKT_OFFSET       8
 
+#define ATH12K_LE32_DEC_ENC(value, dec_bits, enc_bits) \
+               u32_encode_bits(le32_get_bits(value, dec_bits), enc_bits)
+
+#define ATH12K_LE64_DEC_ENC(value, dec_bits, enc_bits) \
+               u32_encode_bits(le64_get_bits(value, dec_bits), enc_bits)
+
 enum dp_monitor_mode {
        ATH12K_DP_TX_MONITOR_MODE,
        ATH12K_DP_RX_MONITOR_MODE
@@ -114,9 +120,6 @@ ath12k_dp_mon_parse_status_buf(struct ath12k_pdev_dp *dp_pdev,
                               struct ath12k_mon_data *pmon,
                               const struct dp_mon_packet_info *packet_info);
 void
-ath12k_dp_mon_parse_eht_sig_hdr(struct hal_rx_mon_ppdu_info *ppdu_info,
-                               const void *tlv_data);
-void
 ath12k_dp_mon_rx_handle_ofdma_info(const struct hal_rx_ppdu_end_user_stats *ppdu_end_user,
                                   struct hal_rx_user_status *rx_user_status);
 void
@@ -137,7 +140,4 @@ ath12k_dp_mon_parse_status_msdu_end(struct ath12k_mon_data *pmon,
 void
 ath12k_dp_mon_hal_rx_parse_u_sig_hdr(const struct hal_mon_usig_hdr *usig,
                                     struct hal_rx_mon_ppdu_info *ppdu_info);
-void
-ath12k_dp_mon_hal_aggr_tlv(struct hal_rx_mon_ppdu_info *ppdu_info,
-                          u16 tlv_len, const void *tlv_data);
 #endif
index f6d41ded57150d349313a8c637beeb1cfcf78940..b924180007c538fca8c1b3a92ac9f9eadb9df33d 100644 (file)
 #include "../dp_tx.h"
 #include "../peer.h"
 
+static void
+ath12k_wifi7_dp_mon_hal_aggr_tlv(struct hal_rx_mon_ppdu_info *ppdu_info,
+                                u16 tlv_len, const void *tlv_data)
+{
+       if (tlv_len <= HAL_RX_MON_MAX_AGGR_SIZE - ppdu_info->tlv_aggr.cur_len) {
+               memcpy(ppdu_info->tlv_aggr.buf + ppdu_info->tlv_aggr.cur_len,
+                      tlv_data, tlv_len);
+               ppdu_info->tlv_aggr.cur_len += tlv_len;
+       }
+}
+
 static void
 ath12k_wifi7_dp_mon_rx_memset_ppdu_info(struct hal_rx_mon_ppdu_info *ppdu_info)
 {
@@ -432,6 +443,376 @@ ath12k_wifi7_dp_mon_parse_he_sig_su(const struct hal_rx_he_sig_a_su_info *he_sig
        ppdu_info->dcm = dcm;
 }
 
+static inline bool
+ath12k_wifi7_dp_mon_hal_rx_is_non_ofdma(const struct hal_rx_u_sig_info *usig_info)
+{
+       u32 ppdu_type_comp_mode = usig_info->ppdu_type_comp_mode;
+       u32 ul_dl = usig_info->ul_dl;
+
+       if ((ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_MU_MIMO && ul_dl == 0) ||
+           (ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_MU_OFDMA && ul_dl == 0) ||
+           (ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_MU_MIMO  && ul_dl == 1))
+               return true;
+
+       return false;
+}
+
+static inline bool
+ath12k_wifi7_dp_mon_hal_rx_is_ofdma(const struct hal_rx_u_sig_info *usig_info)
+{
+       if (usig_info->ppdu_type_comp_mode == 0 && usig_info->ul_dl == 0)
+               return true;
+
+       return false;
+}
+
+static inline bool
+ath12k_wifi7_dp_mon_hal_rx_is_frame_type_ndp(const struct hal_rx_u_sig_info *usig_info)
+{
+       if (usig_info->ppdu_type_comp_mode == 1 &&
+           usig_info->eht_sig_mcs == 0 &&
+           usig_info->num_eht_sig_sym == 0)
+               return true;
+
+       return false;
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_eht_sig_ndp(const struct hal_eht_sig_ndp_cmn_eb *eht_sig_ndp,
+                                            struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
+       u32 known, data;
+
+       known = __le32_to_cpu(eht->known);
+       known |= IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE |
+                IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF |
+                IEEE80211_RADIOTAP_EHT_KNOWN_NSS_S |
+                IEEE80211_RADIOTAP_EHT_KNOWN_BEAMFORMED_S |
+                IEEE80211_RADIOTAP_EHT_KNOWN_DISREGARD_S |
+                IEEE80211_RADIOTAP_EHT_KNOWN_CRC1 |
+                IEEE80211_RADIOTAP_EHT_KNOWN_TAIL1;
+       eht->known = cpu_to_le32(known);
+
+       data = __le32_to_cpu(eht->data[0]);
+       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
+                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_SPATIAL_REUSE,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE);
+       /* GI and LTF size are separately indicated in radiotap header
+        * and hence will be parsed from other TLV
+        */
+       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
+                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_NUM_LTF_SYM,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF);
+
+       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
+                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_CRC,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_CRC1_O);
+
+       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
+                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_DISREGARD,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_DISREGARD_S);
+       eht->data[0] = cpu_to_le32(data);
+
+       data = __le32_to_cpu(eht->data[7]);
+       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
+                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_NSS,
+                                   IEEE80211_RADIOTAP_EHT_DATA7_NSS_S);
+
+       data |= ATH12K_LE32_DEC_ENC(eht_sig_ndp->info0,
+                                   HAL_RX_EHT_SIG_NDP_CMN_INFO0_BEAMFORMED,
+                                   IEEE80211_RADIOTAP_EHT_DATA7_BEAMFORMED_S);
+       eht->data[7] = cpu_to_le32(data);
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_usig_overflow(const struct hal_eht_sig_usig_overflow *ovflow,
+                                              struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
+       u32 known, data;
+
+       known = __le32_to_cpu(eht->known);
+       known |= IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE |
+                IEEE80211_RADIOTAP_EHT_KNOWN_EHT_LTF |
+                IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM |
+                IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM |
+                IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM |
+                IEEE80211_RADIOTAP_EHT_KNOWN_DISREGARD_O;
+       eht->known = cpu_to_le32(known);
+
+       data = __le32_to_cpu(eht->data[0]);
+       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
+                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_SPATIAL_REUSE,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE);
+
+       /* GI and LTF size are separately indicated in radiotap header
+        * and hence will be parsed from other TLV
+        */
+       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
+                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_NUM_LTF_SYM,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_EHT_LTF);
+
+       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
+                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_LDPC_EXTA_SYM,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_LDPC_EXTRA_SYM_OM);
+
+       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
+                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_PRE_FEC_PAD_FACTOR,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM);
+
+       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
+                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_DISAMBIGUITY,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_PE_DISAMBIGUITY_OM);
+
+       data |= ATH12K_LE32_DEC_ENC(ovflow->info0,
+                                   HAL_RX_EHT_SIG_OVERFLOW_INFO0_DISREGARD,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_DISREGARD_O);
+       eht->data[0] = cpu_to_le32(data);
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_non_ofdma_users(const struct hal_eht_sig_non_ofdma_cmn_eb *eb,
+                                                struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
+       u32 known, data;
+
+       known = __le32_to_cpu(eht->known);
+       known |= IEEE80211_RADIOTAP_EHT_KNOWN_NR_NON_OFDMA_USERS_M;
+       eht->known = cpu_to_le32(known);
+
+       data = __le32_to_cpu(eht->data[7]);
+       data |= ATH12K_LE32_DEC_ENC(eb->info0,
+                                   HAL_RX_EHT_SIG_NON_OFDMA_INFO0_NUM_USERS,
+                                   IEEE80211_RADIOTAP_EHT_DATA7_NUM_OF_NON_OFDMA_USERS);
+       eht->data[7] = cpu_to_le32(data);
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_eht_mumimo_user(const struct hal_eht_sig_mu_mimo *user,
+                                                struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       struct hal_rx_eht_info *eht_info = &ppdu_info->eht_info;
+       u32 user_idx;
+
+       if (eht_info->num_user_info >= ARRAY_SIZE(eht_info->user_info))
+               return;
+
+       user_idx = eht_info->num_user_info++;
+
+       eht_info->user_info[user_idx] |=
+               IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_SPATIAL_CONFIG_KNOWN_M |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_STA_ID,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_CODING,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_CODING) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_MCS,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_MCS) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_SPATIAL_CODING,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_SPATIAL_CONFIG_M);
+
+       ppdu_info->mcs = le32_get_bits(user->info0,
+                                      HAL_RX_EHT_SIG_MUMIMO_USER_INFO0_MCS);
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_eht_non_mumimo_user(const struct hal_eht_sig_non_mu_mimo *user,
+                                                    struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       struct hal_rx_eht_info *eht_info = &ppdu_info->eht_info;
+       u32 user_idx;
+
+       if (eht_info->num_user_info >= ARRAY_SIZE(eht_info->user_info))
+               return;
+
+       user_idx = eht_info->num_user_info++;
+
+       eht_info->user_info[user_idx] |=
+               IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID_KNOWN |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_KNOWN_O |
+               IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_KNOWN_O |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_STA_ID,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_STA_ID) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_CODING,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_CODING) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_MCS,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_MCS) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_NSS,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O) |
+               ATH12K_LE32_DEC_ENC(user->info0,
+                                   HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_BEAMFORMED,
+                                   IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_O);
+
+       ppdu_info->mcs = le32_get_bits(user->info0,
+                                      HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_MCS);
+
+       ppdu_info->nss = le32_get_bits(user->info0,
+                                      HAL_RX_EHT_SIG_NON_MUMIMO_USER_INFO0_NSS) + 1;
+}
+
+static inline bool
+ath12k_wifi7_dp_mon_hal_rx_is_mu_mimo_user(const struct hal_rx_u_sig_info *usig_info)
+{
+       if (usig_info->ppdu_type_comp_mode == HAL_RX_RECEPTION_TYPE_SU &&
+           usig_info->ul_dl == 1)
+               return true;
+
+       return false;
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_eht_sig_non_ofdma(const void *tlv,
+                                                  struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       const struct hal_eht_sig_non_ofdma_cmn_eb *eb = tlv;
+
+       ath12k_wifi7_dp_mon_hal_rx_parse_usig_overflow(tlv, ppdu_info);
+       ath12k_wifi7_dp_mon_hal_rx_parse_non_ofdma_users(eb, ppdu_info);
+
+       if (ath12k_wifi7_dp_mon_hal_rx_is_mu_mimo_user(&ppdu_info->u_sig_info))
+               ath12k_wifi7_dp_mon_hal_rx_parse_eht_mumimo_user(&eb->user_field.mu_mimo,
+                                                                ppdu_info);
+       else
+               ath12k_wifi7_dp_mon_hal_rx_parse_eht_non_mumimo_user(&eb->user_field.n_mu_mimo,
+                                                                    ppdu_info);
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_ru_allocation(const struct hal_eht_sig_ofdma_cmn_eb *eb,
+                                              struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       const struct hal_eht_sig_ofdma_cmn_eb1 *ofdma_cmn_eb1 = &eb->eb1;
+       const struct hal_eht_sig_ofdma_cmn_eb2 *ofdma_cmn_eb2 = &eb->eb2;
+       struct hal_rx_radiotap_eht *eht = &ppdu_info->eht_info.eht;
+       enum ieee80211_radiotap_eht_data ru_123, ru_124, ru_125, ru_126;
+       enum ieee80211_radiotap_eht_data ru_121, ru_122, ru_112, ru_111;
+       u32 data;
+
+       ru_123 = IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_1_2_3;
+       ru_124 = IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_4;
+       ru_125 = IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_5;
+       ru_126 = IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_1_2_6;
+       ru_121 = IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_1;
+       ru_122 = IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_2;
+       ru_112 = IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_1_1_2;
+       ru_111 = IEEE80211_RADIOTAP_EHT_DATA1_RU_ALLOC_CC_1_1_1;
+
+       switch (ppdu_info->u_sig_info.bw) {
+       case HAL_EHT_BW_320_2:
+       case HAL_EHT_BW_320_1:
+               data = __le32_to_cpu(eht->data[4]);
+               /* CC1 2::3 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA4_RU_ALLOC_CC_1_2_3_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_3,
+                                           ru_123);
+               eht->data[4] = cpu_to_le32(data);
+
+               data = __le32_to_cpu(eht->data[5]);
+               /* CC1 2::4 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_4_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_4,
+                                           ru_124);
+
+               /* CC1 2::5 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA5_RU_ALLOC_CC_1_2_5_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_5,
+                                           ru_125);
+               eht->data[5] = cpu_to_le32(data);
+
+               data = __le32_to_cpu(eht->data[6]);
+               /* CC1 2::6 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA6_RU_ALLOC_CC_1_2_6_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_6,
+                                           ru_126);
+               eht->data[6] = cpu_to_le32(data);
+
+               fallthrough;
+       case HAL_EHT_BW_160:
+               data = __le32_to_cpu(eht->data[3]);
+               /* CC1 2::1 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_1_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_1,
+                                           ru_121);
+               /* CC1 2::2 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA3_RU_ALLOC_CC_1_2_2_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb2->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB2_RU_ALLOC_2_2,
+                                           ru_122);
+               eht->data[3] = cpu_to_le32(data);
+
+               fallthrough;
+       case HAL_EHT_BW_80:
+               data = __le32_to_cpu(eht->data[2]);
+               /* CC1 1::2 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA2_RU_ALLOC_CC_1_1_2_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb1->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB1_RU_ALLOC_1_2,
+                                           ru_112);
+               eht->data[2] = cpu_to_le32(data);
+
+               fallthrough;
+       case HAL_EHT_BW_40:
+               fallthrough;
+       case HAL_EHT_BW_20:
+               data = __le32_to_cpu(eht->data[1]);
+               /* CC1 1::1 */
+               data |= IEEE80211_RADIOTAP_EHT_DATA1_RU_ALLOC_CC_1_1_1_KNOWN |
+                       ATH12K_LE64_DEC_ENC(ofdma_cmn_eb1->info0,
+                                           HAL_RX_EHT_SIG_OFDMA_EB1_RU_ALLOC_1_1,
+                                           ru_111);
+               eht->data[1] = cpu_to_le32(data);
+               break;
+       default:
+               break;
+       }
+}
+
+static void
+ath12k_wifi7_dp_mon_hal_rx_parse_eht_sig_ofdma(const void *tlv,
+                                              struct hal_rx_mon_ppdu_info *ppdu_info)
+{
+       const struct hal_eht_sig_ofdma_cmn_eb *ofdma = tlv;
+
+       ath12k_wifi7_dp_mon_hal_rx_parse_usig_overflow(tlv, ppdu_info);
+       ath12k_wifi7_dp_mon_hal_rx_parse_ru_allocation(ofdma, ppdu_info);
+
+       ath12k_wifi7_dp_mon_hal_rx_parse_eht_non_mumimo_user(&ofdma->user_field.n_mu_mimo,
+                                                            ppdu_info);
+}
+
+static void
+ath12k_wifi7_dp_mon_parse_eht_sig_hdr(struct hal_rx_mon_ppdu_info *ppdu_info,
+                                     const void *tlv_data)
+{
+       ppdu_info->is_eht = true;
+
+       if (ath12k_wifi7_dp_mon_hal_rx_is_frame_type_ndp(&ppdu_info->u_sig_info))
+               ath12k_wifi7_dp_mon_hal_rx_parse_eht_sig_ndp(tlv_data, ppdu_info);
+       else if (ath12k_wifi7_dp_mon_hal_rx_is_non_ofdma(&ppdu_info->u_sig_info))
+               ath12k_wifi7_dp_mon_hal_rx_parse_eht_sig_non_ofdma(tlv_data, ppdu_info);
+       else if (ath12k_wifi7_dp_mon_hal_rx_is_ofdma(&ppdu_info->u_sig_info))
+               ath12k_wifi7_dp_mon_hal_rx_parse_eht_sig_ofdma(tlv_data, ppdu_info);
+}
+
 static enum hal_rx_mon_status
 ath12k_wifi7_dp_mon_rx_parse_status_tlv(struct ath12k_pdev_dp *dp_pdev,
                                        struct ath12k_mon_data *pmon,
@@ -447,7 +828,8 @@ ath12k_wifi7_dp_mon_rx_parse_status_tlv(struct ath12k_pdev_dp *dp_pdev,
        userid = le64_get_bits(tlv->tl, HAL_TLV_64_USR_ID);
 
        if (ppdu_info->tlv_aggr.in_progress && ppdu_info->tlv_aggr.tlv_tag != tlv_tag) {
-               ath12k_dp_mon_parse_eht_sig_hdr(ppdu_info, ppdu_info->tlv_aggr.buf);
+               ath12k_wifi7_dp_mon_parse_eht_sig_hdr(ppdu_info,
+                                                     ppdu_info->tlv_aggr.buf);
 
                ppdu_info->tlv_aggr.in_progress = false;
                ppdu_info->tlv_aggr.cur_len = 0;
@@ -691,7 +1073,7 @@ ath12k_wifi7_dp_mon_rx_parse_status_tlv(struct ath12k_pdev_dp *dp_pdev,
 
                ppdu_info->is_eht = true;
 
-               ath12k_dp_mon_hal_aggr_tlv(ppdu_info, tlv_len, tlv_data);
+               ath12k_wifi7_dp_mon_hal_aggr_tlv(ppdu_info, tlv_len, tlv_data);
                break;
        case HAL_DUMMY:
                return HAL_RX_MON_STATUS_BUF_DONE;