#define ATH12K_INVALID_HW_MAC_ID       0xFF
 #define ATH12K_CONNECTION_LOSS_HZ      (3 * HZ)
-#define        ATH12K_RX_RATE_TABLE_NUM        320
-#define        ATH12K_RX_RATE_TABLE_11AX_NUM   576
 
 #define ATH12K_MON_TIMER_INTERVAL  10
 #define ATH12K_RESET_TIMEOUT_HZ                        (20 * HZ)
 #define HAL_RX_MAX_MCS_BE      15
 #define HAL_RX_MAX_NSS         8
 #define HAL_RX_MAX_NUM_LEGACY_RATES 12
-#define ATH12K_RX_RATE_TABLE_11AX_NUM  576
-#define ATH12K_RX_RATE_TABLE_NUM 320
 
 struct ath12k_rx_peer_rate_stats {
        u64 ht_mcs_count[HAL_RX_MAX_MCS_HT + 1];
        u64 bw_count[HAL_RX_BW_MAX];
        u64 gi_count[HAL_RX_GI_MAX];
        u64 legacy_count[HAL_RX_MAX_NUM_LEGACY_RATES];
-       u64 rx_rate[ATH12K_RX_RATE_TABLE_11AX_NUM];
+       u64 rx_rate[HAL_RX_BW_MAX][HAL_RX_GI_MAX][HAL_RX_MAX_NSS][HAL_RX_MAX_MCS_HT + 1];
 };
 
 struct ath12k_rx_peer_stats {
 
                                              struct hal_rx_user_status *user_stats,
                                              u32 num_msdu)
 {
-       u32 rate_idx = 0;
+       struct ath12k_rx_peer_rate_stats *stats;
        u32 mcs_idx = (user_stats) ? user_stats->mcs : ppdu_info->mcs;
        u32 nss_idx = (user_stats) ? user_stats->nss - 1 : ppdu_info->nss - 1;
        u32 bw_idx = ppdu_info->bw;
        u32 gi_idx = ppdu_info->gi;
+       u32 len;
 
-       if ((mcs_idx > HAL_RX_MAX_MCS_HE) || (nss_idx >= HAL_RX_MAX_NSS) ||
-           (bw_idx >= HAL_RX_BW_MAX) || (gi_idx >= HAL_RX_GI_MAX)) {
+       if (mcs_idx > HAL_RX_MAX_MCS_HT || nss_idx >= HAL_RX_MAX_NSS ||
+           bw_idx >= HAL_RX_BW_MAX || gi_idx >= HAL_RX_GI_MAX) {
                return;
        }
 
-       if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11N ||
-           ppdu_info->preamble_type == HAL_RX_PREAMBLE_11AC) {
-               rate_idx = mcs_idx * 8 + 8 * 10 * nss_idx;
-               rate_idx += bw_idx * 2 + gi_idx;
-       } else if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11AX) {
+       if (ppdu_info->preamble_type == HAL_RX_PREAMBLE_11AX ||
+           ppdu_info->preamble_type == HAL_RX_PREAMBLE_11BE)
                gi_idx = ath12k_he_gi_to_nl80211_he_gi(ppdu_info->gi);
-               rate_idx = mcs_idx * 12 + 12 * 12 * nss_idx;
-               rate_idx += bw_idx * 3 + gi_idx;
-       } else {
-               return;
-       }
 
-       rx_stats->pkt_stats.rx_rate[rate_idx] += num_msdu;
+       rx_stats->pkt_stats.rx_rate[bw_idx][gi_idx][nss_idx][mcs_idx] += num_msdu;
+       stats = &rx_stats->byte_stats;
+
        if (user_stats)
-               rx_stats->byte_stats.rx_rate[rate_idx] += user_stats->mpdu_ok_byte_count;
+               len = user_stats->mpdu_ok_byte_count;
        else
-               rx_stats->byte_stats.rx_rate[rate_idx] += ppdu_info->mpdu_len;
+               len = ppdu_info->mpdu_len;
+
+       stats->rx_rate[bw_idx][gi_idx][nss_idx][mcs_idx] += len;
 }
 
 static void ath12k_dp_mon_rx_update_peer_su_stats(struct ath12k *ar,