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:
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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_ */
|
||||
|
@@ -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])
|
||||
|
@@ -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*/
|
||||
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user