qcacmn: Add support for OFDMA UL per user info
Add support for OFDMA UL per user info such as
nss, mcs, ofdma RU start and ofdma RU size
Change-Id: Ibb4397f262d1a5df5b01d80a8a741a9b193168e7
diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c
index b201c52..9d18596 100644
--- a/dp/wifi3.0/dp_rx_mon_status.c
+++ b/dp/wifi3.0/dp_rx_mon_status.c
@@ -686,6 +686,99 @@
}
}
+#if defined(HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_M)
+static inline void
+dp_rx_ul_ofdma_ru_size_to_width(
+ uint32_t ru_size,
+ uint32_t *ru_width)
+{
+ uint32_t width;
+
+ width = 0;
+ switch (ru_size) {
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_26:
+ width = 1;
+ break;
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_52:
+ width = 2;
+ break;
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_106:
+ width = 4;
+ break;
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_242:
+ width = 9;
+ break;
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_484:
+ width = 18;
+ break;
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_996:
+ width = 37;
+ break;
+ case HTT_UL_OFDMA_V0_RU_SIZE_RU_996x2:
+ width = 74;
+ break;
+ default:
+ QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+ "RU size to width convert err");
+ break;
+ }
+ *ru_width = width;
+}
+
+static inline void
+dp_rx_mon_handle_ofdma_info(struct hal_rx_ppdu_info *ppdu_info)
+{
+ struct mon_rx_user_status *mon_rx_user_status;
+ uint32_t num_users;
+ uint32_t i;
+ uint32_t ul_ofdma_user_v0_word0;
+ uint32_t ul_ofdma_user_v0_word1;
+ uint32_t ru_width;
+
+ if (ppdu_info->rx_status.reception_type != HAL_RX_TYPE_MU_OFDMA)
+ return;
+
+ num_users = ppdu_info->com_info.num_users;
+ if (num_users > HAL_MAX_UL_MU_USERS)
+ num_users = HAL_MAX_UL_MU_USERS;
+ for (i = 0; i < num_users; i++) {
+ mon_rx_user_status = &ppdu_info->rx_user_status[i];
+ ul_ofdma_user_v0_word0 =
+ mon_rx_user_status->ul_ofdma_user_v0_word0;
+ ul_ofdma_user_v0_word1 =
+ mon_rx_user_status->ul_ofdma_user_v0_word1;
+
+ if (HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_GET(
+ ul_ofdma_user_v0_word0) &&
+ !HTT_UL_OFDMA_USER_INFO_V0_W0_VER_GET(
+ ul_ofdma_user_v0_word0)) {
+ mon_rx_user_status->mcs =
+ HTT_UL_OFDMA_USER_INFO_V0_W1_MCS_GET(
+ ul_ofdma_user_v0_word1);
+ mon_rx_user_status->nss =
+ HTT_UL_OFDMA_USER_INFO_V0_W1_NSS_GET(
+ ul_ofdma_user_v0_word1);
+
+ mon_rx_user_status->ofdma_info_valid = 1;
+ mon_rx_user_status->dl_ofdma_ru_start_index =
+ HTT_UL_OFDMA_USER_INFO_V0_W1_RU_START_GET(
+ ul_ofdma_user_v0_word1);
+
+ dp_rx_ul_ofdma_ru_size_to_width(
+ HTT_UL_OFDMA_USER_INFO_V0_W1_RU_SIZE_GET(
+ ul_ofdma_user_v0_word1),
+ &ru_width);
+ mon_rx_user_status->dl_ofdma_ru_width = ru_width;
+ }
+ }
+}
+#else
+static inline void
+dp_rx_mon_handle_ofdma_info(struct hal_rx_ppdu_info *ppdu_info)
+{
+}
+#endif
+
/**
* dp_rx_mon_status_process_tlv() - Process status TLV in status
* buffer on Rx status Queue posted by status SRNG processing.
@@ -796,6 +889,7 @@
dp_rx_mon_deliver_non_std(soc, mac_id);
} else if (tlv_status == HAL_TLV_STATUS_PPDU_DONE) {
rx_mon_stats->status_ppdu_done++;
+ dp_rx_mon_handle_ofdma_info(ppdu_info);
if (pdev->enhanced_stats_en ||
pdev->mcopy_mode || pdev->neighbour_peers_added)
dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info);
diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h
index 2cb8a4c..7950630 100644
--- a/hal/wifi3.0/hal_api_mon.h
+++ b/hal/wifi3.0/hal_api_mon.h
@@ -424,6 +424,7 @@
uint64_t mpdu_fcs_ok_bitmap;
uint32_t last_ppdu_id;
uint32_t mpdu_cnt;
+ uint8_t num_users;
};
/**
diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h
index b522c3e..a231715 100644
--- a/hal/wifi3.0/hal_generic_api.h
+++ b/hal/wifi3.0/hal_generic_api.h
@@ -245,22 +245,23 @@
}
#endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */
-#if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET)
+#if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \
+defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET)
+
static inline void
hal_rx_handle_ofdma_info(
void *rx_tlv,
struct mon_rx_user_status *mon_rx_user_status)
{
- mon_rx_user_status->ofdma_info_valid =
- HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1,
- OFDMA_INFO_VALID);
- mon_rx_user_status->dl_ofdma_ru_start_index =
- HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1,
- DL_OFDMA_RU_START_INDEX);
- mon_rx_user_status->dl_ofdma_ru_width =
- HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
- DL_OFDMA_RU_WIDTH);
+ mon_rx_user_status->ul_ofdma_user_v0_word0 =
+ HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11,
+ SW_RESPONSE_REFERENCE_PTR);
+
+ mon_rx_user_status->ul_ofdma_user_v0_word1 =
+ HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22,
+ SW_RESPONSE_REFERENCE_PTR_EXT);
}
+
#else
static inline void
hal_rx_handle_ofdma_info(void *rx_tlv,
@@ -474,14 +475,9 @@
mon_rx_user_status =
&ppdu_info->rx_user_status[user_id];
- mon_rx_user_status->mcs =
- HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1,
- MCS);
- mon_rx_user_status->nss =
- HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1,
- NSS);
-
hal_rx_handle_ofdma_info(rx_tlv, mon_rx_user_status);
+
+ ppdu_info->com_info.num_users++;
}
ppdu_info->com_info.mpdu_cnt_fcs_ok =
@@ -1176,11 +1172,15 @@
RECEPTION_TYPE);
switch (reception_type) {
case QDF_RECEPTION_TYPE_ULOFMDA:
+ ppdu_info->rx_status.reception_type =
+ HAL_RX_TYPE_MU_OFDMA;
ppdu_info->rx_status.ulofdma_flag = 1;
ppdu_info->rx_status.he_data1 =
QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
break;
case QDF_RECEPTION_TYPE_ULMIMO:
+ ppdu_info->rx_status.reception_type =
+ HAL_RX_TYPE_MU_MIMO;
ppdu_info->rx_status.he_data1 =
QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
break;
diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h
index 44fd7a2..c10e7d0 100644
--- a/qdf/inc/qdf_nbuf.h
+++ b/qdf/inc/qdf_nbuf.h
@@ -335,6 +335,8 @@
ofdma_info_valid:1,
dl_ofdma_ru_start_index:7,
dl_ofdma_ru_width:7;
+ uint32_t ul_ofdma_user_v0_word0;
+ uint32_t ul_ofdma_user_v0_word1;
};
/**