Эх сурвалжийг харах

qcacmn: Fix SAP DHCP ACK no TX Comp notify issue

When TX completion is released from FW, dp_tx_notify_completion()
will not be invoked, then TX DCHP ACK will miss
hdd_softap_notify_tx_compl_cbk() which then
WMI_PEER_CRIT_PROTO_HINT_ENABLED with value 0 will not send to FW.

(1) move dp_tx_notify_completion() from dp_tx_comp_process_desc_list()
to dp_tx_comp_process_tx_status(), so that both TX completion release
source FW or TQM case will call it.
(2) clear TX notify flag for intra-bss forwarding BC/MC to avoid
unnecessary TX completion notify.
(3) Set ts.status for release source FW case otherwise it will be value
0 always.

Change-Id: I2bf9900a3d16ba162a83b061f0b96e7d2f79423a
CRs-Fixed: 3178423
Jinwei Chen 3 жил өмнө
parent
commit
5f37239c73

+ 3 - 0
dp/wifi3.0/be/dp_be_tx.c

@@ -266,6 +266,9 @@ void dp_tx_process_htt_completion_be(struct dp_soc *soc,
 		ts.tsf = htt_desc[4];
 		ts.first_msdu = 1;
 		ts.last_msdu = 1;
+		ts.status = (tx_status == HTT_TX_FW2WBM_TX_STATUS_OK ?
+			     HAL_TX_TQM_RR_FRAME_ACKED :
+			     HAL_TX_TQM_RR_REM_CMD_REM);
 		tid = ts.tid;
 		if (qdf_unlikely(tid >= CDP_MAX_DATA_TIDS))
 			tid = CDP_MAX_DATA_TIDS - 1;

+ 2 - 0
dp/wifi3.0/dp_rx.c

@@ -876,6 +876,8 @@ bool dp_rx_intrabss_mcbc_fwd(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
 						      tid_stats))
 		return false;
 
+	/* set TX notify flag 0 to avoid unnecessary TX comp callback */
+	qdf_nbuf_tx_notify_comp_set(nbuf_copy, 0);
 	if (dp_tx_send((struct cdp_soc_t *)soc,
 		       ta_peer->vdev->vdev_id, nbuf_copy)) {
 		DP_PEER_PER_PKT_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1,

+ 5 - 7
dp/wifi3.0/dp_tx.c

@@ -4667,6 +4667,11 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc,
 	dp_tx_update_connectivity_stats(soc, vdev, tx_desc, ts->status);
 	dp_tx_update_uplink_delay(soc, vdev, ts);
 
+	/* check tx complete notification */
+	if (qdf_nbuf_tx_notify_comp_get(nbuf))
+		dp_tx_notify_completion(soc, vdev, tx_desc,
+					nbuf, ts->status);
+
 	/* Update per-packet stats for mesh mode */
 	if (qdf_unlikely(vdev->mesh_vdev) &&
 			!(tx_desc->flags & DP_TX_DESC_FLAG_TO_FW))
@@ -4855,7 +4860,6 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
 	struct hal_tx_completion_status ts;
 	struct dp_txrx_peer *txrx_peer = NULL;
 	uint16_t peer_id = DP_INVALID_PEER;
-	qdf_nbuf_t netbuf;
 	dp_txrx_ref_handle txrx_ref_handle = NULL;
 
 	desc = comp_head;
@@ -4908,12 +4912,6 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
 		dp_tx_comp_process_tx_status(soc, desc, &ts, txrx_peer,
 					     ring_id);
 
-		netbuf = desc->nbuf;
-		/* check tx complete notification */
-		if (txrx_peer && qdf_nbuf_tx_notify_comp_get(netbuf))
-			dp_tx_notify_completion(soc, txrx_peer->vdev, desc,
-						netbuf, ts.status);
-
 		dp_tx_comp_process_desc(soc, desc, &ts, txrx_peer);
 
 		dp_tx_desc_release(desc, desc->pool_id);

+ 3 - 0
dp/wifi3.0/li/dp_li_tx.c

@@ -178,6 +178,9 @@ void dp_tx_process_htt_completion_li(struct dp_soc *soc,
 		ts.tsf = htt_desc[3];
 		ts.first_msdu = 1;
 		ts.last_msdu = 1;
+		ts.status = (tx_status == HTT_TX_FW2WBM_TX_STATUS_OK ?
+			     HAL_TX_TQM_RR_FRAME_ACKED :
+			     HAL_TX_TQM_RR_REM_CMD_REM);
 		tid = ts.tid;
 		if (qdf_unlikely(tid >= CDP_MAX_DATA_TIDS))
 			tid = CDP_MAX_DATA_TIDS - 1;