Browse Source

Merge "qcacmn: Avoid sending wds del wmi cmds in a burst"

Linux Build Service Account 4 years ago
parent
commit
8534447cef

+ 1 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -1996,6 +1996,7 @@ struct cdp_peer_hmwds_ast_add_status {
 enum cdp_soc_param_t {
 enum cdp_soc_param_t {
 	DP_SOC_PARAM_MSDU_EXCEPTION_DESC,
 	DP_SOC_PARAM_MSDU_EXCEPTION_DESC,
 	DP_SOC_PARAM_CMEM_FSE_SUPPORT,
 	DP_SOC_PARAM_CMEM_FSE_SUPPORT,
+	DP_SOC_PARAM_MAX_AST_AGEOUT,
 	DP_SOC_PARAM_MAX,
 	DP_SOC_PARAM_MAX,
 };
 };
 
 

+ 5 - 0
dp/wifi3.0/dp_main.c

@@ -11331,6 +11331,10 @@ static QDF_STATUS dp_soc_set_param(struct cdp_soc_t  *soc_hdl,
 			soc->fst_in_cmem = !!value;
 			soc->fst_in_cmem = !!value;
 		dp_info("FW supports CMEM FSE %u", value);
 		dp_info("FW supports CMEM FSE %u", value);
 		break;
 		break;
+	case DP_SOC_PARAM_MAX_AST_AGEOUT:
+		soc->max_ast_ageout_count = value;
+		dp_info("Max ast ageout count %u", soc->max_ast_ageout_count);
+		break;
 	default:
 	default:
 		dp_info("not handled param %d ", param);
 		dp_info("not handled param %d ", param);
 		break;
 		break;
@@ -12917,6 +12921,7 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle,
 	wlan_cfg_set_rx_hash(soc->wlan_cfg_ctx,
 	wlan_cfg_set_rx_hash(soc->wlan_cfg_ctx,
 			     cfg_get(soc->ctrl_psoc, CFG_DP_RX_HASH));
 			     cfg_get(soc->ctrl_psoc, CFG_DP_RX_HASH));
 	soc->cce_disable = false;
 	soc->cce_disable = false;
+	soc->max_ast_ageout_count = MAX_AST_AGEOUT_COUNT;
 
 
 	qdf_mem_zero(&soc->vdev_id_map, sizeof(soc->vdev_id_map));
 	qdf_mem_zero(&soc->vdev_id_map, sizeof(soc->vdev_id_map));
 	qdf_spinlock_create(&soc->vdev_map_lock);
 	qdf_spinlock_create(&soc->vdev_map_lock);

+ 5 - 0
dp/wifi3.0/dp_peer.h

@@ -54,6 +54,11 @@ struct reo_qdesc_event {
 };
 };
 #endif
 #endif
 
 
+struct ast_del_ctxt {
+	bool age;
+	int del_count;
+};
+
 typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
 typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
 			       void *arg);
 			       void *arg);
 void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id);
 void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id);

+ 28 - 6
dp/wifi3.0/dp_txrx_wds.c

