summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/cds/inc/cds_sched.h6
-rw-r--r--core/cds/src/cds_sched.c2
-rw-r--r--core/dp/ol/inc/ol_txrx_osif_api.h6
-rw-r--r--core/dp/txrx/ol_rx.c3
-rw-r--r--core/dp/txrx/ol_rx_defrag.c3
-rw-r--r--core/dp/txrx/ol_tx_send.c13
-rw-r--r--core/dp/txrx/ol_txrx.c34
-rw-r--r--core/dp/txrx/ol_txrx.h12
-rw-r--r--core/dp/txrx/ol_txrx_types.h1
-rw-r--r--core/wma/src/wma_mgmt.c1
10 files changed, 59 insertions, 22 deletions
diff --git a/core/cds/inc/cds_sched.h b/core/cds/inc/cds_sched.h
index 835b5a04c082..eae8de839f91 100644
--- a/core/cds/inc/cds_sched.h
+++ b/core/cds/inc/cds_sched.h
@@ -43,6 +43,7 @@
#include "cds_config.h"
#include "cds_reg_service.h"
#include "qdf_cpuhp.h"
+#include "ol_txrx.h"
#define TX_POST_EVENT 0x001
#define TX_SUSPEND_EVENT 0x002
@@ -90,7 +91,8 @@ typedef void (*cds_ol_rx_thread_cb)(void *context, void *rxpkt, uint16_t staid);
typedef void (*cds_ol_mon_thread_cb)(
void *context, void *monpkt,
uint8_t vdev_id, uint8_t tid,
- uint8_t status, bool pkt_format);
+ struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format);
typedef int (*send_mode_change_event_cb)(void);
@@ -140,7 +142,7 @@ struct cds_ol_mon_pkt {
uint8_t tid;
/* Tx packet status */
- uint8_t status;
+ struct ol_mon_tx_status pkt_tx_status;
/* 0 = 802.3 format , 1 = 802.11 format */
bool pkt_format;
diff --git a/core/cds/src/cds_sched.c b/core/cds/src/cds_sched.c
index 5bb7e5bdd6e3..a1f8cf6c4ea4 100644
--- a/core/cds/src/cds_sched.c
+++ b/core/cds/src/cds_sched.c
@@ -1565,7 +1565,7 @@ static void cds_mon_from_queue(p_cds_sched_context pschedcontext)
vdev_id = pkt->vdev_id;
tid = pkt->tid;
pkt->callback(pkt->context, pkt->monpkt, vdev_id,
- tid, pkt->status, pkt->pkt_format);
+ tid, pkt->pkt_tx_status, pkt->pkt_format);
cds_free_ol_mon_pkt(pschedcontext, pkt);
spin_lock_bh(&pschedcontext->ol_mon_queue_lock);
}
diff --git a/core/dp/ol/inc/ol_txrx_osif_api.h b/core/dp/ol/inc/ol_txrx_osif_api.h
index d2fe056a63d2..c89c56da105b 100644
--- a/core/dp/ol/inc/ol_txrx_osif_api.h
+++ b/core/dp/ol/inc/ol_txrx_osif_api.h
@@ -83,7 +83,7 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer,
* @mon_buf_list: netbuf list
* @type: data process type
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
@@ -91,7 +91,9 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer,
void ol_txrx_mon_data_process(uint8_t vdev_id,
qdf_nbuf_t mon_buf_list,
enum mon_data_process_type type,
- uint8_t tid, uint8_t status, bool pktformat);
+ uint8_t tid,
+ struct ol_mon_tx_status pkt_tx_status,
+ bool pktformat);
void ol_txrx_flush_rx_frames(struct ol_txrx_peer_t *peer,
bool drop);
diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c
index 17f3696b2ab3..e4310496dd35 100644
--- a/core/dp/txrx/ol_rx.c
+++ b/core/dp/txrx/ol_rx.c
@@ -1476,6 +1476,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev,
uint32_t filled = 0;
uint8_t vdev_id;
bool is_pkt_capture_flow_id = false;
+ struct ol_mon_tx_status pkt_tx_status = {0};
if (tid >= OL_TXRX_NUM_EXT_TIDS) {
ol_txrx_err("%s: invalid tid, %u\n", __FUNCTION__, tid);
@@ -1585,7 +1586,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev,
if (head_mon_msdu)
ol_txrx_mon_data_process(
vdev_id, head_mon_msdu,
- PROCESS_TYPE_DATA_RX, 0, 0,
+ PROCESS_TYPE_DATA_RX, 0, pkt_tx_status,
TXRX_PKT_FORMAT_8023);
if (is_pkt_capture_flow_id) {
diff --git a/core/dp/txrx/ol_rx_defrag.c b/core/dp/txrx/ol_rx_defrag.c
index 4373999b4467..84045eb8ad58 100644
--- a/core/dp/txrx/ol_rx_defrag.c
+++ b/core/dp/txrx/ol_rx_defrag.c
@@ -684,6 +684,7 @@ ol_rx_defrag(ol_txrx_pdev_handle pdev,
struct ieee80211_frame *wh;
uint8_t key[DEFRAG_IEEE80211_KEY_LEN];
htt_pdev_handle htt_pdev = pdev->htt_pdev;
+ struct ol_mon_tx_status pkt_tx_status = {0};
vdev = peer->vdev;
@@ -832,7 +833,7 @@ ol_rx_defrag(ol_txrx_pdev_handle pdev,
if (head_mon_msdu)
ol_txrx_mon_data_process(
vdev->vdev_id, head_mon_msdu,
- PROCESS_TYPE_DATA_RX, 0, 0,
+ PROCESS_TYPE_DATA_RX, 0, pkt_tx_status,
TXRX_PKT_FORMAT_8023);
}
diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c
index da4ab21e38c1..1b69f9c0c327 100644
--- a/core/dp/txrx/ol_tx_send.c
+++ b/core/dp/txrx/ol_tx_send.c
@@ -835,6 +835,10 @@ ol_tx_process_mon_tx_completion(
qdf_nbuf_t netbuf;
int nbuf_len;
struct qdf_tso_seg_elem_t *tso_seg = NULL;
+ struct ol_mon_tx_status pkt_tx_status = {0};
+
+ pkt_tx_status.status = status;
+ pkt_tx_status.tx_retry_cnt = payload->tx_retry_cnt;
qdf_assert(tx_desc);
@@ -928,7 +932,7 @@ ol_tx_process_mon_tx_completion(
ol_txrx_mon_data_process(tx_desc->vdev_id,
netbuf, PROCESS_TYPE_DATA_TX_COMPL,
- tid, status, TXRX_PKT_FORMAT_8023);
+ tid, pkt_tx_status, TXRX_PKT_FORMAT_8023);
}
void
@@ -936,7 +940,7 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg)
{
int nbuf_len;
qdf_nbuf_t netbuf;
- uint8_t status;
+ struct ol_mon_tx_status pkt_tx_status = {0};
uint8_t tid = 0;
bool pkt_format;
u_int32_t *msg_word = (u_int32_t *)msg;
@@ -974,7 +978,8 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg)
qdf_mem_copy(qdf_nbuf_data(netbuf), txhdr,
sizeof(struct htt_tx_data_hdr_information));
- status = offload_deliver_msg->status;
+ pkt_tx_status.status = offload_deliver_msg->status;
+ pkt_tx_status.tx_retry_cnt = offload_deliver_msg->tx_retry_cnt;
pkt_format = offload_deliver_msg->format;
tid = offload_deliver_msg->tid_num;
/* Is FW sends offload data during roaming */
@@ -985,7 +990,7 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg)
ol_txrx_mon_data_process(
vdev_id,
netbuf, PROCESS_TYPE_DATA_TX,
- tid, status, pkt_format);
+ tid, pkt_tx_status, pkt_format);
}
/**
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 07692b6347b7..be2929374b23 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -5471,14 +5471,15 @@ static inline int ol_txrx_drop_nbuf_list(qdf_nbuf_t buf_list)
* @nbuf_list: netbuf list
* @vdev_id: vdev id for which packet is captured
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
*/
static void
ol_txrx_mon_mgmt_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid, struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
uint8_t drop_count;
@@ -5529,6 +5530,7 @@ bool ol_txrx_mon_mgmt_process(struct mon_rx_status *txrx_status,
struct cds_ol_mon_pkt *pkt;
ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX);
p_cds_sched_context sched_ctx = get_cds_sched_ctxt();
+ struct ol_mon_tx_status pkt_tx_status = {0};
if (unlikely(!sched_ctx))
return false;
@@ -5554,7 +5556,7 @@ bool ol_txrx_mon_mgmt_process(struct mon_rx_status *txrx_status,
pkt->monpkt = (void *)nbuf;
pkt->vdev_id = HTT_INVALID_VDEV;
pkt->tid = HTT_INVALID_TID;
- pkt->status = status;
+ pkt->pkt_tx_status = pkt_tx_status;
pkt->pkt_format = TXRX_PKT_FORMAT_80211;
cds_indicate_monpkt(sched_ctx, pkt);
@@ -5859,6 +5861,7 @@ ol_txrx_update_tx_status(struct ol_txrx_pdev_t *pdev,
tx_status->ant_signal_db = mon_hdr->rssi_comb;
tx_status->tx_status = mon_hdr->status;
tx_status->add_rtap_ext = true;
+ tx_status->tx_retry_cnt = mon_hdr->tx_retry_cnt;
}
/**
@@ -5868,14 +5871,15 @@ ol_txrx_update_tx_status(struct ol_txrx_pdev_t *pdev,
* @nbuf_list: netbuf list
* @vdev_id: vdev id for which packet is captured
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
*/
static void
ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid, struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
qdf_nbuf_t msdu, next_buf;
@@ -5947,7 +5951,8 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
mon_hdr.sgi = cmpl_desc->sgi;
mon_hdr.ldpc = cmpl_desc->ldpc;
mon_hdr.beamformed = cmpl_desc->beamformed;
- mon_hdr.status = status;
+ mon_hdr.status = pkt_tx_status.status;
+ mon_hdr.tx_retry_cnt = pkt_tx_status.tx_retry_cnt;
qdf_nbuf_pull_head(
msdu,
@@ -6052,6 +6057,7 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
msdu = next_buf;
}
+
return;
free_buf:
@@ -6065,14 +6071,15 @@ free_buf:
* @nbuf_list: netbuf list
* @vdev_id: vdev id for which packet is captured
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
*/
static void
ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid, struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
qdf_nbuf_t buf_list = (qdf_nbuf_t)nbuf_list;
@@ -6161,8 +6168,9 @@ ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
ol_htt_mon_note_chan(pdev, chan);
htt_rx_mon_get_rx_status(pdev->htt_pdev, rx_desc, &rx_status);
- rx_status.tx_status = status;
+ rx_status.tx_status = pkt_tx_status.status;
rx_status.add_rtap_ext = true;
+ rx_status.tx_retry_cnt = pkt_tx_status.tx_retry_cnt;
/* clear IEEE80211_RADIOTAP_F_FCS flag*/
rx_status.rtap_flags &= ~(BIT(4));
@@ -6233,13 +6241,17 @@ ol_txrx_pktcapture_status_map(uint8_t status)
void ol_txrx_mon_data_process(uint8_t vdev_id,
qdf_nbuf_t mon_buf_list,
enum mon_data_process_type type,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid,
+ struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
uint8_t drop_count;
struct cds_ol_mon_pkt *pkt;
ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX);
p_cds_sched_context sched_ctx = get_cds_sched_ctxt();
cds_ol_mon_thread_cb callback = NULL;
+ pkt_tx_status.status =
+ ol_txrx_pktcapture_status_map(pkt_tx_status.status);
if (!pdev) {
ol_txrx_err("pdev is NULL");
@@ -6269,7 +6281,7 @@ void ol_txrx_mon_data_process(uint8_t vdev_id,
pkt->monpkt = (void *)mon_buf_list;
pkt->vdev_id = vdev_id;
pkt->tid = tid;
- pkt->status = ol_txrx_pktcapture_status_map(status);
+ pkt->pkt_tx_status = pkt_tx_status;
pkt->pkt_format = pkt_format;
cds_indicate_monpkt(sched_ctx, pkt);
return;
diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h
index 40c77a5e2c4c..a4498059c839 100644
--- a/core/dp/txrx/ol_txrx.h
+++ b/core/dp/txrx/ol_txrx.h
@@ -225,4 +225,16 @@ enum pktcapture_tx_status {
pktcapture_tx_status_discard,
pktcapture_tx_status_no_ack,
};
+
+/*
+ * struct ol_mon_tx_status - tx packets info
+ * @status: tx status
+ * @tx_retry_cnt: tx retry count
+ *
+ */
+
+struct ol_mon_tx_status {
+ uint8_t status;
+ uint8_t tx_retry_cnt;
+};
#endif /* _OL_TXRX__H_ */
diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h
index fe230839a151..3203a75ebeb0 100644
--- a/core/dp/txrx/ol_txrx_types.h
+++ b/core/dp/txrx/ol_txrx_types.h
@@ -576,6 +576,7 @@ struct ol_txrx_mon_hdr_elem_t {
bool beamformed;
bool dir; /* rx:0 , tx:1 */
uint8_t status; /* tx status */
+ uint8_t tx_retry_cnt;
};
/*
diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c
index 09cbd9772617..bb3a22b820ba 100644
--- a/core/wma/src/wma_mgmt.c
+++ b/core/wma/src/wma_mgmt.c
@@ -2895,6 +2895,7 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr,
txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02);
txrx_status.tx_status = status;
txrx_status.add_rtap_ext = true;
+ txrx_status.tx_retry_cnt = hdr->tx_retry_cnt;
wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf);
wh->i_fc[1] &= ~IEEE80211_FC1_WEP;