qcacmn: Support MU in tx capture mode

Support fix for MU related data frame in tx capture mode.

Change-Id: I8b63eaf320463a3a068beb589089582cafe05001
CRs-Fixed: 2656346
This commit is contained in:
nobelj
2020-02-12 14:36:29 -08:00
committed by nshrivas
parent 0150333a89
commit 01dcfedca1
8 changed files with 185 additions and 82 deletions

View File

@@ -1503,6 +1503,8 @@ struct cdp_tx_sojourn_stats {
* @is_mcast: MCAST or UCAST
* @user_pos: user position
* @mu_group_id: mu group id
* @ppdu_start_timestamp: 64 bits ppdu start timestamp
* @ppdu_end_timestamp: 64 bits ppdu end timestamp
*/
struct cdp_delayed_tx_completion_ppdu_user {
uint32_t frame_ctrl:16,
@@ -1526,6 +1528,8 @@ struct cdp_delayed_tx_completion_ppdu_user {
bool is_mcast;
uint32_t user_pos;
uint32_t mu_group_id;
uint64_t ppdu_start_timestamp;
uint64_t ppdu_end_timestamp;
};
/**
@@ -1561,6 +1565,7 @@ struct cdp_delayed_tx_completion_ppdu_user {
* @dcm: dcm
* @ldpc: ldpc
* @delayed_ba: delayed ba bit
* @ack_ba_tlv: ack ba recv tlv bit
* @ppdu_type: SU/MU_MIMO/MU_OFDMA/MU_MIMO_OFDMA/UL_TRIG/BURST_BCN/UL_BSR_RESP/
* UL_BSR_TRIG/UNKNOWN
* @ba_seq_no: Block Ack sequence number
@@ -1584,6 +1589,11 @@ struct cdp_delayed_tx_completion_ppdu_user {
* @sa_goodput: smart antenna tx feedback info goodput
* @current_rate_per: Moving average per
* @last_enq_seq: last equeue sequence number
* @mpdu_q: queue of mpdu in a ppdu
* @mpdus: MPDU list based on enqueue sequence bitmap
* @pending_retries: pending MPDUs (retries)
* @tlv_bitmap: per user tlv bitmap
* @skip: tx capture skip flag
*/
struct cdp_tx_completion_ppdu_user {
uint32_t completion_status:8,
@@ -1620,7 +1630,8 @@ struct cdp_tx_completion_ppdu_user {
gi:4,
dcm:1,
ldpc:1,
delayed_ba:1;
delayed_ba:1,
ack_ba_tlv:1;
uint32_t ba_seq_no;
uint32_t ba_bitmap[CDP_BA_256_BIT_MAP_SIZE_DWORDS];
uint32_t start_seq;
@@ -1669,6 +1680,12 @@ struct cdp_tx_completion_ppdu_user {
*/
uint32_t current_rate_per;
uint32_t last_enq_seq;
qdf_nbuf_queue_t mpdu_q;
qdf_nbuf_t *mpdus;
uint32_t pending_retries;
uint32_t tlv_bitmap;
bool skip;
};
/**
@@ -1713,6 +1730,7 @@ struct cdp_tx_completion_ppdu_user {
* @long_retries: long retries
* @short_retries: short retries
* @completion_status: completion status - OK/Filter/Abort/Timeout
* @usr_idx: user index
*/
struct cdp_tx_indication_mpdu_info {
uint32_t ppdu_id;
@@ -1750,6 +1768,7 @@ struct cdp_tx_indication_mpdu_info {
mprot_type:3,
rts_success:1,
rts_failure:1;
uint8_t usr_idx;
};
/**
@@ -1786,7 +1805,6 @@ struct cdp_tx_mgmt_comp_info {
* @vdev_id: VAP Id
* @bar_num_users: BA response user count, based on completion common TLV
* @num_users: Number of users
* @pending_retries: pending MPDUs (retries)
* @drop_reason: drop reason from flush status
* @is_flush: is_flush is set based on flush tlv
* @flow_type: tx flow type from flush status
@@ -1813,12 +1831,12 @@ struct cdp_tx_mgmt_comp_info {
* @doppler: value for doppler (will be 0 most of the times)
* @spatial_reuse: value for spatial reuse used in radiotap HE header
* @user: per-User stats (array of per-user structures)
* @mpdu_q: queue of mpdu in a ppdu
* @mpdus: MPDU list based on enqueue sequence bitmap
* @bar_ppdu_id: BAR ppdu_id
* @bar_tx_duration: BAR tx duration
* @bar_ppdu_start_timestamp: BAR start timestamp
* @bar_ppdu_end_timestamp: BAR end timestamp
* @tlv_bitmap: tlv_bitmap for the PPDU
* @sched_cmdid: schedule command id
*/
struct cdp_tx_completion_ppdu {
uint32_t ppdu_id;
@@ -1827,7 +1845,6 @@ struct cdp_tx_completion_ppdu {
uint16_t bar_num_users;
uint32_t num_users;
uint8_t last_usr_index;
uint32_t pending_retries;
uint32_t drop_reason;
uint32_t is_flush:1,
flow_type:8,
@@ -1854,12 +1871,12 @@ struct cdp_tx_completion_ppdu {
uint8_t doppler;
uint8_t spatial_reuse;
struct cdp_tx_completion_ppdu_user user[CDP_MU_MAX_USERS];
qdf_nbuf_queue_t mpdu_q;
qdf_nbuf_t *mpdus;
uint32_t bar_ppdu_id;
uint32_t bar_tx_duration;
uint32_t bar_ppdu_start_timestamp;
uint32_t bar_ppdu_end_timestamp;
uint32_t tlv_bitmap;
uint16_t sched_cmdid;
};
/**

View File

@@ -1665,6 +1665,9 @@ struct cdp_cfr_rcc_stats {
* @nondata_rx_ru_size: UL ofdma non data ru size counter array
* @data_rx_ppdu: data rx ppdu counter
* @data_user: data user counter array
* @tx_ppdu_proc: stats counter for tx ppdu processed
* @ack_ba_comes_twice: stats counter for ack_ba_comes twice
* @ppdu_drop: stats counter for ppdu_desc drop once threshold reached
*/
struct cdp_pdev_stats {
struct {
@@ -1727,6 +1730,10 @@ struct cdp_pdev_stats {
struct cdp_tso_stats tso_stats;
struct cdp_cfr_rcc_stats rcc;
uint64_t tx_ppdu_proc;
uint32_t ack_ba_comes_twice;
uint32_t ppdu_drop;
};
#ifdef QCA_ENH_V3_STATS_SUPPORT

View File

@@ -73,7 +73,8 @@ dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap)
/*
* dp_peer_copy_delay_stats() - copy ppdu stats to peer delayed stats.
* @peer: Datapath peer handle
* @ppdu: PPDU Descriptor
* @ppdu: User PPDU Descriptor
* @cur_ppdu_id: PPDU_ID
*
* Return: None
*
@@ -83,17 +84,21 @@ dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap)
* Ack. To populate peer stats we need successful msdu(data frame).
* So we hold the Tx data stats on delayed_ba for stats update.
*/
static inline void
static void
dp_peer_copy_delay_stats(struct dp_peer *peer,
struct cdp_tx_completion_ppdu_user *ppdu)
struct cdp_tx_completion_ppdu_user *ppdu,
uint32_t cur_ppdu_id)
{
struct dp_pdev *pdev;
struct dp_vdev *vdev;
if (!peer->last_delayed_ba_ppduid || !cur_ppdu_id)
return;
if (peer->last_delayed_ba) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"BA not yet recv for prev delayed ppdu[%d]\n",
peer->last_delayed_ba_ppduid);
"BA not yet recv for prev delayed ppdu[%d] - cur ppdu[%d]",
peer->last_delayed_ba_ppduid, cur_ppdu_id);
vdev = peer->vdev;
if (vdev) {
pdev = vdev->pdev;
@@ -2197,6 +2202,8 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
start_tag_buf = tag_buf;
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
ppdu_desc->ppdu_id = ppdu_info->ppdu_id;
tag_buf = start_tag_buf + HTT_GET_STATS_CMN_INDEX(RING_ID_SCH_CMD_ID);
ppdu_info->sched_cmdid =
HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_GET(*tag_buf);
@@ -2209,6 +2216,8 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
frame_ctrl = ppdu_desc->frame_ctrl;
ppdu_desc->bar_ppdu_id = ppdu_info->ppdu_id;
switch (frame_type) {
case HTT_STATS_FTYPE_TIDQ_DATA_SU:
case HTT_STATS_FTYPE_TIDQ_DATA_MU:
@@ -2225,7 +2234,6 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
case HTT_STATS_FTYPE_SGEN_MU_BAR:
case HTT_STATS_FTYPE_SGEN_BAR:
ppdu_desc->frame_type = CDP_PPDU_FTYPE_BAR;
ppdu_desc->bar_ppdu_id = ppdu_info->ppdu_id;
break;
default:
ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL;
@@ -2308,6 +2316,7 @@ static void dp_process_ppdu_stats_user_common_tlv(
uint8_t curr_user_index = 0;
struct dp_peer *peer;
struct dp_vdev *vdev;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc =
(struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2319,6 +2328,7 @@ static void dp_process_ppdu_stats_user_common_tlv(
dp_get_ppdu_info_user_index(pdev,
peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_desc->vdev_id =
HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_GET(*tag_buf);
@@ -2414,6 +2424,7 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
struct cdp_tx_completion_ppdu_user *ppdu_user_desc;
uint8_t curr_user_index = 0;
struct dp_vdev *vdev;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2424,6 +2435,7 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
dp_get_ppdu_info_user_index(pdev,
peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
if (peer_id == DP_SCAN_PEER_ID) {
vdev =
dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc,
@@ -2513,6 +2525,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
uint16_t peer_id;
struct dp_peer *peer;
uint32_t size = CDP_BA_64_BIT_MAP_SIZE_DWORDS;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2528,6 +2541,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_desc->vdev_id = peer->vdev->vdev_id;
qdf_mem_copy(ppdu_user_desc->mac_addr,
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
@@ -2566,6 +2580,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
uint16_t peer_id;
struct dp_peer *peer;
uint32_t size = CDP_BA_256_BIT_MAP_SIZE_DWORDS;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2580,6 +2595,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_desc->vdev_id = peer->vdev->vdev_id;
qdf_mem_copy(ppdu_user_desc->mac_addr,
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
@@ -2617,6 +2633,7 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
uint8_t bw_iter;
htt_ppdu_stats_user_cmpltn_common_tlv *dp_stats_buf =
(htt_ppdu_stats_user_cmpltn_common_tlv *)tag_buf;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2630,6 +2647,7 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_desc->last_usr_index = curr_user_index;
ppdu_desc->vdev_id = peer->vdev->vdev_id;
qdf_mem_copy(ppdu_user_desc->mac_addr,
@@ -2687,10 +2705,10 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_GET(*tag_buf);
/*
* increase successful mpdu counter from
* htt_ppdu_stats_user_cmpltn_common_tlv
* on mpdu success, increase compltn_common_tlv counter
*/
ppdu_info->mpdu_compltn_common_tlv += ppdu_user_desc->mpdu_success;
if (ppdu_user_desc->mpdu_success)
ppdu_info->compltn_common_tlv++;
/*
* MU BAR may send request to n users but we may received ack only from
@@ -2749,6 +2767,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv(
uint8_t curr_user_index = 0;
uint16_t peer_id;
struct dp_peer *peer;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2764,6 +2783,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_desc->vdev_id = peer->vdev->vdev_id;
qdf_mem_copy(ppdu_user_desc->mac_addr,
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
@@ -2796,6 +2816,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv(
uint8_t curr_user_index = 0;
uint16_t peer_id;
struct dp_peer *peer;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2811,6 +2832,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_desc->vdev_id = peer->vdev->vdev_id;
qdf_mem_copy(ppdu_user_desc->mac_addr,
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
@@ -2841,6 +2863,7 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(
struct cdp_tx_completion_ppdu *ppdu_desc;
struct cdp_tx_completion_ppdu_user *ppdu_user_desc;
uint8_t curr_user_index = 0;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2854,6 +2877,15 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
if (!ppdu_user_desc->ack_ba_tlv) {
ppdu_user_desc->ack_ba_tlv = 1;
} else {
pdev->stats.ack_ba_comes_twice++;
dp_peer_unref_del_find_by_id(peer);
return;
}
ppdu_desc->vdev_id = peer->vdev->vdev_id;
qdf_mem_copy(ppdu_user_desc->mac_addr,
peer->mac_addr.raw, QDF_MAC_ADDR_SIZE);
@@ -2878,8 +2910,9 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(
tag_buf++;
ppdu_user_desc->success_bytes = *tag_buf;
/* increase successful mpdu counter */
ppdu_info->mpdu_ack_ba_tlv += ppdu_user_desc->num_mpdu;
/* increase ack ba tlv counter on successful mpdu */
if (ppdu_user_desc->num_mpdu)
ppdu_info->ack_ba_tlv++;
if (ppdu_user_desc->ba_size == 0) {
ppdu_user_desc->ba_seq_no = ppdu_user_desc->start_seq;
@@ -2906,6 +2939,7 @@ static void dp_process_ppdu_stats_user_common_array_tlv(
struct cdp_tx_completion_ppdu_user *ppdu_user_desc;
uint8_t curr_user_index = 0;
struct htt_tx_ppdu_stats_info *dp_stats_buf;
uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
@@ -2924,6 +2958,7 @@ static void dp_process_ppdu_stats_user_common_array_tlv(
curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info);
ppdu_user_desc = &ppdu_desc->user[curr_user_index];
ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
ppdu_user_desc->retry_bytes = dp_stats_buf->tx_retry_bytes;
ppdu_user_desc->failed_bytes = dp_stats_buf->tx_failed_bytes;
@@ -2974,6 +3009,7 @@ dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev,
peer_id = HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_GET(*tag_buf);
tid = HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_GET(*tag_buf);
ppdu_desc->num_users = 1;
ppdu_desc->user[0].peer_id = peer_id;
ppdu_desc->user[0].tid = tid;
@@ -3245,8 +3281,8 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
ppdu_desc = (struct cdp_tx_completion_ppdu *)
qdf_nbuf_data(ppdu_info->nbuf);
ppdu_desc->num_users = ppdu_info->last_user;
ppdu_desc->ppdu_id = ppdu_info->ppdu_id;
if (ppdu_desc->frame_type != CDP_PPDU_FTYPE_BAR)
ppdu_desc->ppdu_id = ppdu_info->ppdu_id;
tlv_bitmap_expected = HTT_PPDU_DEFAULT_TLV_BITMAP;
if (pdev->tx_sniffer_enable || pdev->mcopy_mode ||
@@ -3289,12 +3325,12 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
* Since ACK_BA_STATUS TLV come from Hardware it is
* asynchronous So we need to depend on some tlv to confirm
* all tlv is received for a ppdu.
* So we depend on both HTT_PPDU_STATS_COMMON_TLV and
* So we depend on both SCHED_CMD_STATUS_TLV and
* ACK_BA_STATUS_TLV. for failure packet we won't get
* ACK_BA_STATUS_TLV.
*/
if (!(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_COMMON_TLV)) ||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV)) ||
(!(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)) &&
(ppdu_desc->user[i].completion_status ==
@@ -3311,7 +3347,9 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
if ((ppdu_desc->user[i].tid < CDP_DATA_TID_MAX ||
(ppdu_desc->user[i].tid == CDP_DATA_NON_QOS_TID) ||
(ppdu_desc->htt_frame_type ==
HTT_STATS_FTYPE_SGEN_QOS_NULL)) &&
HTT_STATS_FTYPE_SGEN_QOS_NULL) ||
((ppdu_desc->frame_type == CDP_PPDU_FTYPE_BAR) &&
(ppdu_desc->num_mpdu > 1))) &&
(ppdu_desc->frame_type != CDP_PPDU_FTYPE_CTRL)) {
dp_tx_stats_update(pdev, peer,
@@ -3451,7 +3489,13 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id,
*/
if (pdev->list_depth > HTT_PPDU_DESC_MAX_DEPTH) {
ppdu_info = TAILQ_FIRST(&pdev->ppdu_info_list);
dp_ppdu_desc_deliver(pdev, ppdu_info);
TAILQ_REMOVE(&pdev->ppdu_info_list,
ppdu_info, ppdu_info_list_elem);
pdev->list_depth--;
pdev->stats.ppdu_drop++;
qdf_nbuf_free(ppdu_info->nbuf);
ppdu_info->nbuf = NULL;
qdf_mem_free(ppdu_info);
}
/*
@@ -3601,9 +3645,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
}
if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_DATA &&
(ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV)) &&
(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV)) &&
ppdu_desc->delayed_ba) {
for (i = 0; i < ppdu_desc->num_users; i++) {
struct cdp_delayed_tx_completion_ppdu_user *delay_ppdu;
uint64_t start_tsf;
uint64_t end_tsf;
uint32_t ppdu_id;
ppdu_id = ppdu_desc->ppdu_id;
@@ -3616,13 +3664,19 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
if (!peer)
continue;
delay_ppdu = &peer->delayed_ba_ppdu_stats;
start_tsf = ppdu_desc->ppdu_start_timestamp;
end_tsf = ppdu_desc->ppdu_end_timestamp;
/**
* save delayed ba user info
*/
if (ppdu_desc->user[i].delayed_ba) {
dp_peer_copy_delay_stats(peer,
&ppdu_desc->user[i]);
&ppdu_desc->user[i],
ppdu_id);
peer->last_delayed_ba_ppduid = ppdu_id;
delay_ppdu->ppdu_start_timestamp = start_tsf;
delay_ppdu->ppdu_end_timestamp = end_tsf;
}
dp_peer_unref_del_find_by_id(peer);
}
@@ -3633,8 +3687,12 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
* copy the store peer delayed info to BAR status
*/
if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_BAR &&
(ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV))) {
(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV))) {
for (i = 0; i < ppdu_desc->bar_num_users; i++) {
struct cdp_delayed_tx_completion_ppdu_user *delay_ppdu;
uint64_t start_tsf;
uint64_t end_tsf;
peer = dp_peer_find_by_id(pdev->soc,
ppdu_desc->user[i].peer_id);
/**
@@ -3644,12 +3702,17 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
if (!peer)
continue;
delay_ppdu = &peer->delayed_ba_ppdu_stats;
start_tsf = delay_ppdu->ppdu_start_timestamp;
end_tsf = delay_ppdu->ppdu_end_timestamp;
if (peer->last_delayed_ba) {
dp_peer_copy_stats_to_bar(peer,
&ppdu_desc->user[i]);
ppdu_desc->bar_ppdu_id = ppdu_desc->ppdu_id;
ppdu_desc->ppdu_id =
peer->last_delayed_ba_ppduid;
ppdu_desc->ppdu_start_timestamp = start_tsf;
ppdu_desc->ppdu_end_timestamp = end_tsf;
}
dp_peer_unref_del_find_by_id(peer);
}
@@ -3670,8 +3733,7 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
/*
* successful mpdu count should match with both tlv
*/
if (ppdu_info->mpdu_compltn_common_tlv !=
ppdu_info->mpdu_ack_ba_tlv)
if (ppdu_info->compltn_common_tlv != ppdu_info->ack_ba_tlv)
return NULL;
}
@@ -3679,12 +3741,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
* Once all the TLVs for a given PPDU has been processed,
* return PPDU status to be delivered to higher layer.
* tlv_bitmap_expected can't be available for different frame type.
* But STATS COMMON TLV is the last TLV from the FW for a ppdu.
* But SCHED CMD STATS TLV is the last TLV from the FW for a ppdu.
* apart from ACK BA TLV, FW sends other TLV in sequential order.
* flush tlv comes separate.
*/
if ((ppdu_info->tlv_bitmap != 0 &&
(ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV))) ||
(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV))) ||
(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV)))
return ppdu_info;

View File

@@ -1606,6 +1606,8 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
if (dp_peer_find_add_id_to_obj(peer, peer_id)) {
/* TBDXXX: assert for now */
QDF_ASSERT(0);
} else {
dp_peer_tid_peer_id_update(peer, peer->peer_ids[0]);
}
return peer;
@@ -2478,37 +2480,6 @@ static void dp_peer_setup_remaining_tids(struct dp_peer *peer)
static void dp_peer_setup_remaining_tids(struct dp_peer *peer) {};
#endif
#ifndef WLAN_TX_PKT_CAPTURE_ENH
/*
* dp_peer_tid_queue_init() Initialize ppdu stats queue per TID
* @peer: Datapath peer
*
*/
static inline void dp_peer_tid_queue_init(struct dp_peer *peer)
{
}
/*
* dp_peer_tid_queue_cleanup() remove ppdu stats queue per TID
* @peer: Datapath peer
*
*/
static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer)
{
}
/*
* dp_peer_update_80211_hdr() dp peer update 80211 hdr
* @vdev: Datapath vdev
* @peer: Datapath peer
*
*/
static inline void
dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer)
{
}
#endif
/*
* dp_peer_tx_init() Initialize receive TID state
* @pdev: Datapath pdev

View File

@@ -340,4 +340,47 @@ dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc,
void dp_rx_tid_delete_cb(struct dp_soc *soc,
void *cb_ctxt,
union hal_reo_status *reo_status);
#ifndef WLAN_TX_PKT_CAPTURE_ENH
/**
* dp_peer_tid_queue_init() Initialize ppdu stats queue per TID
* @peer: Datapath peer
*
*/
static inline void dp_peer_tid_queue_init(struct dp_peer *peer)
{
}
/**
* dp_peer_tid_peer_id_update() update peer_id to tid structure
* @peer: Datapath peer
* @peer_id: peer_id
*
*/
static inline
void dp_peer_tid_peer_id_update(struct dp_peer *peer, uint16_t peer_id)
{
}
/**
* dp_peer_tid_queue_cleanup() remove ppdu stats queue per TID
* @peer: Datapath peer
*
*/
static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer)
{
}
/**
* dp_peer_update_80211_hdr() dp peer update 80211 hdr
* @vdev: Datapath vdev
* @peer: Datapath peer
*
*/
static inline void
dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer)
{
}
#endif
#endif /* _DP_PEER_H_ */

View File

@@ -5822,8 +5822,12 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
}
DP_PRINT_STATS("BA not received for delayed_ba: %d",
pdev->stats.cdp_delayed_ba_not_recev);
DP_PRINT_STATS("tx_ppdu_proc: %llu\n",
pdev->tx_ppdu_proc);
DP_PRINT_STATS("tx_ppdu_proc: %llu",
pdev->stats.tx_ppdu_proc);
DP_PRINT_STATS("ack ba comes twice: %llu",
pdev->stats.ack_ba_comes_twice);
DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu",
pdev->stats.ppdu_drop);
for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
if (!pdev->stats.wdi_event[i])

View File

@@ -1409,18 +1409,18 @@ struct dp_neighbour_peer {
/**
* struct ppdu_info - PPDU Status info descriptor
* @ppdu_id - Unique ppduid assigned by firmware for every tx packet
* @sched_cmdid - schedule command id, which will be same in a burst
* @max_ppdu_id - wrap around for ppdu id
* @last_tlv_cnt - Keep track for missing ppdu tlvs
* @last_user - last ppdu processed for user
* @is_ampdu - set if Ampdu aggregate
* @nbuf - ppdu descriptor payload
* @ppdu_desc - ppdu descriptor
* @ppdu_info_list_elem - linked list of ppdu tlvs
* @ppdu_info_queue_elem - Singly linked list (queue) of ppdu tlvs
* @mpdu_compltn_common_tlv - Successful MPDU counter from COMPLTN COMMON tlv
* @mpdu_ack_ba_tlv - Successful MPDU from ACK BA tlv
* @ppdu_id: Unique ppduid assigned by firmware for every tx packet
* @sched_cmdid: schedule command id, which will be same in a burst
* @max_ppdu_id: wrap around for ppdu id
* @last_tlv_cnt: Keep track for missing ppdu tlvs
* @last_user: last ppdu processed for user
* @is_ampdu: set if Ampdu aggregate
* @nbuf: ppdu descriptor payload
* @ppdu_desc: ppdu descriptor
* @ppdu_info_list_elem: linked list of ppdu tlvs
* @ppdu_info_queue_elem: Singly linked list (queue) of ppdu tlvs
* @mpdu_compltn_common_tlv: Successful tlv counter from COMPLTN COMMON tlv
* @mpdu_ack_ba_tlv: Successful tlv counter from ACK BA tlv
*/
struct ppdu_info {
uint32_t ppdu_id;
@@ -1442,8 +1442,8 @@ struct ppdu_info {
#else
TAILQ_ENTRY(ppdu_info) ppdu_info_list_elem;
#endif
uint16_t mpdu_compltn_common_tlv;
uint16_t mpdu_ack_ba_tlv;
uint8_t compltn_common_tlv;
uint8_t ack_ba_tlv;
};
/**
@@ -1840,8 +1840,6 @@ struct dp_pdev {
/* tx packet capture enhancement */
enum cdp_tx_enh_capture_mode tx_capture_enabled;
struct dp_pdev_tx_capture tx_capture;
/* stats counter for tx ppdu processed */
uint64_t tx_ppdu_proc;
uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/

View File

@@ -3614,7 +3614,7 @@ static void set_default_trace_levels(struct category_info *cinfo)
[QDF_MODULE_ID_CMN_MLME] = QDF_TRACE_LEVEL_INFO,
[QDF_MODULE_ID_BSSCOLOR] = QDF_TRACE_LEVEL_ERROR,
[QDF_MODULE_ID_CFR] = QDF_TRACE_LEVEL_ERROR,
[QDF_MODULE_ID_TX_CAPTURE] = QDF_TRACE_LEVEL_NONE,
[QDF_MODULE_ID_TX_CAPTURE] = QDF_TRACE_LEVEL_FATAL,
[QDF_MODULE_ID_INTEROP_ISSUES_AP] = QDF_TRACE_LEVEL_NONE,
[QDF_MODULE_ID_BLACKLIST_MGR] = QDF_TRACE_LEVEL_NONE,
[QDF_MODULE_ID_QLD] = QDF_TRACE_LEVEL_ERROR,