@@ -44,6 +44,12 @@ static void
 dp_peer_age_ast_entries(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 dp_peer_age_ast_entries(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 {
 {
 	struct dp_ast_entry *ase, *temp_ase;
 	struct dp_ast_entry *ase, *temp_ase;
+	struct ast_del_ctxt *del_ctxt = (struct ast_del_ctxt *)arg;
+
+	if ((del_ctxt->del_count >= soc->max_ast_ageout_count) &&
+	    !del_ctxt->age) {
+		return;
+	}
 
 
 	DP_PEER_ITERATE_ASE_LIST(peer, ase, temp_ase) {
 	DP_PEER_ITERATE_ASE_LIST(peer, ase, temp_ase) {
 		/*
 		/*
@@ -54,12 +60,21 @@ dp_peer_age_ast_entries(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 			continue;
 			continue;
 
 
 		if (ase->is_active) {
 		if (ase->is_active) {
-			ase->is_active = FALSE;
+			if (del_ctxt->age)
+				ase->is_active = FALSE;
+
 			continue;
 			continue;
 		}
 		}
 
 
-		DP_STATS_INC(soc, ast.aged_out, 1);
-		dp_peer_del_ast(soc, ase);
+		if (del_ctxt->del_count < soc->max_ast_ageout_count) {
+			DP_STATS_INC(soc, ast.aged_out, 1);
+			dp_peer_del_ast(soc, ase);
+			del_ctxt->del_count++;
+		} else {
+			soc->pending_ageout = true;
+			if (!del_ctxt->age)
+				break;
+		}
 	}
 	}
 }
 }
 
 
@@ -97,17 +112,23 @@ dp_peer_age_mec_entries(struct dp_soc *soc)
 static void dp_ast_aging_timer_fn(void *soc_hdl)
 static void dp_ast_aging_timer_fn(void *soc_hdl)
 {
 {
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
+	struct ast_del_ctxt del_ctxt = {0};
+
 
 
 	if (soc->wds_ast_aging_timer_cnt++ >= DP_WDS_AST_AGING_TIMER_CNT) {
 	if (soc->wds_ast_aging_timer_cnt++ >= DP_WDS_AST_AGING_TIMER_CNT) {
+		del_ctxt.age = true;
 		soc->wds_ast_aging_timer_cnt = 0;
 		soc->wds_ast_aging_timer_cnt = 0;
+	}
+
+	if (soc->pending_ageout || del_ctxt.age) {
+		soc->pending_ageout = false;
 
 
 		/* AST list access lock */
 		/* AST list access lock */
 		qdf_spin_lock_bh(&soc->ast_lock);
 		qdf_spin_lock_bh(&soc->ast_lock);
 
 
-		dp_soc_iterate_peer(soc, dp_peer_age_ast_entries, NULL,
-				DP_MOD_ID_AST);
+		dp_soc_iterate_peer(soc, dp_peer_age_ast_entries, &del_ctxt,
+				    DP_MOD_ID_AST);
 		qdf_spin_unlock_bh(&soc->ast_lock);
 		qdf_spin_unlock_bh(&soc->ast_lock);
-
 	}
 	}
 
 
 	/*
 	/*
@@ -132,6 +153,7 @@ static void dp_ast_aging_timer_fn(void *soc_hdl)
 void dp_soc_wds_attach(struct dp_soc *soc)
 void dp_soc_wds_attach(struct dp_soc *soc)
 {
 {
 	soc->wds_ast_aging_timer_cnt = 0;
 	soc->wds_ast_aging_timer_cnt = 0;
+	soc->pending_ageout = false;
 	qdf_timer_init(soc->osdev, &soc->ast_aging_timer,
 	qdf_timer_init(soc->osdev, &soc->ast_aging_timer,
 		       dp_ast_aging_timer_fn, (void *)soc,
 		       dp_ast_aging_timer_fn, (void *)soc,
 		       QDF_TIMER_TYPE_WAKE_APPS);
 		       QDF_TIMER_TYPE_WAKE_APPS);

+ 4 - 0
dp/wifi3.0/dp_types.h

@@ -104,6 +104,8 @@
 #define DP_MAX_IRQ_PER_CONTEXT 12
 #define DP_MAX_IRQ_PER_CONTEXT 12
 #define DEFAULT_HW_PEER_ID 0xffff
 #define DEFAULT_HW_PEER_ID 0xffff
 
 
+#define MAX_AST_AGEOUT_COUNT 128
+
 #define WBM_INT_ERROR_ALL 0
 #define WBM_INT_ERROR_ALL 0
 #define WBM_INT_ERROR_REO_NULL_BUFFER 1
 #define WBM_INT_ERROR_REO_NULL_BUFFER 1
 #define WBM_INT_ERROR_REO_NULL_LINK_DESC 2
 #define WBM_INT_ERROR_REO_NULL_LINK_DESC 2
@@ -1831,6 +1833,8 @@ struct dp_soc {
 
 
 	/*Timer counter for WDS AST entry ageout*/
 	/*Timer counter for WDS AST entry ageout*/
 	uint8_t wds_ast_aging_timer_cnt;
 	uint8_t wds_ast_aging_timer_cnt;
+	bool pending_ageout;
+	uint32_t max_ast_ageout_count;
 
 
 	/*interrupt timer*/
 	/*interrupt timer*/
 	qdf_timer_t mon_reap_timer;
 	qdf_timer_t mon_reap_timer;