qcacmn: support enhance TX capture
support TX capture mode to deliver msdu along with meta data. Change-Id: Ic84416cc4892e37bfb831dada136a4ff6b615a61
This commit is contained in:
@@ -843,6 +843,7 @@ enum cdp_pdev_param_type {
|
||||
CDP_INGRESS_STATS,
|
||||
CDP_OSIF_DROP,
|
||||
CDP_CONFIG_ENH_RX_CAPTURE,
|
||||
CDP_CONFIG_TX_CAPTURE,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1210,6 +1211,81 @@ struct cdp_tx_completion_ppdu_user {
|
||||
struct cdp_stats_cookie *cookie;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cdp_tx_indication_mpdu_info - Tx MPDU completion information
|
||||
* @ppdu_id: PPDU id
|
||||
* @duration: user duration in ppdu
|
||||
* @frame_type: frame type MGMT/CTRL/DATA/BAR
|
||||
* @frame_ctrl: frame control field in 802.11 header
|
||||
* @qos_ctrl: QoS control field in 802.11 header
|
||||
* @tid: TID number
|
||||
* @num_msdu: number of msdu in MPDU
|
||||
* @seq_no: Sequence number of first MPDU
|
||||
* @ltf_size: ltf_size
|
||||
* @stbc: stbc
|
||||
* @he_re: he_re (range extension)
|
||||
* @txbf: txbf
|
||||
* @bw: Transmission bandwidth
|
||||
* <enum 2 transmit_bw_20_MHz>
|
||||
* <enum 3 transmit_bw_40_MHz>
|
||||
* <enum 4 transmit_bw_80_MHz>
|
||||
* <enum 5 transmit_bw_160_MHz>
|
||||
* @nss: NSS 1,2, ...8
|
||||
* @mcs: MCS index
|
||||
* @preamble: preamble
|
||||
* @gi: guard interval 800/400/1600/3200 ns
|
||||
* @channel: frequency
|
||||
* @channel_num: channel number
|
||||
* @ack_rssi: ack rssi
|
||||
* @ldpc: ldpc
|
||||
* @tx_rate: Transmission Rate
|
||||
* @mac_address: peer mac address
|
||||
* @bss_mac_address: bss mac address
|
||||
* @ppdu_start_timestamp: TSF at PPDU start
|
||||
* @ppdu_end_timestamp: TSF at PPDU end
|
||||
* @ba_start_seq: Block Ack sequence number
|
||||
* @ba_bitmap: Block Ack bitmap
|
||||
*/
|
||||
struct cdp_tx_indication_mpdu_info {
|
||||
uint32_t ppdu_id;
|
||||
uint32_t tx_duration;
|
||||
uint16_t frame_type;
|
||||
uint16_t frame_ctrl;
|
||||
uint16_t qos_ctrl;
|
||||
uint8_t tid;
|
||||
uint32_t num_msdu;
|
||||
uint32_t seq_no;
|
||||
uint32_t ltf_size:2,
|
||||
he_re:1,
|
||||
txbf:4,
|
||||
bw:4,
|
||||
nss:4,
|
||||
mcs:4,
|
||||
preamble:4,
|
||||
gi:4;
|
||||
uint32_t channel;
|
||||
uint8_t channel_num;
|
||||
uint32_t ack_rssi;
|
||||
uint32_t ldpc;
|
||||
uint32_t tx_rate;
|
||||
uint8_t mac_address[QDF_MAC_ADDR_SIZE];
|
||||
uint8_t bss_mac_address[QDF_MAC_ADDR_SIZE];
|
||||
uint32_t ppdu_start_timestamp;
|
||||
uint32_t ppdu_end_timestamp;
|
||||
uint32_t ba_start_seq;
|
||||
uint32_t ba_bitmap[CDP_BA_256_BIT_MAP_SIZE_DWORDS];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cdp_tx_indication_info - Tx capture information
|
||||
* @mpdu_info: Tx MPDU completion information
|
||||
* @mpdu_nbuf: reconstructed mpdu packet
|
||||
*/
|
||||
struct cdp_tx_indication_info {
|
||||
struct cdp_tx_indication_mpdu_info mpdu_info;
|
||||
qdf_nbuf_t mpdu_nbuf;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cdp_tx_completion_ppdu - Tx PPDU completion information
|
||||
* @completion_status: completion status - OK/Filter/Abort/Timeout
|
||||
@@ -1228,6 +1304,7 @@ struct cdp_tx_completion_ppdu_user {
|
||||
* @ppdu_end_timestamp: TSF at PPDU end
|
||||
* @ack_timestamp: TSF at the reception of ACK
|
||||
* @user: per-User stats (array of per-user structures)
|
||||
* @mpdu_q: queue of mpdu in a ppdu
|
||||
*/
|
||||
struct cdp_tx_completion_ppdu {
|
||||
uint32_t ppdu_id;
|
||||
@@ -1247,6 +1324,7 @@ struct cdp_tx_completion_ppdu {
|
||||
uint32_t ppdu_end_timestamp;
|
||||
uint32_t ack_timestamp;
|
||||
struct cdp_tx_completion_ppdu_user user[CDP_MU_MAX_USERS];
|
||||
qdf_nbuf_queue_t mpdu_q;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -1751,6 +1751,7 @@ enum _ol_ath_param_t {
|
||||
OL_ATH_PARAM_RX_MON_LITE = 407,
|
||||
/* wifi down indication used in MBSS feature */
|
||||
OL_ATH_PARAM_WIFI_DOWN_IND = 408,
|
||||
OL_ATH_PARAM_TX_CAPTURE = 409,
|
||||
};
|
||||
|
||||
/* Enumeration of PDEV Configuration parameter */
|
||||
|
@@ -19,13 +19,13 @@
|
||||
#include <htt.h>
|
||||
#include <hal_hw_headers.h>
|
||||
#include <hal_api.h>
|
||||
#include "dp_htt.h"
|
||||
#include "dp_peer.h"
|
||||
#include "dp_types.h"
|
||||
#include "dp_internal.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "htt_stats.h"
|
||||
#include "htt_ppdu_stats.h"
|
||||
#include "dp_htt.h"
|
||||
#include "qdf_mem.h" /* qdf_mem_malloc,free */
|
||||
#include "cdp_txrx_cmn_struct.h"
|
||||
|
||||
@@ -53,47 +53,6 @@ do { \
|
||||
|
||||
#define HTT_MGMT_CTRL_TLV_HDR_RESERVERD_LEN 16
|
||||
|
||||
/**
|
||||
* Bitmap of HTT PPDU TLV types for Default mode
|
||||
*/
|
||||
#define HTT_PPDU_DEFAULT_TLV_BITMAP \
|
||||
(1 << HTT_PPDU_STATS_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)
|
||||
|
||||
/**
|
||||
* Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 64
|
||||
*/
|
||||
#define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_64 \
|
||||
((1 << HTT_PPDU_STATS_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV))
|
||||
|
||||
/**
|
||||
* Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 256
|
||||
*/
|
||||
#define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_256 \
|
||||
((1 << HTT_PPDU_STATS_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV))
|
||||
|
||||
#define HTT_FRAMECTRL_DATATYPE 0x08
|
||||
#define HTT_PPDU_DESC_MAX_DEPTH 16
|
||||
#define DP_SCAN_PEER_ID 0xFFFF
|
||||
|
||||
/*
|
||||
* dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap() - Get ppdu stats tlv
|
||||
* bitmap for sniffer mode
|
||||
@@ -102,8 +61,7 @@ do { \
|
||||
* Return: expected bitmap value, returns zero if doesn't match with
|
||||
* either 64-bit Tx window or 256-bit window tlv bitmap
|
||||
*/
|
||||
|
||||
static inline int
|
||||
int
|
||||
dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap)
|
||||
{
|
||||
if (bitmap == (HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_64))
|
||||
@@ -114,17 +72,15 @@ dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef FEATURE_PERPKT_INFO
|
||||
/*
|
||||
* dp_tx_stats_update() - Update per-peer statistics
|
||||
* @soc: Datapath soc handle
|
||||
* dp_tx_rate_stats_update() - Update rate per-peer statistics
|
||||
* @peer: Datapath peer handle
|
||||
* @ppdu: PPDU Descriptor
|
||||
* @ack_rssi: RSSI of last ack received
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
#ifdef FEATURE_PERPKT_INFO
|
||||
static inline void
|
||||
static void
|
||||
dp_tx_rate_stats_update(struct dp_peer *peer,
|
||||
struct cdp_tx_completion_ppdu_user *ppdu)
|
||||
{
|
||||
@@ -135,7 +91,6 @@ dp_tx_rate_stats_update(struct dp_peer *peer,
|
||||
if (!peer || !ppdu)
|
||||
return;
|
||||
|
||||
|
||||
ratekbps = dp_getrateindex(ppdu->gi,
|
||||
ppdu->mcs,
|
||||
ppdu->nss,
|
||||
@@ -166,8 +121,19 @@ dp_tx_rate_stats_update(struct dp_peer *peer,
|
||||
}
|
||||
}
|
||||
|
||||
static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
|
||||
struct cdp_tx_completion_ppdu_user *ppdu, uint32_t ack_rssi)
|
||||
/*
|
||||
* dp_tx_stats_update() - Update per-peer statistics
|
||||
* @soc: Datapath soc handle
|
||||
* @peer: Datapath peer handle
|
||||
* @ppdu: PPDU Descriptor
|
||||
* @ack_rssi: RSSI of last ack received
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static void
|
||||
dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
|
||||
struct cdp_tx_completion_ppdu_user *ppdu,
|
||||
uint32_t ack_rssi)
|
||||
{
|
||||
struct dp_pdev *pdev = peer->vdev->pdev;
|
||||
uint8_t preamble, mcs;
|
||||
@@ -283,6 +249,18 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#else
|
||||
static inline void
|
||||
dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
|
||||
void *data,
|
||||
uint32_t ppdu_id,
|
||||
uint32_t size)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* htt_htc_pkt_alloc() - Allocate HTC packet buffer
|
||||
* @htt_soc: HTT SOC handle
|
||||
@@ -1848,19 +1826,33 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
|
||||
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
|
||||
|
||||
tag_buf += 2;
|
||||
ppdu_info->sched_cmdid =
|
||||
HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_GET(*tag_buf);
|
||||
ppdu_desc->num_users =
|
||||
HTT_PPDU_STATS_COMMON_TLV_NUM_USERS_GET(*tag_buf);
|
||||
tag_buf++;
|
||||
frame_type = HTT_PPDU_STATS_COMMON_TLV_FRM_TYPE_GET(*tag_buf);
|
||||
|
||||
if ((frame_type == HTT_STATS_FTYPE_TIDQ_DATA_SU) ||
|
||||
(frame_type == HTT_STATS_FTYPE_TIDQ_DATA_MU))
|
||||
ppdu_desc->frame_type = CDP_PPDU_FTYPE_DATA;
|
||||
else if ((frame_type == HTT_STATS_FTYPE_SGEN_MU_BAR) ||
|
||||
(frame_type == HTT_STATS_FTYPE_SGEN_BAR))
|
||||
switch (frame_type) {
|
||||
case HTT_STATS_FTYPE_TIDQ_DATA_SU:
|
||||
case HTT_STATS_FTYPE_TIDQ_DATA_MU:
|
||||
/*
|
||||
* for management packet, frame type come as DATA_SU
|
||||
* need to check frame_ctrl before setting frame_type
|
||||
*/
|
||||
if (HTT_GET_FRAME_CTRL_TYPE(frame_type) <= FRAME_CTRL_TYPE_CTRL)
|
||||
ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL;
|
||||
else
|
||||
ppdu_desc->frame_type = CDP_PPDU_FTYPE_DATA;
|
||||
break;
|
||||
case HTT_STATS_FTYPE_SGEN_MU_BAR:
|
||||
case HTT_STATS_FTYPE_SGEN_BAR:
|
||||
ppdu_desc->frame_type = CDP_PPDU_FTYPE_BAR;
|
||||
else
|
||||
break;
|
||||
default:
|
||||
ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL;
|
||||
break;
|
||||
}
|
||||
|
||||
tag_buf += 2;
|
||||
ppdu_desc->tx_duration = *tag_buf;
|
||||
@@ -2067,6 +2059,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
|
||||
struct cdp_tx_completion_ppdu_user *ppdu_user_desc;
|
||||
uint8_t curr_user_index = 0;
|
||||
uint16_t peer_id;
|
||||
uint32_t size = CDP_BA_64_BIT_MAP_SIZE_DWORDS;
|
||||
|
||||
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
|
||||
|
||||
@@ -2085,7 +2078,12 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
|
||||
|
||||
ppdu_user_desc->start_seq = dp_stats_buf->start_seq;
|
||||
qdf_mem_copy(&ppdu_user_desc->enq_bitmap, &dp_stats_buf->enq_bitmap,
|
||||
CDP_BA_64_BIT_MAP_SIZE_DWORDS);
|
||||
sizeof(uint32_t) * CDP_BA_64_BIT_MAP_SIZE_DWORDS);
|
||||
|
||||
dp_process_ppdu_stats_update_failed_bitmap(pdev,
|
||||
(void *)ppdu_user_desc,
|
||||
ppdu_info->ppdu_id,
|
||||
size);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2108,6 +2106,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
|
||||
struct cdp_tx_completion_ppdu_user *ppdu_user_desc;
|
||||
uint8_t curr_user_index = 0;
|
||||
uint16_t peer_id;
|
||||
uint32_t size = CDP_BA_256_BIT_MAP_SIZE_DWORDS;
|
||||
|
||||
ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf);
|
||||
|
||||
@@ -2126,7 +2125,12 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
|
||||
|
||||
ppdu_user_desc->start_seq = dp_stats_buf->start_seq;
|
||||
qdf_mem_copy(&ppdu_user_desc->enq_bitmap, &dp_stats_buf->enq_bitmap,
|
||||
CDP_BA_256_BIT_MAP_SIZE_DWORDS);
|
||||
sizeof(uint32_t) * CDP_BA_256_BIT_MAP_SIZE_DWORDS);
|
||||
|
||||
dp_process_ppdu_stats_update_failed_bitmap(pdev,
|
||||
(void *)ppdu_user_desc,
|
||||
ppdu_info->ppdu_id,
|
||||
size);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2238,7 +2242,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv(
|
||||
|
||||
ppdu_user_desc->ba_seq_no = dp_stats_buf->ba_seq_no;
|
||||
qdf_mem_copy(&ppdu_user_desc->ba_bitmap, &dp_stats_buf->ba_bitmap,
|
||||
CDP_BA_64_BIT_MAP_SIZE_DWORDS);
|
||||
sizeof(uint32_t) * CDP_BA_64_BIT_MAP_SIZE_DWORDS);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2278,7 +2282,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv(
|
||||
|
||||
ppdu_user_desc->ba_seq_no = dp_stats_buf->ba_seq_no;
|
||||
qdf_mem_copy(&ppdu_user_desc->ba_bitmap, &dp_stats_buf->ba_bitmap,
|
||||
CDP_BA_256_BIT_MAP_SIZE_DWORDS);
|
||||
sizeof(uint32_t) * CDP_BA_256_BIT_MAP_SIZE_DWORDS);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2421,6 +2425,24 @@ static void dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev,
|
||||
dp_peer_unref_del_find_by_id(peer);
|
||||
}
|
||||
|
||||
#ifndef WLAN_TX_PKT_CAPTURE_ENH
|
||||
/*
|
||||
* dp_deliver_mgmt_frm: Process
|
||||
* @pdev: DP PDEV handle
|
||||
* @nbuf: buffer containing the htt_ppdu_stats_tx_mgmtctrl_payload_tlv
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
|
||||
{
|
||||
if (pdev->tx_sniffer_enable || pdev->mcopy_mode) {
|
||||
dp_wdi_event_handler(WDI_EVENT_TX_MGMT_CTRL, pdev->soc,
|
||||
nbuf, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv: Process
|
||||
* htt_ppdu_stats_tx_mgmtctrl_payload_tlv
|
||||
@@ -2439,7 +2461,7 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev,
|
||||
uint8_t trim_size;
|
||||
|
||||
if ((!pdev->tx_sniffer_enable) && (!pdev->mcopy_mode) &&
|
||||
(!pdev->bpr_enable))
|
||||
(!pdev->bpr_enable) && (!pdev->tx_capture_enabled))
|
||||
return QDF_STATUS_SUCCESS;
|
||||
|
||||
trim_size = ((pdev->mgmtctrl_frm_info.mgmt_buf +
|
||||
@@ -2461,11 +2483,8 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev,
|
||||
tag_buf, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
}
|
||||
if (pdev->tx_sniffer_enable || pdev->mcopy_mode) {
|
||||
dp_wdi_event_handler(WDI_EVENT_TX_MGMT_CTRL, pdev->soc,
|
||||
tag_buf, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
}
|
||||
|
||||
dp_deliver_mgmt_frm(pdev, tag_buf);
|
||||
|
||||
return QDF_STATUS_E_ALREADY;
|
||||
}
|
||||
@@ -2555,23 +2574,21 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor
|
||||
* to upper layer
|
||||
* dp_ppdu_desc_user_stats_update(): Function to update TX user stats
|
||||
* @pdev: DP pdev handle
|
||||
* @ppdu_info: per PPDU TLV descriptor
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static
|
||||
void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
||||
struct ppdu_info *ppdu_info)
|
||||
void
|
||||
dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
|
||||
struct ppdu_info *ppdu_info)
|
||||
{
|
||||
struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
|
||||
struct dp_peer *peer = NULL;
|
||||
qdf_nbuf_t nbuf;
|
||||
uint16_t i;
|
||||
uint32_t tlv_bitmap_expected;
|
||||
uint32_t tlv_bitmap_default;
|
||||
uint16_t i;
|
||||
|
||||
ppdu_desc = (struct cdp_tx_completion_ppdu *)
|
||||
qdf_nbuf_data(ppdu_info->nbuf);
|
||||
@@ -2589,7 +2606,6 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
||||
|
||||
tlv_bitmap_default = tlv_bitmap_expected;
|
||||
for (i = 0; i < ppdu_desc->num_users; i++) {
|
||||
|
||||
ppdu_desc->num_mpdu += ppdu_desc->user[i].num_mpdu;
|
||||
ppdu_desc->num_msdu += ppdu_desc->user[i].num_msdu;
|
||||
|
||||
@@ -2620,14 +2636,37 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
||||
(ppdu_desc->frame_type == CDP_PPDU_FTYPE_DATA)) {
|
||||
|
||||
dp_tx_stats_update(pdev->soc, peer,
|
||||
&ppdu_desc->user[i],
|
||||
ppdu_desc->ack_rssi);
|
||||
&ppdu_desc->user[i],
|
||||
ppdu_desc->ack_rssi);
|
||||
}
|
||||
|
||||
dp_tx_rate_stats_update(peer, &ppdu_desc->user[i]);
|
||||
dp_peer_unref_del_find_by_id(peer);
|
||||
tlv_bitmap_expected = tlv_bitmap_default;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef WLAN_TX_PKT_CAPTURE_ENH
|
||||
|
||||
/**
|
||||
* dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor
|
||||
* to upper layer
|
||||
* @pdev: DP pdev handle
|
||||
* @ppdu_info: per PPDU TLV descriptor
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
static
|
||||
void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
||||
struct ppdu_info *ppdu_info)
|
||||
{
|
||||
struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
|
||||
qdf_nbuf_t nbuf;
|
||||
|
||||
ppdu_desc = (struct cdp_tx_completion_ppdu *)
|
||||
qdf_nbuf_data(ppdu_info->nbuf);
|
||||
|
||||
dp_ppdu_desc_user_stats_update(pdev, ppdu_info);
|
||||
|
||||
/*
|
||||
* Remove from the list
|
||||
@@ -2665,6 +2704,8 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev,
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dp_get_ppdu_desc(): Function to allocate new PPDU status
|
||||
* desc for new ppdu id
|
||||
@@ -2898,9 +2939,11 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
|
||||
QDF_STATUS_SUCCESS)
|
||||
free_buf = false;
|
||||
|
||||
pdev->mgmtctrl_frm_info.mgmt_buf = NULL;
|
||||
pdev->mgmtctrl_frm_info.mgmt_buf_len = 0;
|
||||
pdev->mgmtctrl_frm_info.ppdu_id = 0;
|
||||
if (free_buf) {
|
||||
pdev->mgmtctrl_frm_info.mgmt_buf = NULL;
|
||||
pdev->mgmtctrl_frm_info.mgmt_buf_len = 0;
|
||||
pdev->mgmtctrl_frm_info.ppdu_id = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (ppdu_info)
|
||||
|
@@ -24,6 +24,9 @@
|
||||
#include <qdf_nbuf.h>
|
||||
#include <htc_api.h>
|
||||
|
||||
#include "cdp_txrx_cmn_struct.h"
|
||||
#include "dp_types.h"
|
||||
|
||||
#define HTT_TX_MUTEX_TYPE qdf_spinlock_t
|
||||
|
||||
#define HTT_TX_MUTEX_INIT(_mutex) \
|
||||
@@ -40,6 +43,22 @@
|
||||
|
||||
#define DP_HTT_MAX_SEND_QUEUE_DEPTH 64
|
||||
|
||||
#ifndef HTT_MAC_ADDR_LEN
|
||||
#define HTT_MAC_ADDR_LEN 6
|
||||
#endif
|
||||
|
||||
#define HTT_FRAMECTRL_TYPE_MASK 0x0C
|
||||
#define HTT_GET_FRAME_CTRL_TYPE(_val) \
|
||||
(((_val) & HTT_FRAMECTRL_TYPE_MASK) >> 2)
|
||||
#define FRAME_CTRL_TYPE_MGMT 0x0
|
||||
#define FRAME_CTRL_TYPE_CTRL 0x1
|
||||
#define FRAME_CTRL_TYPE_DATA 0x2
|
||||
#define FRAME_CTRL_TYPE_RESV 0x3
|
||||
|
||||
#define HTT_FRAMECTRL_DATATYPE 0x08
|
||||
#define HTT_PPDU_DESC_MAX_DEPTH 16
|
||||
#define DP_SCAN_PEER_ID 0xFFFF
|
||||
|
||||
#define DP_HTT_HTC_PKT_MISCLIST_SIZE 256
|
||||
|
||||
#define HTT_T2H_EXT_STATS_TLV_START_OFFSET 3
|
||||
@@ -223,4 +242,18 @@ struct htt_stats_context {
|
||||
uint32_t msg_len;
|
||||
};
|
||||
|
||||
int
|
||||
dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap);
|
||||
|
||||
/**
|
||||
* dp_ppdu_desc_user_stats_update(): Function to update TX user stats
|
||||
* @pdev: DP pdev handle
|
||||
* @ppdu_info: per PPDU TLV descriptor
|
||||
*
|
||||
* return: void
|
||||
*/
|
||||
void
|
||||
dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
|
||||
struct ppdu_info *ppdu_info);
|
||||
|
||||
#endif /* _DP_HTT_H_ */
|
||||
|
@@ -35,6 +35,64 @@
|
||||
/* Macro For NYSM value received in VHT TLV */
|
||||
#define VHT_SGI_NYSM 3
|
||||
|
||||
/* PPDU STATS CFG */
|
||||
#define DP_PPDU_STATS_CFG_ALL 0xFFFF
|
||||
|
||||
/* PPDU stats mask sent to FW to enable enhanced stats */
|
||||
#define DP_PPDU_STATS_CFG_ENH_STATS 0xE67
|
||||
/* PPDU stats mask sent to FW to support debug sniffer feature */
|
||||
#define DP_PPDU_STATS_CFG_SNIFFER 0x2FFF
|
||||
/* PPDU stats mask sent to FW to support BPR feature*/
|
||||
#define DP_PPDU_STATS_CFG_BPR 0x2000
|
||||
/* PPDU stats mask sent to FW to support BPR and enhanced stats feature */
|
||||
#define DP_PPDU_STATS_CFG_BPR_ENH (DP_PPDU_STATS_CFG_BPR | \
|
||||
DP_PPDU_STATS_CFG_ENH_STATS)
|
||||
/* PPDU stats mask sent to FW to support BPR and pcktlog stats feature */
|
||||
#define DP_PPDU_STATS_CFG_BPR_PKTLOG (DP_PPDU_STATS_CFG_BPR | \
|
||||
DP_PPDU_TXLITE_STATS_BITMASK_CFG)
|
||||
|
||||
/**
|
||||
* Bitmap of HTT PPDU TLV types for Default mode
|
||||
*/
|
||||
#define HTT_PPDU_DEFAULT_TLV_BITMAP \
|
||||
(1 << HTT_PPDU_STATS_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)
|
||||
|
||||
/**
|
||||
* Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 64
|
||||
*/
|
||||
#define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_64 \
|
||||
((1 << HTT_PPDU_STATS_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV))
|
||||
|
||||
/**
|
||||
* Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 256
|
||||
*/
|
||||
#define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_256 \
|
||||
((1 << HTT_PPDU_STATS_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \
|
||||
(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV))
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
extern uint8_t
|
||||
dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS];
|
||||
#endif
|
||||
|
||||
#if DP_PRINT_ENABLE
|
||||
#include <stdarg.h> /* va_list */
|
||||
#include <qdf_types.h> /* qdf_vprint */
|
||||
@@ -676,6 +734,7 @@ extern void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer);
|
||||
extern void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer);
|
||||
extern void dp_peer_find_hash_erase(struct dp_soc *soc);
|
||||
extern void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer);
|
||||
void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer);
|
||||
extern void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer);
|
||||
extern void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer);
|
||||
extern void dp_peer_unref_delete(void *peer_handle);
|
||||
@@ -1006,4 +1065,57 @@ void dp_pdev_print_delay_stats(struct dp_pdev *pdev);
|
||||
*/
|
||||
void dp_pdev_print_tid_stats(struct dp_pdev *pdev);
|
||||
#endif /* CONFIG_WIN */
|
||||
|
||||
void dp_soc_set_txrx_ring_map(struct dp_soc *soc);
|
||||
|
||||
#ifndef WLAN_TX_PKT_CAPTURE_ENH
|
||||
/**
|
||||
* dp_tx_ppdu_stats_attach - Initialize Tx PPDU stats and enhanced capture
|
||||
* @pdev: DP PDEV
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_tx_ppdu_stats_detach - Cleanup Tx PPDU stats and enhanced capture
|
||||
* @pdev: DP PDEV
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_tx_ppdu_stats_process - Deferred PPDU stats handler
|
||||
* @context: Opaque work context (PDEV)
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void dp_tx_ppdu_stats_process(void *context)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_tx_add_to_comp_queue() - add completion msdu to queue
|
||||
* @soc: DP Soc handle
|
||||
* @tx_desc: software Tx descriptor
|
||||
* @ts : Tx completion status from HAL/HTT descriptor
|
||||
* @peer: DP peer
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline
|
||||
QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc,
|
||||
struct dp_tx_desc_s *desc,
|
||||
struct hal_tx_completion_status *ts,
|
||||
struct dp_peer *peer)
|
||||
{
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* #ifndef _DP_INTERNAL_H_ */
|
||||
|
@@ -27,7 +27,6 @@
|
||||
#include <htt.h>
|
||||
#include <wdi_event.h>
|
||||
#include <queue.h>
|
||||
#include "dp_htt.h"
|
||||
#include "dp_types.h"
|
||||
#include "dp_internal.h"
|
||||
#include "dp_tx.h"
|
||||
@@ -46,6 +45,8 @@
|
||||
#include "dp_peer.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "htt_stats.h"
|
||||
#include "htt_ppdu_stats.h"
|
||||
#include "dp_htt.h"
|
||||
#include "qdf_mem.h" /* qdf_mem_malloc,free */
|
||||
#include "cfg_ucfg_api.h"
|
||||
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
|
||||
@@ -84,6 +85,23 @@ dp_config_enh_rx_capture(struct cdp_pdev *pdev_handle, int val)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#else
|
||||
/*
|
||||
* dp_config_enh_tx_capture()- API to enable/disable enhanced tx capture
|
||||
* @pdev_handle: DP_PDEV handle
|
||||
* @val: user provided value
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static QDF_STATUS
|
||||
dp_config_enh_tx_capture(struct cdp_pdev *pdev_handle, int val)
|
||||
{
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
void *dp_soc_init(void *dpsoc, HTC_HANDLE htc_handle, void *hif_handle);
|
||||
static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force);
|
||||
static struct dp_soc *
|
||||
@@ -136,21 +154,6 @@ bool is_dp_verbose_debug_enabled;
|
||||
|
||||
#define STR_MAXLEN 64
|
||||
|
||||
#define DP_PPDU_STATS_CFG_ALL 0xFFFF
|
||||
|
||||
/* PPDU stats mask sent to FW to enable enhanced stats */
|
||||
#define DP_PPDU_STATS_CFG_ENH_STATS 0xE67
|
||||
/* PPDU stats mask sent to FW to support debug sniffer feature */
|
||||
#define DP_PPDU_STATS_CFG_SNIFFER 0x2FFF
|
||||
/* PPDU stats mask sent to FW to support BPR feature*/
|
||||
#define DP_PPDU_STATS_CFG_BPR 0x2000
|
||||
/* PPDU stats mask sent to FW to support BPR and enhanced stats feature */
|
||||
#define DP_PPDU_STATS_CFG_BPR_ENH (DP_PPDU_STATS_CFG_BPR | \
|
||||
DP_PPDU_STATS_CFG_ENH_STATS)
|
||||
/* PPDU stats mask sent to FW to support BPR and pcktlog stats feature */
|
||||
#define DP_PPDU_STATS_CFG_BPR_PKTLOG (DP_PPDU_STATS_CFG_BPR | \
|
||||
DP_PPDU_TXLITE_STATS_BITMASK_CFG)
|
||||
|
||||
#define RNG_ERR "SRNG setup failed for"
|
||||
|
||||
/* Threshold for peer's cached buf queue beyond which frames are dropped */
|
||||
@@ -289,28 +292,21 @@ static const struct dp_rate_debug dp_rate_string[DOT11_MAX][MAX_MCS] = {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* dp_cpu_ring_map_type - dp tx cpu ring map
|
||||
* @DP_NSS_DEFAULT_MAP: Default mode with no NSS offloaded
|
||||
* @DP_NSS_FIRST_RADIO_OFFLOADED_MAP: Only First Radio is offloaded
|
||||
* @DP_NSS_SECOND_RADIO_OFFLOADED_MAP: Only second radio is offloaded
|
||||
* @DP_NSS_DBDC_OFFLOADED_MAP: Both radios are offloaded
|
||||
* @DP_NSS_DBTC_OFFLOADED_MAP: All three radios are offloaded
|
||||
* @DP_NSS_CPU_RING_MAP_MAX: Max cpu ring map val
|
||||
*/
|
||||
enum dp_cpu_ring_map_types {
|
||||
DP_NSS_DEFAULT_MAP,
|
||||
DP_NSS_FIRST_RADIO_OFFLOADED_MAP,
|
||||
DP_NSS_SECOND_RADIO_OFFLOADED_MAP,
|
||||
DP_NSS_DBDC_OFFLOADED_MAP,
|
||||
DP_NSS_DBTC_OFFLOADED_MAP,
|
||||
DP_NSS_CPU_RING_MAP_MAX
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Cpu to tx ring map
|
||||
*/
|
||||
#ifdef CONFIG_WIN
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
uint8_t
|
||||
dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = {
|
||||
{0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2},
|
||||
{0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1},
|
||||
{0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0},
|
||||
{0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2},
|
||||
{0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3},
|
||||
{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}
|
||||
};
|
||||
#else
|
||||
static uint8_t
|
||||
dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = {
|
||||
{0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2, 0x0, 0x0, 0x1, 0x2},
|
||||
@@ -319,6 +315,7 @@ dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = {
|
||||
{0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2},
|
||||
{0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3}
|
||||
};
|
||||
#endif
|
||||
#else
|
||||
static uint8_t
|
||||
dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS] = {
|
||||
@@ -3484,6 +3481,7 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
|
||||
qdf_event_create(&pdev->fw_peer_stats_event);
|
||||
|
||||
pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
||||
dp_tx_ppdu_stats_attach(pdev);
|
||||
|
||||
return (struct cdp_pdev *)pdev;
|
||||
|
||||
@@ -3769,6 +3767,8 @@ static void dp_pdev_detach(struct cdp_pdev *txrx_pdev, int force)
|
||||
|
||||
dp_mon_link_free(pdev);
|
||||
|
||||
dp_tx_ppdu_stats_detach(pdev);
|
||||
|
||||
/* Cleanup per PDEV REO rings if configured */
|
||||
if (wlan_cfg_per_pdev_rx_ring(soc->wlan_cfg_ctx)) {
|
||||
dp_srng_cleanup(soc, &soc->reo_dest_ring[pdev->pdev_id],
|
||||
@@ -5200,6 +5200,8 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl)
|
||||
qdf_atomic_set(&peer->is_default_route_set, 1);
|
||||
|
||||
dp_peer_rx_init(pdev, peer);
|
||||
dp_peer_tx_init(pdev, peer);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -6825,6 +6827,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev)
|
||||
DP_PRINT_STATS(" Tag[%d] = %llu", index,
|
||||
pdev->stats.ppdu_stats_counter[index]);
|
||||
}
|
||||
DP_PRINT_STATS("tx_ppdu_proc: %llu\n",
|
||||
pdev->tx_ppdu_proc);
|
||||
|
||||
for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
|
||||
if (!pdev->stats.wdi_event[i])
|
||||
@@ -8100,6 +8104,8 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_pdev *pdev_handle,
|
||||
break;
|
||||
case CDP_CONFIG_ENH_RX_CAPTURE:
|
||||
return dp_config_enh_rx_capture(pdev_handle, val);
|
||||
case CDP_CONFIG_TX_CAPTURE:
|
||||
return dp_config_enh_tx_capture(pdev_handle, val);
|
||||
default:
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
@@ -10137,7 +10143,7 @@ static struct cdp_ops dp_txrx_ops = {
|
||||
*
|
||||
* Return: Void
|
||||
*/
|
||||
static void dp_soc_set_txrx_ring_map(struct dp_soc *soc)
|
||||
void dp_soc_set_txrx_ring_map(struct dp_soc *soc)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
|
||||
|
@@ -34,6 +34,10 @@
|
||||
#include <cdp_txrx_handle.h>
|
||||
#include <wlan_cfg.h>
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
|
||||
#ifdef DP_LFR
|
||||
static inline void
|
||||
dp_set_ssn_valid_flag(struct hal_reo_cmd_params *params,
|
||||
@@ -2061,6 +2065,62 @@ static void dp_peer_setup_remaining_tids(struct dp_peer *peer)
|
||||
#else
|
||||
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
|
||||
* @peer: Datapath peer
|
||||
*
|
||||
*/
|
||||
void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer)
|
||||
{
|
||||
dp_peer_tid_queue_init(peer);
|
||||
dp_peer_update_80211_hdr(peer->vdev, peer);
|
||||
}
|
||||
|
||||
/*
|
||||
* dp_peer_tx_cleanup() – Deinitialize receive TID state
|
||||
* @vdev: Datapath vdev
|
||||
* @peer: Datapath peer
|
||||
*
|
||||
*/
|
||||
static inline void
|
||||
dp_peer_tx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer)
|
||||
{
|
||||
dp_peer_tid_queue_cleanup(peer);
|
||||
}
|
||||
|
||||
/*
|
||||
* dp_peer_rx_init() – Initialize receive TID state
|
||||
* @pdev: Datapath pdev
|
||||
@@ -2162,6 +2222,8 @@ void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer)
|
||||
peer->last_disassoc_rcvd = 0;
|
||||
peer->last_deauth_rcvd = 0;
|
||||
|
||||
dp_peer_tx_cleanup(vdev, peer);
|
||||
|
||||
/* cleanup the Rx reorder queues for this peer */
|
||||
dp_peer_rx_cleanup(vdev, peer);
|
||||
}
|
||||
|
@@ -16,9 +16,12 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#include "qdf_types.h"
|
||||
#include "htt_stats.h"
|
||||
#include "dp_peer.h"
|
||||
#include "dp_types.h"
|
||||
#include "dp_internal.h"
|
||||
#include "htt_stats.h"
|
||||
#include "htt_ppdu_stats.h"
|
||||
#include "dp_htt.h"
|
||||
|
||||
#define DP_MAX_STRING_LEN 500
|
||||
|
||||
@@ -80,6 +83,10 @@ const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* dp_print_stats_string_tlv: display htt_stats_string_tlv
|
||||
* @tag_buf: buffer containing the tlv htt_stats_string_tlv
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include "if_meta_hdr.h"
|
||||
#endif
|
||||
#include "enet.h"
|
||||
#include "dp_internal.h"
|
||||
|
||||
#define DP_TX_QUEUE_MASK 0x3
|
||||
|
||||
@@ -59,6 +60,10 @@ static const uint8_t sec_type_map[MAX_CDP_SEC_TYPE] = {
|
||||
HAL_TX_ENCRYPT_TYPE_AES_GCMP_256,
|
||||
HAL_TX_ENCRYPT_TYPE_WAPI_GCM_SM4};
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dp_tx_get_queue() - Returns Tx queue IDs to be used for this Tx frame
|
||||
* @vdev: DP Virtual device handle
|
||||
@@ -3041,19 +3046,30 @@ dp_tx_comp_process_desc(struct dp_soc *soc,
|
||||
time_latency = (qdf_ktime_to_ms(qdf_ktime_get()) -
|
||||
desc->timestamp);
|
||||
}
|
||||
if (!(desc->msdu_ext_desc) &&
|
||||
(dp_get_completion_indication_for_stack(soc, desc->pdev,
|
||||
peer, ts, desc->nbuf,
|
||||
time_latency)
|
||||
== QDF_STATUS_SUCCESS)) {
|
||||
qdf_nbuf_unmap(soc->osdev, desc->nbuf,
|
||||
QDF_DMA_TO_DEVICE);
|
||||
if (!(desc->msdu_ext_desc)) {
|
||||
if (QDF_STATUS_SUCCESS ==
|
||||
dp_tx_add_to_comp_queue(soc, desc, ts, peer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
dp_send_completion_to_stack(soc, desc->pdev, ts->peer_id,
|
||||
ts->ppdu_id, desc->nbuf);
|
||||
} else {
|
||||
dp_tx_comp_free_buf(soc, desc);
|
||||
if (QDF_STATUS_SUCCESS ==
|
||||
dp_get_completion_indication_for_stack(soc,
|
||||
desc->pdev,
|
||||
peer, ts,
|
||||
desc->nbuf,
|
||||
time_latency)) {
|
||||
qdf_nbuf_unmap(soc->osdev, desc->nbuf,
|
||||
QDF_DMA_TO_DEVICE);
|
||||
dp_send_completion_to_stack(soc,
|
||||
desc->pdev,
|
||||
ts->peer_id,
|
||||
ts->ppdu_id,
|
||||
desc->nbuf);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dp_tx_comp_free_buf(soc, desc);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -57,6 +57,10 @@
|
||||
#include <pktlog.h>
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
|
||||
#define REPT_MU_MIMO 1
|
||||
#define REPT_MU_OFDMA_MIMO 3
|
||||
#define DP_VO_TID 6
|
||||
@@ -240,6 +244,32 @@ enum dp_nss_cfg {
|
||||
dp_nss_cfg_max
|
||||
};
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#define DP_CPU_RING_MAP_1 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dp_cpu_ring_map_type - dp tx cpu ring map
|
||||
* @DP_NSS_DEFAULT_MAP: Default mode with no NSS offloaded
|
||||
* @DP_NSS_FIRST_RADIO_OFFLOADED_MAP: Only First Radio is offloaded
|
||||
* @DP_NSS_SECOND_RADIO_OFFLOADED_MAP: Only second radio is offloaded
|
||||
* @DP_NSS_DBDC_OFFLOADED_MAP: Both radios are offloaded
|
||||
* @DP_NSS_DBTC_OFFLOADED_MAP: All three radios are offloaded
|
||||
* @DP_SINGLE_TX_RING_MAP: to avoid out of order all cpu mapped to single ring
|
||||
* @DP_NSS_CPU_RING_MAP_MAX: Max cpu ring map val
|
||||
*/
|
||||
enum dp_cpu_ring_map_types {
|
||||
DP_NSS_DEFAULT_MAP,
|
||||
DP_NSS_FIRST_RADIO_OFFLOADED_MAP,
|
||||
DP_NSS_SECOND_RADIO_OFFLOADED_MAP,
|
||||
DP_NSS_DBDC_OFFLOADED_MAP,
|
||||
DP_NSS_DBTC_OFFLOADED_MAP,
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
DP_SINGLE_TX_RING_MAP,
|
||||
#endif
|
||||
DP_NSS_CPU_RING_MAP_MAX
|
||||
};
|
||||
|
||||
/**
|
||||
* struct rx_desc_pool
|
||||
* @pool_size: number of RX descriptor in the pool
|
||||
@@ -1113,9 +1143,16 @@ struct dp_neighbour_peer {
|
||||
TAILQ_ENTRY(dp_neighbour_peer) neighbour_peer_list_elem;
|
||||
};
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#define WLAN_TX_PKT_CAPTURE_ENH 1
|
||||
#define DP_TX_PPDU_PROC_THRESHOLD 8
|
||||
#define DP_TX_PPDU_PROC_TIMEOUT 10
|
||||
#endif
|
||||
|
||||
/**
|
||||
* 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
|
||||
@@ -1123,9 +1160,11 @@ struct dp_neighbour_peer {
|
||||
* @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
|
||||
*/
|
||||
struct ppdu_info {
|
||||
uint32_t ppdu_id;
|
||||
uint32_t sched_cmdid;
|
||||
uint32_t max_ppdu_id;
|
||||
uint16_t tlv_bitmap;
|
||||
uint16_t last_tlv_cnt;
|
||||
@@ -1133,7 +1172,38 @@ struct ppdu_info {
|
||||
is_ampdu:1;
|
||||
qdf_nbuf_t nbuf;
|
||||
struct cdp_tx_completion_ppdu *ppdu_desc;
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
union {
|
||||
TAILQ_ENTRY(ppdu_info) ppdu_info_dlist_elem;
|
||||
STAILQ_ENTRY(ppdu_info) ppdu_info_slist_elem;
|
||||
} ulist;
|
||||
#define ppdu_info_list_elem ulist.ppdu_info_dlist_elem
|
||||
#define ppdu_info_queue_elem ulist.ppdu_info_slist_elem
|
||||
#else
|
||||
TAILQ_ENTRY(ppdu_info) ppdu_info_list_elem;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* struct msdu_completion_info - wbm msdu completion info
|
||||
* @ppdu_id - Unique ppduid assigned by firmware for every tx packet
|
||||
* @peer_id - peer_id
|
||||
* @tid - tid which used during transmit
|
||||
* @first_msdu - first msdu indication
|
||||
* @last_msdu - last msdu indication
|
||||
* @msdu_part_of_amsdu - msdu part of amsdu
|
||||
* @transmit_cnt - retried count
|
||||
* @tsf - timestamp which it transmitted
|
||||
*/
|
||||
struct msdu_completion_info {
|
||||
uint32_t ppdu_id;
|
||||
uint16_t peer_id;
|
||||
uint8_t tid;
|
||||
uint8_t first_msdu:1,
|
||||
last_msdu:1,
|
||||
msdu_part_of_amsdu:1;
|
||||
uint8_t transmit_cnt;
|
||||
uint32_t tsf;
|
||||
};
|
||||
|
||||
#ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
|
||||
@@ -1150,6 +1220,14 @@ struct rx_protocol_tag_stats {
|
||||
|
||||
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
|
||||
|
||||
#ifndef WLAN_TX_PKT_CAPTURE_ENH
|
||||
struct dp_pdev_tx_capture {
|
||||
};
|
||||
|
||||
struct dp_peer_tx_capture {
|
||||
};
|
||||
#endif
|
||||
|
||||
/* PDEV level structure for data path */
|
||||
struct dp_pdev {
|
||||
/**
|
||||
@@ -1401,6 +1479,7 @@ struct dp_pdev {
|
||||
uint32_t ppdu_id;
|
||||
bool first_nbuf;
|
||||
struct {
|
||||
qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */
|
||||
uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */
|
||||
uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */
|
||||
uint32_t ppdu_id;
|
||||
@@ -1471,6 +1550,12 @@ struct dp_pdev {
|
||||
rx_err_proto_tag_stats[RX_PROTOCOL_TAG_MAX];
|
||||
#endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */
|
||||
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
|
||||
|
||||
/* tx packet capture enhancement */
|
||||
bool tx_capture_enabled;
|
||||
struct dp_pdev_tx_capture tx_capture;
|
||||
/* stats counter for tx ppdu processed */
|
||||
uint64_t tx_ppdu_proc;
|
||||
};
|
||||
|
||||
struct dp_peer;
|
||||
@@ -1702,6 +1787,8 @@ struct dp_peer {
|
||||
|
||||
/* TID structures */
|
||||
struct dp_rx_tid rx_tid[DP_MAX_TIDS];
|
||||
struct dp_peer_tx_capture tx_capture;
|
||||
|
||||
|
||||
/* TBD: No transmit TID state required? */
|
||||
|
||||
|
@@ -363,6 +363,7 @@ typedef bool (*qdf_irqlocked_func_t)(void *);
|
||||
* @QDF_MODULE_ID_SM_ENGINE: SM engine module ID
|
||||
* @QDF_MODULE_ID_CMN_MLME: CMN MLME module ID
|
||||
* @QDF_MODULE_ID_CFR: CFR module ID
|
||||
* @QDF_MODULE_ID_TX_CAPTURE: Tx capture enhancement feature ID
|
||||
* @QDF_MODULE_ID_ANY: anything
|
||||
* @QDF_MODULE_ID_MAX: Max place holder module ID
|
||||
*/
|
||||
@@ -475,6 +476,7 @@ typedef enum {
|
||||
QDF_MODULE_ID_CMN_MLME,
|
||||
QDF_MODULE_ID_BSSCOLOR,
|
||||
QDF_MODULE_ID_CFR,
|
||||
QDF_MODULE_ID_TX_CAPTURE,
|
||||
QDF_MODULE_ID_ANY,
|
||||
QDF_MODULE_ID_MAX,
|
||||
} QDF_MODULE_ID;
|
||||
|
@@ -2892,6 +2892,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = {
|
||||
[QDF_MODULE_ID_CMN_MLME] = {"CMN_MLME"},
|
||||
[QDF_MODULE_ID_BSSCOLOR] = {"BSSCOLOR"},
|
||||
[QDF_MODULE_ID_CFR] = {"CFR"},
|
||||
[QDF_MODULE_ID_TX_CAPTURE] = {"TX_CAPTURE_ENHANCE"},
|
||||
[QDF_MODULE_ID_ANY] = {"ANY"},
|
||||
};
|
||||
qdf_export_symbol(g_qdf_category_name);
|
||||
@@ -3347,6 +3348,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_ANY] = QDF_TRACE_LEVEL_INFO,
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user