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
Este commit está contenido en:
Jinwei Chen
2022-04-20 07:17:09 -07:00
cometido por Madan Koyyalamudi
padre e04b80efc6
commit 5f37239c73
Se han modificado 4 ficheros con 13 adiciones y 7 borrados

Ver fichero

@@ -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;

Ver fichero

@@ -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,

Ver fichero

@@ -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);

Ver fichero

@@ -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;