Browse Source

qcacmn: Use sw_peer_id instead of ast_index to get peer

In order to support flow overide feature,
AST table has to be split between RxPCU and DDR.
With this split, RX monitor cannot make use of
ast_index to fetch peer as it is not from DDR.
So make use of sw_peer_id to fetch peer.
This sw_peer_id is derived from RX_MPDU_STAT_START_TLV

Change-Id: Ib2a003a2640fded3287c318d2ad59fd3127af9b6
CRs-fixed: 3004363
Devender Kumar 3 năm trước cách đây
mục cha
commit
c182e1e3e9

+ 8 - 0
dp/wifi3.0/dp_htt.c

@@ -2709,6 +2709,14 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
 				  "HTT_T2H_MSG_TYPE_PEER_MAP msg for peer id %d vdev id %d n",
 				  peer_id, vdev_id);
 
+			QDF_TRACE(QDF_MODULE_ID_TXRX,
+				  QDF_TRACE_LEVEL_INFO,
+				  "ast_idx[0] %d ast_idx[1] %d ast_idx[2] %d ast_idx[3] %d n",
+				  ast_flow_info.ast_idx[0],
+				  ast_flow_info.ast_idx[1],
+				  ast_flow_info.ast_idx[2],
+				  ast_flow_info.ast_idx[3]);
+
 			dp_rx_peer_map_handler(soc->dp_soc, peer_id,
 					       hw_peer_id, vdev_id,
 					       peer_mac_addr, ast_hash,

+ 40 - 65
dp/wifi3.0/monitor/dp_rx_mon_status.c

@@ -274,8 +274,6 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
 {
 	struct dp_peer *peer;
 	struct dp_soc *soc = pdev->soc;
-	struct dp_ast_entry *ast_entry;
-	uint32_t ast_index;
 	int i;
 	struct mon_rx_user_status *rx_user_status;
 	struct mon_rx_user_info *rx_user_info;
@@ -283,6 +281,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
 	int ru_size;
 	bool is_data = false;
 	uint32_t num_users;
+	uint16_t sw_peer_id;
 
 	num_users = ppdu_info->com_info.num_users;
 	for (i = 0; i < num_users; i++) {
@@ -293,20 +292,11 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
 		rx_user_info = &ppdu_info->rx_user_info[i];
 		rx_stats_peruser = &cdp_rx_ppdu->user[i];
 
-		ast_index = rx_user_status->ast_index;
-		if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) {
-			rx_stats_peruser->peer_id = HTT_INVALID_PEER;
-			continue;
-		}
-
-		ast_entry = soc->ast_table[ast_index];
-		if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) {
-			rx_stats_peruser->peer_id = HTT_INVALID_PEER;
-			continue;
-		}
+		sw_peer_id = rx_user_status->sw_peer_id;
 
-		peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id,
+		peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
 					     DP_MOD_ID_RX_PPDU_STATS);
+
 		if (!peer) {
 			rx_stats_peruser->peer_id = HTT_INVALID_PEER;
 			continue;
@@ -422,9 +412,10 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev,
 {
 	struct dp_peer *peer;
 	struct dp_soc *soc = pdev->soc;
-	struct dp_ast_entry *ast_entry;
-	uint32_t ast_index;
 	uint32_t i;
+	struct mon_rx_user_status *rx_user_status;
+	uint32_t num_users = ppdu_info->com_info.num_users;
+	uint16_t sw_peer_id;
 
 	cdp_rx_ppdu->first_data_seq_ctrl =
 		ppdu_info->rx_status.first_data_seq_ctrl;
@@ -450,22 +441,14 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev,
 		cdp_rx_ppdu->is_ampdu = 0;
 	cdp_rx_ppdu->tid = ppdu_info->rx_status.tid;
 
+	qdf_assert_always(num_users <= CDP_MU_MAX_USERS);
+	rx_user_status = &ppdu_info->rx_user_status[num_users - 1];
 
-	ast_index = ppdu_info->rx_status.ast_index;
-	if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) {
-		cdp_rx_ppdu->peer_id = HTT_INVALID_PEER;
-		cdp_rx_ppdu->num_users = 0;
-		goto end;
-	}
+	sw_peer_id = rx_user_status->sw_peer_id;
 
-	ast_entry = soc->ast_table[ast_index];
-	if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) {
-		cdp_rx_ppdu->peer_id = HTT_INVALID_PEER;
-		cdp_rx_ppdu->num_users = 0;
-		goto end;
-	}
-	peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id,
+	peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
 				     DP_MOD_ID_RX_PPDU_STATS);
+
 	if (!peer) {
 		cdp_rx_ppdu->peer_id = HTT_INVALID_PEER;
 		cdp_rx_ppdu->num_users = 0;
@@ -1167,12 +1150,11 @@ dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev,
 {
 	struct dp_peer *peer;
 	struct dp_soc *soc = pdev->soc;
-	struct dp_ast_entry *ast_entry;
 	struct mon_rx_user_status *rx_user_status;
 	struct cdp_rx_stats_ppdu_user *rx_stats_peruser;
 	uint32_t num_users;
+	uint16_t sw_peer_id;
 	int user_id;
-	uint32_t ast_index;
 
 	qdf_spin_lock_bh(&soc->ast_lock);
 
@@ -1185,21 +1167,12 @@ dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev,
 
 		rx_user_status =  &ppdu_info->rx_user_status[user_id];
 		rx_stats_peruser = &cdp_rx_ppdu->user[user_id];
-		ast_index = rx_user_status->ast_index;
-
-		if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) {
-			rx_stats_peruser->peer_id = HTT_INVALID_PEER;
-			continue;
-		}
 
-		ast_entry = soc->ast_table[ast_index];
-		if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) {
-			rx_stats_peruser->peer_id = HTT_INVALID_PEER;
-			continue;
-		}
+		sw_peer_id = rx_user_status->sw_peer_id;
 
