|
@@ -3411,6 +3411,7 @@ void dp_tx_update_connectivity_stats(struct dp_soc *soc,
|
|
|
|
|
|
/**
|
|
/**
|
|
* dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
|
|
* dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
|
|
|
|
+ * @soc: DP soc handle
|
|
* @tx_desc: software descriptor head pointer
|
|
* @tx_desc: software descriptor head pointer
|
|
* @ts: Tx completion status
|
|
* @ts: Tx completion status
|
|
* @peer: peer handle
|
|
* @peer: peer handle
|
|
@@ -3419,13 +3420,13 @@ void dp_tx_update_connectivity_stats(struct dp_soc *soc,
|
|
* Return: none
|
|
* Return: none
|
|
*/
|
|
*/
|
|
static inline
|
|
static inline
|
|
-void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
|
|
|
|
|
|
+void dp_tx_comp_process_tx_status(struct dp_soc *soc,
|
|
|
|
+ struct dp_tx_desc_s *tx_desc,
|
|
struct hal_tx_completion_status *ts,
|
|
struct hal_tx_completion_status *ts,
|
|
struct dp_peer *peer, uint8_t ring_id)
|
|
struct dp_peer *peer, uint8_t ring_id)
|
|
{
|
|
{
|
|
uint32_t length;
|
|
uint32_t length;
|
|
qdf_ether_header_t *eh;
|
|
qdf_ether_header_t *eh;
|
|
- struct dp_soc *soc = NULL;
|
|
|
|
struct dp_vdev *vdev = tx_desc->vdev;
|
|
struct dp_vdev *vdev = tx_desc->vdev;
|
|
qdf_nbuf_t nbuf = tx_desc->nbuf;
|
|
qdf_nbuf_t nbuf = tx_desc->nbuf;
|
|
uint8_t dp_status;
|
|
uint8_t dp_status;
|
|
@@ -3436,6 +3437,7 @@ void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
|
|
}
|
|
}
|
|
|
|
|
|
eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf);
|
|
eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf);
|
|
|
|
+ length = qdf_nbuf_len(nbuf);
|
|
|
|
|
|
dp_status = qdf_dp_get_status_from_htt(ts->status);
|
|
dp_status = qdf_dp_get_status_from_htt(ts->status);
|
|
DPTRACE(qdf_dp_trace_ptr(tx_desc->nbuf,
|
|
DPTRACE(qdf_dp_trace_ptr(tx_desc->nbuf,
|
|
@@ -3475,28 +3477,24 @@ void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
|
|
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);
|
|
|
|
|
|
- soc = vdev->pdev->soc;
|
|
|
|
-
|
|
|
|
- dp_tx_update_connectivity_stats(soc, tx_desc, 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,
|
|
(ts->status == HAL_TX_TQM_RR_REM_CMD_REM));
|
|
(ts->status == HAL_TX_TQM_RR_REM_CMD_REM));
|
|
|
|
|
|
|
|
+ if (!peer) {
|
|
|
|
+ dp_err_rl("peer is null or deletion in progress");
|
|
|
|
+ DP_STATS_INC_PKT(soc, tx.tx_invalid_peer, 1, length);
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dp_tx_update_connectivity_stats(soc, tx_desc, ts->status);
|
|
|
|
+
|
|
/* Update per-packet stats for mesh mode */
|
|
/* Update per-packet stats for mesh mode */
|
|
if (qdf_unlikely(vdev->mesh_vdev) &&
|
|
if (qdf_unlikely(vdev->mesh_vdev) &&
|
|
!(tx_desc->flags & DP_TX_DESC_FLAG_TO_FW))
|
|
!(tx_desc->flags & DP_TX_DESC_FLAG_TO_FW))
|
|
dp_tx_comp_fill_tx_completion_stats(tx_desc, ts);
|
|
dp_tx_comp_fill_tx_completion_stats(tx_desc, ts);
|
|
|
|
|
|
- length = qdf_nbuf_len(nbuf);
|
|
|
|
/* Update peer level stats */
|
|
/* Update peer level stats */
|
|
- if (!peer) {
|
|
|
|
- QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_DP,
|
|
|
|
- "peer is null or deletion in progress");
|
|
|
|
- DP_STATS_INC_PKT(soc, tx.tx_invalid_peer, 1, length);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (qdf_unlikely(peer->bss_peer && vdev->opmode == wlan_op_mode_ap)) {
|
|
if (qdf_unlikely(peer->bss_peer && vdev->opmode == wlan_op_mode_ap)) {
|
|
if (ts->status != HAL_TX_TQM_RR_REM_CMD_REM) {
|
|
if (ts->status != HAL_TX_TQM_RR_REM_CMD_REM) {
|
|
DP_STATS_INC_PKT(peer, tx.mcast, 1, length);
|
|
DP_STATS_INC_PKT(peer, tx.mcast, 1, length);
|
|
@@ -3587,7 +3585,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
|
|
}
|
|
}
|
|
hal_tx_comp_get_status(&desc->comp, &ts, soc->hal_soc);
|
|
hal_tx_comp_get_status(&desc->comp, &ts, soc->hal_soc);
|
|
peer = dp_peer_find_by_id(soc, ts.peer_id);
|
|
peer = dp_peer_find_by_id(soc, ts.peer_id);
|
|
- dp_tx_comp_process_tx_status(desc, &ts, peer, ring_id);
|
|
|
|
|
|
+ dp_tx_comp_process_tx_status(soc, desc, &ts, peer, ring_id);
|
|
|
|
|
|
netbuf = desc->nbuf;
|
|
netbuf = desc->nbuf;
|
|
/* check tx complete notification */
|
|
/* check tx complete notification */
|
|
@@ -3710,7 +3708,7 @@ void dp_tx_process_htt_completion(struct dp_tx_desc_s *tx_desc, uint8_t *status,
|
|
if (qdf_likely(peer))
|
|
if (qdf_likely(peer))
|
|
dp_peer_unref_del_find_by_id(peer);
|
|
dp_peer_unref_del_find_by_id(peer);
|
|
|
|
|
|
- dp_tx_comp_process_tx_status(tx_desc, &ts, peer, ring_id);
|
|
|
|
|
|
+ dp_tx_comp_process_tx_status(soc, tx_desc, &ts, peer, ring_id);
|
|
dp_tx_comp_process_desc(soc, tx_desc, &ts, peer);
|
|
dp_tx_comp_process_desc(soc, tx_desc, &ts, peer);
|
|
dp_tx_desc_release(tx_desc, tx_desc->pool_id);
|
|
dp_tx_desc_release(tx_desc, tx_desc->pool_id);
|
|
|
|
|