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
This commit is contained in:
Kai Chen
2019-07-10 16:13:48 -07:00
committed by nshrivas
parent 0876d02741
commit 93f7e1be90
4 changed files with 114 additions and 17 deletions

View File

@@ -686,6 +686,99 @@ dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
} }
} }
#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 * dp_rx_mon_status_process_tlv() - Process status TLV in status
* buffer on Rx status Queue posted by status SRNG processing. * buffer on Rx status Queue posted by status SRNG processing.
@@ -796,6 +889,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id,
dp_rx_mon_deliver_non_std(soc, mac_id); dp_rx_mon_deliver_non_std(soc, mac_id);
} else if (tlv_status == HAL_TLV_STATUS_PPDU_DONE) { } else if (tlv_status == HAL_TLV_STATUS_PPDU_DONE) {
rx_mon_stats->status_ppdu_done++; rx_mon_stats->status_ppdu_done++;
dp_rx_mon_handle_ofdma_info(ppdu_info);
if (pdev->enhanced_stats_en || if (pdev->enhanced_stats_en ||
pdev->mcopy_mode || pdev->neighbour_peers_added) pdev->mcopy_mode || pdev->neighbour_peers_added)
dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info); dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info);

View File

@@ -424,6 +424,7 @@ struct hal_rx_ppdu_common_info {
uint64_t mpdu_fcs_ok_bitmap; uint64_t mpdu_fcs_ok_bitmap;
uint32_t last_ppdu_id; uint32_t last_ppdu_id;
uint32_t mpdu_cnt; uint32_t mpdu_cnt;
uint8_t num_users;
}; };
/** /**

View File

@@ -245,22 +245,23 @@ hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
} }
#endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */ #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 static inline void
hal_rx_handle_ofdma_info( hal_rx_handle_ofdma_info(
void *rx_tlv, void *rx_tlv,
struct mon_rx_user_status *mon_rx_user_status) struct mon_rx_user_status *mon_rx_user_status)
{ {
mon_rx_user_status->ofdma_info_valid = mon_rx_user_status->ul_ofdma_user_v0_word0 =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11,
OFDMA_INFO_VALID); SW_RESPONSE_REFERENCE_PTR);
mon_rx_user_status->dl_ofdma_ru_start_index =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, mon_rx_user_status->ul_ofdma_user_v0_word1 =
DL_OFDMA_RU_START_INDEX); HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22,
mon_rx_user_status->dl_ofdma_ru_width = SW_RESPONSE_REFERENCE_PTR_EXT);
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
DL_OFDMA_RU_WIDTH);
} }
#else #else
static inline void static inline void
hal_rx_handle_ofdma_info(void *rx_tlv, hal_rx_handle_ofdma_info(void *rx_tlv,
@@ -474,14 +475,9 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo,
mon_rx_user_status = mon_rx_user_status =
&ppdu_info->rx_user_status[user_id]; &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); 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 = ppdu_info->com_info.mpdu_cnt_fcs_ok =
@@ -1176,11 +1172,15 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo,
RECEPTION_TYPE); RECEPTION_TYPE);
switch (reception_type) { switch (reception_type) {
case QDF_RECEPTION_TYPE_ULOFMDA: 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.ulofdma_flag = 1;
ppdu_info->rx_status.he_data1 = ppdu_info->rx_status.he_data1 =
QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
break; break;
case QDF_RECEPTION_TYPE_ULMIMO: case QDF_RECEPTION_TYPE_ULMIMO:
ppdu_info->rx_status.reception_type =
HAL_RX_TYPE_MU_MIMO;
ppdu_info->rx_status.he_data1 = ppdu_info->rx_status.he_data1 =
QDF_MON_STATUS_HE_MU_FORMAT_TYPE; QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
break; break;

View File

@@ -335,6 +335,8 @@ struct mon_rx_user_status {
ofdma_info_valid:1, ofdma_info_valid:1,
dl_ofdma_ru_start_index:7, dl_ofdma_ru_start_index:7,
dl_ofdma_ru_width:7; dl_ofdma_ru_width:7;
uint32_t ul_ofdma_user_v0_word0;
uint32_t ul_ofdma_user_v0_word1;
}; };
/** /**