-		peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id,
+		peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
 					     DP_MOD_ID_RX_PPDU_STATS);
+
 		if (!peer) {
 			rx_stats_peruser->peer_id = HTT_INVALID_PEER;
 			continue;
@@ -1610,29 +1583,31 @@ dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
 				qdf_nbuf_t status_nbuf, uint32_t pdev_id)
 {
 	struct dp_peer *peer;
-	struct dp_ast_entry *ast_entry;
-	uint32_t ast_index;
-
-	ast_index = ppdu_info->rx_status.ast_index;
-	if (ast_index < wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) {
-		ast_entry = soc->ast_table[ast_index];
-		if (ast_entry) {
-			peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id,
-						     DP_MOD_ID_RX_PPDU_STATS);
-			if (peer) {
-				if ((peer->peer_id != HTT_INVALID_PEER) &&
-				    (peer->peer_based_pktlog_filter)) {
-					dp_wdi_event_handler(
-							WDI_EVENT_RX_DESC, soc,
-							status_nbuf,
-							peer->peer_id,
-							WDI_NO_VAL, pdev_id);
-				}
-				dp_peer_unref_delete(peer,
-						     DP_MOD_ID_RX_PPDU_STATS);
-			}
-		}
+	struct mon_rx_user_status *rx_user_status;
+	uint32_t num_users = ppdu_info->com_info.num_users;
+	uint16_t sw_peer_id;
+
+	qdf_assert_always(num_users <= CDP_MU_MAX_USERS);
+	rx_user_status = &ppdu_info->rx_user_status[num_users - 1];
+
+	sw_peer_id = rx_user_status->sw_peer_id;
+
+	peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
+				     DP_MOD_ID_RX_PPDU_STATS);
+
+	if (!peer)
+		return;
+
+	if ((peer->peer_id != HTT_INVALID_PEER) &&
+	    (peer->peer_based_pktlog_filter)) {
+		dp_wdi_event_handler(
+			WDI_EVENT_RX_DESC, soc,
+			status_nbuf,
+			peer->peer_id,
+			WDI_NO_VAL, pdev_id);
 	}
+	dp_peer_unref_delete(peer,
+			     DP_MOD_ID_RX_PPDU_STATS);
 }
 
 #if defined(HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_M)

+ 3 - 0
hal/wifi3.0/li/hal_li_generic_api.h

@@ -1524,6 +1524,9 @@ hal_rx_status_get_tlv_info_generic_li(void *rx_tlv_hdr, void *ppduinfo,
 		ppdu_info->sw_frame_group_id =
 			HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start);
 
+		ppdu_info->rx_user_status[user_id].sw_peer_id =
+			HAL_RX_GET_SW_PEER_ID(rx_mpdu_start);
+
 		if (ppdu_info->sw_frame_group_id ==
 		    HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
 			ppdu_info->rx_status.frame_control_info_valid =

+ 5 - 1
hal/wifi3.0/qca5018/hal_5018_rx.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -52,6 +52,10 @@
 
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID)
+
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		(reg_val) &= \

+ 3 - 0
hal/wifi3.0/qca6290/hal_6290_rx.h

@@ -270,6 +270,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		(reg_val) &= \

+ 3 - 0
hal/wifi3.0/qca6390/hal_6390_rx.h

@@ -276,6 +276,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)	\
 	do { \
 		reg_val &= \

+ 4 - 1
hal/wifi3.0/qca6490/hal_6490_rx.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -279,6 +279,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		reg_val &= \

+ 3 - 0
hal/wifi3.0/qca6750/hal_6750_rx.h

@@ -279,6 +279,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		reg_val &= \

+ 3 - 0
hal/wifi3.0/qca8074v1/hal_8074v1_rx.h

@@ -259,6 +259,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		reg_val &= \

+ 3 - 0
hal/wifi3.0/qca8074v2/hal_8074v2_rx.h

@@ -268,6 +268,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		reg_val &= \

+ 3 - 0
hal/wifi3.0/qcn6122/hal_qcn6122_rx.h

@@ -59,6 +59,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		(reg_val) &= \

+ 4 - 1
hal/wifi3.0/qcn9000/hal_9000_rx.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -57,6 +57,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		reg_val &= \

+ 3 - 0
hal/wifi3.0/wcn7850/hal_7850_rx.h

@@ -60,6 +60,9 @@
 #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start)	\
 	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, SW_FRAME_GROUP_ID)
 
+#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start)	\
+	HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, SW_PEER_ID)
+
 #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params)		\
 	do { \
 		reg_val &= \

+ 2 - 0
qdf/inc/qdf_nbuf.h

@@ -403,6 +403,7 @@ struct mon_rx_status {
  * @mpdu_fcs_ok_bitmap: mpdu with fcs ok bitmap
  * @mpdu_ok_byte_count: mpdu byte count with fcs ok
  * @mpdu_err_byte_count: mpdu byte count with fcs err
+ * @sw_peer_id: software peer id
  */
 struct mon_rx_user_status {
 	uint32_t mcs:4,
@@ -433,6 +434,7 @@ struct mon_rx_user_status {
 	uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS];
 	uint32_t mpdu_ok_byte_count;
 	uint32_t mpdu_err_byte_count;
+	uint16_t sw_peer_id;
 };
 
 /**