Browse Source

qcacmn: Flush queue before qref delete

REO_FLUSH_CACHE cmd
 - flush_q_1k_desc as 1 – This will flush Queue, Q1k and QEXT in one go.
   we need not give 11 cmd for each tid of the peer.
 - forward_all_mpdus_in_queue to 1 in FLUSH_CACHE_CMD.
   With this we need wait for aging threshold time.

Change-Id: I695ab48a50968872eb22024ba5c770f0e5a74a09
CRs-Fixed: 3384665
Ruben Columbus 2 năm trước cách đây
mục cha
commit
8339fb6fde
3 tập tin đã thay đổi với 15 bổ sung61 xóa
  1. 11 61
      dp/wifi3.0/dp_peer.c
  2. 3 0
      hal/wifi3.0/be/hal_be_reo.c
  3. 1 0
      hal/wifi3.0/hal_reo.h

+ 11 - 61
dp/wifi3.0/dp_peer.c

@@ -4016,9 +4016,7 @@ void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt,
 	uint32_t list_size;
 	struct reo_desc_list_node *desc;
 	unsigned long curr_ts = qdf_get_system_timestamp();
-	uint32_t desc_size, tot_desc_size;
 	struct hal_reo_cmd_params params;
-	bool flush_failure = false;
 
 	DP_RX_REO_QDESC_UPDATE_EVT(freedesc);
 
@@ -4074,52 +4072,15 @@ void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt,
 				continue;
 		}
 
-		/* Flush and invalidate REO descriptor from HW cache: Base and
-		 * extension descriptors should be flushed separately */
-		if (desc->pending_ext_desc_size)
-			tot_desc_size = desc->pending_ext_desc_size;
-		else
-			tot_desc_size = rx_tid->hw_qdesc_alloc_size;
-		/* Get base descriptor size by passing non-qos TID */
-		desc_size = hal_get_reo_qdesc_size(soc->hal_soc, 0,
-						   DP_NON_QOS_TID);
-
-		/* Flush reo extension descriptors */
-		while ((tot_desc_size -= desc_size) > 0) {
-			qdf_mem_zero(&params, sizeof(params));
-			params.std.addr_lo =
-				((uint64_t)(rx_tid->hw_qdesc_paddr) +
-				tot_desc_size) & 0xffffffff;
-			params.std.addr_hi =
-				(uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
-
-			if (QDF_STATUS_SUCCESS != dp_reo_send_cmd(soc,
-							CMD_FLUSH_CACHE,
-							&params,
-							NULL,
-							NULL)) {
-				dp_info_rl("fail to send CMD_CACHE_FLUSH:"
-					   "tid %d desc %pK", rx_tid->tid,
-					   (void *)(rx_tid->hw_qdesc_paddr));
-				desc->pending_ext_desc_size = tot_desc_size +
-								      desc_size;
-				dp_reo_desc_clean_up(soc, desc, reo_status);
-				flush_failure = true;
-				break;
-			}
-		}
-
-		if (flush_failure)
-			break;
-		else
-			desc->pending_ext_desc_size = desc_size;
-
 		/* Flush base descriptor */
 		qdf_mem_zero(&params, sizeof(params));
 		params.std.need_status = 1;
 		params.std.addr_lo =
 			(uint64_t)(rx_tid->hw_qdesc_paddr) & 0xffffffff;
 		params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
+		if (rx_tid->ba_win_size > 256)
+			params.u.fl_cache_params.flush_q_1k_desc = 1;
+		params.u.fl_cache_params.fwd_mpdus_in_queue = 1;
 
 		if (QDF_STATUS_SUCCESS != dp_reo_send_cmd(soc,
 							  CMD_FLUSH_CACHE,
@@ -4160,6 +4121,7 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid)
 {
 	struct dp_rx_tid *rx_tid = &(peer->rx_tid[tid]);
 	struct dp_soc *soc = peer->vdev->pdev->soc;
+	union hal_reo_status reo_status;
 	struct hal_reo_cmd_params params;
 	struct reo_desc_list_node *freedesc =
 		qdf_mem_malloc(sizeof(*freedesc));
@@ -4178,25 +4140,8 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid)
 
 	DP_RX_REO_QDESC_GET_MAC(freedesc, peer);
 
-	params.std.need_status = 1;
-	params.std.addr_lo = rx_tid->hw_qdesc_paddr & 0xffffffff;
-	params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
-	params.u.upd_queue_params.update_vld = 1;
-	params.u.upd_queue_params.vld = 0;
-
-	if (dp_reo_send_cmd(soc, CMD_UPDATE_RX_REO_QUEUE, &params,
-			    dp_rx_tid_delete_cb, (void *)freedesc)
-		!= QDF_STATUS_SUCCESS) {
-		/* Defer the clean up to the call back context */
-		qdf_spin_lock_bh(&soc->reo_desc_freelist_lock);
-		freedesc->free_ts = qdf_get_system_timestamp();
-		freedesc->resend_update_reo_cmd = true;
-		qdf_list_insert_front(&soc->reo_desc_freelist,
-				      (qdf_list_node_t *)freedesc);
-		DP_STATS_INC(soc, rx.err.reo_cmd_send_fail, 1);
-		qdf_spin_unlock_bh(&soc->reo_desc_freelist_lock);
-		dp_info("Failed to send CMD_UPDATE_RX_REO_QUEUE");
-	}
+	reo_status.rx_queue_status.header.status = HAL_REO_CMD_SUCCESS;
+	dp_rx_tid_delete_cb(soc, freedesc, &reo_status);
 
 	rx_tid->hw_qdesc_vaddr_unaligned = NULL;
 	rx_tid->hw_qdesc_alloc_size = 0;
@@ -6194,6 +6139,11 @@ void dp_send_cache_flush_for_rx_tid(
 			params.std.addr_hi =
 				(uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
 			params.u.fl_cache_params.flush_no_inval = 0;
+
+			if (rx_tid->ba_win_size > 256)
+				params.u.fl_cache_params.flush_q_1k_desc = 1;
+			params.u.fl_cache_params.fwd_mpdus_in_queue = 1;
+
 			if (QDF_STATUS_SUCCESS !=
 				dp_reo_send_cmd(
 					soc, CMD_FLUSH_CACHE,

+ 3 - 0
hal/wifi3.0/be/hal_be_reo.c

@@ -405,6 +405,9 @@ hal_reo_cmd_flush_cache_be(hal_ring_handle_t hal_ring_hdl,
 	HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
 			      FLUSH_WITHOUT_INVALIDATE, cp->flush_no_inval);
 
+	HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
+			      FLUSH_QUEUE_1K_DESC, cp->flush_q_1k_desc);
+
 	HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
 			      BLOCK_CACHE_USAGE_AFTER_FLUSH,
 			      cp->block_use_after_flush);

+ 1 - 0
hal/wifi3.0/hal_reo.h

@@ -206,6 +206,7 @@ struct hal_reo_cmd_flush_cache_params {
 	bool flush_no_inval;
 	bool block_use_after_flush;
 	bool flush_entire_cache;
+	bool flush_q_1k_desc;
 };
 
 /**