qcacmn: Move monitor related fields from soc/pdev to mon_soc/mon_pdev
PATCH[6/7]: This patch consists following changes: -Move monitor related pdev variables to struct dp_mon_pdev -Move monitor relted soc variables to struct dp_mon_soc -Move cookie to monitor link desc va to monitor file -Add APIs to access monitor related variables -Add dummy APIs to build without monitor support. Change-Id: I032a480b1383d061f984cee3ba6b10ac7a0ff350 CRs-Fixed: 2983781
This commit is contained in:

committed by
Madan Koyyalamudi

parent
c4796962ca
commit
53fe7000ba
@@ -23,7 +23,6 @@
|
||||
#include "dp_types.h"
|
||||
#include "dp_internal.h"
|
||||
#include "dp_rx.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "htt_stats.h"
|
||||
#include "htt_ppdu_stats.h"
|
||||
#include "dp_htt.h"
|
||||
@@ -57,71 +56,6 @@
|
||||
((pkt->htc_pkt.Status != QDF_STATUS_E_CANCELED) && \
|
||||
(pkt->htc_pkt.Status != QDF_STATUS_E_RESOURCES))
|
||||
|
||||
QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc,
|
||||
uint32_t mac_id,
|
||||
uint32_t event,
|
||||
qdf_nbuf_t mpdu,
|
||||
uint32_t msdu_timestamp)
|
||||
{
|
||||
uint32_t data_size, hdr_size, ppdu_id, align4byte;
|
||||
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
|
||||
uint32_t *msg_word;
|
||||
|
||||
if (!pdev)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
|
||||
|
||||
hdr_size = HTT_T2H_PPDU_STATS_IND_HDR_SIZE
|
||||
+ qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload);
|
||||
|
||||
data_size = qdf_nbuf_len(mpdu);
|
||||
|
||||
qdf_nbuf_push_head(mpdu, hdr_size);
|
||||
|
||||
msg_word = (uint32_t *)qdf_nbuf_data(mpdu);
|
||||
/*
|
||||
* Populate the PPDU Stats Indication header
|
||||
*/
|
||||
HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_T2H_MSG_TYPE_PPDU_STATS_IND);
|
||||
HTT_T2H_PPDU_STATS_MAC_ID_SET(*msg_word, mac_id);
|
||||
HTT_T2H_PPDU_STATS_PDEV_ID_SET(*msg_word, pdev->pdev_id);
|
||||
align4byte = ((data_size +
|
||||
qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload)
|
||||
+ 3) >> 2) << 2;
|
||||
HTT_T2H_PPDU_STATS_PAYLOAD_SIZE_SET(*msg_word, align4byte);
|
||||
msg_word++;
|
||||
HTT_T2H_PPDU_STATS_PPDU_ID_SET(*msg_word, ppdu_id);
|
||||
msg_word++;
|
||||
|
||||
*msg_word = msdu_timestamp;
|
||||
msg_word++;
|
||||
/* Skip reserved field */
|
||||
msg_word++;
|
||||
/*
|
||||
* Populate MGMT_CTRL Payload TLV first
|
||||
*/
|
||||
HTT_STATS_TLV_TAG_SET(*msg_word,
|
||||
HTT_PPDU_STATS_RX_MGMTCTRL_PAYLOAD_TLV);
|
||||
|
||||
align4byte = ((data_size - sizeof(htt_tlv_hdr_t) +
|
||||
qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload)
|
||||
+ 3) >> 2) << 2;
|
||||
HTT_STATS_TLV_LENGTH_SET(*msg_word, align4byte);
|
||||
msg_word++;
|
||||
|
||||
HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_SET(
|
||||
*msg_word, data_size);
|
||||
msg_word++;
|
||||
|
||||
dp_wdi_event_handler(event, soc, (void *)mpdu,
|
||||
HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id);
|
||||
|
||||
qdf_nbuf_pull_head(mpdu, hdr_size);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* htt_htc_pkt_alloc() - Allocate HTC packet buffer
|
||||
* @htt_soc: HTT SOC handle
|
||||
|
@@ -454,6 +454,19 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc)
|
||||
#endif
|
||||
|
||||
#ifndef WIFI_MONITOR_SUPPORT
|
||||
#define MON_BUF_MIN_ENTRIES 64
|
||||
static inline struct qdf_mem_multi_page_t*
|
||||
monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline uint32_t *
|
||||
monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline QDF_STATUS monitor_drop_inv_peer_pkts(struct dp_vdev *vdev,
|
||||
struct ieee80211_frame *wh)
|
||||
{
|
||||
@@ -482,6 +495,97 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev)
|
||||
static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
|
||||
struct dp_peer *ta_peer,
|
||||
uint8_t *mac_addr,
|
||||
qdf_nbuf_t nbuf,
|
||||
uint32_t flags)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline
|
||||
void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
|
||||
struct dp_vdev *vdev,
|
||||
struct dp_neighbour_peer *peer)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline enum reg_wifi_band
|
||||
monitor_get_chan_band(struct dp_pdev *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void monitor_get_mpdu_status(struct dp_pdev *pdev,
|
||||
struct dp_soc *soc,
|
||||
uint8_t *rx_tlv_hdr)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void monitor_print_tx_stats(struct dp_pdev *pdev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
QDF_STATUS monitor_mcopy_check_deliver(struct dp_pdev *pdev,
|
||||
uint16_t peer_id, uint32_t ppdu_id,
|
||||
uint8_t first_msdu)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct dp_vdev*
|
||||
monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
|
||||
void *rx_desc)
|
||||
{
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
static inline struct mon_rx_status*
|
||||
monitor_get_rx_status_addr(struct dp_pdev *pdev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define DP_MAX_TIMER_EXEC_TIME_TICKS \
|
||||
@@ -2021,15 +2125,6 @@ void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc,
|
||||
int dp_wdi_event_attach(struct dp_pdev *txrx_pdev);
|
||||
int dp_wdi_event_detach(struct dp_pdev *txrx_pdev);
|
||||
|
||||
/**
|
||||
* dp_get_pldev() - function to get pktlog device handle
|
||||
* @soc_hdl: datapath soc handle
|
||||
* @pdev_id: physical device id
|
||||
*
|
||||
* Return: pktlog device handle or NULL
|
||||
*/
|
||||
void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
|
||||
|
||||
static inline void
|
||||
dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
|
||||
void *cb_context,
|
||||
@@ -2642,18 +2737,6 @@ static inline uint32_t dp_history_get_next_index(qdf_atomic_t *curr_idx,
|
||||
*/
|
||||
void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding);
|
||||
|
||||
/**
|
||||
* dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
|
||||
* @soc: DP soc handle
|
||||
*
|
||||
* Return: Full monitor mode status
|
||||
*/
|
||||
static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
|
||||
{
|
||||
return (pdev->soc->full_mon_mode && pdev->monitor_configured) ?
|
||||
true : false;
|
||||
}
|
||||
|
||||
#ifndef FEATURE_WDS
|
||||
static inline void
|
||||
dp_hmwds_ast_add_notify(struct dp_peer *peer,
|
||||
|
@@ -139,7 +139,7 @@ QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
|
||||
|
||||
for (i = 0; i < soc->pdev_count; i++) {
|
||||
pdev = soc->pdev_list[i];
|
||||
if (pdev && pdev->monitor_configured)
|
||||
if (pdev && monitor_is_configured(pdev))
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@@ -32,7 +32,6 @@
|
||||
#include "dp_tx.h"
|
||||
#include "dp_tx_desc.h"
|
||||
#include "dp_rx.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#ifdef DP_RATETABLE_SUPPORT
|
||||
#include "dp_ratetable.h"
|
||||
#endif
|
||||
@@ -44,7 +43,6 @@
|
||||
#include "cdp_txrx_cmn_reg.h"
|
||||
#include <qdf_util.h>
|
||||
#include "dp_peer.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "htt_stats.h"
|
||||
#include "dp_htt.h"
|
||||
#ifdef WLAN_SUPPORT_RX_FISA
|
||||
@@ -53,14 +51,10 @@
|
||||
#include "htt_ppdu_stats.h"
|
||||
#include "qdf_mem.h" /* qdf_mem_malloc,free */
|
||||
#include "cfg_ucfg_api.h"
|
||||
#include "dp_mon_filter.h"
|
||||
|
||||
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
|
||||
#include "cdp_txrx_flow_ctrl_v2.h"
|
||||
#else
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include <dp_mon.h>
|
||||
#endif
|
||||
|
||||
static inline void
|
||||
cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
|
||||
@@ -68,6 +62,9 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include <dp_mon.h>
|
||||
#endif
|
||||
#include "dp_ipa.h"
|
||||
#include "dp_cal_client_api.h"
|
||||
#ifdef FEATURE_WDS
|
||||
@@ -2509,6 +2506,7 @@ static void dp_interrupt_timer(void *arg)
|
||||
uint8_t dp_intr_id = wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx);
|
||||
uint32_t lmac_iter;
|
||||
int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx);
|
||||
enum reg_wifi_band mon_band;
|
||||
|
||||
/*
|
||||
* this logic makes all data path interfacing rings (UMAC/LMAC)
|
||||
@@ -2529,8 +2527,9 @@ static void dp_interrupt_timer(void *arg)
|
||||
if (!qdf_atomic_read(&soc->cmn_init_done))
|
||||
return;
|
||||
|
||||
if (pdev->mon_chan_band != REG_BAND_UNKNOWN) {
|
||||
lmac_id = pdev->ch_band_lmac_id_mapping[pdev->mon_chan_band];
|
||||
if (monitor_is_chan_band_known(pdev)) {
|
||||
mon_band = monitor_get_chan_band(pdev);
|
||||
lmac_id = pdev->ch_band_lmac_id_mapping[mon_band];
|
||||
if (qdf_likely(lmac_id != DP_MON_INVALID_LMAC_ID)) {
|
||||
dp_intr_id = soc->mon_intr_id_lmac_map[lmac_id];
|
||||
dp_srng_record_timer_entry(soc, dp_intr_id);
|
||||
@@ -3074,10 +3073,15 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id)
|
||||
{
|
||||
struct qdf_mem_multi_page_t *pages;
|
||||
|
||||
if (mac_id != WLAN_INVALID_PDEV_ID)
|
||||
pages = &soc->mon_link_desc_pages[mac_id];
|
||||
else
|
||||
if (mac_id != WLAN_INVALID_PDEV_ID) {
|
||||
pages = monitor_get_link_desc_pages(soc, mac_id);
|
||||
if (!pages)
|
||||
/* monitor_get_link_desc_pages returns NULL only
|
||||
* if monitor SOC is NULL */
|
||||
QDF_ASSERT(pages);
|
||||
} else {
|
||||
pages = &soc->link_desc_pages;
|
||||
}
|
||||
|
||||
if (pages->dma_pages) {
|
||||
wlan_minidump_remove((void *)
|
||||
@@ -3129,12 +3133,17 @@ QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc, uint32_t mac_id)
|
||||
* with REO queue descriptors
|
||||
*/
|
||||
if (mac_id != WLAN_INVALID_PDEV_ID) {
|
||||
pages = &soc->mon_link_desc_pages[mac_id];
|
||||
pages = monitor_get_link_desc_pages(soc, mac_id);
|
||||
if (!pages)
|
||||
/* monitor_get_link_desc_pages returns NULL only
|
||||
* if monitor SOC is NULL
|
||||
*/
|
||||
QDF_ASSERT(pages);
|
||||
dp_srng = &soc->rxdma_mon_desc_ring[mac_id];
|
||||
num_entries = dp_srng->alloc_size /
|
||||
hal_srng_get_entrysize(soc->hal_soc,
|
||||
RXDMA_MONITOR_DESC);
|
||||
total_link_descs = &soc->total_mon_link_descs[mac_id];
|
||||
total_link_descs = monitor_get_total_link_descs(soc, mac_id);
|
||||
qdf_str_lcopy(minidump_str, "mon_link_desc_bank",
|
||||
MINIDUMP_STR_SIZE);
|
||||
} else {
|
||||
@@ -3375,6 +3384,7 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id)
|
||||
uint32_t count = 0;
|
||||
void *desc_srng;
|
||||
int link_desc_size = hal_get_link_desc_size(soc->hal_soc);
|
||||
uint32_t *total_link_descs_addr;
|
||||
uint32_t total_link_descs;
|
||||
uint32_t scatter_buf_num;
|
||||
uint32_t num_entries_per_buf = 0;
|
||||
@@ -3391,8 +3401,15 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id)
|
||||
total_link_descs = soc->total_link_descs;
|
||||
desc_srng = soc->wbm_idle_link_ring.hal_srng;
|
||||
} else {
|
||||
pages = &soc->mon_link_desc_pages[mac_id];
|
||||
total_link_descs = soc->total_mon_link_descs[mac_id];
|
||||
pages = monitor_get_link_desc_pages(soc, mac_id);
|
||||
if (!pages)
|
||||
/* monitor_get_link_desc_pages returns NULL only
|
||||
* if monitor SOC is NULL
|
||||
*/
|
||||
QDF_ASSERT(pages);
|
||||
total_link_descs_addr =
|
||||
monitor_get_total_link_descs(soc, mac_id);
|
||||
total_link_descs = *total_link_descs_addr;
|
||||
desc_srng = soc->rxdma_mon_desc_ring[mac_id].hal_srng;
|
||||
}
|
||||
|
||||
@@ -4528,36 +4545,6 @@ static void dp_cleanup_ipa_rx_refill_buf_ring(struct dp_soc *soc,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ATH_SUPPORT_EXT_STAT
|
||||
/*dp_peer_cal_clients_stats_update - update peer stats on cal client timer
|
||||
* @soc : Datapath SOC
|
||||
* @peer : Datapath peer
|
||||
* @arg : argument to iter function
|
||||
*/
|
||||
static void
|
||||
dp_peer_cal_clients_stats_update(struct dp_soc *soc,
|
||||
struct dp_peer *peer,
|
||||
void *arg)
|
||||
{
|
||||
dp_cal_client_update_peer_stats(&peer->stats);
|
||||
}
|
||||
|
||||
/*dp_iterate_update_peer_list - update peer stats on cal client timer
|
||||
* @pdev_hdl: pdev handle
|
||||
*/
|
||||
void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl)
|
||||
{
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl;
|
||||
|
||||
dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL,
|
||||
DP_MOD_ID_CDP);
|
||||
}
|
||||
#else
|
||||
void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DP_TX_HW_DESC_HISTORY
|
||||
/**
|
||||
* dp_soc_tx_hw_desc_history_attach - Attach TX HW descriptor history
|
||||
@@ -4925,7 +4912,6 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force)
|
||||
dp_rx_pdev_desc_pool_deinit(pdev);
|
||||
dp_pdev_bkp_stats_detach(pdev);
|
||||
qdf_event_destroy(&pdev->fw_peer_stats_event);
|
||||
dp_cal_client_detach(&pdev->cal_client_ctx);
|
||||
if (pdev->sojourn_buf)
|
||||
qdf_nbuf_free(pdev->sojourn_buf);
|
||||
|
||||
@@ -5844,7 +5830,6 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
|
||||
|
||||
if (wlan_op_mode_monitor == vdev->opmode) {
|
||||
monitor_vdev_attach(vdev);
|
||||
pdev->monitor_vdev = vdev;
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -6066,7 +6051,6 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
|
||||
struct dp_soc *soc = (struct dp_soc *)cdp_soc;
|
||||
struct dp_pdev *pdev;
|
||||
struct dp_neighbour_peer *peer = NULL;
|
||||
struct dp_neighbour_peer *temp_peer = NULL;
|
||||
struct dp_peer *vap_self_peer = NULL;
|
||||
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
||||
DP_MOD_ID_CDP);
|
||||
@@ -6113,23 +6097,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
|
||||
*/
|
||||
dp_vdev_id_map_tbl_remove(soc, vdev);
|
||||
|
||||
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
|
||||
if (!soc->hw_nac_monitor_support) {
|
||||
TAILQ_FOREACH(peer, &pdev->neighbour_peers_list,
|
||||
neighbour_peer_list_elem) {
|
||||
QDF_ASSERT(peer->vdev != vdev);
|
||||
}
|
||||
} else {
|
||||
TAILQ_FOREACH_SAFE(peer, &pdev->neighbour_peers_list,
|
||||
neighbour_peer_list_elem, temp_peer) {
|
||||
if (peer->vdev == vdev) {
|
||||
TAILQ_REMOVE(&pdev->neighbour_peers_list, peer,
|
||||
neighbour_peer_list_elem);
|
||||
qdf_mem_free(peer);
|
||||
}
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
|
||||
monitor_neighbour_peer_list_remove(pdev, vdev, peer);
|
||||
|
||||
dp_tx_vdev_multipass_deinit(vdev);
|
||||
|
||||
@@ -7083,7 +7051,6 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,
|
||||
|
||||
if (wlan_op_mode_monitor == vdev->opmode) {
|
||||
monitor_vdev_delete(soc, vdev);
|
||||
pdev->monitor_vdev = NULL;
|
||||
goto free_vdev;
|
||||
}
|
||||
|
||||
@@ -7702,7 +7669,7 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev)
|
||||
qdf_mem_zero(&pdev->stats.rx, sizeof(pdev->stats.rx));
|
||||
qdf_mem_zero(&pdev->stats.tx_i, sizeof(pdev->stats.tx_i));
|
||||
|
||||
if (pdev->mcopy_mode)
|
||||
if (monitor_is_enable_mcopy_mode(pdev))
|
||||
DP_UPDATE_STATS(pdev, pdev->invalid_peer);
|
||||
|
||||
soc = pdev->soc;
|
||||
@@ -8445,6 +8412,8 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id,
|
||||
struct dp_pdev *pdev =
|
||||
dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)cdp_soc,
|
||||
pdev_id);
|
||||
enum reg_wifi_band chan_band;
|
||||
|
||||
if (!pdev)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
@@ -8510,12 +8479,12 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id,
|
||||
val.cdp_pdev_param_fltr_neigh_peers);
|
||||
break;
|
||||
case CDP_MONITOR_CHANNEL:
|
||||
pdev->mon_chan_num = val.cdp_pdev_param_monitor_chan;
|
||||
monitor_set_chan_num(pdev, val.cdp_pdev_param_monitor_chan);
|
||||
break;
|
||||
case CDP_MONITOR_FREQUENCY:
|
||||
pdev->mon_chan_freq = val.cdp_pdev_param_mon_freq;
|
||||
pdev->mon_chan_band =
|
||||
wlan_reg_freq_to_band(pdev->mon_chan_freq);
|
||||
chan_band = wlan_reg_freq_to_band(val.cdp_pdev_param_mon_freq);
|
||||
monitor_set_chan_freq(pdev, val.cdp_pdev_param_mon_freq);
|
||||
monitor_set_chan_band(pdev, chan_band);
|
||||
break;
|
||||
case CDP_CONFIG_BSS_COLOR:
|
||||
monitor_set_bsscolor(pdev, val.cdp_pdev_param_bss_color);
|
||||
@@ -10697,9 +10666,6 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
|
||||
.txrx_get_sec_type = dp_get_sec_type,
|
||||
.txrx_wdi_event_sub = dp_wdi_event_sub,
|
||||
.txrx_wdi_event_unsub = dp_wdi_event_unsub,
|
||||
#ifdef WDI_EVENT_ENABLE
|
||||
.txrx_get_pldev = dp_get_pldev,
|
||||
#endif
|
||||
.txrx_set_pdev_param = dp_set_pdev_param,
|
||||
.txrx_get_pdev_param = dp_get_pdev_param,
|
||||
.txrx_set_peer_param = dp_set_peer_param,
|
||||
@@ -11333,11 +11299,7 @@ static QDF_STATUS dp_bus_suspend(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
||||
qdf_timer_stop(&soc->int_timer);
|
||||
|
||||
/* Stop monitor reap timer and reap any pending frames in ring */
|
||||
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
|
||||
dp_is_enable_reap_timer_non_pkt(pdev))) {
|
||||
if (monitor_reap_timer_stop(soc))
|
||||
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
|
||||
}
|
||||
monitor_stop_reap_timer(pdev);
|
||||
|
||||
dp_suspend_fse_cache_flush(soc);
|
||||
|
||||
@@ -11358,9 +11320,7 @@ static QDF_STATUS dp_bus_resume(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
||||
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
|
||||
|
||||
/* Start monitor reap timer */
|
||||
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
|
||||
dp_is_enable_reap_timer_non_pkt(pdev)))
|
||||
monitor_reap_timer_start(soc);
|
||||
monitor_start_reap_timer(pdev);
|
||||
|
||||
dp_resume_fse_cache_flush(soc);
|
||||
|
||||
@@ -11389,11 +11349,7 @@ static void dp_process_wow_ack_rsp(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
||||
* response from FW reap mon status ring to make sure no packets pending
|
||||
* in the ring.
|
||||
*/
|
||||
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
|
||||
dp_is_enable_reap_timer_non_pkt(pdev)) &&
|
||||
soc->reap_timer_init) {
|
||||
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
|
||||
}
|
||||
monitor_stop_reap_timer(pdev);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -11415,11 +11371,7 @@ static void dp_process_target_suspend_req(struct cdp_soc_t *soc_hdl,
|
||||
}
|
||||
|
||||
/* Stop monitor reap timer and reap any pending frames in ring */
|
||||
if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
|
||||
dp_is_enable_reap_timer_non_pkt(pdev))) {
|
||||
if (monitor_reap_timer_stop(soc))
|
||||
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
|
||||
}
|
||||
monitor_stop_reap_timer(pdev);
|
||||
}
|
||||
|
||||
static struct cdp_bus_ops dp_ops_bus = {
|
||||
@@ -12870,8 +12822,6 @@ static void dp_soc_cfg_dump(struct dp_soc *soc, uint32_t target_type)
|
||||
dp_init_info("DP soc Dump for Target = %d", target_type);
|
||||
dp_init_info("ast_override_support = %d, da_war_enabled = %d,",
|
||||
soc->ast_override_support, soc->da_war_enabled);
|
||||
dp_init_info("hw_nac_monitor_support = %d",
|
||||
soc->hw_nac_monitor_support);
|
||||
|
||||
wlan_cfg_dp_soc_ctx_dump(soc->wlan_cfg_ctx);
|
||||
}
|
||||
@@ -13205,14 +13155,6 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
|
||||
/* set the reo destination during initialization */
|
||||
dp_pdev_set_default_reo(pdev);
|
||||
|
||||
/*
|
||||
* initialize ppdu tlv list
|
||||
*/
|
||||
TAILQ_INIT(&pdev->ppdu_info_list);
|
||||
TAILQ_INIT(&pdev->sched_comp_ppdu_list);
|
||||
pdev->tlv_count = 0;
|
||||
pdev->list_depth = 0;
|
||||
|
||||
qdf_mem_zero(&pdev->sojourn_stats, sizeof(struct cdp_tx_sojourn_stats));
|
||||
|
||||
pdev->sojourn_buf = qdf_nbuf_alloc(pdev->soc->osdev,
|
||||
@@ -13226,11 +13168,6 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
|
||||
sojourn_buf = qdf_nbuf_data(pdev->sojourn_buf);
|
||||
qdf_mem_zero(sojourn_buf, sizeof(struct cdp_tx_sojourn_stats));
|
||||
|
||||
/* initlialize cal client timer */
|
||||
dp_cal_client_attach(&pdev->cal_client_ctx,
|
||||
dp_pdev_to_cdp_pdev(pdev),
|
||||
pdev->soc->osdev,
|
||||
&dp_iterate_update_peer_list);
|
||||
qdf_event_create(&pdev->fw_peer_stats_event);
|
||||
|
||||
pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
|
||||
|
@@ -29,15 +29,11 @@
|
||||
#include <hal_reo.h>
|
||||
#include <cdp_txrx_handle.h>
|
||||
#include <wlan_cfg.h>
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include <dp_mon.h>
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
|
||||
#ifdef QCA_PEER_EXT_STATS
|
||||
|
@@ -28,17 +28,16 @@
|
||||
#include "if_meta_hdr.h"
|
||||
#endif
|
||||
#include "dp_internal.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "dp_ipa.h"
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
#include "dp_hist.h"
|
||||
#include "dp_rx_buffer_pool.h"
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include "dp_htt.h"
|
||||
#include <dp_mon.h>
|
||||
#endif
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
|
||||
#ifndef QCA_HOST_MODE_WIFI_DISABLED
|
||||
|
||||
|
@@ -1081,40 +1081,6 @@ void *dp_rx_cookie_2_link_desc_va(struct dp_soc *soc,
|
||||
return link_desc_va;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of
|
||||
* the MSDU Link Descriptor
|
||||
* @pdev: core txrx pdev context
|
||||
* @buf_info: buf_info includes cookie that used to lookup virtual address of
|
||||
* link descriptor. Normally this is just an index into a per pdev array.
|
||||
*
|
||||
* This is the VA of the link descriptor in monitor mode destination ring,
|
||||
* that HAL layer later uses to retrieve the list of MSDU's for a given MPDU.
|
||||
*
|
||||
* Return: void *: Virtual Address of the Rx descriptor
|
||||
*/
|
||||
static inline
|
||||
void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
|
||||
struct hal_buf_info *buf_info,
|
||||
int mac_id)
|
||||
{
|
||||
void *link_desc_va;
|
||||
struct qdf_mem_multi_page_t *pages;
|
||||
uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
|
||||
|
||||
pages = &pdev->soc->mon_link_desc_pages[mac_id];
|
||||
if (!pages)
|
||||
return NULL;
|
||||
|
||||
if (qdf_unlikely(page_id >= pages->num_pages))
|
||||
return NULL;
|
||||
|
||||
link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
|
||||
(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
|
||||
|
||||
return link_desc_va;
|
||||
}
|
||||
|
||||
#ifndef QCA_HOST_MODE_WIFI_DISABLED
|
||||
/*
|
||||
* dp_rx_intrabss_fwd() - API for intrabss fwd. For EAPOL
|
||||
|
@@ -26,7 +26,6 @@
|
||||
#include "wlan_cfg.h"
|
||||
#include "dp_internal.h"
|
||||
#include "dp_rx.h"
|
||||
#include "dp_rx_mon.h"
|
||||
|
||||
#ifdef WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL
|
||||
/**
|
||||
|
@@ -914,9 +914,8 @@ dp_rx_chain_msdus(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
||||
|
||||
dp_pdev->invalid_peer_head_msdu = NULL;
|
||||
dp_pdev->invalid_peer_tail_msdu = NULL;
|
||||
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr,
|
||||
&(dp_pdev->ppdu_info.rx_status));
|
||||
|
||||
monitor_get_mpdu_status(dp_pdev, soc, rx_tlv_hdr);
|
||||
}
|
||||
|
||||
if (dp_pdev->ppdu_id == hal_rx_attn_phy_ppdu_id_get(soc->hal_soc,
|
||||
|
@@ -21,7 +21,6 @@
|
||||
#include "dp_internal.h"
|
||||
#include "htt_stats.h"
|
||||
#include "htt_ppdu_stats.h"
|
||||
#include "dp_htt.h"
|
||||
|
||||
#ifdef QCA_PEER_EXT_STATS
|
||||
#include <cdp_txrx_hist_struct.h>
|
||||
@@ -172,10 +171,6 @@ const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
|
||||
#define TID_COUNTER_STATS 1 /* Success/drop stats type */
|
||||
#define TID_DELAY_STATS 2 /* Delay stats type */
|
||||
|
||||
@@ -6250,13 +6245,9 @@ 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("ppdu info schedule completion list depth: %d",
|
||||
pdev->sched_comp_list_depth);
|
||||
DP_PRINT_STATS("cur sched cmdid: %d", pdev->last_sched_cmdid);
|
||||
DP_PRINT_STATS("delivered sched cmdid: %d",
|
||||
pdev->delivered_sched_cmdid);
|
||||
DP_PRINT_STATS("ppdu info list depth: %d",
|
||||
pdev->list_depth);
|
||||
|
||||
monitor_print_tx_stats(pdev);
|
||||
|
||||
DP_PRINT_STATS("tx_ppdu_proc: %llu",
|
||||
pdev->stats.tx_ppdu_proc);
|
||||
DP_PRINT_STATS("ack ba comes twice: %llu",
|
||||
|
@@ -34,9 +34,6 @@
|
||||
#endif
|
||||
#include "enet.h"
|
||||
#include "dp_internal.h"
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
#ifdef ATH_SUPPORT_IQUE
|
||||
#include "dp_txrx_me.h"
|
||||
#endif
|
||||
@@ -47,6 +44,9 @@
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include <dp_mon.h>
|
||||
#endif
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
|
||||
/* Flag to skip CCE classify when mesh or tid override enabled */
|
||||
#define DP_TX_SKIP_CCE_CLASSIFY \
|
||||
@@ -1994,7 +1994,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
||||
HTT_TX_TCL_METADATA_VALID_HTT_SET(htt_tcl_metadata, 1);
|
||||
|
||||
dp_tx_desc_update_fast_comp_flag(soc, tx_desc,
|
||||
!pdev->enhanced_stats_en);
|
||||
!monitor_is_enable_enhanced_stats(pdev));
|
||||
|
||||
dp_tx_update_mesh_flags(soc, vdev, tx_desc);
|
||||
|
||||
@@ -3837,7 +3837,7 @@ static inline void dp_tx_sojourn_stats_process(struct dp_pdev *pdev,
|
||||
uint64_t delta_ms;
|
||||
struct cdp_tx_sojourn_stats *sojourn_stats;
|
||||
|
||||
if (qdf_unlikely(pdev->enhanced_stats_en == 0))
|
||||
if (qdf_unlikely(!monitor_is_enable_enhanced_stats(pdev)))
|
||||
return;
|
||||
|
||||
if (qdf_unlikely(tid == HTT_INVALID_TID ||
|
||||
|
@@ -24,6 +24,9 @@
|
||||
#include "dp_internal.h"
|
||||
#include "dp_tx.h"
|
||||
#include "enet.h"
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include "dp_mon.h"
|
||||
#endif
|
||||
#include "dp_txrx_wds.h"
|
||||
|
||||
/* Generic AST entry aging timer value */
|
||||
@@ -1176,7 +1179,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
|
||||
uint8_t last_msdu = ts->last_msdu;
|
||||
uint32_t txcap_hdr_size = sizeof(struct tx_capture_hdr);
|
||||
|
||||
if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode &&
|
||||
if (qdf_unlikely(!monitor_is_enable_tx_sniffer(pdev) &&
|
||||
!monitor_is_enable_mcopy_mode(pdev) &&
|
||||
!pdev->latency_capture_enable))
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
|
||||
@@ -1186,24 +1190,13 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc,
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
if (pdev->mcopy_mode) {
|
||||
/* If mcopy is enabled and mcopy_mode is M_COPY deliver 1st MSDU
|
||||
* per PPDU. If mcopy_mode is M_COPY_EXTENDED deliver 1st MSDU
|
||||
* for each MPDU
|
||||
*/
|
||||
if (pdev->mcopy_mode == M_COPY) {
|
||||
if ((pdev->m_copy_id.tx_ppdu_id == ppdu_id) &&
|
||||
(pdev->m_copy_id.tx_peer_id == peer_id)) {
|
||||
if (monitor_mcopy_check_deliver(pdev, peer_id, ppdu_id, first_msdu) !=
|
||||
QDF_STATUS_SUCCESS)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!first_msdu)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
pdev->m_copy_id.tx_ppdu_id = ppdu_id;
|
||||
pdev->m_copy_id.tx_peer_id = peer_id;
|
||||
}
|
||||
|
||||
if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) {
|
||||
netbuf = qdf_nbuf_realloc_headroom(netbuf, txcap_hdr_size);
|
||||
|
@@ -152,7 +152,6 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
|
||||
struct dp_ast_entry *ast;
|
||||
uint32_t flags = DP_AST_FLAGS_HM;
|
||||
uint32_t ret = 0;
|
||||
struct dp_neighbour_peer *neighbour_peer = NULL;
|
||||
struct dp_pdev *pdev = ta_peer->vdev->pdev;
|
||||
uint8_t wds_src_mac[QDF_MAC_ADDR_SIZE];
|
||||
|
||||
@@ -230,32 +229,9 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
|
||||
* smart monitor is enabled and send add_ast command
|
||||
* to FW.
|
||||
*/
|
||||
if (pdev->neighbour_peers_added) {
|
||||
qdf_mem_copy(wds_src_mac,
|
||||
(qdf_nbuf_data(nbuf) +
|
||||
QDF_MAC_ADDR_SIZE),
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
|
||||
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
|
||||
TAILQ_FOREACH(neighbour_peer,
|
||||
&pdev->neighbour_peers_list,
|
||||
neighbour_peer_list_elem) {
|
||||
if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr,
|
||||
wds_src_mac,
|
||||
QDF_MAC_ADDR_SIZE)) {
|
||||
ret = dp_peer_add_ast(soc,
|
||||
ta_peer,
|
||||
wds_src_mac,
|
||||
CDP_TXRX_AST_TYPE_WDS,
|
||||
monitor_neighbour_peer_add_ast(pdev, ta_peer,
|
||||
wds_src_mac, nbuf,
|
||||
flags);
|
||||
QDF_TRACE(QDF_MODULE_ID_DP,
|
||||
QDF_TRACE_LEVEL_INFO,
|
||||
"sa valid and nac roamed to wds");
|
||||
break;
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@@ -55,9 +55,6 @@
|
||||
#include <pktlog.h>
|
||||
#endif
|
||||
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
//#include "dp_tx.h"
|
||||
|
||||
#define REPT_MU_MIMO 1
|
||||
@@ -1710,17 +1707,6 @@ struct dp_soc {
|
||||
/* total link descriptors for regular RX and TX */
|
||||
uint32_t total_link_descs;
|
||||
|
||||
/* monitor link descriptor pages */
|
||||
struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW];
|
||||
|
||||
/* total link descriptors for monitor mode for each radio */
|
||||
uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW];
|
||||
|
||||
/* Monitor Link descriptor memory banks */
|
||||
struct link_desc_bank
|
||||
mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS];
|
||||
uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW];
|
||||
|
||||
/* Link descriptor Idle list for HW internal use (SRNG mode) */
|
||||
struct dp_srng wbm_idle_link_ring;
|
||||
|
||||
@@ -1969,8 +1955,6 @@ struct dp_soc {
|
||||
bool is_last_stats_ctx_init;
|
||||
#endif /* WLAN_FEATURE_STATS_EXT */
|
||||
|
||||
/* Smart monitor capability for HKv2 */
|
||||
uint8_t hw_nac_monitor_support;
|
||||
/* Flag to indicate if HTT v2 is enabled*/
|
||||
bool is_peer_map_unmap_v2;
|
||||
/* Per peer per Tid ba window size support */
|
||||
@@ -2023,8 +2007,6 @@ struct dp_soc {
|
||||
} skip_fisa_param;
|
||||
#endif
|
||||
#endif /* WLAN_SUPPORT_RX_FLOW_TAG || WLAN_SUPPORT_RX_FISA */
|
||||
/* Full monitor mode support */
|
||||
bool full_mon_mode;
|
||||
/* SG supported for msdu continued packets from wbm release ring */
|
||||
bool wbm_release_desc_rx_sg_support;
|
||||
bool peer_map_attach_success;
|
||||
@@ -2291,13 +2273,6 @@ 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
|
||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||
/* Template data to be set for Enhanced RX Monitor packets */
|
||||
#define RX_MON_CAP_ENH_TRAILER 0xdeadc0dedeadda7a
|
||||
@@ -2388,9 +2363,6 @@ struct dp_pdev {
|
||||
/* TXRX SOC handle */
|
||||
struct dp_soc *soc;
|
||||
|
||||
/* Stuck count on monitor destination ring MPDU process */
|
||||
uint32_t mon_dest_ring_stuck_cnt;
|
||||
|
||||
bool pdev_deinit;
|
||||
|
||||
/* pdev status down or up required to handle dynamic hw
|
||||
@@ -2433,42 +2405,9 @@ struct dp_pdev {
|
||||
/* PDEV transmit lock */
|
||||
qdf_spinlock_t tx_lock;
|
||||
|
||||
#ifndef REMOVE_PKT_LOG
|
||||
bool pkt_log_init;
|
||||
/* Pktlog pdev */
|
||||
struct pktlog_dev_t *pl_dev;
|
||||
#endif /* #ifndef REMOVE_PKT_LOG */
|
||||
|
||||
/* Monitor mode interface and status storage */
|
||||
struct dp_vdev *monitor_vdev;
|
||||
|
||||
/* Monitor mode operation channel */
|
||||
int mon_chan_num;
|
||||
|
||||
/* Monitor mode operation frequency */
|
||||
qdf_freq_t mon_chan_freq;
|
||||
|
||||
/* Monitor mode band */
|
||||
enum reg_wifi_band mon_chan_band;
|
||||
|
||||
/* monitor mode lock */
|
||||
qdf_spinlock_t mon_lock;
|
||||
|
||||
/*tx_mutex for me*/
|
||||
DP_MUTEX_TYPE tx_mutex;
|
||||
|
||||
/* monitor */
|
||||
bool monitor_configured;
|
||||
|
||||
/* Smart Mesh */
|
||||
bool filter_neighbour_peers;
|
||||
|
||||
/*flag to indicate neighbour_peers_list not empty */
|
||||
bool neighbour_peers_added;
|
||||
/* smart mesh mutex */
|
||||
qdf_spinlock_t neighbour_peer_mutex;
|
||||
/* Neighnour peer list */
|
||||
TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list;
|
||||
/* msdu chain head & tail */
|
||||
qdf_nbuf_t invalid_peer_head_msdu;
|
||||
qdf_nbuf_t invalid_peer_tail_msdu;
|
||||
@@ -2482,19 +2421,6 @@ struct dp_pdev {
|
||||
/* Global RX decap mode for the device */
|
||||
enum htt_pkt_type rx_decap_mode;
|
||||
|
||||
/* Enhanced Stats is enabled */
|
||||
bool enhanced_stats_en;
|
||||
|
||||
/* advance filter mode and type*/
|
||||
uint8_t mon_filter_mode;
|
||||
uint16_t fp_mgmt_filter;
|
||||
uint16_t fp_ctrl_filter;
|
||||
uint16_t fp_data_filter;
|
||||
uint16_t mo_mgmt_filter;
|
||||
uint16_t mo_ctrl_filter;
|
||||
uint16_t mo_data_filter;
|
||||
uint16_t md_data_filter;
|
||||
|
||||
qdf_atomic_t num_tx_outstanding;
|
||||
int32_t tx_descs_max;
|
||||
|
||||
@@ -2511,8 +2437,6 @@ struct dp_pdev {
|
||||
/* dscp_tid_map_*/
|
||||
uint8_t dscp_tid_map[DP_MAX_TID_MAPS][DSCP_TID_MAP_MAX];
|
||||
|
||||
struct hal_rx_ppdu_info ppdu_info;
|
||||
|
||||
/* operating channel */
|
||||
struct {
|
||||
uint8_t num;
|
||||
@@ -2520,32 +2444,6 @@ struct dp_pdev {
|
||||
uint16_t freq;
|
||||
} operating_channel;
|
||||
|
||||
qdf_nbuf_queue_t rx_status_q;
|
||||
uint32_t mon_ppdu_status;
|
||||
struct cdp_mon_status rx_mon_recv_status;
|
||||
/* monitor mode status/destination ring PPDU and MPDU count */
|
||||
struct cdp_pdev_mon_stats rx_mon_stats;
|
||||
/* to track duplicate link descriptor indications by HW for a WAR */
|
||||
uint64_t mon_last_linkdesc_paddr;
|
||||
/* to track duplicate buffer indications by HW for a WAR */
|
||||
uint32_t mon_last_buf_cookie;
|
||||
/* 128 bytes mpdu header queue per user for ppdu */
|
||||
qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS];
|
||||
/* is this a mpdu header TLV and not msdu header TLV */
|
||||
bool is_mpdu_hdr[MAX_MU_USERS];
|
||||
/* per user 128 bytes msdu header list for MPDU */
|
||||
struct msdu_list msdu_list[MAX_MU_USERS];
|
||||
/* RX enhanced capture mode */
|
||||
uint8_t rx_enh_capture_mode;
|
||||
/* Rx per peer enhanced capture mode */
|
||||
bool rx_enh_capture_peer;
|
||||
struct dp_vdev *rx_enh_monitor_vdev;
|
||||
/* RX enhanced capture trailer enable/disable flag */
|
||||
bool is_rx_enh_capture_trailer_enabled;
|
||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||
/* RX per MPDU/PPDU information */
|
||||
struct cdp_rx_indication_mpdu mpdu_ind;
|
||||
#endif
|
||||
/* pool addr for mcast enhance buff */
|
||||
struct {
|
||||
int size;
|
||||
@@ -2575,69 +2473,21 @@ struct dp_pdev {
|
||||
/* map this pdev to a particular Reo Destination ring */
|
||||
enum cdp_host_reo_dest_ring reo_dest;
|
||||
|
||||
/* Packet log mode */
|
||||
uint8_t rx_pktlog_mode;
|
||||
/* Enable pktlog logging cbf */
|
||||
bool rx_pktlog_cbf;
|
||||
|
||||
/* WDI event handlers */
|
||||
struct wdi_event_subscribe_t **wdi_event_list;
|
||||
|
||||
/* ppdu_id of last received HTT TX stats */
|
||||
uint32_t last_ppdu_id;
|
||||
struct {
|
||||
uint8_t last_user;
|
||||
qdf_nbuf_t buf;
|
||||
} tx_ppdu_info;
|
||||
|
||||
bool tx_sniffer_enable;
|
||||
/* mirror copy mode */
|
||||
enum m_copy_mode mcopy_mode;
|
||||
bool cfr_rcc_mode;
|
||||
bool enable_reap_timer_non_pkt;
|
||||
bool bpr_enable;
|
||||
|
||||
/* enable time latency check for tx completion */
|
||||
bool latency_capture_enable;
|
||||
|
||||
/* enable calculation of delay stats*/
|
||||
bool delay_stats_flag;
|
||||
struct {
|
||||
uint32_t tx_ppdu_id;
|
||||
uint16_t tx_peer_id;
|
||||
uint32_t rx_ppdu_id;
|
||||
} m_copy_id;
|
||||
|
||||
/* To check if PPDU Tx stats are enabled for Pktlog */
|
||||
bool pktlog_ppdu_stats;
|
||||
|
||||
void *dp_txrx_handle; /* Advanced data path handle */
|
||||
|
||||
#ifdef ATH_SUPPORT_NAC_RSSI
|
||||
bool nac_rssi_filtering;
|
||||
#endif
|
||||
|
||||
/* ppdu_stats lock for queue concurrency between cores*/
|
||||
qdf_spinlock_t ppdu_stats_lock;
|
||||
|
||||
/* list of ppdu tlvs */
|
||||
TAILQ_HEAD(, ppdu_info) ppdu_info_list;
|
||||
TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
|
||||
|
||||
uint32_t sched_comp_list_depth;
|
||||
uint16_t delivered_sched_cmdid;
|
||||
uint16_t last_sched_cmdid;
|
||||
uint32_t tlv_count;
|
||||
uint32_t list_depth;
|
||||
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;
|
||||
} mgmtctrl_frm_info;
|
||||
|
||||
/* Current noise-floor reading for the pdev channel */
|
||||
int16_t chan_noise_floor;
|
||||
|
||||
@@ -2652,8 +2502,6 @@ struct dp_pdev {
|
||||
* with same MAC address across 2 radios
|
||||
*/
|
||||
uint8_t is_primary;
|
||||
/* Context of cal client timer */
|
||||
struct cdp_cal_client *cal_client_ctx;
|
||||
struct cdp_tx_sojourn_stats sojourn_stats;
|
||||
qdf_nbuf_t sojourn_buf;
|
||||
|
||||
@@ -2662,11 +2510,6 @@ struct dp_pdev {
|
||||
|
||||
union dp_rx_desc_list_elem_t *free_list_head;
|
||||
union dp_rx_desc_list_elem_t *free_list_tail;
|
||||
/* Pdev level flag to check peer based pktlog enabled or
|
||||
* disabled
|
||||
*/
|
||||
uint8_t dp_peer_based_pktlog;
|
||||
|
||||
/* Cached peer_id from htt_peer_details_tlv */
|
||||
uint16_t fw_stats_peer_id;
|
||||
|
||||
@@ -2705,12 +2548,6 @@ struct dp_pdev {
|
||||
#endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */
|
||||
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
|
||||
|
||||
/* tx packet capture enhancement */
|
||||
enum cdp_tx_enh_capture_mode tx_capture_enabled;
|
||||
struct dp_pdev_tx_capture tx_capture;
|
||||
|
||||
uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/
|
||||
|
||||
#ifdef WLAN_SUPPORT_RX_FLOW_TAG
|
||||
/**
|
||||
* Pointer to DP Flow FST at SOC level if
|
||||
@@ -2728,38 +2565,13 @@ struct dp_pdev {
|
||||
data_stall_detect_cb data_stall_detect_callback;
|
||||
#endif /* WLAN_SUPPORT_DATA_STALL */
|
||||
|
||||
struct dp_mon_filter **filter; /* Monitor Filter pointer */
|
||||
|
||||
#ifdef QCA_SUPPORT_FULL_MON
|
||||
/* List to maintain all MPDUs for a PPDU in monitor mode */
|
||||
TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q;
|
||||
|
||||
/* TODO: define per-user mpdu list
|
||||
* struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS];
|
||||
*/
|
||||
struct hal_rx_mon_desc_info *mon_desc;
|
||||
#endif
|
||||
qdf_nbuf_t mcopy_status_nbuf;
|
||||
|
||||
/* flag to indicate whether LRO hash command has been sent to FW */
|
||||
uint8_t is_lro_hash_configured;
|
||||
|
||||
/* Flag to hold on to monitor destination ring */
|
||||
bool hold_mon_dest_ring;
|
||||
|
||||
#ifdef WLAN_ATF_ENABLE
|
||||
/* ATF stats enable */
|
||||
bool dp_atf_stats_enable;
|
||||
#endif
|
||||
|
||||
/* Maintains first status buffer's paddr of a PPDU */
|
||||
uint64_t status_buf_addr;
|
||||
#ifdef HTT_STATS_DEBUGFS_SUPPORT
|
||||
/* HTT stats debugfs params */
|
||||
struct pdev_htt_stats_dbgfs_cfg *dbgfs_cfg;
|
||||
#endif
|
||||
/* Flag to inidicate monitor rings are initialized */
|
||||
uint8_t pdev_mon_init;
|
||||
struct {
|
||||
qdf_work_t work;
|
||||
qdf_workqueue_t *work_queue;
|
||||
@@ -3560,4 +3372,17 @@ void dp_rx_refill_buff_pool_enqueue(struct dp_soc *soc);
|
||||
#else
|
||||
static inline void dp_rx_refill_buff_pool_enqueue(struct dp_soc *soc) {}
|
||||
#endif
|
||||
QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng,
|
||||
int ring_type, uint32_t num_entries,
|
||||
bool cached);
|
||||
void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng);
|
||||
QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng,
|
||||
int ring_type, int ring_num, int mac_id);
|
||||
void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng,
|
||||
int ring_type, int ring_num);
|
||||
|
||||
enum timer_yield_status
|
||||
dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done,
|
||||
uint64_t start_time);
|
||||
|
||||
#endif /* _DP_TYPES_H_ */
|
||||
|
@@ -25,16 +25,6 @@
|
||||
#endif
|
||||
|
||||
#ifdef WDI_EVENT_ENABLE
|
||||
void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
|
||||
{
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
|
||||
|
||||
if (!pdev)
|
||||
return NULL;
|
||||
|
||||
return pdev->pl_dev;
|
||||
}
|
||||
/*
|
||||
* dp_wdi_event_next_sub() - Return handle for Next WDI event
|
||||
* @wdi_sub: WDI Event handle
|
||||
|
@@ -31,8 +31,10 @@
|
||||
#include "if_meta_hdr.h"
|
||||
#endif
|
||||
#include "dp_internal.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "dp_ipa.h"
|
||||
#ifdef WIFI_MONITOR_SUPPORT
|
||||
#include <dp_mon.h>
|
||||
#endif
|
||||
#ifdef FEATURE_WDS
|
||||
#include "dp_txrx_wds.h"
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -13,6 +13,10 @@
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifdef WLAN_TX_PKT_CAPTURE_ENH
|
||||
#include "dp_tx_capture.h"
|
||||
#endif
|
||||
|
||||
#define DP_INTR_POLL_TIMER_MS 5
|
||||
|
||||
#define MON_VDEV_TIMER_INIT 0x1
|
||||
@@ -20,6 +24,7 @@
|
||||
|
||||
/* Budget to reap monitor status ring */
|
||||
#define DP_MON_REAP_BUDGET 1024
|
||||
#define MON_BUF_MIN_ENTRIES 64
|
||||
|
||||
#define mon_rx_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_RX, params)
|
||||
|
||||
@@ -121,11 +126,35 @@ struct dp_mon_ops {
|
||||
void (*mon_reap_timer_start)(struct dp_mon_soc *mon_soc);
|
||||
bool (*mon_reap_timer_stop)(struct dp_mon_soc *mon_soc);
|
||||
void (*mon_reap_timer_deinit)(struct dp_mon_soc *mon_soc);
|
||||
QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_mon_pdev *mon_pdev,
|
||||
uint16_t peer_id,
|
||||
uint32_t ppdu_id,
|
||||
uint8_t first_msdu);
|
||||
void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev,
|
||||
struct dp_peer *ta_peer,
|
||||
uint8_t *mac_addr,
|
||||
qdf_nbuf_t nbuf,
|
||||
uint32_t flags);
|
||||
};
|
||||
|
||||
struct dp_mon_soc {
|
||||
/* Holds all monitor related fields extracted from dp_soc */
|
||||
/* Holds pointer to monitor ops */
|
||||
/* monitor link descriptor pages */
|
||||
struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW];
|
||||
|
||||
/* total link descriptors for monitor mode for each radio */
|
||||
uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW];
|
||||
|
||||
/* Monitor Link descriptor memory banks */
|
||||
struct link_desc_bank
|
||||
mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS];
|
||||
uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW];
|
||||
/* Smart monitor capability for HKv2 */
|
||||
uint8_t hw_nac_monitor_support;
|
||||
|
||||
/* Full monitor mode support */
|
||||
bool full_mon_mode;
|
||||
|
||||
/*interrupt timer*/
|
||||
qdf_timer_t mon_reap_timer;
|
||||
@@ -138,6 +167,170 @@ struct dp_mon_soc {
|
||||
};
|
||||
|
||||
struct dp_mon_pdev {
|
||||
/* monitor */
|
||||
bool monitor_configured;
|
||||
|
||||
struct dp_mon_filter **filter; /* Monitor Filter pointer */
|
||||
|
||||
/* advance filter mode and type*/
|
||||
uint8_t mon_filter_mode;
|
||||
uint16_t fp_mgmt_filter;
|
||||
uint16_t fp_ctrl_filter;
|
||||
uint16_t fp_data_filter;
|
||||
uint16_t mo_mgmt_filter;
|
||||
uint16_t mo_ctrl_filter;
|
||||
uint16_t mo_data_filter;
|
||||
uint16_t md_data_filter;
|
||||
|
||||
struct dp_pdev_tx_capture tx_capture;
|
||||
|
||||
/* tx packet capture enhancement */
|
||||
enum cdp_tx_enh_capture_mode tx_capture_enabled;
|
||||
/* Stuck count on monitor destination ring MPDU process */
|
||||
uint32_t mon_dest_ring_stuck_cnt;
|
||||
/* monitor mode lock */
|
||||
qdf_spinlock_t mon_lock;
|
||||
|
||||
/* Monitor mode operation channel */
|
||||
int mon_chan_num;
|
||||
|
||||
/* Monitor mode operation frequency */
|
||||
qdf_freq_t mon_chan_freq;
|
||||
|
||||
/* Monitor mode band */
|
||||
enum reg_wifi_band mon_chan_band;
|
||||
|
||||
uint32_t mon_ppdu_status;
|
||||
/* monitor mode status/destination ring PPDU and MPDU count */
|
||||
struct cdp_pdev_mon_stats rx_mon_stats;
|
||||
/* Monitor mode interface and status storage */
|
||||
struct dp_vdev *mvdev;
|
||||
struct cdp_mon_status rx_mon_recv_status;
|
||||
/* to track duplicate link descriptor indications by HW for a WAR */
|
||||
uint64_t mon_last_linkdesc_paddr;
|
||||
/* to track duplicate buffer indications by HW for a WAR */
|
||||
uint32_t mon_last_buf_cookie;
|
||||
|
||||
#ifdef QCA_SUPPORT_FULL_MON
|
||||
/* List to maintain all MPDUs for a PPDU in monitor mode */
|
||||
TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q;
|
||||
|
||||
/* TODO: define per-user mpdu list
|
||||
* struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS];
|
||||
*/
|
||||
struct hal_rx_mon_desc_info *mon_desc;
|
||||
#endif
|
||||
/* Flag to hold on to monitor destination ring */
|
||||
bool hold_mon_dest_ring;
|
||||
|
||||
/* Flag to inidicate monitor rings are initialized */
|
||||
uint8_t pdev_mon_init;
|
||||
#ifndef REMOVE_PKT_LOG
|
||||
bool pkt_log_init;
|
||||
struct pktlog_dev_t *pl_dev; /* Pktlog pdev */
|
||||
#endif /* #ifndef REMOVE_PKT_LOG */
|
||||
|
||||
/* Smart Mesh */
|
||||
bool filter_neighbour_peers;
|
||||
|
||||
/*flag to indicate neighbour_peers_list not empty */
|
||||
bool neighbour_peers_added;
|
||||
/* smart mesh mutex */
|
||||
qdf_spinlock_t neighbour_peer_mutex;
|
||||
/* Neighnour peer list */
|
||||
TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list;
|
||||
/* Enhanced Stats is enabled */
|
||||
bool enhanced_stats_en;
|
||||
qdf_nbuf_queue_t rx_status_q;
|
||||
|
||||
/* 128 bytes mpdu header queue per user for ppdu */
|
||||
qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS];
|
||||
|
||||
/* is this a mpdu header TLV and not msdu header TLV */
|
||||
bool is_mpdu_hdr[MAX_MU_USERS];
|
||||
|
||||
/* per user 128 bytes msdu header list for MPDU */
|
||||
struct msdu_list msdu_list[MAX_MU_USERS];
|
||||
|
||||
/* RX enhanced capture mode */
|
||||
uint8_t rx_enh_capture_mode;
|
||||
/* Rx per peer enhanced capture mode */
|
||||
bool rx_enh_capture_peer;
|
||||
struct dp_vdev *rx_enh_monitor_vdev;
|
||||
/* RX enhanced capture trailer enable/disable flag */
|
||||
bool is_rx_enh_capture_trailer_enabled;
|
||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||
/* RX per MPDU/PPDU information */
|
||||
struct cdp_rx_indication_mpdu mpdu_ind;
|
||||
#endif
|
||||
|
||||
/* Packet log mode */
|
||||
uint8_t rx_pktlog_mode;
|
||||
/* Enable pktlog logging cbf */
|
||||
bool rx_pktlog_cbf;
|
||||
|
||||
bool tx_sniffer_enable;
|
||||
/* mirror copy mode */
|
||||
enum m_copy_mode mcopy_mode;
|
||||
bool enable_reap_timer_non_pkt;
|
||||
bool bpr_enable;
|
||||
/* Pdev level flag to check peer based pktlog enabled or
|
||||
* disabled
|
||||
*/
|
||||
uint8_t dp_peer_based_pktlog;
|
||||
|
||||
#ifdef WLAN_ATF_ENABLE
|
||||
/* ATF stats enable */
|
||||
bool dp_atf_stats_enable;
|
||||
#endif
|
||||
|
||||
/* Maintains first status buffer's paddr of a PPDU */
|
||||
uint64_t status_buf_addr;
|
||||
struct hal_rx_ppdu_info ppdu_info;
|
||||
|
||||
struct {
|
||||
uint8_t last_user;
|
||||
qdf_nbuf_t buf;
|
||||
} tx_ppdu_info;
|
||||
|
||||
struct {
|
||||
uint32_t tx_ppdu_id;
|
||||
uint16_t tx_peer_id;
|
||||
uint32_t rx_ppdu_id;
|
||||
} m_copy_id;
|
||||
|
||||
/* To check if PPDU Tx stats are enabled for Pktlog */
|
||||
bool pktlog_ppdu_stats;
|
||||
|
||||
#ifdef ATH_SUPPORT_NAC_RSSI
|
||||
bool nac_rssi_filtering;
|
||||
#endif
|
||||
|
||||
/* ppdu_stats lock for queue concurrency between cores*/
|
||||
qdf_spinlock_t ppdu_stats_lock;
|
||||
|
||||
/* list of ppdu tlvs */
|
||||
TAILQ_HEAD(, ppdu_info) ppdu_info_list;
|
||||
TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
|
||||
|
||||
uint32_t sched_comp_list_depth;
|
||||
uint16_t delivered_sched_cmdid;
|
||||
uint16_t last_sched_cmdid;
|
||||
uint32_t tlv_count;
|
||||
uint32_t list_depth;
|
||||
|
||||
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;
|
||||
} mgmtctrl_frm_info;
|
||||
/* Context of cal client timer */
|
||||
struct cdp_cal_client *cal_client_ctx;
|
||||
uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/
|
||||
|
||||
qdf_nbuf_t mcopy_status_nbuf;
|
||||
bool is_dp_mon_pdev_initialized;
|
||||
};
|
||||
|
||||
struct dp_mon_vdev {
|
||||
@@ -157,6 +350,9 @@ struct dp_mon_peer {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct mon_ops {
|
||||
};
|
||||
|
||||
#ifdef FEATURE_PERPKT_INFO
|
||||
void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
|
||||
#else
|
||||
@@ -167,6 +363,12 @@ void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
|
||||
#endif
|
||||
|
||||
#ifndef WLAN_TX_PKT_CAPTURE_ENH
|
||||
struct dp_pdev_tx_capture {
|
||||
};
|
||||
|
||||
struct dp_peer_tx_capture {
|
||||
};
|
||||
|
||||
/**
|
||||
* dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID
|
||||
* @peer: Datapath peer
|
||||
@@ -340,21 +542,282 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of
|
||||
* the MSDU Link Descriptor
|
||||
* @pdev: core txrx pdev context
|
||||
* @buf_info: buf_info includes cookie that used to lookup virtual address of
|
||||
* link descriptor. Normally this is just an index into a per pdev array.
|
||||
*
|
||||
* This is the VA of the link descriptor in monitor mode destination ring,
|
||||
* that HAL layer later uses to retrieve the list of MSDU's for a given MPDU.
|
||||
*
|
||||
* Return: void *: Virtual Address of the Rx descriptor
|
||||
*/
|
||||
static inline
|
||||
void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
|
||||
struct hal_buf_info *buf_info,
|
||||
int mac_id)
|
||||
{
|
||||
void *link_desc_va;
|
||||
struct qdf_mem_multi_page_t *pages;
|
||||
uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
|
||||
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
|
||||
|
||||
if (!mon_soc)
|
||||
return NULL;
|
||||
|
||||
pages = &mon_soc->mon_link_desc_pages[mac_id];
|
||||
if (!pages)
|
||||
return NULL;
|
||||
|
||||
if (qdf_unlikely(page_id >= pages->num_pages))
|
||||
return NULL;
|
||||
|
||||
link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
|
||||
(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
|
||||
|
||||
return link_desc_va;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
|
||||
* @soc: DP soc handle
|
||||
*
|
||||
* Return: Full monitor mode status
|
||||
*/
|
||||
static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
|
||||
{
|
||||
return (pdev->soc->monitor_soc->full_mon_mode &&
|
||||
pdev->monitor_pdev->monitor_configured) ? true : false;
|
||||
}
|
||||
|
||||
/*
|
||||
* dp_is_enable_reap_timer_non_pkt() - check if mon reap timer is
|
||||
* monitor_is_enable_reap_timer_non_pkt() - check if mon reap timer is
|
||||
* enabled by non-pkt log or not
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: true if mon reap timer is enabled by non-pkt log
|
||||
*/
|
||||
static inline bool dp_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
|
||||
static inline bool monitor_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev) {
|
||||
dp_err("null pdev");
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return false;
|
||||
|
||||
return pdev->monitor_pdev->enable_reap_timer_non_pkt;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: true if mcopy mode is enabled
|
||||
*/
|
||||
static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return false;
|
||||
|
||||
return pdev->monitor_pdev->mcopy_mode;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: true if tx sniffer is enabled
|
||||
*/
|
||||
static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return false;
|
||||
|
||||
return pdev->monitor_pdev->tx_sniffer_enable;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_is_set_monitor_configured() - check if monitor configured is set
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: true if monitor configured is set
|
||||
*/
|
||||
static inline bool monitor_is_configured(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return false;
|
||||
|
||||
return pdev->monitor_pdev->monitor_configured;
|
||||
}
|
||||
|
||||
static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
|
||||
void *rx_desc)
|
||||
{
|
||||
struct cdp_mon_status *rs;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
uint32_t msdu_ppdu_id = 0;
|
||||
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass))
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
rs = &pdev->monitor_pdev->rx_mon_recv_status;
|
||||
if (!rs || rs->cdp_rs_rxdma_err)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc);
|
||||
|
||||
if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP,
|
||||
QDF_TRACE_LEVEL_ERROR,
|
||||
"msdu_ppdu_id=%x,com_info.ppdu_id=%x",
|
||||
msdu_ppdu_id,
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static inline struct mon_rx_status*
|
||||
monitor_get_rx_status_addr(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return NULL;
|
||||
|
||||
return &pdev->monitor_pdev->ppdu_info.rx_status;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_is_chan_band_known() - check if monitor chan band known
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: true if chan band known
|
||||
*/
|
||||
static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return false;
|
||||
|
||||
if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return pdev->enable_reap_timer_non_pkt;
|
||||
/*
|
||||
* monitor_get_chan_band() - get chan band
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: wifi channel band
|
||||
*/
|
||||
static inline enum reg_wifi_band
|
||||
monitor_get_chan_band(struct dp_pdev *pdev)
|
||||
{
|
||||
return pdev->monitor_pdev->mon_chan_band;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_print_tx_stats() - print tx stats from monitor pdev
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
*/
|
||||
static inline void monitor_print_tx_stats(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
DP_PRINT_STATS("ppdu info schedule completion list depth: %d",
|
||||
pdev->monitor_pdev->sched_comp_list_depth);
|
||||
DP_PRINT_STATS("delivered sched cmdid: %d",
|
||||
pdev->monitor_pdev->delivered_sched_cmdid);
|
||||
DP_PRINT_STATS("cur sched cmdid: %d",
|
||||
pdev->monitor_pdev->last_sched_cmdid);
|
||||
DP_PRINT_STATS("ppdu info list depth: %d",
|
||||
pdev->monitor_pdev->list_depth);
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_is_enable_enhanced_stats() - check if enhanced stats enabled
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return: true if enhanced stats is enabled
|
||||
*/
|
||||
static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return false;
|
||||
|
||||
return pdev->monitor_pdev->enhanced_stats_en;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_set_chan_num() - set channel number
|
||||
* @pdev: point to dp pdev
|
||||
* @chan_num: channel number
|
||||
*
|
||||
* Return:
|
||||
*/
|
||||
static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
pdev->monitor_pdev->mon_chan_num = chan_num;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_set_chan_freq() - set channel frequency
|
||||
* @pdev: point to dp pdev
|
||||
* @chan_freq: channel frequency
|
||||
*
|
||||
* Return:
|
||||
*/
|
||||
static inline void
|
||||
monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
pdev->monitor_pdev->mon_chan_freq = chan_freq;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_set_chan_band() - set channel band
|
||||
* @pdev: point to dp pdev
|
||||
* @chan_band: channel band
|
||||
*
|
||||
* Return:
|
||||
*/
|
||||
static inline void
|
||||
monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
pdev->monitor_pdev->mon_chan_band = chan_band;
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_get_mpdu_status() - get mpdu status
|
||||
* @pdev: point to dp pdev
|
||||
* @soc: point to dp soc
|
||||
*
|
||||
*/
|
||||
static inline void monitor_get_mpdu_status(struct dp_pdev *pdev,
|
||||
struct dp_soc *soc,
|
||||
uint8_t *rx_tlv_hdr)
|
||||
{
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr,
|
||||
&mon_pdev->ppdu_info.rx_status);
|
||||
}
|
||||
|
||||
#ifdef FEATURE_NAC_RSSI
|
||||
@@ -364,8 +827,11 @@ static inline QDF_STATUS monitor_drop_inv_peer_pkts(struct dp_vdev *vdev,
|
||||
struct dp_pdev *pdev = vdev->pdev;
|
||||
struct dp_soc *soc = pdev->soc;
|
||||
|
||||
if (!soc->hw_nac_monitor_support &&
|
||||
pdev->filter_neighbour_peers &&
|
||||
if (!soc->monitor_soc)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
if (!soc->monitor_soc->hw_nac_monitor_support &&
|
||||
pdev->monitor_pdev->filter_neighbour_peers &&
|
||||
vdev->opmode == wlan_op_mode_sta) {
|
||||
mon_rx_warn("%pK: Drop inv peer pkts with STA RA:%pm",
|
||||
soc, wh->i_addr1);
|
||||
@@ -416,6 +882,15 @@ static inline void monitor_vdev_register_osif(struct dp_vdev *vdev,
|
||||
vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon;
|
||||
}
|
||||
|
||||
static inline struct dp_vdev*
|
||||
monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
|
||||
{
|
||||
if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev)
|
||||
return NULL;
|
||||
|
||||
return pdev->monitor_pdev->mvdev;
|
||||
}
|
||||
|
||||
static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc)
|
||||
{
|
||||
struct dp_mon_soc *mon_soc;
|
||||
@@ -428,6 +903,21 @@ static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc)
|
||||
return mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_RUNNING;
|
||||
}
|
||||
|
||||
static inline struct qdf_mem_multi_page_t*
|
||||
monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
|
||||
{
|
||||
if (!soc || !soc->monitor_soc)
|
||||
return NULL;
|
||||
|
||||
return &soc->monitor_soc->mon_link_desc_pages[mac_id];
|
||||
}
|
||||
|
||||
static inline uint32_t *
|
||||
monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
|
||||
{
|
||||
return &soc->monitor_soc->total_mon_link_descs[mac_id];
|
||||
}
|
||||
|
||||
static inline QDF_STATUS monitor_pdev_attach(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_mon_ops *monitor_ops;
|
||||
@@ -1473,7 +1963,7 @@ bool monitor_reap_timer_stop(struct dp_soc *soc)
|
||||
return false;
|
||||
}
|
||||
|
||||
monitor_ops->mon_reap_timer_stop(mon_soc);
|
||||
return monitor_ops->mon_reap_timer_stop(mon_soc);
|
||||
}
|
||||
|
||||
static inline
|
||||
@@ -1556,6 +2046,54 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc)
|
||||
return monitor_ops->mon_vdev_timer_stop(mon_soc);
|
||||
}
|
||||
|
||||
static inline
|
||||
QDF_STATUS monitor_mcopy_check_deliver(struct dp_pdev *pdev,
|
||||
uint16_t peer_id, uint32_t ppdu_id,
|
||||
uint8_t first_msdu)
|
||||
{
|
||||
struct dp_mon_ops *monitor_ops;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
|
||||
|
||||
if (!mon_soc) {
|
||||
qdf_err("monitor soc is NULL");
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
monitor_ops = mon_soc->mon_ops;
|
||||
if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) {
|
||||
qdf_err("callback not registered");
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
return monitor_ops->mon_mcopy_check_deliver(mon_pdev, peer_id,
|
||||
ppdu_id, first_msdu);
|
||||
}
|
||||
|
||||
static inline void monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
|
||||
struct dp_peer *ta_peer,
|
||||
uint8_t *mac_addr,
|
||||
qdf_nbuf_t nbuf,
|
||||
uint32_t flags)
|
||||
{
|
||||
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
|
||||
struct dp_mon_ops *monitor_ops;
|
||||
|
||||
if (!mon_soc) {
|
||||
qdf_err("monitor soc is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
monitor_ops = mon_soc->mon_ops;
|
||||
if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) {
|
||||
qdf_err("callback not registered");
|
||||
return;
|
||||
}
|
||||
|
||||
return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr,
|
||||
nbuf, flags);
|
||||
}
|
||||
|
||||
static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev)
|
||||
{
|
||||
if (soc->intr_mode == DP_INTR_POLL) {
|
||||
@@ -1569,3 +2107,77 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev)
|
||||
monitor_vdev_detach(vdev);
|
||||
}
|
||||
|
||||
#ifdef DP_POWER_SAVE
|
||||
/*
|
||||
* monitor_stop_reap_timer() - stop reap timer
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return:
|
||||
*/
|
||||
static inline void monitor_stop_reap_timer(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_soc *soc;
|
||||
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
soc = pdev->soc;
|
||||
|
||||
if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
|
||||
monitor_is_enable_reap_timer_non_pkt(pdev))) {
|
||||
if (monitor_reap_timer_stop(soc))
|
||||
monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* monitor_start_reap_timer() - start reap timer
|
||||
* @pdev: point to dp pdev
|
||||
*
|
||||
* Return:
|
||||
*/
|
||||
static inline void monitor_start_reap_timer(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_soc *soc;
|
||||
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
soc = pdev->soc;
|
||||
if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
|
||||
monitor_is_enable_reap_timer_non_pkt(pdev)))
|
||||
monitor_reap_timer_start(soc);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline
|
||||
void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
|
||||
struct dp_vdev *vdev,
|
||||
struct dp_neighbour_peer *peer)
|
||||
{
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
struct dp_neighbour_peer *temp_peer = NULL;
|
||||
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
return;
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
|
||||
if (!pdev->soc->monitor_soc->hw_nac_monitor_support) {
|
||||
TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
|
||||
neighbour_peer_list_elem) {
|
||||
QDF_ASSERT(peer->vdev != vdev);
|
||||
}
|
||||
} else {
|
||||
TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list,
|
||||
neighbour_peer_list_elem, temp_peer) {
|
||||
if (peer->vdev == vdev) {
|
||||
TAILQ_REMOVE(&mon_pdev->neighbour_peers_list,
|
||||
peer,
|
||||
neighbour_peer_list_elem);
|
||||
qdf_mem_free(peer);
|
||||
}
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include "dp_types.h"
|
||||
#include "dp_internal.h"
|
||||
#include "dp_htt.h"
|
||||
#include "dp_mon.h"
|
||||
#include "dp_mon_filter.h"
|
||||
|
||||
/**
|
||||
@@ -51,7 +52,7 @@ static int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
|
||||
* @mode: The filter modes
|
||||
* @tlv_filter: tlv filter
|
||||
*/
|
||||
static void dp_mon_filter_show_filter(struct dp_pdev *pdev,
|
||||
static void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
|
||||
enum dp_mon_filter_mode mode,
|
||||
struct dp_mon_filter *filter)
|
||||
{
|
||||
@@ -192,6 +193,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
{
|
||||
int32_t current_mode = 0;
|
||||
struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
/*
|
||||
* Loop through all the modes.
|
||||
@@ -199,7 +201,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
|
||||
current_mode++) {
|
||||
struct dp_mon_filter *mon_filter =
|
||||
&pdev->filter[current_mode][srng_type];
|
||||
&mon_pdev->filter[current_mode][srng_type];
|
||||
uint32_t src_filter = 0, dst_filter = 0;
|
||||
|
||||
/*
|
||||
@@ -305,7 +307,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
|
||||
}
|
||||
|
||||
dp_mon_filter_show_filter(pdev, 0, filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, 0, filter);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -338,44 +340,46 @@ dp_mon_filter_reset_mon_srng(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
*/
|
||||
static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
/*
|
||||
* Check if the Rx Enhanced capture mode, monitor mode,
|
||||
* smart_monitor_mode and mcopy mode can co-exist together.
|
||||
*/
|
||||
if ((pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) &&
|
||||
((pdev->neighbour_peers_added && pdev->monitor_vdev) ||
|
||||
pdev->mcopy_mode)) {
|
||||
if ((mon_pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) &&
|
||||
((mon_pdev->neighbour_peers_added && mon_pdev->mvdev) ||
|
||||
mon_pdev->mcopy_mode)) {
|
||||
dp_mon_filter_err("%pK:Rx Capture mode can't exist with modes:\n"
|
||||
"Smart Monitor Mode:%d\n"
|
||||
"M_Copy Mode:%d", pdev->soc,
|
||||
pdev->neighbour_peers_added,
|
||||
pdev->mcopy_mode);
|
||||
mon_pdev->neighbour_peers_added,
|
||||
mon_pdev->mcopy_mode);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the monitor mode cannot co-exist with any other mode.
|
||||
*/
|
||||
if ((pdev->monitor_vdev && pdev->monitor_configured) &&
|
||||
(pdev->mcopy_mode || pdev->neighbour_peers_added)) {
|
||||
if ((mon_pdev->mvdev && mon_pdev->monitor_configured) &&
|
||||
(mon_pdev->mcopy_mode || mon_pdev->neighbour_peers_added)) {
|
||||
dp_mon_filter_err("%pK: Monitor mode can't exist with modes\n"
|
||||
"M_Copy Mode:%d\n"
|
||||
"Smart Monitor Mode:%d",
|
||||
pdev->soc, pdev->mcopy_mode,
|
||||
pdev->neighbour_peers_added);
|
||||
pdev->soc, mon_pdev->mcopy_mode,
|
||||
mon_pdev->neighbour_peers_added);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the smart monitor mode can co-exist with any other mode
|
||||
*/
|
||||
if (pdev->neighbour_peers_added &&
|
||||
((pdev->mcopy_mode) || pdev->monitor_configured)) {
|
||||
dp_mon_filter_err("%pK: Smart Monitor mode can't exist with modes\n"
|
||||
if (mon_pdev->neighbour_peers_added &&
|
||||
((mon_pdev->mcopy_mode) || mon_pdev->monitor_configured)) {
|
||||
dp_mon_filter_err("%pk: Smart Monitor mode can't exist with modes\n"
|
||||
"M_Copy Mode:%d\n"
|
||||
"Monitor Mode:%d",
|
||||
pdev->soc, pdev->mcopy_mode,
|
||||
pdev->monitor_configured);
|
||||
pdev->soc, mon_pdev->mcopy_mode,
|
||||
mon_pdev->monitor_configured);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
@@ -383,13 +387,13 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
|
||||
* Check if the m_copy, monitor mode and the smart_monitor_mode
|
||||
* can co-exist togther.
|
||||
*/
|
||||
if (pdev->mcopy_mode &&
|
||||
(pdev->monitor_vdev || pdev->neighbour_peers_added)) {
|
||||
if (mon_pdev->mcopy_mode &&
|
||||
(mon_pdev->mvdev || mon_pdev->neighbour_peers_added)) {
|
||||
dp_mon_filter_err("%pK: mcopy mode can't exist with modes\n"
|
||||
"Monitor Mode:%pK\n"
|
||||
"Smart Monitor Mode:%d",
|
||||
pdev->soc, pdev->monitor_vdev,
|
||||
pdev->neighbour_peers_added);
|
||||
pdev->soc, mon_pdev->mvdev,
|
||||
mon_pdev->neighbour_peers_added);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
@@ -397,12 +401,12 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
|
||||
* Check if the Rx packet log lite or full can co-exist with
|
||||
* the enable modes.
|
||||
*/
|
||||
if ((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
|
||||
!pdev->rx_pktlog_cbf &&
|
||||
(pdev->monitor_vdev || pdev->monitor_configured)) {
|
||||
if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
|
||||
!mon_pdev->rx_pktlog_cbf &&
|
||||
(mon_pdev->mvdev || mon_pdev->monitor_configured)) {
|
||||
dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n"
|
||||
"Monitor Mode:%d", pdev->soc,
|
||||
pdev->monitor_configured);
|
||||
mon_pdev->monitor_configured);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
return QDF_STATUS_SUCCESS;
|
||||
@@ -414,11 +418,11 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
|
||||
* Check if the Rx packet log lite or full can co-exist with
|
||||
* the enable modes.
|
||||
*/
|
||||
if ((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
|
||||
(pdev->monitor_vdev || pdev->monitor_configured)) {
|
||||
if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
|
||||
(mon_pdev->mvdev || mon_pdev->monitor_configured)) {
|
||||
dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n"
|
||||
"Monitor Mode:%d", pdev->soc,
|
||||
pdev->monitor_configured);
|
||||
mon_pdev->monitor_configured);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
@@ -433,7 +437,7 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
|
||||
static void dp_mon_filter_set_mon_cmn(struct dp_mon_pdev *mon_pdev,
|
||||
struct dp_mon_filter *filter)
|
||||
{
|
||||
filter->tlv_filter.mpdu_start = 1;
|
||||
@@ -450,16 +454,16 @@ static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
|
||||
filter->tlv_filter.ppdu_end_status_done = 0;
|
||||
filter->tlv_filter.header_per_msdu = 1;
|
||||
filter->tlv_filter.enable_fp =
|
||||
(pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0;
|
||||
(mon_pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0;
|
||||
filter->tlv_filter.enable_mo =
|
||||
(pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0;
|
||||
(mon_pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0;
|
||||
|
||||
filter->tlv_filter.fp_mgmt_filter = pdev->fp_mgmt_filter;
|
||||
filter->tlv_filter.fp_ctrl_filter = pdev->fp_ctrl_filter;
|
||||
filter->tlv_filter.fp_data_filter = pdev->fp_data_filter;
|
||||
filter->tlv_filter.mo_mgmt_filter = pdev->mo_mgmt_filter;
|
||||
filter->tlv_filter.mo_ctrl_filter = pdev->mo_ctrl_filter;
|
||||
filter->tlv_filter.mo_data_filter = pdev->mo_data_filter;
|
||||
filter->tlv_filter.fp_mgmt_filter = mon_pdev->fp_mgmt_filter;
|
||||
filter->tlv_filter.fp_ctrl_filter = mon_pdev->fp_ctrl_filter;
|
||||
filter->tlv_filter.fp_data_filter = mon_pdev->fp_data_filter;
|
||||
filter->tlv_filter.mo_mgmt_filter = mon_pdev->mo_mgmt_filter;
|
||||
filter->tlv_filter.mo_ctrl_filter = mon_pdev->mo_ctrl_filter;
|
||||
filter->tlv_filter.mo_data_filter = mon_pdev->mo_data_filter;
|
||||
filter->tlv_filter.offset_valid = false;
|
||||
}
|
||||
|
||||
@@ -470,7 +474,7 @@ static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev,
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static void dp_mon_filter_set_status_cmn(struct dp_pdev *pdev,
|
||||
static void dp_mon_filter_set_status_cmn(struct dp_mon_pdev *mon_pdev,
|
||||
struct dp_mon_filter *filter)
|
||||
{
|
||||
filter->tlv_filter.mpdu_start = 1;
|
||||
@@ -491,7 +495,7 @@ static void dp_mon_filter_set_status_cmn(struct dp_pdev *pdev,
|
||||
filter->tlv_filter.fp_data_filter = FILTER_DATA_ALL;
|
||||
filter->tlv_filter.offset_valid = false;
|
||||
|
||||
if (pdev->mon_filter_mode & MON_FILTER_OTHER) {
|
||||
if (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) {
|
||||
filter->tlv_filter.enable_mo = 1;
|
||||
filter->tlv_filter.mo_mgmt_filter = FILTER_MGMT_ALL;
|
||||
filter->tlv_filter.mo_ctrl_filter = FILTER_CTRL_ALL;
|
||||
@@ -562,26 +566,26 @@ static void dp_mon_filter_set_cbf_cmn(struct dp_pdev *pdev,
|
||||
#ifdef FEATURE_PERPKT_INFO
|
||||
/**
|
||||
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: Monitor DP pdev handle
|
||||
*/
|
||||
void dp_mon_filter_setup_enhanced_stats(struct dp_pdev *pdev)
|
||||
void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev)
|
||||
{
|
||||
struct dp_mon_filter filter = {0};
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
if (!mon_pdev) {
|
||||
dp_mon_filter_err("Monitor pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -594,12 +598,15 @@ void dp_mon_filter_reset_enhanced_stats(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -613,6 +620,7 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -625,19 +633,24 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
if (!mon_pdev) {
|
||||
dp_mon_filter_err("monitor pdev Context is null");
|
||||
return;
|
||||
}
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_mon_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_mon_cmn(mon_pdev, &filter);
|
||||
|
||||
filter.tlv_filter.fp_data_filter = 0;
|
||||
filter.tlv_filter.mo_data_filter = 0;
|
||||
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
/* Clear the filter as the same filter will be used to set the
|
||||
* monitor status ring
|
||||
@@ -646,16 +659,16 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev)
|
||||
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
|
||||
/* Setup the filter */
|
||||
filter.tlv_filter.enable_mo = 1;
|
||||
filter.tlv_filter.packet_header = 1;
|
||||
filter.tlv_filter.mpdu_end = 1;
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -669,6 +682,7 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -681,13 +695,14 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
#endif /* FEATURE_PERPKT_INFO */
|
||||
|
||||
@@ -700,9 +715,12 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_mon_filter filter = {0};
|
||||
struct dp_soc *soc = NULL;
|
||||
struct dp_mon_soc *mon_soc;
|
||||
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -715,36 +733,39 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_soc = soc->monitor_soc;
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
|
||||
if (soc->hw_nac_monitor_support) {
|
||||
if (mon_soc->hw_nac_monitor_support) {
|
||||
filter.tlv_filter.enable_md = 1;
|
||||
filter.tlv_filter.packet_header = 1;
|
||||
filter.tlv_filter.md_data_filter = FILTER_DATA_ALL;
|
||||
}
|
||||
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter
|
||||
* @pdev: DP pdev handle
|
||||
*/
|
||||
void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev)
|
||||
void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev)
|
||||
{
|
||||
struct dp_mon_filter filter = {0};
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
|
||||
if (!mon_pdev) {
|
||||
dp_mon_filter_err("monitor pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
|
||||
|
||||
@@ -760,6 +781,7 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -772,9 +794,11 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_mon_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_mon_cmn(mon_pdev, &filter);
|
||||
|
||||
filter.tlv_filter.fp_mgmt_filter = 0;
|
||||
filter.tlv_filter.fp_ctrl_filter = 0;
|
||||
@@ -783,12 +807,12 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
|
||||
filter.tlv_filter.mo_ctrl_filter = 0;
|
||||
filter.tlv_filter.mo_data_filter = 0;
|
||||
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
/* Clear the filter as the same filter will be used to set the
|
||||
* monitor status ring
|
||||
@@ -797,31 +821,31 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev)
|
||||
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
|
||||
/* Setup the filter */
|
||||
filter.tlv_filter.mpdu_end = 1;
|
||||
filter.tlv_filter.enable_mo = 1;
|
||||
filter.tlv_filter.packet_header = 1;
|
||||
|
||||
if (pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) {
|
||||
if (mon_pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) {
|
||||
filter.tlv_filter.header_per_msdu = 0;
|
||||
filter.tlv_filter.enable_mo = 0;
|
||||
} else if (pdev->rx_enh_capture_mode ==
|
||||
} else if (mon_pdev->rx_enh_capture_mode ==
|
||||
CDP_RX_ENH_CAPTURE_MPDU_MSDU) {
|
||||
bool is_rx_mon_proto_flow_tag_enabled =
|
||||
wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(soc->wlan_cfg_ctx);
|
||||
filter.tlv_filter.header_per_msdu = 1;
|
||||
filter.tlv_filter.enable_mo = 0;
|
||||
if (pdev->is_rx_enh_capture_trailer_enabled ||
|
||||
if (mon_pdev->is_rx_enh_capture_trailer_enabled ||
|
||||
is_rx_mon_proto_flow_tag_enabled)
|
||||
filter.tlv_filter.msdu_end = 1;
|
||||
}
|
||||
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -835,6 +859,7 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -847,13 +872,14 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
#endif /* WLAN_RX_PKT_CAPTURE_ENH */
|
||||
|
||||
@@ -868,6 +894,7 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -880,14 +907,15 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_mon_cmn(pdev, &filter);
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_set_mon_cmn(mon_pdev, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
/* Clear the filter as the same filter will be used to set the
|
||||
* monitor status ring
|
||||
@@ -896,12 +924,12 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev)
|
||||
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
/* Store the above filter */
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -915,6 +943,7 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -927,13 +956,14 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev)
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
#ifdef WDI_EVENT_ENABLE
|
||||
@@ -947,14 +977,17 @@ void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
|
||||
/* Setup the filter */
|
||||
filter.tlv_filter.packet_header = 1;
|
||||
@@ -963,8 +996,8 @@ void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev)
|
||||
filter.tlv_filter.mpdu_end = 1;
|
||||
filter.tlv_filter.attention = 1;
|
||||
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -977,12 +1010,15 @@ void dp_mon_filter_reset_rx_pkt_log_full(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -995,35 +1031,39 @@ void dp_mon_filter_setup_rx_pkt_log_lite(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cmn(pdev, &filter);
|
||||
dp_mon_filter_set_status_cmn(mon_pdev, &filter);
|
||||
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_mon_filter_reset_rx_pkt_log_lite() - Reset the Rx pktlog lite mode filter
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: Monitor pdev handle
|
||||
*/
|
||||
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev)
|
||||
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev)
|
||||
{
|
||||
struct dp_mon_filter filter = {0};
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
|
||||
if (!mon_pdev) {
|
||||
dp_mon_filter_err("monitor pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1037,6 +1077,7 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
@@ -1052,8 +1093,8 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev)
|
||||
/* Enabled the filter */
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_status_cbf(pdev, &filter);
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
/* Clear the filter as the same filter will be used to set the
|
||||
* monitor status ring
|
||||
@@ -1062,12 +1103,12 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev)
|
||||
|
||||
filter.valid = true;
|
||||
dp_mon_filter_set_cbf_cmn(pdev, &filter);
|
||||
dp_mon_filter_show_filter(pdev, mode, &filter);
|
||||
dp_mon_filter_show_filter(mon_pdev, mode, &filter);
|
||||
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1081,6 +1122,8 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
|
||||
enum dp_mon_filter_srng_type srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR,
|
||||
FL("pdev Context is null"));
|
||||
@@ -1097,10 +1140,10 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev)
|
||||
srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
|
||||
srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
|
||||
pdev->filter[mode][srng_type] = filter;
|
||||
mon_pdev->filter[mode][srng_type] = filter;
|
||||
}
|
||||
#endif /* WDI_EVENT_ENABLE */
|
||||
|
||||
@@ -1121,7 +1164,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev)
|
||||
*/
|
||||
static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev)
|
||||
{
|
||||
return (pdev->monitor_vdev) ? true : false;
|
||||
return (pdev->monitor_pdev->mvdev) ? true : false;
|
||||
}
|
||||
#else
|
||||
static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev)
|
||||
@@ -1145,12 +1188,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
|
||||
enum dp_mon_filter_srng_type mon_srng_type =
|
||||
DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF;
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
soc = pdev->soc;
|
||||
if (!soc) {
|
||||
dp_mon_filter_err("Soc Context is null");
|
||||
@@ -1184,7 +1229,7 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
|
||||
* reset when monitor mode gets enabled/disabled.
|
||||
*/
|
||||
if (soc->wlan_cfg_ctx->rxdma1_enable) {
|
||||
if (pdev->monitor_configured || mon_mode_set) {
|
||||
if (mon_pdev->monitor_configured || mon_mode_set) {
|
||||
status = dp_mon_ht2_rx_ring_cfg(soc, pdev,
|
||||
mon_srng_type,
|
||||
&filter.tlv_filter);
|
||||
@@ -1232,20 +1277,20 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
|
||||
* the radio object.
|
||||
* @pdev: DP pdev handle
|
||||
*/
|
||||
void dp_mon_filter_dealloc(struct dp_pdev *pdev)
|
||||
void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev)
|
||||
{
|
||||
enum dp_mon_filter_mode mode;
|
||||
struct dp_mon_filter **mon_filter = NULL;
|
||||
|
||||
if (!pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
if (!mon_pdev) {
|
||||
dp_mon_filter_err("Monitor pdev Context is null");
|
||||
return;
|
||||
}
|
||||
|
||||
mon_filter = pdev->filter;
|
||||
mon_filter = mon_pdev->filter;
|
||||
|
||||
/*
|
||||
* Check if the monitor filters are already allocated to the pdev.
|
||||
* Check if the monitor filters are already allocated to the mon_pdev.
|
||||
*/
|
||||
if (!mon_filter) {
|
||||
dp_mon_filter_err("Found NULL memmory for the Monitor filter");
|
||||
@@ -1265,20 +1310,20 @@ void dp_mon_filter_dealloc(struct dp_pdev *pdev)
|
||||
}
|
||||
|
||||
qdf_mem_free(mon_filter);
|
||||
pdev->filter = NULL;
|
||||
mon_pdev->filter = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_mon_filter_alloc() - Allocate the filter objects to be stored in
|
||||
* the radio object.
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: DP pdev handle
|
||||
*/
|
||||
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev)
|
||||
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev)
|
||||
{
|
||||
struct dp_mon_filter **mon_filter = NULL;
|
||||
enum dp_mon_filter_mode mode;
|
||||
|
||||
if (!pdev) {
|
||||
if (!mon_pdev) {
|
||||
dp_mon_filter_err("pdev Context is null");
|
||||
return NULL;
|
||||
}
|
||||
@@ -1303,13 +1348,13 @@ struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev)
|
||||
/* Assign the mon_filter to the pdev->filter such
|
||||
* that the dp_mon_filter_dealloc() can free up the filters. */
|
||||
if (!mon_filter[mode]) {
|
||||
pdev->filter = mon_filter;
|
||||
mon_pdev->filter = mon_filter;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
return mon_filter;
|
||||
fail:
|
||||
dp_mon_filter_dealloc(pdev);
|
||||
dp_mon_filter_dealloc(mon_pdev);
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -155,9 +155,9 @@ enum dp_mon_filter_action {
|
||||
#ifdef FEATURE_PERPKT_INFO
|
||||
/**
|
||||
* dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: Monitor DP pdev handle
|
||||
*/
|
||||
void dp_mon_filter_setup_enhanced_stats(struct dp_pdev *pdev);
|
||||
void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev);
|
||||
|
||||
/***
|
||||
* dp_mon_filter_reset_enhanced_stats() - Reset the enhanced stats filter
|
||||
@@ -187,9 +187,9 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev);
|
||||
|
||||
/**
|
||||
* dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: monitor pdev handle
|
||||
*/
|
||||
void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev);
|
||||
void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev);
|
||||
#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
|
||||
|
||||
#ifdef WLAN_RX_PKT_CAPTURE_ENH
|
||||
@@ -240,9 +240,9 @@ void dp_mon_filter_setup_rx_pkt_log_lite(struct dp_pdev *pdev);
|
||||
|
||||
/**
|
||||
* dp_mon_filter_reset_rx_pkt_log_lite() - Reset the Rx pktlog lite mode filter
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: Monitor pdev handle
|
||||
*/
|
||||
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev);
|
||||
void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev);
|
||||
|
||||
/**
|
||||
* dp_mon_filter_setup_rx_pkt_log_cbf() - Setup the Rx pktlog cbf mode filter
|
||||
@@ -270,14 +270,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev);
|
||||
/**
|
||||
* dp_mon_filter_dealloc() - Deallocate the filter objects to be stored in
|
||||
* the radio object.
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: monitor pdev handle
|
||||
*/
|
||||
void dp_mon_filter_dealloc(struct dp_pdev *pdev);
|
||||
void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev);
|
||||
|
||||
/**
|
||||
* dp_mon_filter_alloc() - Allocate the filter objects to be stored in
|
||||
* the radio object.
|
||||
* @pdev: DP pdev handle
|
||||
* @mon_pdev: monitor pdev handle
|
||||
*/
|
||||
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev);
|
||||
struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev);
|
||||
#endif /* #ifndef _DP_MON_FILTER_H_ */
|
||||
|
@@ -43,9 +43,10 @@ static inline void
|
||||
dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
qdf_nbuf_t mon_mpdu)
|
||||
{
|
||||
struct hal_rx_ppdu_info *ppdu_info = &pdev->ppdu_info;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
struct hal_rx_ppdu_info *ppdu_info = &mon_pdev->ppdu_info;
|
||||
|
||||
if (pdev->tx_capture_enabled
|
||||
if (mon_pdev->tx_capture_enabled
|
||||
== CDP_TX_ENH_CAPTURE_DISABLED)
|
||||
return;
|
||||
|
||||
@@ -59,9 +60,11 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
static void
|
||||
dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv)
|
||||
{
|
||||
if (dp_pdev->tx_capture_enabled
|
||||
struct dp_mon_pdev *mon_pdev = dp_pdev->monitor_pdev;
|
||||
|
||||
if (mon_pdev->tx_capture_enabled
|
||||
!= CDP_TX_ENH_CAPTURE_DISABLED)
|
||||
dp_pdev->ppdu_info.rx_info.user_id =
|
||||
mon_pdev->ppdu_info.rx_info.user_id =
|
||||
hal_rx_hw_desc_mpdu_user_id(dp_pdev->soc->hal_soc,
|
||||
rx_desc_tlv);
|
||||
}
|
||||
@@ -191,12 +194,14 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
qdf_dma_addr_t buf_paddr = 0;
|
||||
uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
|
||||
struct cdp_mon_status *rs;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (qdf_unlikely(!dp_pdev)) {
|
||||
dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
|
||||
return rx_bufs_used;
|
||||
}
|
||||
|
||||
mon_pdev = dp_pdev->monitor_pdev;
|
||||
msdu = 0;
|
||||
|
||||
last = NULL;
|
||||
@@ -204,7 +209,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
hal_rx_reo_ent_buf_paddr_get(soc->hal_soc, rxdma_dst_ring_desc,
|
||||
&buf_info, &msdu_cnt);
|
||||
|
||||
rs = &dp_pdev->rx_mon_recv_status;
|
||||
rs = &mon_pdev->rx_mon_recv_status;
|
||||
rs->cdp_rs_rxdma_err = false;
|
||||
if ((hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc) ==
|
||||
HAL_RX_WBM_RXDMA_PSH_RSN_ERROR)) {
|
||||
@@ -214,11 +219,11 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
if (qdf_unlikely((rxdma_err == HAL_RXDMA_ERR_FLUSH_REQUEST) ||
|
||||
(rxdma_err == HAL_RXDMA_ERR_MPDU_LENGTH) ||
|
||||
(rxdma_err == HAL_RXDMA_ERR_OVERFLOW) ||
|
||||
(rxdma_err == HAL_RXDMA_ERR_FCS && dp_pdev->mcopy_mode) ||
|
||||
(rxdma_err == HAL_RXDMA_ERR_FCS && mon_pdev->mcopy_mode) ||
|
||||
(rxdma_err == HAL_RXDMA_ERR_FCS &&
|
||||
dp_pdev->rx_pktlog_cbf))) {
|
||||
mon_pdev->rx_pktlog_cbf))) {
|
||||
drop_mpdu = true;
|
||||
dp_pdev->rx_mon_stats.dest_mpdu_drop++;
|
||||
mon_pdev->rx_mon_stats.dest_mpdu_drop++;
|
||||
}
|
||||
rs->cdp_rs_rxdma_err = true;
|
||||
}
|
||||
@@ -228,9 +233,9 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
|
||||
do {
|
||||
/* WAR for duplicate link descriptors received from HW */
|
||||
if (qdf_unlikely(dp_pdev->mon_last_linkdesc_paddr ==
|
||||
if (qdf_unlikely(mon_pdev->mon_last_linkdesc_paddr ==
|
||||
buf_info.paddr)) {
|
||||
dp_pdev->rx_mon_stats.dup_mon_linkdesc_cnt++;
|
||||
mon_pdev->rx_mon_stats.dup_mon_linkdesc_cnt++;
|
||||
return rx_bufs_used;
|
||||
}
|
||||
|
||||
@@ -257,7 +262,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
buf_paddr = dp_rx_mon_get_paddr_from_desc(rx_desc);
|
||||
|
||||
/* WAR for duplicate buffers received from HW */
|
||||
if (qdf_unlikely(dp_pdev->mon_last_buf_cookie ==
|
||||
if (qdf_unlikely(mon_pdev->mon_last_buf_cookie ==
|
||||
msdu_list.sw_cookie[i] ||
|
||||
DP_RX_MON_IS_BUFFER_ADDR_NULL(rx_desc) ||
|
||||
msdu_list.paddr[i] != buf_paddr ||
|
||||
@@ -266,8 +271,8 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
* buffers in this MPDU
|
||||
*/
|
||||
drop_mpdu = true;
|
||||
dp_pdev->rx_mon_stats.dup_mon_buf_cnt++;
|
||||
dp_pdev->mon_last_linkdesc_paddr =
|
||||
mon_pdev->rx_mon_stats.dup_mon_buf_cnt++;
|
||||
mon_pdev->mon_last_linkdesc_paddr =
|
||||
buf_info.paddr;
|
||||
continue;
|
||||
}
|
||||
@@ -285,13 +290,13 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
rx_desc->pool_id)) {
|
||||
drop_mpdu = true;
|
||||
msdu = NULL;
|
||||
dp_pdev->mon_last_linkdesc_paddr =
|
||||
mon_pdev->mon_last_linkdesc_paddr =
|
||||
buf_info.paddr;
|
||||
goto next_msdu;
|
||||
}
|
||||
|
||||
if (drop_mpdu) {
|
||||
dp_pdev->mon_last_linkdesc_paddr =
|
||||
mon_pdev->mon_last_linkdesc_paddr =
|
||||
buf_info.paddr;
|
||||
dp_rx_mon_buffer_free(rx_desc);
|
||||
msdu = NULL;
|
||||
@@ -311,7 +316,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
drop_mpdu = true;
|
||||
dp_rx_mon_buffer_free(rx_desc);
|
||||
msdu = NULL;
|
||||
dp_pdev->mon_last_linkdesc_paddr =
|
||||
mon_pdev->mon_last_linkdesc_paddr =
|
||||
buf_info.paddr;
|
||||
goto next_msdu;
|
||||
}
|
||||
@@ -346,12 +351,12 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
rx_desc_tlv);
|
||||
|
||||
if (*ppdu_id == msdu_ppdu_id)
|
||||
dp_pdev->rx_mon_stats.ppdu_id_match++;
|
||||
mon_pdev->rx_mon_stats.ppdu_id_match++;
|
||||
else
|
||||
dp_pdev->rx_mon_stats.ppdu_id_mismatch
|
||||
mon_pdev->rx_mon_stats.ppdu_id_mismatch
|
||||
++;
|
||||
|
||||
dp_pdev->mon_last_linkdesc_paddr =
|
||||
mon_pdev->mon_last_linkdesc_paddr =
|
||||
buf_info.paddr;
|
||||
|
||||
if (dp_rx_mon_alloc_parent_buffer(head_msdu)
|
||||
@@ -370,7 +375,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
rx_desc_tlv))
|
||||
hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc,
|
||||
rx_desc_tlv,
|
||||
&(dp_pdev->ppdu_info.rx_status));
|
||||
&mon_pdev->ppdu_info.rx_status);
|
||||
|
||||
dp_rx_mon_parse_desc_buffer(soc,
|
||||
&(msdu_list.msdu_info[i]),
|
||||
@@ -430,7 +435,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
|
||||
}
|
||||
|
||||
next_msdu:
|
||||
dp_pdev->mon_last_buf_cookie = msdu_list.sw_cookie[i];
|
||||
mon_pdev->mon_last_buf_cookie = msdu_list.sw_cookie[i];
|
||||
rx_bufs_used++;
|
||||
dp_rx_add_to_free_desc_list(head,
|
||||
tail, rx_desc);
|
||||
@@ -551,11 +556,14 @@ qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc,
|
||||
uint32_t pad_byte_pholder = 0;
|
||||
qdf_nbuf_t msdu_curr;
|
||||
uint16_t rx_mon_tlv_size = soc->rx_mon_pkt_tlv_size;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (qdf_unlikely(!dp_pdev)) {
|
||||
dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mon_pdev = dp_pdev->monitor_pdev;
|
||||
qdf_mem_zero(&buf_info, sizeof(struct hal_rx_mon_dest_buf_info));
|
||||
|
||||
if (!head_msdu || !tail_msdu)
|
||||
@@ -576,7 +584,7 @@ qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc,
|
||||
rx_mon_tlv_size;
|
||||
rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc,
|
||||
rx_desc);
|
||||
dp_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
|
||||
mon_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
|
||||
|
||||
rx_desc = qdf_nbuf_get_frag_addr(head_msdu, 0) - rx_mon_tlv_size;
|
||||
hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_desc,
|
||||
@@ -936,6 +944,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
|
||||
struct ieee80211_frame *wh;
|
||||
struct ieee80211_qoscntl *qos;
|
||||
struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
head_frag_list = NULL;
|
||||
mpdu_buf = NULL;
|
||||
|
||||
@@ -945,6 +954,8 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mon_pdev = dp_pdev->monitor_pdev;
|
||||
|
||||
/* The nbuf has been pulled just beyond the status and points to the
|
||||
* payload
|
||||
*/
|
||||
@@ -966,7 +977,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
|
||||
|
||||
rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc,
|
||||
rx_desc);
|
||||
dp_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
|
||||
mon_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err;
|
||||
|
||||
/* Fill out the rx_status from the PPDU start and end fields */
|
||||
/* HAL_RX_GET_PPDU_STATUS(soc, mac_id, rx_status); */
|
||||
@@ -1307,6 +1318,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc,
|
||||
uint32_t *nbuf_data;
|
||||
struct ieee80211_frame *wh;
|
||||
qdf_frag_t addr;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!nbuf)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
@@ -1335,7 +1347,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc,
|
||||
qdf_nbuf_free(nbuf);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
*nbuf_data = pdev->ppdu_info.com_info.ppdu_id;
|
||||
*nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id;
|
||||
|
||||
dp_wdi_event_handler(WDI_EVENT_RX_MGMT_CTRL, soc, nbuf,
|
||||
HTT_INVALID_PEER,
|
||||
@@ -1443,11 +1455,14 @@ static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
|
||||
void *data;
|
||||
struct ieee80211_frame *wh;
|
||||
uint8_t type, subtype;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev)
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
if (pdev->rx_pktlog_cbf) {
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (mon_pdev->rx_pktlog_cbf) {
|
||||
if (qdf_nbuf_get_nr_frags(mpdu))
|
||||
data = qdf_nbuf_get_frag_addr(mpdu, 0);
|
||||
else
|
||||
@@ -1465,7 +1480,7 @@ static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
|
||||
subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
|
||||
if (type == IEEE80211_FC0_TYPE_MGT &&
|
||||
subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) {
|
||||
msdu_timestamp = pdev->ppdu_info.rx_status.tsft;
|
||||
msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft;
|
||||
dp_rx_populate_cbf_hdr(soc,
|
||||
mac_id, event,
|
||||
mpdu,
|
||||
@@ -1488,16 +1503,22 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
|
||||
qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu)
|
||||
{
|
||||
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
|
||||
struct cdp_mon_status *rs = &pdev->rx_mon_recv_status;
|
||||
struct cdp_mon_status *rs;
|
||||
qdf_nbuf_t mon_skb, skb_next;
|
||||
qdf_nbuf_t mon_mpdu = NULL;
|
||||
struct dp_vdev *vdev;
|
||||
struct dp_mon_vdev *mon_vdev;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev || (!pdev->monitor_vdev && !pdev->mcopy_mode &&
|
||||
!pdev->rx_pktlog_cbf))
|
||||
if (!pdev)
|
||||
goto mon_deliver_fail;
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
rs = &mon_pdev->rx_mon_recv_status;
|
||||
|
||||
if (!mon_pdev->mvdev && !mon_pdev->mcopy_mode &&
|
||||
!mon_pdev->rx_pktlog_cbf)
|
||||
goto mon_deliver_fail;
|
||||
|
||||
vdev = pdev->monitor_vdev;
|
||||
/* restitch mon MPDU for delivery via monitor interface */
|
||||
mon_mpdu = dp_rx_mon_restitch_mpdu(soc, mac_id, head_msdu,
|
||||
tail_msdu, rs);
|
||||
@@ -1513,22 +1534,26 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
|
||||
/* monitor vap cannot be present when mcopy is enabled
|
||||
* hence same skb can be consumed
|
||||
*/
|
||||
if (pdev->mcopy_mode)
|
||||
if (mon_pdev->mcopy_mode)
|
||||
return dp_send_mgmt_packet_to_stack(soc, mon_mpdu, pdev);
|
||||
|
||||
if (mon_mpdu && pdev->monitor_vdev && pdev->monitor_vdev->osif_vdev &&
|
||||
vdev->monitor_vdev->osif_rx_mon) {
|
||||
pdev->ppdu_info.rx_status.ppdu_id =
|
||||
pdev->ppdu_info.com_info.ppdu_id;
|
||||
pdev->ppdu_info.rx_status.device_id = soc->device_id;
|
||||
pdev->ppdu_info.rx_status.chan_noise_floor =
|
||||
if (mon_mpdu && mon_pdev->mvdev &&
|
||||
mon_pdev->mvdev->osif_vdev &&
|
||||
mon_pdev->mvdev->monitor_vdev &&
|
||||
mon_pdev->mvdev->monitor_vdev->osif_rx_mon) {
|
||||
mon_vdev = mon_pdev->mvdev->monitor_vdev;
|
||||
|
||||
mon_pdev->ppdu_info.rx_status.ppdu_id =
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id;
|
||||
mon_pdev->ppdu_info.rx_status.device_id = soc->device_id;
|
||||
mon_pdev->ppdu_info.rx_status.chan_noise_floor =
|
||||
pdev->chan_noise_floor;
|
||||
/* convert rssi_comb from dBm to positive dB value */
|
||||
dp_rx_mon_rssi_convert(&pdev->ppdu_info.rx_status);
|
||||
dp_rx_mon_rssi_convert(&mon_pdev->ppdu_info.rx_status);
|
||||
|
||||
dp_handle_tx_capture(soc, pdev, mon_mpdu);
|
||||
|
||||
if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status,
|
||||
if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status,
|
||||
mon_mpdu,
|
||||
qdf_nbuf_headroom(mon_mpdu))) {
|
||||
DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1);
|
||||
@@ -1536,13 +1561,14 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
|
||||
}
|
||||
|
||||
dp_rx_mon_update_pf_tag_to_buf_headroom(soc, mon_mpdu);
|
||||
vdev->monitor_vdev->osif_rx_mon(pdev->monitor_vdev->osif_vdev,
|
||||
|
||||
mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev,
|
||||
mon_mpdu,
|
||||
&pdev->ppdu_info.rx_status);
|
||||
&mon_pdev->ppdu_info.rx_status);
|
||||
} else {
|
||||
dp_rx_mon_dest_debug("%pK: mon_mpdu=%pK monitor_vdev %pK osif_vdev %pK"
|
||||
, soc, mon_mpdu, pdev->monitor_vdev,
|
||||
(pdev->monitor_vdev ? pdev->monitor_vdev->osif_vdev
|
||||
, soc, mon_mpdu, mon_pdev->mvdev,
|
||||
(mon_pdev->mvdev ? mon_pdev->mvdev->osif_vdev
|
||||
: NULL));
|
||||
goto mon_deliver_fail;
|
||||
}
|
||||
@@ -1579,19 +1605,23 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
|
||||
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
|
||||
ol_txrx_rx_mon_fp osif_rx_mon;
|
||||
qdf_nbuf_t dummy_msdu;
|
||||
struct dp_vdev *vdev;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
struct dp_mon_vdev *mon_vdev;
|
||||
|
||||
/* Sanity checking */
|
||||
if (!pdev || !pdev->monitor_vdev)
|
||||
if (!pdev || !pdev->monitor_pdev)
|
||||
goto mon_deliver_non_std_fail;
|
||||
|
||||
vdev = pdev->monitor_vdev;
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!vdev->monitor_vdev->osif_rx_mon)
|
||||
if (!mon_pdev->mvdev || !mon_pdev->mvdev ||
|
||||
!mon_pdev->mvdev->monitor_vdev ||
|
||||
!mon_pdev->mvdev->monitor_vdev->osif_rx_mon)
|
||||
goto mon_deliver_non_std_fail;
|
||||
|
||||
mon_vdev = mon_pdev->mvdev->monitor_vdev;
|
||||
/* Generate a dummy skb_buff */
|
||||
osif_rx_mon = vdev->monitor_vdev->osif_rx_mon;
|
||||
osif_rx_mon = mon_vdev->osif_rx_mon;
|
||||
dummy_msdu = qdf_nbuf_alloc(soc->osdev, MAX_MONITOR_HEADER,
|
||||
MAX_MONITOR_HEADER, 4, FALSE);
|
||||
if (!dummy_msdu)
|
||||
@@ -1600,11 +1630,12 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
|
||||
qdf_nbuf_set_pktlen(dummy_msdu, 0);
|
||||
qdf_nbuf_set_next(dummy_msdu, NULL);
|
||||
|
||||
pdev->ppdu_info.rx_status.ppdu_id =
|
||||
pdev->ppdu_info.com_info.ppdu_id;
|
||||
mon_pdev->ppdu_info.rx_status.ppdu_id =
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id;
|
||||
|
||||
/* Apply the radio header to this dummy skb */
|
||||
if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, dummy_msdu,
|
||||
if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status,
|
||||
dummy_msdu,
|
||||
qdf_nbuf_headroom(dummy_msdu))) {
|
||||
DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1);
|
||||
qdf_nbuf_free(dummy_msdu);
|
||||
@@ -1612,13 +1643,13 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc,
|
||||
}
|
||||
|
||||
/* deliver to the user layer application */
|
||||
osif_rx_mon(pdev->monitor_vdev->osif_vdev,
|
||||
osif_rx_mon(mon_pdev->mvdev->osif_vdev,
|
||||
dummy_msdu, NULL);
|
||||
|
||||
/* Clear rx_status*/
|
||||
qdf_mem_zero(&pdev->ppdu_info.rx_status,
|
||||
sizeof(pdev->ppdu_info.rx_status));
|
||||
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
qdf_mem_zero(&mon_pdev->ppdu_info.rx_status,
|
||||
sizeof(mon_pdev->ppdu_info.rx_status));
|
||||
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
|
||||
@@ -1645,12 +1676,14 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
uint32_t mpdu_rx_bufs_used;
|
||||
int mac_for_pdev = mac_id;
|
||||
struct cdp_pdev_mon_stats *rx_mon_stats;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id);
|
||||
return;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
mon_dst_srng = dp_rxdma_get_mon_dst_ring(pdev, mac_for_pdev);
|
||||
|
||||
if (!mon_dst_srng || !hal_srng_initialized(mon_dst_srng)) {
|
||||
@@ -1663,7 +1696,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
|
||||
qdf_assert((hal_soc && pdev));
|
||||
|
||||
qdf_spin_lock_bh(&pdev->mon_lock);
|
||||
qdf_spin_lock_bh(&mon_pdev->mon_lock);
|
||||
|
||||
if (qdf_unlikely(dp_srng_access_start(int_ctx, soc, mon_dst_srng))) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
@@ -1674,9 +1707,9 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
}
|
||||
|
||||
pdev_id = pdev->pdev_id;
|
||||
ppdu_id = pdev->ppdu_info.com_info.ppdu_id;
|
||||
ppdu_id = mon_pdev->ppdu_info.com_info.ppdu_id;
|
||||
rx_bufs_used = 0;
|
||||
rx_mon_stats = &pdev->rx_mon_stats;
|
||||
rx_mon_stats = &mon_pdev->rx_mon_stats;
|
||||
|
||||
while (qdf_likely(rxdma_dst_ring_desc =
|
||||
hal_srng_dst_peek(hal_soc, mon_dst_srng))) {
|
||||
@@ -1695,34 +1728,35 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
rx_bufs_used += mpdu_rx_bufs_used;
|
||||
|
||||
if (mpdu_rx_bufs_used)
|
||||
pdev->mon_dest_ring_stuck_cnt = 0;
|
||||
mon_pdev->mon_dest_ring_stuck_cnt = 0;
|
||||
else
|
||||
pdev->mon_dest_ring_stuck_cnt++;
|
||||
mon_pdev->mon_dest_ring_stuck_cnt++;
|
||||
|
||||
if (pdev->mon_dest_ring_stuck_cnt >
|
||||
if (mon_pdev->mon_dest_ring_stuck_cnt >
|
||||
MON_DEST_RING_STUCK_MAX_CNT) {
|
||||
dp_info("destination ring stuck");
|
||||
dp_info("ppdu_id status=%d dest=%d",
|
||||
pdev->ppdu_info.com_info.ppdu_id, ppdu_id);
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id, ppdu_id);
|
||||
rx_mon_stats->mon_rx_dest_stuck++;
|
||||
pdev->ppdu_info.com_info.ppdu_id = ppdu_id;
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id = ppdu_id;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ppdu_id != pdev->ppdu_info.com_info.ppdu_id) {
|
||||
if (ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) {
|
||||
rx_mon_stats->stat_ring_ppdu_id_hist[
|
||||
rx_mon_stats->ppdu_id_hist_idx] =
|
||||
pdev->ppdu_info.com_info.ppdu_id;
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id;
|
||||
rx_mon_stats->dest_ring_ppdu_id_hist[
|
||||
rx_mon_stats->ppdu_id_hist_idx] = ppdu_id;
|
||||
rx_mon_stats->ppdu_id_hist_idx =
|
||||
(rx_mon_stats->ppdu_id_hist_idx + 1) &
|
||||
(MAX_PPDU_ID_HIST - 1);
|
||||
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
qdf_mem_zero(&(pdev->ppdu_info.rx_status),
|
||||
sizeof(pdev->ppdu_info.rx_status));
|
||||
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
qdf_mem_zero(&mon_pdev->ppdu_info.rx_status,
|
||||
sizeof(mon_pdev->ppdu_info.rx_status));
|
||||
dp_rx_mon_dest_debug("%pK: ppdu_id %x != ppdu_info.com_info.ppdu_id %x",
|
||||
soc, ppdu_id, pdev->ppdu_info.com_info.ppdu_id);
|
||||
soc, ppdu_id,
|
||||
mon_pdev->ppdu_info.com_info.ppdu_id);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1737,7 +1771,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
|
||||
dp_srng_access_end(int_ctx, soc, mon_dst_srng);
|
||||
|
||||
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
|
||||
|
||||
if (rx_bufs_used) {
|
||||
rx_mon_stats->dest_ppdu_done++;
|
||||
@@ -1844,6 +1878,7 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
struct rx_desc_pool *rx_desc_pool;
|
||||
uint32_t rx_desc_pool_size;
|
||||
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
mon_buf_ring = &soc->rxdma_mon_buf_ring[mac_id];
|
||||
|
||||
@@ -1869,9 +1904,9 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
|
||||
dp_rx_desc_pool_init(soc, mac_id, rx_desc_pool_size, rx_desc_pool);
|
||||
|
||||
pdev->mon_last_linkdesc_paddr = 0;
|
||||
mon_pdev->mon_last_linkdesc_paddr = 0;
|
||||
|
||||
pdev->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1;
|
||||
mon_pdev->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1;
|
||||
|
||||
/* Attach full monitor mode resources */
|
||||
dp_full_mon_attach(pdev);
|
||||
@@ -2084,7 +2119,7 @@ dp_rx_pdev_mon_desc_pool_init(struct dp_pdev *pdev)
|
||||
int mac_id;
|
||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
|
||||
dp_rx_pdev_mon_cmn_desc_pool_init(pdev, mac_id);
|
||||
qdf_spinlock_create(&pdev->mon_lock);
|
||||
qdf_spinlock_create(&pdev->monitor_pdev->mon_lock);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2094,7 +2129,7 @@ dp_rx_pdev_mon_desc_pool_deinit(struct dp_pdev *pdev)
|
||||
|
||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
|
||||
dp_rx_pdev_mon_cmn_desc_pool_deinit(pdev, mac_id);
|
||||
qdf_spinlock_destroy(&pdev->mon_lock);
|
||||
qdf_spinlock_destroy(&pdev->monitor_pdev->mon_lock);
|
||||
}
|
||||
|
||||
void dp_rx_pdev_mon_desc_pool_free(struct dp_pdev *pdev)
|
||||
@@ -2112,7 +2147,7 @@ dp_rx_pdev_mon_buffers_free(struct dp_pdev *pdev)
|
||||
|
||||
for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
|
||||
dp_rx_pdev_mon_cmn_buffers_free(pdev, mac_id);
|
||||
pdev->pdev_mon_init = 0;
|
||||
pdev->monitor_pdev->pdev_mon_init = 0;
|
||||
}
|
||||
|
||||
QDF_STATUS
|
||||
@@ -2154,6 +2189,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
|
||||
struct rx_desc_pool *rx_desc_pool;
|
||||
uint32_t reap_cnt = 0;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (qdf_unlikely(!soc || !soc->hal_soc))
|
||||
return reap_cnt;
|
||||
@@ -2164,11 +2200,12 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
return reap_cnt;
|
||||
|
||||
hal_soc = soc->hal_soc;
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
qdf_spin_lock_bh(&pdev->mon_lock);
|
||||
qdf_spin_lock_bh(&mon_pdev->mon_lock);
|
||||
|
||||
if (qdf_unlikely(hal_srng_access_start(hal_soc, mon_dst_srng))) {
|
||||
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
|
||||
return reap_cnt;
|
||||
}
|
||||
|
||||
@@ -2186,7 +2223,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
buf_info, mac_id);
|
||||
|
||||
if (qdf_unlikely(!rx_msdu_link_desc)) {
|
||||
pdev->rx_mon_stats.mon_link_desc_invalid++;
|
||||
mon_pdev->rx_mon_stats.mon_link_desc_invalid++;
|
||||
goto next_entry;
|
||||
}
|
||||
|
||||
@@ -2201,7 +2238,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
msdu_list.sw_cookie[i]);
|
||||
|
||||
if (qdf_unlikely(!rx_desc)) {
|
||||
pdev->rx_mon_stats.
|
||||
mon_pdev->rx_mon_stats.
|
||||
mon_rx_desc_invalid++;
|
||||
continue;
|
||||
}
|
||||
@@ -2213,7 +2250,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
if (qdf_unlikely(!rx_desc->in_use || !nbuf ||
|
||||
msdu_list.paddr[i] !=
|
||||
buf_paddr)) {
|
||||
pdev->rx_mon_stats.
|
||||
mon_pdev->rx_mon_stats.
|
||||
mon_nbuf_sanity_err++;
|
||||
continue;
|
||||
}
|
||||
@@ -2263,7 +2300,7 @@ next_entry:
|
||||
|
||||
hal_srng_access_end(hal_soc, mon_dst_srng);
|
||||
|
||||
qdf_spin_unlock_bh(&pdev->mon_lock);
|
||||
qdf_spin_unlock_bh(&mon_pdev->mon_lock);
|
||||
|
||||
if (rx_bufs_used) {
|
||||
dp_rx_buffers_replenish(soc, mac_id,
|
||||
|
@@ -24,11 +24,11 @@
|
||||
#include "qdf_trace.h"
|
||||
#include "qdf_nbuf.h"
|
||||
#include "hal_api_mon.h"
|
||||
#include "dp_rx_mon.h"
|
||||
#include "dp_internal.h"
|
||||
#include "qdf_mem.h" /* qdf_mem_malloc,free */
|
||||
#include "dp_htt.h"
|
||||
#include "dp_mon.h"
|
||||
#include "dp_rx_mon.h"
|
||||
|
||||
#include "htt.h"
|
||||
|
||||
@@ -83,6 +83,7 @@ dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev,
|
||||
struct dp_rx_desc *rx_desc;
|
||||
void *rx_tlv;
|
||||
QDF_STATUS buf_status;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
hal_soc = soc->hal_soc;
|
||||
|
||||
@@ -117,11 +118,11 @@ dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev,
|
||||
if (buf_status != QDF_STATUS_SUCCESS) {
|
||||
dp_err_rl("Monitor status ring: DMA is not done "
|
||||
"for nbuf: %pK", status_nbuf);
|
||||
pdev->rx_mon_stats.tlv_tag_status_err++;
|
||||
mon_pdev->rx_mon_stats.tlv_tag_status_err++;
|
||||
return DP_MON_STATUS_NO_DMA;
|
||||
}
|
||||
|
||||
pdev->rx_mon_stats.status_buf_done_war++;
|
||||
mon_pdev->rx_mon_stats.status_buf_done_war++;
|
||||
|
||||
return DP_MON_STATUS_REPLENISH;
|
||||
}
|
||||
@@ -834,13 +835,15 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
uint16_t size = 0;
|
||||
struct ieee80211_frame *wh;
|
||||
uint32_t *nbuf_data;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!ppdu_info->ppdu_msdu_info[fcs_ok_mpdu_cnt].first_msdu_payload)
|
||||
return QDF_STATUS_SUCCESS;
|
||||
|
||||
/* For M_COPY mode only one msdu per ppdu is sent to upper layer*/
|
||||
if (pdev->mcopy_mode == M_COPY) {
|
||||
if (pdev->m_copy_id.rx_ppdu_id == ppdu_info->com_info.ppdu_id)
|
||||
if (mon_pdev->mcopy_mode == M_COPY) {
|
||||
if (mon_pdev->m_copy_id.rx_ppdu_id ==
|
||||
ppdu_info->com_info.ppdu_id)
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -860,11 +863,11 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
}
|
||||
|
||||
nbuf_data = (uint32_t *)qdf_nbuf_data(nbuf);
|
||||
*nbuf_data = pdev->ppdu_info.com_info.ppdu_id;
|
||||
*nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id;
|
||||
/* only retain RX MSDU payload in the skb */
|
||||
qdf_nbuf_trim_tail(nbuf, qdf_nbuf_len(nbuf) - ppdu_info->ppdu_msdu_info[fcs_ok_mpdu_cnt].payload_len);
|
||||
if (deliver_frame) {
|
||||
pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id;
|
||||
mon_pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id;
|
||||
dp_wdi_event_handler(WDI_EVENT_RX_DATA, soc,
|
||||
nbuf, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
@@ -899,19 +902,22 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
{
|
||||
QDF_STATUS mcopy_status;
|
||||
qdf_nbuf_t nbuf_clone = NULL;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
/* If the MPDU end tlv and RX header are received in different buffers,
|
||||
* process the RX header based on fcs status.
|
||||
*/
|
||||
if (pdev->mcopy_status_nbuf) {
|
||||
if (mon_pdev->mcopy_status_nbuf) {
|
||||
/* For M_COPY mode only one msdu per ppdu is sent to upper layer*/
|
||||
if (pdev->mcopy_mode == M_COPY) {
|
||||
if (pdev->m_copy_id.rx_ppdu_id ==
|
||||
if (mon_pdev->mcopy_mode == M_COPY) {
|
||||
if (mon_pdev->m_copy_id.rx_ppdu_id ==
|
||||
ppdu_info->com_info.ppdu_id)
|
||||
goto end1;
|
||||
}
|
||||
|
||||
if (ppdu_info->is_fcs_passed) {
|
||||
nbuf_clone = qdf_nbuf_clone(pdev->mcopy_status_nbuf);
|
||||
nbuf_clone =
|
||||
qdf_nbuf_clone(mon_pdev->mcopy_status_nbuf);
|
||||
if (!nbuf_clone) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
||||
QDF_TRACE_LEVEL_ERROR,
|
||||
@@ -919,7 +925,8 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
goto end1;
|
||||
}
|
||||
|
||||
pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id;
|
||||
mon_pdev->m_copy_id.rx_ppdu_id =
|
||||
ppdu_info->com_info.ppdu_id;
|
||||
dp_wdi_event_handler(WDI_EVENT_RX_DATA, soc,
|
||||
nbuf_clone,
|
||||
HTT_INVALID_PEER,
|
||||
@@ -927,8 +934,8 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
ppdu_info->is_fcs_passed = false;
|
||||
}
|
||||
end1:
|
||||
qdf_nbuf_free(pdev->mcopy_status_nbuf);
|
||||
pdev->mcopy_status_nbuf = NULL;
|
||||
qdf_nbuf_free(mon_pdev->mcopy_status_nbuf);
|
||||
mon_pdev->mcopy_status_nbuf = NULL;
|
||||
}
|
||||
|
||||
/* If the MPDU end tlv and RX header are received in different buffers,
|
||||
@@ -938,17 +945,17 @@ end1:
|
||||
*/
|
||||
if ((ppdu_info->fcs_ok_cnt + ppdu_info->fcs_err_cnt) !=
|
||||
ppdu_info->com_info.mpdu_cnt) {
|
||||
pdev->mcopy_status_nbuf = qdf_nbuf_clone(status_nbuf);
|
||||
if (pdev->mcopy_status_nbuf) {
|
||||
mcopy_status = dp_rx_handle_mcopy_mode(
|
||||
soc, pdev,
|
||||
mon_pdev->mcopy_status_nbuf = qdf_nbuf_clone(status_nbuf);
|
||||
if (mon_pdev->mcopy_status_nbuf) {
|
||||
mcopy_status =
|
||||
dp_rx_handle_mcopy_mode(soc, pdev,
|
||||
ppdu_info,
|
||||
pdev->mcopy_status_nbuf,
|
||||
mon_pdev->mcopy_status_nbuf,
|
||||
ppdu_info->fcs_ok_cnt,
|
||||
false);
|
||||
if (mcopy_status == QDF_STATUS_SUCCESS) {
|
||||
qdf_nbuf_free(pdev->mcopy_status_nbuf);
|
||||
pdev->mcopy_status_nbuf = NULL;
|
||||
qdf_nbuf_free(mon_pdev->mcopy_status_nbuf);
|
||||
mon_pdev->mcopy_status_nbuf = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -975,7 +982,9 @@ dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev,
|
||||
struct hal_rx_ppdu_info *ppdu_info,
|
||||
uint32_t tlv_status)
|
||||
{
|
||||
if (!pdev->mcopy_mode)
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!mon_pdev->mcopy_mode)
|
||||
return;
|
||||
|
||||
/* The fcs status is received in MPDU end tlv. If the RX header
|
||||
@@ -1025,6 +1034,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
QDF_STATUS mcopy_status;
|
||||
qdf_nbuf_t nbuf_clone = NULL;
|
||||
uint8_t fcs_ok_mpdu_cnt = 0;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
dp_rx_mcopy_handle_last_mpdu(soc, pdev, ppdu_info, status_nbuf);
|
||||
|
||||
@@ -1035,7 +1045,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
goto end;
|
||||
|
||||
/* For M_COPY mode only one msdu per ppdu is sent to upper layer*/
|
||||
if (pdev->mcopy_mode == M_COPY)
|
||||
if (mon_pdev->mcopy_mode == M_COPY)
|
||||
ppdu_info->fcs_ok_cnt = 1;
|
||||
|
||||
while (fcs_ok_mpdu_cnt < ppdu_info->fcs_ok_cnt) {
|
||||
@@ -1092,16 +1102,17 @@ dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
qdf_nbuf_t nbuf)
|
||||
{
|
||||
uint8_t size = 0;
|
||||
struct dp_vdev *vdev;
|
||||
struct dp_mon_vdev *mon_vdev;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
if (!pdev->monitor_vdev) {
|
||||
if (!mon_pdev->mvdev) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
"[%s]:[%d] Monitor vdev is NULL !!",
|
||||
__func__, __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
vdev = pdev->monitor_vdev;
|
||||
mon_vdev = mon_pdev->mvdev->monitor_vdev;
|
||||
|
||||
if (!ppdu_info->msdu_info.first_msdu_payload) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||
@@ -1125,15 +1136,15 @@ dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
/* Only retain RX MSDU payload in the skb */
|
||||
qdf_nbuf_trim_tail(nbuf, qdf_nbuf_len(nbuf) -
|
||||
ppdu_info->msdu_info.payload_len);
|
||||
if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, nbuf,
|
||||
if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status, nbuf,
|
||||
qdf_nbuf_headroom(nbuf))) {
|
||||
DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
vdev->monitor_vdev->osif_rx_mon(pdev->monitor_vdev->osif_vdev,
|
||||
mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev,
|
||||
nbuf, NULL);
|
||||
pdev->ppdu_info.rx_status.monitor_direct_used = 0;
|
||||
mon_pdev->ppdu_info.rx_status.monitor_direct_used = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1488,6 +1499,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
{
|
||||
qdf_nbuf_t ppdu_nbuf;
|
||||
struct cdp_rx_indication_ppdu *cdp_rx_ppdu;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
/*
|
||||
* Do not allocate if fcs error,
|
||||
@@ -1504,9 +1516,9 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
struct dp_neighbour_peer *peer = NULL;
|
||||
uint8_t rssi = ppdu_info->rx_status.rssi_comb;
|
||||
|
||||
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
|
||||
if (pdev->neighbour_peers_added) {
|
||||
TAILQ_FOREACH(peer, &pdev->neighbour_peers_list,
|
||||
qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
|
||||
if (mon_pdev->neighbour_peers_added) {
|
||||
TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
|
||||
neighbour_peer_list_elem) {
|
||||
if (!qdf_mem_cmp(&peer->neighbour_peers_macaddr,
|
||||
&ppdu_info->nac_info.mac_addr2,
|
||||
@@ -1516,7 +1528,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
}
|
||||
}
|
||||
}
|
||||
qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
|
||||
qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
|
||||
} else {
|
||||
dp_info("Neighbour peers RSSI update failed! fc_valid = %d, to_ds_flag = %d and mac_addr2_valid = %d",
|
||||
ppdu_info->nac_info.fc_valid,
|
||||
@@ -1527,7 +1539,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
/* need not generate wdi event when mcopy, cfr rcc mode and
|
||||
* enhanced stats are not enabled
|
||||
*/
|
||||
if (!pdev->mcopy_mode && !pdev->enhanced_stats_en &&
|
||||
if (!mon_pdev->mcopy_mode && !mon_pdev->enhanced_stats_en &&
|
||||
!dp_cfr_rcc_mode_status(pdev))
|
||||
return;
|
||||
|
||||
@@ -1536,7 +1548,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
|
||||
if (!ppdu_info->rx_status.frame_control_info_valid ||
|
||||
(ppdu_info->rx_status.ast_index == HAL_AST_IDX_INVALID)) {
|
||||
if (!(pdev->mcopy_mode ||
|
||||
if (!(mon_pdev->mcopy_mode ||
|
||||
(dp_bb_captured_chan_status(pdev, ppdu_info) ==
|
||||
QDF_STATUS_SUCCESS)))
|
||||
return;
|
||||
@@ -1563,7 +1575,8 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
|
||||
soc, ppdu_nbuf,
|
||||
cdp_rx_ppdu->peer_id,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
} else if (pdev->mcopy_mode || dp_cfr_rcc_mode_status(pdev)) {
|
||||
} else if (mon_pdev->mcopy_mode ||
|
||||
dp_cfr_rcc_mode_status(pdev)) {
|
||||
dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC, soc,
|
||||
ppdu_nbuf, HTT_INVALID_PEER,
|
||||
WDI_NO_VAL, pdev->pdev_id);
|
||||
@@ -1742,6 +1755,8 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
|
||||
bool nbuf_used;
|
||||
uint32_t rx_enh_capture_mode;
|
||||
struct dp_mon_soc *mon_soc = soc->monitor_soc;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_rx_mon_status_debug("%pK: pdev is null for mac_id = %d", soc,
|
||||
@@ -1749,24 +1764,25 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
return;
|
||||
}
|
||||
|
||||
ppdu_info = &pdev->ppdu_info;
|
||||
rx_mon_stats = &pdev->rx_mon_stats;
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
ppdu_info = &mon_pdev->ppdu_info;
|
||||
rx_mon_stats = &mon_pdev->rx_mon_stats;
|
||||
|
||||
if (pdev->mon_ppdu_status != DP_PPDU_STATUS_START)
|
||||
if (mon_pdev->mon_ppdu_status != DP_PPDU_STATUS_START)
|
||||
return;
|
||||
|
||||
rx_enh_capture_mode = pdev->rx_enh_capture_mode;
|
||||
rx_enh_capture_mode = mon_pdev->rx_enh_capture_mode;
|
||||
|
||||
while (!qdf_nbuf_is_queue_empty(&pdev->rx_status_q)) {
|
||||
while (!qdf_nbuf_is_queue_empty(&mon_pdev->rx_status_q)) {
|
||||
|
||||
status_nbuf = qdf_nbuf_queue_remove(&pdev->rx_status_q);
|
||||
status_nbuf = qdf_nbuf_queue_remove(&mon_pdev->rx_status_q);
|
||||
|
||||
rx_tlv = qdf_nbuf_data(status_nbuf);
|
||||
rx_tlv_start = rx_tlv;
|
||||
nbuf_used = false;
|
||||
|
||||
if ((pdev->monitor_vdev) || (pdev->enhanced_stats_en) ||
|
||||
(pdev->mcopy_mode) || (dp_cfr_rcc_mode_status(pdev)) ||
|
||||
if ((mon_pdev->mvdev) || (mon_pdev->enhanced_stats_en) ||
|
||||
(mon_pdev->mcopy_mode) || (dp_cfr_rcc_mode_status(pdev)) ||
|
||||
(rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED)) {
|
||||
do {
|
||||
tlv_status = hal_rx_status_get_tlv_info(rx_tlv,
|
||||
@@ -1795,14 +1811,14 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
(tlv_status == HAL_TLV_STATUS_MPDU_END) ||
|
||||
(tlv_status == HAL_TLV_STATUS_MSDU_END));
|
||||
}
|
||||
if (pdev->dp_peer_based_pktlog) {
|
||||
if (mon_pdev->dp_peer_based_pktlog) {
|
||||
dp_rx_process_peer_based_pktlog(soc, ppdu_info,
|
||||
status_nbuf,
|
||||
pdev->pdev_id);
|
||||
} else {
|
||||
if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL)
|
||||
if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL)
|
||||
pktlog_mode = WDI_EVENT_RX_DESC;
|
||||
else if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE)
|
||||
else if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE)
|
||||
pktlog_mode = WDI_EVENT_LITE_RX;
|
||||
|
||||
if (pktlog_mode != WDI_NO_VAL)
|
||||
@@ -1813,13 +1829,14 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
}
|
||||
|
||||
/* smart monitor vap and m_copy cannot co-exist */
|
||||
if (ppdu_info->rx_status.monitor_direct_used && pdev->neighbour_peers_added
|
||||
&& pdev->monitor_vdev) {
|
||||
if (ppdu_info->rx_status.monitor_direct_used &&
|
||||
mon_pdev->neighbour_peers_added &&
|
||||
mon_pdev->mvdev) {
|
||||
smart_mesh_status = dp_rx_handle_smart_mesh_mode(soc,
|
||||
pdev, ppdu_info, status_nbuf);
|
||||
if (smart_mesh_status)
|
||||
qdf_nbuf_free(status_nbuf);
|
||||
} else if (qdf_unlikely(pdev->mcopy_mode)) {
|
||||
} else if (qdf_unlikely(mon_pdev->mcopy_mode)) {
|
||||
dp_rx_process_mcopy_mode(soc, pdev,
|
||||
ppdu_info, tlv_status,
|
||||
status_nbuf);
|
||||
@@ -1841,39 +1858,41 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
rx_mon_stats->status_ppdu_done++;
|
||||
dp_rx_mon_handle_mu_ul_info(ppdu_info);
|
||||
|
||||
if (pdev->tx_capture_enabled
|
||||
if (mon_pdev->tx_capture_enabled
|
||||
!= CDP_TX_ENH_CAPTURE_DISABLED)
|
||||
dp_send_ack_frame_to_stack(soc, pdev,
|
||||
ppdu_info);
|
||||
|
||||
if (pdev->enhanced_stats_en ||
|
||||
pdev->mcopy_mode || pdev->neighbour_peers_added)
|
||||
if (mon_pdev->enhanced_stats_en ||
|
||||
mon_pdev->mcopy_mode ||
|
||||
mon_pdev->neighbour_peers_added)
|
||||
dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info);
|
||||
else if (dp_cfr_rcc_mode_status(pdev))
|
||||
dp_rx_handle_cfr(soc, pdev, ppdu_info);
|
||||
|
||||
pdev->mon_ppdu_status = DP_PPDU_STATUS_DONE;
|
||||
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_DONE;
|
||||
|
||||
/*
|
||||
* if chan_num is not fetched correctly from ppdu RX TLV,
|
||||
* get it from pdev saved.
|
||||
*/
|
||||
if (qdf_unlikely(pdev->ppdu_info.rx_status.chan_num == 0))
|
||||
pdev->ppdu_info.rx_status.chan_num = pdev->mon_chan_num;
|
||||
if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.chan_num == 0))
|
||||
mon_pdev->ppdu_info.rx_status.chan_num =
|
||||
mon_pdev->mon_chan_num;
|
||||
/*
|
||||
* if chan_freq is not fetched correctly from ppdu RX TLV,
|
||||
* get it from pdev saved.
|
||||
*/
|
||||
if (qdf_unlikely(pdev->ppdu_info.rx_status.chan_freq == 0)) {
|
||||
pdev->ppdu_info.rx_status.chan_freq =
|
||||
pdev->mon_chan_freq;
|
||||
if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.chan_freq == 0)) {
|
||||
mon_pdev->ppdu_info.rx_status.chan_freq =
|
||||
mon_pdev->mon_chan_freq;
|
||||
}
|
||||
|
||||
if (!soc->full_mon_mode)
|
||||
if (!mon_soc->full_mon_mode)
|
||||
dp_rx_mon_dest_process(soc, int_ctx, mac_id,
|
||||
quota);
|
||||
|
||||
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -1960,6 +1979,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
QDF_STATUS status;
|
||||
enum dp_mon_reap_status reap_status;
|
||||
uint32_t work_done = 0;
|
||||
struct dp_mon_pdev *mon_pdev;
|
||||
|
||||
if (!pdev) {
|
||||
dp_rx_mon_status_debug("%pK: pdev is null for mac_id = %d",
|
||||
@@ -1967,6 +1987,8 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
return work_done;
|
||||
}
|
||||
|
||||
mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
mon_status_srng = soc->rxdma_mon_status_ring[mac_id].hal_srng;
|
||||
|
||||
qdf_assert(mon_status_srng);
|
||||
@@ -2074,7 +2096,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
}
|
||||
|
||||
/* Put the status_nbuf to queue */
|
||||
qdf_nbuf_queue_add(&pdev->rx_status_q, status_nbuf);
|
||||
qdf_nbuf_queue_add(&mon_pdev->rx_status_q, status_nbuf);
|
||||
|
||||
} else {
|
||||
union dp_rx_desc_list_elem_t *desc_list = NULL;
|
||||
@@ -2169,7 +2191,9 @@ uint32_t
|
||||
dp_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
|
||||
uint32_t mac_id, uint32_t quota)
|
||||
{
|
||||
if (qdf_unlikely(soc->full_mon_mode))
|
||||
struct dp_mon_soc *mon_soc = soc->monitor_soc;
|
||||
|
||||
if (qdf_unlikely(mon_soc->full_mon_mode))
|
||||
return dp_rx_mon_process(soc, int_ctx, mac_id, quota);
|
||||
|
||||
return dp_rx_mon_status_process(soc, int_ctx, mac_id, quota);
|
||||
@@ -2244,6 +2268,7 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
uint32_t num_entries;
|
||||
struct rx_desc_pool *rx_desc_pool;
|
||||
struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
|
||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||
|
||||
soc_cfg_ctx = soc->wlan_cfg_ctx;
|
||||
mon_status_ring = &soc->rxdma_mon_status_ring[mac_id];
|
||||
@@ -2263,31 +2288,32 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id)
|
||||
|
||||
dp_rx_desc_pool_init(soc, mac_id, num_entries + 1, rx_desc_pool);
|
||||
|
||||
qdf_nbuf_queue_init(&pdev->rx_status_q);
|
||||
qdf_nbuf_queue_init(&mon_pdev->rx_status_q);
|
||||
|
||||
pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START;
|
||||
|
||||
qdf_mem_zero(&pdev->ppdu_info, sizeof(pdev->ppdu_info));
|
||||
qdf_mem_zero(&mon_pdev->ppdu_info, sizeof(mon_pdev->ppdu_info));
|
||||
|
||||
/*
|
||||
* Set last_ppdu_id to HAL_INVALID_PPDU_ID in order to avoid ppdu_id
|
||||
* match with '0' ppdu_id from monitor status ring
|
||||
*/
|
||||
pdev->ppdu_info.com_info.last_ppdu_id = HAL_INVALID_PPDU_ID;
|
||||
mon_pdev->ppdu_info.com_info.last_ppdu_id = HAL_INVALID_PPDU_ID;
|
||||
|
||||
qdf_mem_zero(&pdev->rx_mon_stats, sizeof(pdev->rx_mon_stats));
|
||||
qdf_mem_zero(&mon_pdev->rx_mon_stats, sizeof(mon_pdev->rx_mon_stats));
|
||||
|
||||
dp_rx_mon_init_dbg_ppdu_stats(&pdev->ppdu_info,
|
||||
&pdev->rx_mon_stats);
|
||||
dp_rx_mon_init_dbg_ppdu_stats(&mon_pdev->ppdu_info,
|
||||
&mon_pdev->rx_mon_stats);
|
||||
|
||||
for (i = 0; i < MAX_MU_USERS; i++) {
|
||||
qdf_nbuf_queue_init(&pdev->mpdu_q[i]);
|
||||
pdev->is_mpdu_hdr[i] = true;
|
||||
qdf_nbuf_queue_init(&mon_pdev->mpdu_q[i]);
|
||||
mon_pdev->is_mpdu_hdr[i] = true;
|
||||
}
|
||||
|
||||
qdf_mem_zero(pdev->msdu_list, sizeof(pdev->msdu_list[MAX_MU_USERS]));
|
||||
qdf_mem_zero(mon_pdev->msdu_list,
|
||||
sizeof(mon_pdev->msdu_list[MAX_MU_USERS]));
|
||||
|
||||
pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED;
|
||||
mon_pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED;
|
||||
}
|
||||
|
||||
void
|
||||
|
Reference in New Issue
Block a user