|
@@ -1797,6 +1797,35 @@ dp_tx_mon_proc_pending_ppdus(struct dp_pdev *pdev, struct dp_tx_tid *tx_tid,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * dp_tx_ppdu_stats_flush(): Function to flush pending retried ppdu desc
|
|
|
|
+ * @pdev: DP pdev handle
|
|
|
|
+ * @nbuf: ppdu_desc
|
|
|
|
+ *
|
|
|
|
+ * return: void
|
|
|
|
+ */
|
|
|
|
+static void
|
|
|
|
+dp_tx_ppdu_stats_flush(struct dp_pdev *pdev,
|
|
|
|
+ struct cdp_tx_completion_ppdu *ppdu_desc)
|
|
|
|
+{
|
|
|
|
+ struct dp_peer *peer;
|
|
|
|
+
|
|
|
|
+ peer = dp_peer_find_by_id(pdev->soc,
|
|
|
|
+ ppdu_desc->user[0].peer_id);
|
|
|
|
+
|
|
|
|
+ if (!peer)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * for all drop reason we are invoking
|
|
|
|
+ * proc xretries
|
|
|
|
+ */
|
|
|
|
+ dp_tx_mon_proc_xretries(pdev, peer, ppdu_desc->user[0].tid);
|
|
|
|
+
|
|
|
|
+ dp_peer_unref_del_find_by_id(peer);
|
|
|
|
+ return;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* dp_check_ppdu_and_deliver(): Check PPDUs for any holes and deliver
|
|
* dp_check_ppdu_and_deliver(): Check PPDUs for any holes and deliver
|
|
* to upper layer if complete
|
|
* to upper layer if complete
|
|
@@ -1834,6 +1863,14 @@ dp_check_ppdu_and_deliver(struct dp_pdev *pdev,
|
|
|
|
|
|
ppdu_id = ppdu_desc->ppdu_id;
|
|
ppdu_id = ppdu_desc->ppdu_id;
|
|
|
|
|
|
|
|
+ if (ppdu_desc->is_flush) {
|
|
|
|
+ dp_tx_ppdu_stats_flush(pdev, ppdu_desc);
|
|
|
|
+ tmp_nbuf = nbuf_ppdu_desc_list[desc_cnt];
|
|
|
|
+ nbuf_ppdu_desc_list[desc_cnt] = NULL;
|
|
|
|
+ qdf_nbuf_free(tmp_nbuf);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_CTRL ||
|
|
if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_CTRL ||
|
|
ppdu_desc->htt_frame_type ==
|
|
ppdu_desc->htt_frame_type ==
|
|
HTT_STATS_FTYPE_SGEN_QOS_NULL) {
|
|
HTT_STATS_FTYPE_SGEN_QOS_NULL) {
|