qcacmn: Extract tx complete status based on CDP_ARCH_TYPE

For the non standard htt tx completion, extract the tx completion
status based on the CDP arch type.
For Lithium based architecture, use HTT_TX_WBM_COMPLETION_V2
For Beryllium based architecture, use HTT_TX_WBM_COMPLETION_V3

Change-Id: I050e8a144d72c2a9fcb6174c690c38c4e2c88c25
CRs-Fixed: 3119153
This commit is contained in:
Srinivas Girigowda
2022-01-28 19:01:00 -08:00
committed by Madan Koyyalamudi
parent ff60b352ba
commit 1cd2285eca

View File

@@ -49,6 +49,7 @@
#ifdef FEATURE_WDS #ifdef FEATURE_WDS
#include "dp_txrx_wds.h" #include "dp_txrx_wds.h"
#endif #endif
#include "cdp_txrx_cmn_reg.h"
/* Flag to skip CCE classify when mesh or tid override enabled */ /* Flag to skip CCE classify when mesh or tid override enabled */
#define DP_TX_SKIP_CCE_CLASSIFY \ #define DP_TX_SKIP_CCE_CLASSIFY \
@@ -1766,18 +1767,41 @@ static void dp_tx_update_tdls_flags(struct dp_soc *soc,
} }
} }
static uint8_t dp_htt_tx_comp_get_status(struct dp_soc *soc, char *htt_desc)
{
uint8_t tx_status = HTT_TX_FW2WBM_TX_STATUS_MAX;
switch (soc->arch_id) {
case CDP_ARCH_TYPE_LI:
tx_status = HTT_TX_WBM_COMPLETION_V2_TX_STATUS_GET(htt_desc[0]);
break;
case CDP_ARCH_TYPE_BE:
tx_status = HTT_TX_WBM_COMPLETION_V3_TX_STATUS_GET(htt_desc[0]);
break;
default:
dp_err("Incorrect CDP_ARCH %d", soc->arch_id);
QDF_BUG(0);
}
return tx_status;
}
/** /**
* dp_non_std_tx_comp_free_buff() - Free the non std tx packet buffer * dp_non_std_htt_tx_comp_free_buff() - Free the non std tx packet buffer
* @soc: dp_soc handle * @soc: dp_soc handle
* @tx_desc: TX descriptor * @tx_desc: TX descriptor
* @vdev: datapath vdev handle * @vdev: datapath vdev handle
* *
* Return: None * Return: None
*/ */
static void dp_non_std_tx_comp_free_buff(struct dp_soc *soc, static void dp_non_std_htt_tx_comp_free_buff(struct dp_soc *soc,
struct dp_tx_desc_s *tx_desc) struct dp_tx_desc_s *tx_desc)
{ {
struct hal_tx_completion_status ts = {0}; uint8_t tx_status = 0;
uint8_t htt_tx_status[HAL_TX_COMP_HTT_STATUS_LEN];
qdf_nbuf_t nbuf = tx_desc->nbuf; qdf_nbuf_t nbuf = tx_desc->nbuf;
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, tx_desc->vdev_id, struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, tx_desc->vdev_id,
DP_MOD_ID_TDLS); DP_MOD_ID_TDLS);
@@ -1787,12 +1811,15 @@ static void dp_non_std_tx_comp_free_buff(struct dp_soc *soc,
goto error; goto error;
} }
hal_tx_comp_get_status(&tx_desc->comp, &ts, vdev->pdev->soc->hal_soc); hal_tx_comp_get_htt_desc(&tx_desc->comp, htt_tx_status);
tx_status = dp_htt_tx_comp_get_status(soc, htt_tx_status);
dp_debug("vdev_id: %d tx_status: %d", tx_desc->vdev_id, tx_status);
if (vdev->tx_non_std_data_callback.func) { if (vdev->tx_non_std_data_callback.func) {
qdf_nbuf_set_next(nbuf, NULL); qdf_nbuf_set_next(nbuf, NULL);
vdev->tx_non_std_data_callback.func( vdev->tx_non_std_data_callback.func(
vdev->tx_non_std_data_callback.ctxt, vdev->tx_non_std_data_callback.ctxt,
nbuf, ts.status); nbuf, tx_status);
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TDLS); dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TDLS);
return; return;
} else { } else {
@@ -1836,7 +1863,7 @@ static inline void dp_tx_update_tdls_flags(struct dp_soc *soc,
{ {
} }
static inline void dp_non_std_tx_comp_free_buff(struct dp_soc *soc, static inline void dp_non_std_htt_tx_comp_free_buff(struct dp_soc *soc,
struct dp_tx_desc_s *tx_desc) struct dp_tx_desc_s *tx_desc)
{ {
} }
@@ -2143,7 +2170,7 @@ void dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc)
/* If it is TDLS mgmt, don't unmap or free the frame */ /* If it is TDLS mgmt, don't unmap or free the frame */
if (desc->flags & DP_TX_DESC_FLAG_TDLS_FRAME) if (desc->flags & DP_TX_DESC_FLAG_TDLS_FRAME)
return dp_non_std_tx_comp_free_buff(soc, desc); return dp_non_std_htt_tx_comp_free_buff(soc, desc);
/* 0 : MSDU buffer, 1 : MLE */ /* 0 : MSDU buffer, 1 : MLE */
if (desc->msdu_ext_desc) { if (desc->msdu_ext_desc) {
@@ -4368,13 +4395,15 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc,
"ppdu_id = %d \n" "ppdu_id = %d \n"
"transmit_cnt = %d \n" "transmit_cnt = %d \n"
"tid = %d \n" "tid = %d \n"
"peer_id = %d\n", "peer_id = %d\n"
"tx_status = %d\n",
ts->ack_frame_rssi, ts->first_msdu, ts->ack_frame_rssi, ts->first_msdu,
ts->last_msdu, ts->msdu_part_of_amsdu, ts->last_msdu, ts->msdu_part_of_amsdu,
ts->valid, ts->bw, ts->pkt_type, ts->stbc, ts->valid, ts->bw, ts->pkt_type, ts->stbc,
ts->ldpc, ts->sgi, ts->mcs, ts->ofdma, ts->ldpc, ts->sgi, ts->mcs, ts->ofdma,
ts->tones_in_ru, ts->tsf, ts->ppdu_id, ts->tones_in_ru, ts->tsf, ts->ppdu_id,
ts->transmit_cnt, ts->tid, ts->peer_id); ts->transmit_cnt, ts->tid, ts->peer_id,
ts->status);
/* Update SoC level stats */ /* Update SoC level stats */
DP_STATS_INCC(soc, tx.dropped_fw_removed, 1, DP_STATS_INCC(soc, tx.dropped_fw_removed, 1,
@@ -4771,8 +4800,12 @@ more_data:
if (qdf_unlikely(buffer_src == if (qdf_unlikely(buffer_src ==
HAL_TX_COMP_RELEASE_SOURCE_FW)) { HAL_TX_COMP_RELEASE_SOURCE_FW)) {
uint8_t htt_tx_status[HAL_TX_COMP_HTT_STATUS_LEN]; uint8_t htt_tx_status[HAL_TX_COMP_HTT_STATUS_LEN];
hal_tx_comp_get_htt_desc(tx_comp_hal_desc, hal_tx_comp_get_htt_desc(tx_comp_hal_desc,
htt_tx_status); htt_tx_status);
/* Collect hw completion contents */
hal_tx_comp_desc_sync(tx_comp_hal_desc,
&tx_desc->comp, 1);
soc->arch_ops.dp_tx_process_htt_completion( soc->arch_ops.dp_tx_process_htt_completion(
soc, soc,
tx_desc, tx_desc,