diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index f4d1ea1f0c..71593800ce 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -35,6 +35,7 @@ #ifdef FEATURE_PERPKT_INFO #include "dp_ratetable.h" #endif +#include #define HTT_TLV_HDR_LEN HTT_T2H_EXT_STATS_CONF_TLV_HDR_SIZE @@ -803,6 +804,8 @@ fail1: qdf_nbuf_free(htt_msg); return QDF_STATUS_E_FAILURE; } + +qdf_export_symbol(htt_h2t_full_mon_cfg); #else int htt_h2t_full_mon_cfg(struct htt_soc *htt_soc, uint8_t pdev_id, @@ -811,6 +814,7 @@ int htt_h2t_full_mon_cfg(struct htt_soc *htt_soc, return 0; } +qdf_export_symbol(htt_h2t_full_mon_cfg); #endif /* @@ -1545,6 +1549,8 @@ fail0: return QDF_STATUS_E_FAILURE; } +qdf_export_symbol(htt_h2t_rx_ring_cfg); + #if defined(HTT_STATS_ENABLE) static inline QDF_STATUS dp_send_htt_stat_resp(struct htt_stats_context *htt_stats, struct dp_soc *soc, qdf_nbuf_t htt_msg) @@ -2096,6 +2102,52 @@ dp_get_srng_ring_state_from_hal(struct dp_soc *soc, return QDF_STATUS_SUCCESS; } +#ifdef QCA_MONITOR_PKT_SUPPORT +static void +dp_queue_mon_ring_stats(struct dp_pdev *pdev, + int lmac_id, uint32_t *num_srng, + struct dp_soc_srngs_state *soc_srngs_state) +{ + QDF_STATUS status; + + if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { + status = dp_get_srng_ring_state_from_hal + (pdev->soc, pdev, + &pdev->soc->rxdma_mon_buf_ring[lmac_id], + RXDMA_MONITOR_BUF, + &soc_srngs_state->ring_state[*num_srng]); + + if (status == QDF_STATUS_SUCCESS) + qdf_assert_always(++(*num_srng) < DP_MAX_SRNGS); + + status = dp_get_srng_ring_state_from_hal + (pdev->soc, pdev, + &pdev->soc->rxdma_mon_dst_ring[lmac_id], + RXDMA_MONITOR_DST, + &soc_srngs_state->ring_state[*num_srng]); + + if (status == QDF_STATUS_SUCCESS) + qdf_assert_always(++(*num_srng) < DP_MAX_SRNGS); + + status = dp_get_srng_ring_state_from_hal + (pdev->soc, pdev, + &pdev->soc->rxdma_mon_desc_ring[lmac_id], + RXDMA_MONITOR_DESC, + &soc_srngs_state->ring_state[*num_srng]); + + if (status == QDF_STATUS_SUCCESS) + qdf_assert_always(++(*num_srng) < DP_MAX_SRNGS); + } +} +#else +static void +dp_queue_mon_ring_stats(struct dp_pdev *pdev, + int lmac_id, uint32_t *num_srng, + struct dp_soc_srngs_state *soc_srngs_state) +{ +} +#endif + /** * dp_queue_srng_ring_stats(): Print pdev hal level ring stats * @pdev: DP_pdev handle @@ -2258,34 +2310,8 @@ static void dp_queue_ring_stats(struct dp_pdev *pdev) lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id, pdev->pdev_id); - if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { - status = dp_get_srng_ring_state_from_hal - (pdev->soc, pdev, - &pdev->soc->rxdma_mon_buf_ring[lmac_id], - RXDMA_MONITOR_BUF, - &soc_srngs_state->ring_state[j]); - - if (status == QDF_STATUS_SUCCESS) - qdf_assert_always(++j < DP_MAX_SRNGS); - - status = dp_get_srng_ring_state_from_hal - (pdev->soc, pdev, - &pdev->soc->rxdma_mon_dst_ring[lmac_id], - RXDMA_MONITOR_DST, - &soc_srngs_state->ring_state[j]); - - if (status == QDF_STATUS_SUCCESS) - qdf_assert_always(++j < DP_MAX_SRNGS); - - status = dp_get_srng_ring_state_from_hal - (pdev->soc, pdev, - &pdev->soc->rxdma_mon_desc_ring[lmac_id], - RXDMA_MONITOR_DESC, - &soc_srngs_state->ring_state[j]); - - if (status == QDF_STATUS_SUCCESS) - qdf_assert_always(++j < DP_MAX_SRNGS); - } + dp_queue_mon_ring_stats(pdev, lmac_id, &j, + soc_srngs_state); status = dp_get_srng_ring_state_from_hal (pdev->soc, pdev, @@ -3288,6 +3314,8 @@ QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev, return status; } + +qdf_export_symbol(dp_h2t_cfg_stats_msg_send); #endif void diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index c3273f48d9..ba8ebbb83a 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -182,6 +182,8 @@ static inline QDF_STATUS dp_mon_soc_detach_wrapper(struct dp_soc *soc) #endif #ifndef WIFI_MONITOR_SUPPORT +#define MON_BUF_MIN_ENTRIES 64 + static inline QDF_STATUS monitor_pdev_attach(struct dp_pdev *pdev) { return QDF_STATUS_SUCCESS; @@ -205,7 +207,7 @@ static inline QDF_STATUS monitor_vdev_detach(struct dp_vdev *vdev) static inline QDF_STATUS monitor_peer_attach(struct dp_soc *soc, struct dp_peer *peer) { - return QDF_STATUS_E_FAILURE; + return QDF_STATUS_SUCCESS; } static inline QDF_STATUS monitor_peer_detach(struct dp_soc *soc, @@ -451,10 +453,7 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc) { return false; } -#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) { @@ -488,6 +487,11 @@ static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc) return false; } +static inline +void monitor_pdev_set_mon_vdev(struct dp_vdev *vdev) +{ +} + static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev) { } @@ -577,7 +581,7 @@ static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, } static inline struct mon_rx_status* -monitor_get_rx_status_addr(struct dp_pdev *pdev) +monitor_get_rx_status(struct dp_pdev *pdev) { return NULL; } @@ -2143,9 +2147,6 @@ dp_hif_update_pipe_callback(struct dp_soc *dp_soc, hif_update_pipe_callback(dp_soc->hif_handle, DP_HTT_T2H_HP_PIPE, &hif_pipe_callbacks); } - -QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, - struct cdp_rx_stats_ppdu_user *ppdu_user); #else static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id, wdi_event_subscribe *event_cb_sub_handle, @@ -2191,14 +2192,6 @@ dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context, uint8_t pipe_id) { } - - -static inline QDF_STATUS -dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, - struct cdp_rx_stats_ppdu_user *ppdu_user) -{ - return QDF_STATUS_SUCCESS; -} #endif /* CONFIG_WIN */ #ifdef VDEV_PEER_PROTOCOL_COUNT diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index 8df2e1a9f3..8dbc60361a 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -31,6 +31,10 @@ #include "dp_tx.h" #include "dp_rx.h" #include "dp_ipa.h" +#include "dp_internal.h" +#ifdef WIFI_MONITOR_SUPPORT +#include "dp_mon.h" +#endif /* Ring index for WBM2SW2 release ring */ #define IPA_TX_COMP_RING_IDX HAL_IPA_TX_COMP_RING_IDX diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 4c8043db7a..2ca48d727e 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -66,7 +66,6 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc) #include #endif #include "dp_ipa.h" -#include "dp_cal_client_api.h" #ifdef FEATURE_WDS #include "dp_txrx_wds.h" #endif @@ -328,6 +327,8 @@ dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX] = { #endif }; +qdf_export_symbol(dp_cpu_ring_map); + /** * @brief Select the type of statistics */ @@ -3075,14 +3076,16 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id) 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) { + dp_err("can not get link desc pages"); + QDF_ASSERT(0); + return; + } + if (pages->dma_pages) { wlan_minidump_remove((void *) pages->dma_pages->page_v_addr_start, @@ -3095,6 +3098,8 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id) } } +qdf_export_symbol(dp_hw_link_desc_pool_banks_free); + /* * dp_hw_link_desc_pool_banks_alloc() - Allocate h/w link desc pool banks * @soc: DP SOC handle @@ -3134,11 +3139,14 @@ QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc, uint32_t mac_id) */ 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); + /* monitor_get_link_desc_pages returns NULL only + * if monitor SOC is NULL + */ + if (!pages) { + dp_err("can not get link desc pages"); + QDF_ASSERT(0); + return QDF_STATUS_E_FAULT; + } dp_srng = &soc->rxdma_mon_desc_ring[mac_id]; num_entries = dp_srng->alloc_size / hal_srng_get_entrysize(soc->hal_soc, @@ -3338,6 +3346,8 @@ fail: return QDF_STATUS_E_NOMEM; } +qdf_export_symbol(dp_hw_link_desc_pool_banks_alloc); + /* * dp_hw_link_desc_ring_init() - Initialize hw link desc rings * @soc: DP SOC handle @@ -3402,11 +3412,14 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id) desc_srng = soc->wbm_idle_link_ring.hal_srng; } else { 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); + /* monitor_get_link_desc_pages returns NULL only + * if monitor SOC is NULL + */ + if (!pages) { + dp_err("can not get link desc pages"); + QDF_ASSERT(0); + return; + } total_link_descs_addr = monitor_get_total_link_descs(soc, mac_id); total_link_descs = *total_link_descs_addr; @@ -3492,6 +3505,8 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id) } } +qdf_export_symbol(dp_link_desc_ring_replenish); + #ifdef IPA_OFFLOAD #define USE_1_IPA_RX_REO_RING 1 #define USE_2_IPA_RX_REO_RINGS 2 @@ -5297,8 +5312,6 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc) dp_soc_tx_history_detach(soc); dp_soc_rx_history_detach(soc); - monitor_vdev_timer_deinit(soc); - if (!dp_monitor_modularized_enable()) { dp_mon_soc_detach_wrapper(soc); } @@ -5446,13 +5459,10 @@ static QDF_STATUS dp_rxdma_ring_config(struct dp_soc *soc) htt_srng_setup(soc->htt_handle, mac_for_pdev, soc->rx_refill_buf_ring[lmac_id]. hal_srng, RXDMA_BUF); - if (wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) { - /* Configure monitor mode rings */ - monitor_htt_srng_setup(soc, pdev, - lmac_id, - mac_for_pdev); - } - + /* Configure monitor mode rings */ + monitor_htt_srng_setup(soc, pdev, + lmac_id, + mac_for_pdev); htt_srng_setup(soc->htt_handle, mac_for_pdev, soc->rxdma_err_dst_ring[lmac_id].hal_srng, RXDMA_DST); @@ -5829,8 +5839,13 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, dp_vdev_id_map_tbl_add(soc, vdev, vdev_id); if (wlan_op_mode_monitor == vdev->opmode) { - monitor_vdev_attach(vdev); - return QDF_STATUS_SUCCESS; + if (monitor_vdev_attach(vdev) == QDF_STATUS_SUCCESS) { + monitor_pdev_set_mon_vdev(vdev); + monitor_vdev_set_monitor_mode_buf_rings(pdev); + return QDF_STATUS_SUCCESS; + } else { + return QDF_STATUS_E_FAILURE; + } } vdev->tx_encap_type = wlan_cfg_pkt_type(soc->wlan_cfg_ctx); @@ -5854,6 +5869,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, cdp_soc, vdev->ap_bridge_enabled); dp_tx_vdev_attach(vdev); + monitor_vdev_attach(vdev); if (!pdev->is_lro_hash_configured) { if (QDF_IS_STATUS_SUCCESS(dp_lro_hash_setup(soc, pdev))) @@ -6400,13 +6416,9 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, QDF_STATUS_SUCCESS) dp_warn("peer ext_stats ctx alloc failed"); - monitor_peer_attach(soc, peer); - /* - * In tx_monitor mode, filter may be set for unassociated peer - * when unassociated peer get associated peer need to - * update tx_cap_enabled flag to support peer filter. - */ - monitor_peer_tx_capture_filter_check(pdev, peer); + if (monitor_peer_attach(soc, peer) != + QDF_STATUS_SUCCESS) + dp_warn("peer monitor ctx alloc failed"); dp_set_peer_isolation(peer, false); @@ -7058,6 +7070,7 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev, dp_tx_flow_pool_unmap_handler(pdev, vdev_id, FLOW_TYPE_VDEV, vdev_id); dp_tx_vdev_detach(vdev); + monitor_vdev_detach(vdev); free_vdev: qdf_spinlock_destroy(&vdev->peer_list_lock); @@ -7087,6 +7100,8 @@ free_vdev: vdev_delete_cb(vdev_delete_context); } +qdf_export_symbol(dp_vdev_unref_delete); + /* * dp_peer_unref_delete() - unref and delete peer * @peer_handle: Datapath peer handle @@ -7152,8 +7167,6 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id) wlan_minidump_remove(peer, sizeof(*peer), soc->ctrl_psoc, WLAN_MD_DP_PEER, "dp_peer"); - monitor_peer_detach(soc, peer); - qdf_spin_lock_bh(&soc->inactive_peer_list_lock); TAILQ_FOREACH(tmp_peer, &soc->inactive_peer_list, inactive_list_elem) { @@ -7172,6 +7185,8 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id) /* cleanup the peer data */ dp_peer_cleanup(vdev, peer); + monitor_peer_detach(soc, peer); + for (tid = 0; tid < DP_MAX_TIDS; tid++) qdf_spinlock_destroy(&peer->rx_tid[tid].tid_lock); @@ -7185,6 +7200,8 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id) } } +qdf_export_symbol(dp_peer_unref_delete); + #ifdef PEER_CACHE_RX_PKTS static inline void dp_peer_rx_bufq_resources_deinit(struct dp_peer *peer) { @@ -11299,7 +11316,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 */ - monitor_stop_reap_timer(pdev); + monitor_pktlog_reap_pending_frames(pdev); dp_suspend_fse_cache_flush(soc); @@ -11320,7 +11337,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 */ - monitor_start_reap_timer(pdev); + monitor_pktlog_start_reap_timer(pdev); dp_resume_fse_cache_flush(soc); @@ -11349,7 +11366,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. */ - monitor_stop_reap_timer(pdev); + monitor_pktlog_reap_pending_frames(pdev); } /** @@ -11371,7 +11388,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 */ - monitor_stop_reap_timer(pdev); + monitor_pktlog_reap_pending_frames(pdev); } static struct cdp_bus_ops dp_ops_bus = { @@ -11469,6 +11486,8 @@ void dp_soc_set_txrx_ring_map(struct dp_soc *soc) } } +qdf_export_symbol(dp_soc_set_txrx_ring_map); + #if defined(QCA_WIFI_QCA8074) || defined(QCA_WIFI_QCA6018) || \ defined(QCA_WIFI_QCA5018) || defined(QCA_WIFI_QCA9574) /** @@ -11931,6 +11950,9 @@ void dp_is_hw_dbs_enable(struct dp_soc *soc, *max_mac_rings = (dbs_enable)?(*max_mac_rings):1; } +qdf_export_symbol(dp_is_hw_dbs_enable); + +#if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) /** * dp_get_cfr_rcc() - get cfr rcc config * @soc_hdl: Datapath soc handle @@ -12020,6 +12042,7 @@ static void dp_clear_cfr_dbg_stats(struct cdp_soc_t *soc_hdl, qdf_mem_zero(&pdev->stats.rcc, sizeof(pdev->stats.rcc)); } +#endif /** * dp_bucket_index() - Return index from array diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 5f081289ad..e03b281a45 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -35,7 +35,7 @@ #ifdef FEATURE_WDS #include "dp_txrx_wds.h" #endif - +#include #ifdef QCA_PEER_EXT_STATS #include "dp_hist.h" #endif @@ -1398,6 +1398,8 @@ add_ast_entry: return QDF_STATUS_E_FAILURE; } +qdf_export_symbol(dp_peer_add_ast); + /* * dp_peer_free_ast_entry() - Free up the ast entry memory * @soc: SoC handle @@ -1995,6 +1997,8 @@ struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc, return NULL; /* failure */ } +qdf_export_symbol(dp_peer_find_hash_find); + /* * dp_peer_find_hash_remove() - remove peer from peer_hash_table * @soc: soc handle diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 9fdf02c06d..26a43c1ee6 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -473,6 +473,8 @@ free_descs: return QDF_STATUS_SUCCESS; } +qdf_export_symbol(__dp_rx_buffers_replenish); + /* * dp_rx_deliver_raw() - process RAW mode pkts and hand over the * pkts to RAW mode simulation to @@ -2352,6 +2354,8 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id, return QDF_STATUS_SUCCESS; } +qdf_export_symbol(dp_pdev_rx_buffers_attach); + /** * dp_rx_enable_mon_dest_frag() - Enable frag processing for * monitor destination ring via frag. @@ -2385,6 +2389,8 @@ void dp_rx_enable_mon_dest_frag(struct rx_desc_pool *rx_desc_pool, } #endif +qdf_export_symbol(dp_rx_enable_mon_dest_frag); + /* * dp_rx_pdev_desc_pool_alloc() - allocate memory for software rx descriptor * pool diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index affc691819..8e2b126a92 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -633,7 +633,6 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, void dp_rx_desc_pool_init(struct dp_soc *soc, uint32_t pool_id, uint32_t pool_size, struct rx_desc_pool *rx_desc_pool); -void dp_rx_pdev_mon_buf_buffers_free(struct dp_pdev *pdev, uint32_t mac_id); void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc, union dp_rx_desc_list_elem_t **local_desc_list, @@ -1315,25 +1314,6 @@ dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev, } #endif /* WLAN_SUPPORT_RX_FLOW_TAG */ -#if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\ - !defined(WLAN_SUPPORT_RX_FLOW_TAG) -/** - * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor - * mode and then tags appropriate packets - * @soc: core txrx main context - * @vdev: pdev on which packet is received - * @msdu: QDF packet buffer on which the protocol tag should be set - * @rx_desc: base address where the RX TLVs start - * Return: void - */ -static inline -void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, - struct dp_pdev *dp_pdev, - qdf_nbuf_t msdu, void *rx_desc) -{ -} -#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ - /* * dp_rx_buffers_replenish() - replenish rxdma ring with rx nbufs * called during dp rx initialization diff --git a/dp/wifi3.0/dp_rx_buffer_pool.c b/dp/wifi3.0/dp_rx_buffer_pool.c index 379764b51f..7031a2540f 100644 --- a/dp/wifi3.0/dp_rx_buffer_pool.c +++ b/dp/wifi3.0/dp_rx_buffer_pool.c @@ -18,6 +18,9 @@ #include "dp_rx_buffer_pool.h" #include "dp_ipa.h" +#ifdef WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL +#include "dp_rx_mon.h" +#endif #ifndef DP_RX_BUFFER_POOL_SIZE #define DP_RX_BUFFER_POOL_SIZE 128 diff --git a/dp/wifi3.0/dp_rx_desc.c b/dp/wifi3.0/dp_rx_desc.c index f1aa0a0500..541970d625 100644 --- a/dp/wifi3.0/dp_rx_desc.c +++ b/dp/wifi3.0/dp_rx_desc.c @@ -19,6 +19,7 @@ #include "dp_types.h" #include "dp_rx.h" #include "dp_ipa.h" +#include #ifdef RX_DESC_MULTI_PAGE_ALLOC A_COMPILE_TIME_ASSERT(cookie_size_check, @@ -43,6 +44,8 @@ QDF_STATUS dp_rx_desc_pool_is_allocated(struct rx_desc_pool *rx_desc_pool) return QDF_STATUS_SUCCESS; } +qdf_export_symbol(dp_rx_desc_pool_is_allocated); + /* * dp_rx_desc_pool_alloc() - Allocate a memory pool for software rx * descriptors @@ -89,6 +92,8 @@ free_rx_desc_pool: return QDF_STATUS_E_FAULT; } +qdf_export_symbol(dp_rx_desc_pool_alloc); + QDF_STATUS dp_rx_desc_pool_init_generic(struct dp_soc *soc, struct rx_desc_pool *rx_desc_pool, uint32_t pool_id) @@ -156,6 +161,8 @@ void dp_rx_desc_pool_init(struct dp_soc *soc, uint32_t pool_id, qdf_spin_unlock_bh(&rx_desc_pool->lock); } +qdf_export_symbol(dp_rx_desc_pool_init); + union dp_rx_desc_list_elem_t *dp_rx_desc_find(uint16_t page_id, uint16_t offset, struct rx_desc_pool *rx_desc_pool) { @@ -253,6 +260,8 @@ void dp_rx_desc_nbuf_free(struct dp_soc *soc, rx_desc_pool->buf_size); } +qdf_export_symbol(dp_rx_desc_nbuf_free); + void dp_rx_desc_pool_free(struct dp_soc *soc, struct rx_desc_pool *rx_desc_pool) { @@ -263,6 +272,8 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, &rx_desc_pool->desc_pages, 0, true); } +qdf_export_symbol(dp_rx_desc_pool_free); + void dp_rx_desc_pool_deinit(struct dp_soc *soc, struct rx_desc_pool *rx_desc_pool, uint32_t pool_id) @@ -280,6 +291,8 @@ void dp_rx_desc_pool_deinit(struct dp_soc *soc, qdf_spin_unlock_bh(&rx_desc_pool->lock); qdf_spinlock_destroy(&rx_desc_pool->lock); } + +qdf_export_symbol(dp_rx_desc_pool_deinit); #else /* * dp_rx_desc_pool_is_allocated() - check if memory is allocated for the @@ -299,6 +312,8 @@ QDF_STATUS dp_rx_desc_pool_is_allocated(struct rx_desc_pool *rx_desc_pool) return QDF_STATUS_SUCCESS; } +qdf_export_symbol(dp_rx_desc_pool_is_allocated); + /* * dp_rx_desc_pool_alloc() - Allocate a memory pool for software rx * descriptors @@ -326,6 +341,8 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, return QDF_STATUS_SUCCESS; } +qdf_export_symbol(dp_rx_desc_pool_alloc); + QDF_STATUS dp_rx_desc_pool_init_generic(struct dp_soc *soc, struct rx_desc_pool *rx_desc_pool, uint32_t pool_id) @@ -379,6 +396,8 @@ void dp_rx_desc_pool_init(struct dp_soc *soc, uint32_t pool_id, qdf_spin_unlock_bh(&rx_desc_pool->lock); } +qdf_export_symbol(dp_rx_desc_pool_init); + void dp_rx_desc_nbuf_and_pool_free(struct dp_soc *soc, uint32_t pool_id, struct rx_desc_pool *rx_desc_pool) { @@ -437,6 +456,8 @@ void dp_rx_desc_nbuf_free(struct dp_soc *soc, qdf_spin_unlock_bh(&rx_desc_pool->lock); } +qdf_export_symbol(dp_rx_desc_nbuf_free); + /** * dp_rx_desc_frag_free() - Free desc frag buffer * @@ -470,6 +491,8 @@ void dp_rx_desc_frag_free(struct dp_soc *soc, } qdf_spin_unlock_bh(&rx_desc_pool->lock); } + +qdf_export_symbol(dp_rx_desc_frag_free); #endif void dp_rx_desc_pool_free(struct dp_soc *soc, @@ -478,6 +501,8 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, qdf_mem_free(rx_desc_pool->array); } +qdf_export_symbol(dp_rx_desc_pool_free); + void dp_rx_desc_pool_deinit(struct dp_soc *soc, struct rx_desc_pool *rx_desc_pool, uint32_t pool_id) @@ -496,6 +521,8 @@ void dp_rx_desc_pool_deinit(struct dp_soc *soc, qdf_spinlock_destroy(&rx_desc_pool->lock); } +qdf_export_symbol(dp_rx_desc_pool_deinit); + #endif /* RX_DESC_MULTI_PAGE_ALLOC */ void dp_rx_desc_pool_deinit_generic(struct dp_soc *soc, @@ -543,6 +570,8 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id, return count; } +qdf_export_symbol(dp_rx_get_free_desc_list); + /* * dp_rx_add_desc_list_to_free_list() - append unused desc_list back to * freelist. @@ -575,3 +604,5 @@ void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc, qdf_spin_unlock_bh(&rx_desc_pool->lock); } + +qdf_export_symbol(dp_rx_add_desc_list_to_free_list); diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 0e073ecc53..399e6ab5d1 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -255,6 +255,8 @@ done: } +qdf_export_symbol(dp_rx_link_desc_return_by_addr); + /** * dp_rx_link_desc_return() - Return a MPDU link descriptor to HW * (WBM), following error handling diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 8a9ff35a40..320f0a9174 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -21,7 +21,6 @@ #include "dp_internal.h" #include "htt_stats.h" #include "htt_ppdu_stats.h" - #ifdef QCA_PEER_EXT_STATS #include #include "dp_hist.h" @@ -4344,35 +4343,6 @@ void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl, } #endif -#ifdef WDI_EVENT_ENABLE -QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, - struct cdp_rx_stats_ppdu_user *ppdu_user) -{ - struct cdp_interface_peer_qos_stats qos_stats_intf; - - if (ppdu_user->peer_id == HTT_INVALID_PEER) { - dp_err("Invalid peer id"); - return QDF_STATUS_E_FAILURE; - } - qdf_mem_zero(&qos_stats_intf, sizeof(qos_stats_intf)); - - qdf_mem_copy(qos_stats_intf.peer_mac, ppdu_user->mac_addr, - QDF_MAC_ADDR_SIZE); - qos_stats_intf.frame_control = ppdu_user->frame_control; - qos_stats_intf.frame_control_info_valid = - ppdu_user->frame_control_info_valid; - qos_stats_intf.qos_control = ppdu_user->qos_control; - qos_stats_intf.qos_control_info_valid = - ppdu_user->qos_control_info_valid; - qos_stats_intf.vdev_id = ppdu_user->vdev_id; - dp_wdi_event_handler(WDI_EVENT_PEER_QOS_STATS, dp_pdev->soc, - (void *)&qos_stats_intf, 0, - WDI_NO_VAL, dp_pdev->pdev_id); - - return QDF_STATUS_SUCCESS; -} -#endif - #ifdef QCA_ENH_V3_STATS_SUPPORT /** * dp_vow_str_fw_to_hw_delay() - Return string for a delay diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index b524e31399..f3087bed0b 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -533,8 +533,6 @@ static inline void dp_tx_hal_ring_access_end_reap(struct dp_soc *soc, } #endif -void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl); - #ifdef ATH_TX_PRI_OVERRIDE #define DP_TX_TID_OVERRIDE(_msdu_info, _nbuf) \ ((_msdu_info)->tid = qdf_nbuf_get_priority(_nbuf)) @@ -637,16 +635,6 @@ void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev, } #endif -#ifndef WLAN_TX_PKT_CAPTURE_ENH -static inline -QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev, - struct dp_peer *peer_handle, - uint8_t value, uint8_t *peer_mac) -{ - return QDF_STATUS_SUCCESS; -} -#endif - #ifdef WLAN_FEATURE_PKT_CAPTURE_V2 void dp_send_completion_to_pkt_capture(struct dp_soc *soc, struct dp_tx_desc_s *desc, diff --git a/dp/wifi3.0/dp_txrx_wds.h b/dp/wifi3.0/dp_txrx_wds.h index 616c430631..3eda8804e0 100644 --- a/dp/wifi3.0/dp_txrx_wds.h +++ b/dp/wifi3.0/dp_txrx_wds.h @@ -20,6 +20,11 @@ #ifndef _DP_TXRX_WDS_H_ #define _DP_TXRX_WDS_H_ +#ifdef WIFI_MONITOR_SUPPORT +#include "dp_htt.h" +#include "dp_mon.h" +#endif + /* host managed flag */ #define DP_AST_FLAGS_HM 0x0020 diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 2da17eec4d..c6987ca6fa 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2476,8 +2476,6 @@ struct dp_pdev { /* WDI event handlers */ struct wdi_event_subscribe_t **wdi_event_list; - /* ppdu_id of last received HTT TX stats */ - uint32_t last_ppdu_id; bool cfr_rcc_mode; /* enable time latency check for tx completion */ diff --git a/dp/wifi3.0/dp_wdi_event.c b/dp/wifi3.0/dp_wdi_event.c index b912928cc6..292c3754bc 100644 --- a/dp/wifi3.0/dp_wdi_event.c +++ b/dp/wifi3.0/dp_wdi_event.c @@ -23,6 +23,7 @@ #include "dp_htt.h" #include #endif +#include #ifdef WDI_EVENT_ENABLE /* @@ -145,6 +146,7 @@ dp_wdi_event_handler( peer_id, status); } +qdf_export_symbol(dp_wdi_event_handler); /* * dp_wdi_event_sub() - Subscribe WDI event diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index c5a4b42b35..ad72c3d0ad 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -51,8 +51,10 @@ #include "dp_tx_capture.h" #endif +#if defined(QCA_MONITOR_PKT_SUPPORT) || defined(QCA_MCOPY_SUPPORT) static QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, uint8_t delayed_replenish); +#endif #ifndef WLAN_TX_PKT_CAPTURE_ENH static inline void @@ -65,6 +67,27 @@ dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev, #endif #if !defined(DISABLE_MON_CONFIG) + +#ifdef QCA_MONITOR_PKT_SUPPORT +static void dp_mon_dest_rings_deinit(struct dp_pdev *pdev, int lmac_id) +{ + struct dp_soc *soc = pdev->soc; + + if (soc->wlan_cfg_ctx->rxdma1_enable) { + dp_srng_deinit(soc, &soc->rxdma_mon_buf_ring[lmac_id], + RXDMA_MONITOR_BUF, 0); + dp_srng_deinit(soc, &soc->rxdma_mon_dst_ring[lmac_id], + RXDMA_MONITOR_DST, 0); + dp_srng_deinit(soc, &soc->rxdma_mon_desc_ring[lmac_id], + RXDMA_MONITOR_DESC, 0); + } +} +#else +static void dp_mon_dest_rings_deinit(struct dp_pdev *pdev, int lmac_id) +{ +} +#endif + /** * dp_mon_rings_deinit() - Deinitialize monitor rings * @pdev: DP pdev handle @@ -87,18 +110,27 @@ static void dp_mon_rings_deinit(struct dp_pdev *pdev) dp_srng_deinit(soc, &soc->rxdma_mon_status_ring[lmac_id], RXDMA_MONITOR_STATUS, 0); - if (!soc->wlan_cfg_ctx->rxdma1_enable) - continue; - - dp_srng_deinit(soc, &soc->rxdma_mon_buf_ring[lmac_id], - RXDMA_MONITOR_BUF, 0); - dp_srng_deinit(soc, &soc->rxdma_mon_dst_ring[lmac_id], - RXDMA_MONITOR_DST, 0); - dp_srng_deinit(soc, &soc->rxdma_mon_desc_ring[lmac_id], - RXDMA_MONITOR_DESC, 0); + dp_mon_dest_rings_deinit(pdev, lmac_id); } } +#ifdef QCA_MONITOR_PKT_SUPPORT +static void dp_mon_dest_rings_free(struct dp_pdev *pdev, int lmac_id) +{ + struct dp_soc *soc = pdev->soc; + + if (soc->wlan_cfg_ctx->rxdma1_enable) { + dp_srng_free(soc, &soc->rxdma_mon_buf_ring[lmac_id]); + dp_srng_free(soc, &soc->rxdma_mon_dst_ring[lmac_id]); + dp_srng_free(soc, &soc->rxdma_mon_desc_ring[lmac_id]); + } +} +#else +static void dp_mon_dest_rings_free(struct dp_pdev *pdev, int lmac_id) +{ +} +#endif + /** * dp_mon_rings_free() - free monitor rings * @pdev: Datapath pdev handle @@ -120,15 +152,50 @@ static void dp_mon_rings_free(struct dp_pdev *pdev) dp_srng_free(soc, &soc->rxdma_mon_status_ring[lmac_id]); - if (!soc->wlan_cfg_ctx->rxdma1_enable) - continue; - - dp_srng_free(soc, &soc->rxdma_mon_buf_ring[lmac_id]); - dp_srng_free(soc, &soc->rxdma_mon_dst_ring[lmac_id]); - dp_srng_free(soc, &soc->rxdma_mon_desc_ring[lmac_id]); + dp_mon_dest_rings_free(pdev, lmac_id); } } +#ifdef QCA_MONITOR_PKT_SUPPORT +static +QDF_STATUS dp_mon_dest_rings_init(struct dp_pdev *pdev, int lmac_id) +{ + struct dp_soc *soc = pdev->soc; + + if (soc->wlan_cfg_ctx->rxdma1_enable) { + if (dp_srng_init(soc, &soc->rxdma_mon_buf_ring[lmac_id], + RXDMA_MONITOR_BUF, 0, lmac_id)) { + mon_init_err("%pK: " RNG_ERR "rxdma_mon_buf_ring ", + soc); + goto fail1; + } + + if (dp_srng_init(soc, &soc->rxdma_mon_dst_ring[lmac_id], + RXDMA_MONITOR_DST, 0, lmac_id)) { + mon_init_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc); + goto fail1; + } + + if (dp_srng_init(soc, &soc->rxdma_mon_desc_ring[lmac_id], + RXDMA_MONITOR_DESC, 0, lmac_id)) { + mon_init_err("%pK: " RNG_ERR "rxdma_mon_desc_ring", + soc); + goto fail1; + } + } + return QDF_STATUS_SUCCESS; + +fail1: + return QDF_STATUS_E_NOMEM; +} +#else +static +QDF_STATUS dp_mon_dest_rings_init(struct dp_pdev *pdev, int lmac_id) +{ + return QDF_STATUS_SUCCESS; +} +#endif + /** * dp_mon_rings_init() - Initialize monitor srng rings * @pdev: Datapath pdev handle @@ -155,24 +222,41 @@ QDF_STATUS dp_mon_rings_init(struct dp_soc *soc, struct dp_pdev *pdev) goto fail1; } - if (!soc->wlan_cfg_ctx->rxdma1_enable) - continue; + if (dp_mon_dest_rings_init(pdev, lmac_id)) + goto fail1; + } + return QDF_STATUS_SUCCESS; - if (dp_srng_init(soc, &soc->rxdma_mon_buf_ring[lmac_id], - RXDMA_MONITOR_BUF, 0, lmac_id)) { +fail1: + dp_mon_rings_deinit(pdev); + return QDF_STATUS_E_NOMEM; +} + +#ifdef QCA_MONITOR_PKT_SUPPORT +static +QDF_STATUS dp_mon_dest_rings_alloc(struct dp_pdev *pdev, int lmac_id) +{ + int entries; + struct dp_soc *soc = pdev->soc; + struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx = pdev->wlan_cfg_ctx; + + if (soc->wlan_cfg_ctx->rxdma1_enable) { + entries = wlan_cfg_get_dma_mon_buf_ring_size(pdev_cfg_ctx); + if (dp_srng_alloc(soc, &soc->rxdma_mon_buf_ring[lmac_id], + RXDMA_MONITOR_BUF, entries, 0)) { mon_init_err("%pK: " RNG_ERR "rxdma_mon_buf_ring ", soc); goto fail1; } - - if (dp_srng_init(soc, &soc->rxdma_mon_dst_ring[lmac_id], - RXDMA_MONITOR_DST, 0, lmac_id)) { + entries = wlan_cfg_get_dma_mon_dest_ring_size(pdev_cfg_ctx); + if (dp_srng_alloc(soc, &soc->rxdma_mon_dst_ring[lmac_id], + RXDMA_MONITOR_DST, entries, 0)) { mon_init_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc); goto fail1; } - - if (dp_srng_init(soc, &soc->rxdma_mon_desc_ring[lmac_id], - RXDMA_MONITOR_DESC, 0, lmac_id)) { + entries = wlan_cfg_get_dma_mon_desc_ring_size(pdev_cfg_ctx); + if (dp_srng_alloc(soc, &soc->rxdma_mon_desc_ring[lmac_id], + RXDMA_MONITOR_DESC, entries, 0)) { mon_init_err("%pK: " RNG_ERR "rxdma_mon_desc_ring", soc); goto fail1; @@ -181,9 +265,15 @@ QDF_STATUS dp_mon_rings_init(struct dp_soc *soc, struct dp_pdev *pdev) return QDF_STATUS_SUCCESS; fail1: - dp_mon_rings_deinit(pdev); return QDF_STATUS_E_NOMEM; } +#else +static +QDF_STATUS dp_mon_dest_rings_alloc(struct dp_pdev *pdev, int lmac_id) +{ + return QDF_STATUS_SUCCESS; +} +#endif /** * dp_mon_rings_alloc() - Allocate memory for monitor srng rings @@ -213,31 +303,8 @@ QDF_STATUS dp_mon_rings_alloc(struct dp_soc *soc, struct dp_pdev *pdev) goto fail1; } - if (!soc->wlan_cfg_ctx->rxdma1_enable) - continue; - - entries = wlan_cfg_get_dma_mon_buf_ring_size(pdev_cfg_ctx); - if (dp_srng_alloc(soc, &soc->rxdma_mon_buf_ring[lmac_id], - RXDMA_MONITOR_BUF, entries, 0)) { - mon_init_err("%pK: " RNG_ERR "rxdma_mon_buf_ring ", - soc); + if (dp_mon_dest_rings_alloc(pdev, lmac_id)) goto fail1; - } - - entries = wlan_cfg_get_dma_mon_dest_ring_size(pdev_cfg_ctx); - if (dp_srng_alloc(soc, &soc->rxdma_mon_dst_ring[lmac_id], - RXDMA_MONITOR_DST, entries, 0)) { - mon_init_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc); - goto fail1; - } - - entries = wlan_cfg_get_dma_mon_desc_ring_size(pdev_cfg_ctx); - if (dp_srng_alloc(soc, &soc->rxdma_mon_desc_ring[lmac_id], - RXDMA_MONITOR_DESC, entries, 0)) { - mon_init_err("%pK: " RNG_ERR "rxdma_mon_desc_ring", - soc); - goto fail1; - } } return QDF_STATUS_SUCCESS; @@ -288,16 +355,6 @@ dp_config_full_mon_mode(struct cdp_soc_t *soc_handle, } #endif -static inline void -dp_pdev_disable_mcopy_code(struct dp_pdev *pdev) -{ - struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - - mon_pdev->mcopy_mode = M_COPY_DISABLED; - mon_pdev->monitor_configured = false; - mon_pdev->mvdev = NULL; -} - #ifdef QCA_SUPPORT_FULL_MON static inline QDF_STATUS dp_soc_config_full_mon_mode(struct dp_pdev *pdev, enum dp_full_mon_config val) @@ -325,6 +382,86 @@ dp_soc_config_full_mon_mode(struct dp_pdev *pdev, enum dp_full_mon_config val) } #endif +#ifdef QCA_MCOPY_SUPPORT +static inline void +dp_pdev_disable_mcopy_code(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + mon_pdev->mcopy_mode = M_COPY_DISABLED; + mon_pdev->monitor_configured = false; + mon_pdev->mvdev = NULL; +} + +static inline void +dp_reset_mcopy_mode(struct dp_pdev *pdev) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (mon_pdev->mcopy_mode) { + dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_DISABLE); + dp_pdev_disable_mcopy_code(pdev); + dp_mon_filter_reset_mcopy_mode(pdev); + status = dp_mon_filter_update(pdev); + if (status != QDF_STATUS_SUCCESS) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Failed to reset AM copy mode filters")); + } + mon_pdev->monitor_configured = false; + } +} + +static QDF_STATUS +dp_config_mcopy_mode(struct dp_pdev *pdev, int val) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (mon_pdev->mvdev) + return QDF_STATUS_E_RESOURCES; + + mon_pdev->mcopy_mode = val; + mon_pdev->tx_sniffer_enable = 0; + mon_pdev->monitor_configured = true; + + if (!wlan_cfg_is_delay_mon_replenish(pdev->soc->wlan_cfg_ctx)) + dp_vdev_set_monitor_mode_rings(pdev, true); + + /* + * Setup the M copy mode filter. + */ + dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_ENABLE); + dp_mon_filter_setup_mcopy_mode(pdev); + status = dp_mon_filter_update(pdev); + if (status != QDF_STATUS_SUCCESS) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("Failed to set M_copy mode filters")); + dp_mon_filter_reset_mcopy_mode(pdev); + dp_pdev_disable_mcopy_code(pdev); + return status; + } + + if (!mon_pdev->pktlog_ppdu_stats) + dp_h2t_cfg_stats_msg_send(pdev, + DP_PPDU_STATS_CFG_SNIFFER, + pdev->pdev_id); + + return status; +} +#else +static inline void +dp_reset_mcopy_mode(struct dp_pdev *pdev) +{ +} + +static inline QDF_STATUS +dp_config_mcopy_mode(struct dp_pdev *pdev, int val) +{ + return QDF_STATUS_E_INVAL; +} +#endif /* QCA_MCOPY_SUPPORT */ + /** * dp_reset_monitor_mode() - Disable monitor mode * @soc_hdl: Datapath soc handle @@ -359,13 +496,13 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, * mode uses this APIs to filter reset and mode disable */ if (mon_pdev->mcopy_mode) { -#if defined(FEATURE_PERPKT_INFO) +#if defined(QCA_MCOPY_SUPPORT) dp_pdev_disable_mcopy_code(pdev); dp_mon_filter_reset_mcopy_mode(pdev); -#endif /* FEATURE_PERPKT_INFO */ +#endif /* QCA_MCOPY_SUPPORT */ } else if (special_monitor) { #if defined(ATH_SUPPORT_NAC) - dp_mon_filter_reset_smart_monitor(mon_pdev); + dp_mon_filter_reset_smart_monitor(pdev); #endif /* ATH_SUPPORT_NAC */ } else { dp_mon_filter_reset_mon_mode(pdev); @@ -388,6 +525,7 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, * @filter_val: Flag to select Filter for monitor mode * Return: 0 on success, not 0 on failure */ +#ifdef QCA_ADVANCE_MON_FILTER_SUPPORT static QDF_STATUS dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, struct cdp_monitor_filter *filter_val) @@ -442,6 +580,14 @@ dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, return status; } +#else +static QDF_STATUS +dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + struct cdp_monitor_filter *filter_val) +{ + return QDF_STATUS_E_INVAL; +} +#endif /** * dp_deliver_tx_mgmt() - Deliver mgmt frame for tx capture @@ -491,6 +637,7 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *dp_soc, return QDF_STATUS_E_FAILURE; mon_pdev = pdev->monitor_pdev; + mon_pdev->mvdev = vdev; QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN, @@ -535,6 +682,32 @@ fail: return status; } +#ifdef QCA_TX_CAPTURE_SUPPORT +static QDF_STATUS +dp_config_tx_capture_mode(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + mon_pdev->tx_sniffer_enable = 1; + mon_pdev->monitor_configured = false; + + if (!mon_pdev->pktlog_ppdu_stats) + dp_h2t_cfg_stats_msg_send(pdev, + DP_PPDU_STATS_CFG_SNIFFER, + pdev->pdev_id); + + return QDF_STATUS_SUCCESS; +} +#else +#ifdef QCA_MCOPY_SUPPORT +static QDF_STATUS +dp_config_tx_capture_mode(struct dp_pdev *pdev) +{ + return QDF_STATUS_E_INVAL; +} +#endif +#endif + /* * dp_config_debug_sniffer()- API to enable/disable debug sniffer * @pdev: DP_PDEV handle @@ -542,6 +715,7 @@ fail: * * Return: 0 for success. nonzero for failure. */ +#if defined(QCA_MCOPY_SUPPORT) || defined(QCA_TX_CAPTURE_SUPPORT) static QDF_STATUS dp_config_debug_sniffer(struct dp_pdev *pdev, int val) { @@ -553,18 +727,7 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) * monitor modes. Hence disabling the filter for this mode will * reset the monitor destination ring filters. */ - if (mon_pdev->mcopy_mode) { -#ifdef FEATURE_PERPKT_INFO - dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_DISABLE); - dp_pdev_disable_mcopy_code(pdev); - dp_mon_filter_reset_mcopy_mode(pdev); - status = dp_mon_filter_update(pdev); - if (status != QDF_STATUS_SUCCESS) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("Failed to reset AM copy mode filters")); - } -#endif /* FEATURE_PERPKT_INFO */ - } + dp_reset_mcopy_mode(pdev); switch (val) { case 0: mon_pdev->tx_sniffer_enable = 0; @@ -580,6 +743,11 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) !mon_pdev->enhanced_stats_en && !mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); + } else if (mon_pdev->enhanced_stats_en && + !mon_pdev->bpr_enable) { + dp_h2t_cfg_stats_msg_send(pdev, + DP_PPDU_STATS_CFG_ENH_STATS, + pdev->pdev_id); } else if (!mon_pdev->enhanced_stats_en && mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, @@ -593,57 +761,28 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) break; case 1: - mon_pdev->tx_sniffer_enable = 1; - mon_pdev->monitor_configured = false; - - if (!mon_pdev->pktlog_ppdu_stats) - dp_h2t_cfg_stats_msg_send(pdev, - DP_PPDU_STATS_CFG_SNIFFER, - pdev->pdev_id); + status = dp_config_tx_capture_mode(pdev); break; case 2: case 4: - if (mon_pdev->mvdev) { - status = QDF_STATUS_E_RESOURCES; - break; - } - -#ifdef FEATURE_PERPKT_INFO - mon_pdev->mcopy_mode = val; - mon_pdev->tx_sniffer_enable = 0; - mon_pdev->monitor_configured = true; - - if (!wlan_cfg_is_delay_mon_replenish(pdev->soc->wlan_cfg_ctx)) - dp_vdev_set_monitor_mode_rings(pdev, true); - - /* - * Setup the M copy mode filter. - */ - dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_ENABLE); - dp_mon_filter_setup_mcopy_mode(pdev); - status = dp_mon_filter_update(pdev); - if (status != QDF_STATUS_SUCCESS) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("Failed to set M_copy mode filters")); - dp_mon_filter_reset_mcopy_mode(pdev); - dp_pdev_disable_mcopy_code(pdev); - return status; - } - - if (!mon_pdev->pktlog_ppdu_stats) - dp_h2t_cfg_stats_msg_send(pdev, - DP_PPDU_STATS_CFG_SNIFFER, - pdev->pdev_id); -#endif /* FEATURE_PERPKT_INFO */ + status = dp_config_mcopy_mode(pdev, val); break; default: QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "Invalid value"); + "Invalid value, mode not supported"); + status = QDF_STATUS_E_INVAL; break; } return status; } +#else +static QDF_STATUS +dp_config_debug_sniffer(struct dp_pdev *pdev, int val) +{ +return QDF_STATUS_E_INVAL; +} +#endif static void dp_flush_monitor_rings(struct dp_soc *soc) { @@ -686,19 +825,13 @@ static void dp_flush_monitor_rings(struct dp_soc *soc) } #if !defined(DISABLE_MON_CONFIG) -/** - * dp_mon_htt_srng_setup() - Prepare HTT messages for Monitor rings - * @soc: soc handle - * @pdev: physical device handle - * @mac_id: ring number - * @mac_for_pdev: mac_id - * - * Return: non-zero for failure, zero for success - */ -static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, - struct dp_pdev *pdev, - int mac_id, - int mac_for_pdev) + +#ifdef QCA_MONITOR_PKT_SUPPORT +static +QDF_STATUS dp_mon_htt_dest_srng_setup(struct dp_soc *soc, + struct dp_pdev *pdev, + int mac_id, + int mac_for_pdev) { QDF_STATUS status = QDF_STATUS_SUCCESS; @@ -723,16 +856,6 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, return status; } - status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - soc->rxdma_mon_status_ring[mac_id] - .hal_srng, - RXDMA_MONITOR_STATUS); - - if (status != QDF_STATUS_SUCCESS) { - dp_err("Failed to send htt srng setup message for Rxdma mon status ring"); - return status; - } - status = htt_srng_setup(soc->htt_handle, mac_for_pdev, soc->rxdma_mon_desc_ring[mac_id] .hal_srng, @@ -742,20 +865,91 @@ static QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, dp_err("Failed to send htt srng message for Rxdma mon desc ring"); return status; } - } else { - status = htt_srng_setup(soc->htt_handle, mac_for_pdev, - soc->rxdma_mon_status_ring[mac_id] - .hal_srng, - RXDMA_MONITOR_STATUS); - - if (status != QDF_STATUS_SUCCESS) { - dp_err("Failed to send htt srng setup message for Rxdma mon status ring"); - return status; - } } return status; } +#else +static +QDF_STATUS dp_mon_htt_dest_srng_setup(struct dp_soc *soc, + struct dp_pdev *pdev, + int mac_id, + int mac_for_pdev) +{ + return QDF_STATUS_SUCCESS; +} +#endif + +/** + * dp_mon_htt_srng_setup() - Prepare HTT messages for Monitor rings + * @soc: soc handle + * @pdev: physical device handle + * @mac_id: ring number + * @mac_for_pdev: mac_id + * + * Return: non-zero for failure, zero for success + */ +#ifdef QCA_HOST2FW_RXBUF_RING +QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, + struct dp_pdev *pdev, + int mac_id, + int mac_for_pdev) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + + status = dp_mon_htt_dest_srng_setup(soc, pdev, mac_id, mac_for_pdev); + if (status != QDF_STATUS_SUCCESS) + return status; + + status = htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_status_ring[mac_id] + .hal_srng, + RXDMA_MONITOR_STATUS); + + if (status != QDF_STATUS_SUCCESS) { + dp_err("Failed to send htt srng setup message for Rxdma mon status ring"); + return status; + } + + return status; +} +#else +/* This is only for WIN */ +QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, + struct dp_pdev *pdev, + int mac_id, + int mac_for_pdev) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) { + status = dp_mon_htt_dest_srng_setup(soc, pdev, + mac_id, mac_for_pdev); + if (status != QDF_STATUS_SUCCESS) + return status; + } + + status = htt_srng_setup(soc->htt_handle, mac_for_pdev, + soc->rxdma_mon_status_ring[mac_id] + .hal_srng, + RXDMA_MONITOR_STATUS); + + if (status != QDF_STATUS_SUCCESS) { + dp_err("Failed to send htt srng setup message for Rxdma mon status ring"); + return status; + } + + return status; +} +#endif +#else +QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, + struct dp_pdev *pdev, + int mac_id, + int mac_for_pdev) +{ + return QDF_STATUS_SUCCESS; +} #endif /* MCL specific functions */ @@ -847,7 +1041,7 @@ static uint8_t dp_get_mon_vdev_from_pdev_wifi3(struct cdp_soc_t *soc_hdl, * @peer: Datapath peer * */ -void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer) +static void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer) { dp_peer_tid_queue_init(peer); dp_peer_update_80211_hdr(peer->vdev, peer); @@ -865,7 +1059,7 @@ dp_peer_tx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer) dp_peer_tid_queue_cleanup(peer); } -#ifdef FEATURE_PERPKT_INFO +#if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT) #ifndef WLAN_TX_PKT_CAPTURE_ENH /* * dp_deliver_mgmt_frm: Process @@ -888,6 +1082,9 @@ void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf) } } #endif +#endif + +#ifdef QCA_ENHANCED_STATS_SUPPORT /* * dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv: Process * htt_ppdu_stats_tx_mgmtctrl_payload_tlv @@ -960,7 +1157,6 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev, return QDF_STATUS_E_ALREADY; } -#endif /* * dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap() - Get ppdu stats tlv @@ -981,7 +1177,6 @@ dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap) return 0; } -#ifdef FEATURE_PERPKT_INFO /* * dp_peer_find_by_id_valid - check if peer exists for given id * @soc: core DP soc context @@ -1380,9 +1575,7 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, UPDATE_PEER_STATS, pdev->pdev_id); #endif } -#endif -#ifdef FEATURE_PERPKT_INFO /* * dp_get_ppdu_info_user_index: Find and allocate a per-user descriptor for a PPDU, * if a new peer id arrives in a PPDU @@ -2282,6 +2475,7 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, uint64_t start_tsf; uint64_t end_tsf; uint32_t ppdu_id; + struct dp_mon_peer *mon_peer; ppdu_id = ppdu_desc->ppdu_id; peer = dp_peer_get_ref_by_id @@ -2294,7 +2488,8 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, if (!peer) continue; - delay_ppdu = &peer->monitor_peer->delayed_ba_ppdu_stats; + mon_peer = peer->monitor_peer; + delay_ppdu = &mon_peer->delayed_ba_ppdu_stats; start_tsf = ppdu_desc->ppdu_start_timestamp; end_tsf = ppdu_desc->ppdu_end_timestamp; /** @@ -2304,13 +2499,12 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, dp_peer_copy_delay_stats(peer, &ppdu_desc->user[i], ppdu_id); - peer->monitor_peer->last_delayed_ba_ppduid = - ppdu_id; + mon_peer->last_delayed_ba_ppduid = ppdu_id; delay_ppdu->ppdu_start_timestamp = start_tsf; delay_ppdu->ppdu_end_timestamp = end_tsf; } ppdu_desc->user[i].peer_last_delayed_ba = - peer->monitor_peer->last_delayed_ba; + mon_peer->last_delayed_ba; dp_peer_unref_delete(peer, DP_MOD_ID_TX_PPDU_STATS); @@ -2338,6 +2532,7 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, struct cdp_delayed_tx_completion_ppdu_user *delay_ppdu; uint64_t start_tsf; uint64_t end_tsf; + struct dp_mon_peer *mon_peer; peer = dp_peer_get_ref_by_id (pdev->soc, @@ -2350,6 +2545,7 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, if (!peer) continue; + mon_peer = peer->monitor_peer; if (ppdu_desc->user[i].completion_status != HTT_PPDU_STATS_USER_STATUS_OK) { dp_peer_unref_delete(peer, @@ -2357,20 +2553,20 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, continue; } - delay_ppdu = &peer->monitor_peer->delayed_ba_ppdu_stats; + delay_ppdu = &mon_peer->delayed_ba_ppdu_stats; start_tsf = delay_ppdu->ppdu_start_timestamp; end_tsf = delay_ppdu->ppdu_end_timestamp; - if (peer->monitor_peer->last_delayed_ba) { + if (mon_peer->last_delayed_ba) { dp_peer_copy_stats_to_bar(peer, &ppdu_desc->user[i]); ppdu_desc->ppdu_id = - peer->monitor_peer->last_delayed_ba_ppduid; + mon_peer->last_delayed_ba_ppduid; ppdu_desc->ppdu_start_timestamp = start_tsf; ppdu_desc->ppdu_end_timestamp = end_tsf; } ppdu_desc->user[i].peer_last_delayed_ba = - peer->monitor_peer->last_delayed_ba; + mon_peer->last_delayed_ba; dp_peer_unref_delete(peer, DP_MOD_ID_TX_PPDU_STATS); } } @@ -3086,7 +3282,7 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, if (!ppdu_info) return NULL; - pdev->last_ppdu_id = ppdu_id; + mon_pdev->last_ppdu_id = ppdu_id; tlv_bitmap_expected = HTT_PPDU_DEFAULT_TLV_BITMAP; @@ -3158,7 +3354,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, return NULL; } -#endif /* FEATURE_PERPKT_INFO */ +#else +void +dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, + struct ppdu_info *ppdu_info) +{ +} +#endif /* QCA_ENHANCED_STATS_SUPPORT */ /** * dp_txrx_ppdu_stats_handler() - Function to process HTT PPDU stats from FW @@ -3169,7 +3371,7 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, * return:void */ #if defined(WDI_EVENT_ENABLE) -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg) { @@ -3216,10 +3418,11 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, { return true; } -#endif +#endif/* QCA_ENHANCED_STATS_SUPPORT */ #endif -#if defined(WDI_EVENT_ENABLE) && !defined(REMOVE_PKT_LOG) +#if defined(WDI_EVENT_ENABLE) &&\ + (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) /* * dp_ppdu_stats_ind_handler() - PPDU stats msg handler * @htt_soc: HTT SOC handle @@ -3312,7 +3515,7 @@ static void dp_htt_ppdu_stats_detach(struct dp_pdev *pdev) qdf_mem_free(mon_pdev->ppdu_tlv_buf); } -void +static void dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) { struct cdp_pdev_mon_stats *rx_mon_stats; @@ -3402,6 +3605,7 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) * *Return: 0 for success. nonzero for failure. */ +#ifdef QCA_SUPPORT_BPR static QDF_STATUS dp_set_bpr_enable(struct dp_pdev *pdev, int val) { @@ -3450,6 +3654,7 @@ dp_set_bpr_enable(struct dp_pdev *pdev, int val) return QDF_STATUS_SUCCESS; } +#endif #ifdef ATH_SUPPORT_NAC /* @@ -3549,6 +3754,7 @@ static bool dp_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle) return false; } +#ifdef QCA_MONITOR_PKT_SUPPORT /** * dp_vdev_set_monitor_mode_buf_rings () - set monitor mode buf rings * @@ -3599,6 +3805,11 @@ static void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) } } } +#else +static void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) +{ +} +#endif /* * dp_set_pktlog_wifi3() - attach txrx vdev @@ -3609,8 +3820,8 @@ static void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) * Return: Success, NULL on failure */ #ifdef WDI_EVENT_ENABLE -int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, - bool enable) +static int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, + bool enable) { struct dp_soc *soc = NULL; int max_mac_rings = wlan_cfg_get_num_mac_rings @@ -3675,7 +3886,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Pktlog lite filters set failed", soc); - dp_mon_filter_reset_rx_pkt_log_lite(mon_pdev); + dp_mon_filter_reset_rx_pkt_log_lite(pdev); mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_DISABLED; return 0; @@ -3762,7 +3973,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, return 0; } - dp_mon_filter_reset_rx_pkt_log_lite(mon_pdev); + dp_mon_filter_reset_rx_pkt_log_lite(pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Pktlog filters reset failed", soc); @@ -3818,8 +4029,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, #endif /* MCL specific functions */ -#if defined(DP_CON_MON) -#ifndef REMOVE_PKT_LOG +#if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) /** * dp_pktlogmod_exit() - API to cleanup pktlog info * @pdev: Pdev handle @@ -3847,7 +4057,8 @@ static void dp_pktlogmod_exit(struct dp_pdev *pdev) pktlogmod_exit(scn); mon_pdev->pkt_log_init = false; } -#endif +#else +static void dp_pktlogmod_exit(struct dp_pdev *handle) { } #endif /*DP_CON_MON*/ #ifdef WDI_EVENT_ENABLE @@ -4024,7 +4235,7 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: smart mon filter setup failed", soc); - dp_mon_filter_reset_smart_monitor(mon_pdev); + dp_mon_filter_reset_smart_monitor(pdev); mon_pdev->neighbour_peers_added = false; } } @@ -4046,7 +4257,7 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, if (TAILQ_EMPTY(&mon_pdev->neighbour_peers_list)) { QDF_STATUS status = QDF_STATUS_SUCCESS; - dp_mon_filter_reset_smart_monitor(mon_pdev); + dp_mon_filter_reset_smart_monitor(pdev); status = dp_mon_filter_update(pdev); if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: smart mon filter clear failed", @@ -4249,7 +4460,7 @@ dp_enable_mon_reap_timer(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 = NULL; struct dp_mon_soc *mon_soc = soc->monitor_soc; - struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_mon_pdev *mon_pdev; pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); if (!pdev) { @@ -4257,6 +4468,7 @@ dp_enable_mon_reap_timer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, return; } + mon_pdev = pdev->monitor_pdev; mon_pdev->enable_reap_timer_non_pkt = enable; if (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) { dp_debug("pktlog enabled %d", mon_pdev->rx_pktlog_mode); @@ -4381,7 +4593,7 @@ static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev) return false; } -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT /* * dp_enable_enhanced_stats()- API to enable enhanced statistcs * @soc_handle: DP_SOC handle @@ -4413,7 +4625,7 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) status = dp_mon_filter_update(pdev); if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Failed to set enhanced mode filters", soc); - dp_mon_filter_reset_enhanced_stats(pdev); + dp_mon_filter_reset_enhanced_stats(mon_pdev); dp_cal_client_timer_stop(mon_pdev->cal_client_ctx); mon_pdev->enhanced_stats_en = 0; return QDF_STATUS_E_FAILURE; @@ -4466,7 +4678,7 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) pdev->pdev_id); } - dp_mon_filter_reset_enhanced_stats(pdev); + dp_mon_filter_reset_enhanced_stats(mon_pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("Failed to reset enhanced mode filters")); @@ -4474,7 +4686,43 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) return QDF_STATUS_SUCCESS; } -#endif /* FEATURE_PERPKT_INFO */ + +#ifdef WDI_EVENT_ENABLE +QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, + struct cdp_rx_stats_ppdu_user *ppdu_user) +{ + struct cdp_interface_peer_qos_stats qos_stats_intf; + + if (ppdu_user->peer_id == HTT_INVALID_PEER) { + dp_err("Invalid peer id"); + return QDF_STATUS_E_FAILURE; + } + qdf_mem_zero(&qos_stats_intf, sizeof(qos_stats_intf)); + + qdf_mem_copy(qos_stats_intf.peer_mac, ppdu_user->mac_addr, + QDF_MAC_ADDR_SIZE); + qos_stats_intf.frame_control = ppdu_user->frame_control; + qos_stats_intf.frame_control_info_valid = + ppdu_user->frame_control_info_valid; + qos_stats_intf.qos_control = ppdu_user->qos_control; + qos_stats_intf.qos_control_info_valid = + ppdu_user->qos_control_info_valid; + qos_stats_intf.vdev_id = ppdu_user->vdev_id; + dp_wdi_event_handler(WDI_EVENT_PEER_QOS_STATS, dp_pdev->soc, + (void *)&qos_stats_intf, 0, + WDI_NO_VAL, dp_pdev->pdev_id); + + return QDF_STATUS_SUCCESS; +} +#else +static inline QDF_STATUS +dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, + struct cdp_rx_stats_ppdu_user *ppdu_user) +{ + return QDF_STATUS_SUCCESS; +} +#endif +#endif /* QCA_ENHANCED_STATS_SUPPORT */ /** * dp_enable_peer_based_pktlog() - Set Flag for peer based filtering @@ -4528,7 +4776,8 @@ dp_enable_peer_based_pktlog(struct cdp_soc_t *soc, uint8_t pdev_id, * * Return: Success if Rx & Tx capture is enabled for peer, false otherwise */ -QDF_STATUS +#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH) +static QDF_STATUS dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc, uint8_t pdev_id, bool is_rx_pkt_cap_enable, @@ -4561,7 +4810,9 @@ dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc, return status; } +#endif +#if defined(QCA_MONITOR_PKT_SUPPORT) || defined(QCA_MCOPY_SUPPORT) /** * dp_vdev_set_monitor_mode_rings () - set monitor mode rings * @@ -4648,6 +4899,7 @@ static QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, fail0: return QDF_STATUS_E_FAILURE; } +#endif /* dp_mon_vdev_timer()- timer poll for interrupts * @@ -4752,22 +5004,28 @@ static void dp_mon_reap_timer_init(struct dp_soc *soc) } #endif -static void dp_mon_reap_timer_deinit(struct dp_mon_soc *mon_soc) +static void dp_mon_reap_timer_deinit(struct dp_soc *soc) { + struct dp_mon_soc *mon_soc = soc->monitor_soc; + if (mon_soc->reap_timer_init) { qdf_timer_free(&mon_soc->mon_reap_timer); mon_soc->reap_timer_init = 0; } } -static void dp_mon_reap_timer_start(struct dp_mon_soc *mon_soc) +static void dp_mon_reap_timer_start(struct dp_soc *soc) { + struct dp_mon_soc *mon_soc = soc->monitor_soc; + if (mon_soc->reap_timer_init) qdf_timer_mod(&mon_soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS); } -static bool dp_mon_reap_timer_stop(struct dp_mon_soc *mon_soc) +static bool dp_mon_reap_timer_stop(struct dp_soc *soc) { + struct dp_mon_soc *mon_soc = soc->monitor_soc; + if (mon_soc->reap_timer_init) { qdf_timer_sync_cancel(&mon_soc->mon_reap_timer); return true; @@ -4786,24 +5044,30 @@ static void dp_mon_vdev_timer_init(struct dp_soc *soc) mon_soc->mon_vdev_timer_state |= MON_VDEV_TIMER_INIT; } -static void dp_mon_vdev_timer_deinit(struct dp_mon_soc *mon_soc) +static void dp_mon_vdev_timer_deinit(struct dp_soc *soc) { + struct dp_mon_soc *mon_soc = soc->monitor_soc; + if (mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_INIT) { qdf_timer_free(&mon_soc->mon_vdev_timer); mon_soc->mon_vdev_timer_state = 0; } } -static void dp_mon_vdev_timer_start(struct dp_mon_soc *mon_soc) +static void dp_mon_vdev_timer_start(struct dp_soc *soc) { + struct dp_mon_soc *mon_soc = soc->monitor_soc; + if (mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_INIT) { qdf_timer_mod(&mon_soc->mon_vdev_timer, DP_INTR_POLL_TIMER_MS); mon_soc->mon_vdev_timer_state |= MON_VDEV_TIMER_RUNNING; } } -static bool dp_mon_vdev_timer_stop(struct dp_mon_soc *mon_soc) +static bool dp_mon_vdev_timer_stop(struct dp_soc *soc) { + struct dp_mon_soc *mon_soc = soc->monitor_soc; + if (mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_RUNNING) { qdf_timer_sync_cancel(&mon_soc->mon_vdev_timer); mon_soc->mon_vdev_timer_state &= ~MON_VDEV_TIMER_RUNNING; @@ -4813,11 +5077,14 @@ static bool dp_mon_vdev_timer_stop(struct dp_mon_soc *mon_soc) return false; } -static QDF_STATUS dp_mcopy_check_deliver(struct dp_mon_pdev *mon_pdev, +#ifdef QCA_MCOPY_SUPPORT +static QDF_STATUS dp_mcopy_check_deliver(struct dp_pdev *pdev, uint16_t peer_id, uint32_t ppdu_id, uint8_t first_msdu) { + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + if (mon_pdev->mcopy_mode) { if (mon_pdev->mcopy_mode == M_COPY) { if ((mon_pdev->m_copy_id.tx_ppdu_id == ppdu_id) && @@ -4835,6 +5102,7 @@ static QDF_STATUS dp_mcopy_check_deliver(struct dp_mon_pdev *mon_pdev, return QDF_STATUS_SUCCESS; } +#endif static void dp_mon_neighbour_peer_add_ast(struct dp_pdev *pdev, struct dp_peer *ta_peer, @@ -4876,12 +5144,12 @@ static void dp_mon_neighbour_peer_add_ast(struct dp_pdev *pdev, } #ifdef WDI_EVENT_ENABLE -void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) +static 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 && !pdev->monitor_pdev) + if (!pdev || !pdev->monitor_pdev) return NULL; return pdev->monitor_pdev->pl_dev; @@ -4970,7 +5238,7 @@ dp_peer_cal_clients_stats_update(struct dp_soc *soc, /*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) +static void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) { struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; @@ -4978,7 +5246,7 @@ void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) DP_MOD_ID_CDP); } #else -void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) +static void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) { } #endif @@ -5191,10 +5459,9 @@ QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev) return QDF_STATUS_SUCCESS; } -QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev) +static QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev) { struct dp_mon_vdev *mon_vdev; - struct dp_pdev *pdev = vdev->pdev; mon_vdev = (struct dp_mon_vdev *)qdf_mem_malloc(sizeof(*mon_vdev)); if (!mon_vdev) { @@ -5203,17 +5470,18 @@ QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev) } vdev->monitor_vdev = mon_vdev; - dp_vdev_set_monitor_mode_buf_rings(pdev); - pdev->monitor_pdev->mvdev = vdev; return QDF_STATUS_SUCCESS; } -QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev) +static QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev) { struct dp_mon_vdev *mon_vdev = vdev->monitor_vdev; struct dp_pdev *pdev = vdev->pdev; + if (!mon_vdev) + return QDF_STATUS_E_FAILURE; + qdf_mem_free(mon_vdev); vdev->monitor_vdev = NULL; pdev->monitor_pdev->mvdev = NULL; @@ -5221,9 +5489,10 @@ QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev) return QDF_STATUS_SUCCESS; } -QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer) +static QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer) { struct dp_mon_peer *mon_peer; + struct dp_pdev *pdev; mon_peer = (struct dp_mon_peer *)qdf_mem_malloc(sizeof(*mon_peer)); if (!mon_peer) { @@ -5232,11 +5501,18 @@ QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer) } peer->monitor_peer = mon_peer; + pdev = peer->vdev->pdev; + /* + * In tx_monitor mode, filter may be set for unassociated peer + * when unassociated peer get associated peer need to + * update tx_cap_enabled flag to support peer filter. + */ + dp_peer_tx_capture_filter_check(pdev, peer); return QDF_STATUS_SUCCESS; } -QDF_STATUS dp_mon_peer_detach(struct dp_peer *peer) +static QDF_STATUS dp_mon_peer_detach(struct dp_peer *peer) { struct dp_mon_peer *mon_peer = peer->monitor_peer; @@ -5280,7 +5556,8 @@ static struct dp_mon_ops monitor_ops = { .mon_tx_add_to_comp_queue = dp_tx_add_to_comp_queue, .mon_peer_tx_capture_filter_check = dp_peer_tx_capture_filter_check, #endif -#if defined(WDI_EVENT_ENABLE) && !defined(REMOVE_PKT_LOG) +#if defined(WDI_EVENT_ENABLE) &&\ + (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) .mon_ppdu_stats_ind_handler = dp_ppdu_stats_ind_handler, #endif .mon_htt_ppdu_stats_attach = dp_htt_ppdu_stats_attach, @@ -5293,7 +5570,10 @@ static struct dp_mon_ops monitor_ops = { #ifdef WLAN_RX_PKT_CAPTURE_ENH .mon_config_enh_rx_capture = dp_config_enh_rx_capture, #endif +#ifdef QCA_SUPPORT_BPR .mon_set_bpr_enable = dp_set_bpr_enable, +#endif + #ifdef ATH_SUPPORT_NAC .mon_set_filter_neigh_peers = dp_set_filter_neigh_peers, #endif @@ -5324,7 +5604,9 @@ static struct dp_mon_ops monitor_ops = { .mon_reap_timer_start = dp_mon_reap_timer_start, .mon_reap_timer_stop = dp_mon_reap_timer_stop, .mon_reap_timer_deinit = dp_mon_reap_timer_deinit, +#ifdef QCA_MCOPY_SUPPORT .mon_mcopy_check_deliver = dp_mcopy_check_deliver, +#endif .mon_neighbour_peer_add_ast = dp_mon_neighbour_peer_add_ast, }; @@ -5336,12 +5618,12 @@ static struct cdp_mon_ops dp_ops_mon = { .config_full_mon_mode = dp_config_full_mon_mode, }; -static inline void dp_mon_ops_register(struct dp_mon_soc *mon_soc) +void dp_mon_ops_register(struct dp_mon_soc *mon_soc) { mon_soc->mon_ops = &monitor_ops; } -static inline void dp_mon_cdp_ops_register(struct dp_soc *soc) +void dp_mon_cdp_ops_register(struct dp_soc *soc) { struct cdp_ops *ops = soc->cdp_soc.ops; @@ -5357,7 +5639,7 @@ static inline void dp_mon_cdp_ops_register(struct dp_soc *soc) #endif ops->cmn_drv_ops->txrx_set_monitor_mode = dp_vdev_set_monitor_mode; ops->cmn_drv_ops->txrx_get_mon_vdev_from_pdev = - dp_get_mon_vdev_from_pdev_wifi3; + dp_get_mon_vdev_from_pdev_wifi3; #ifdef DP_PEER_EXTENDED_API ops->misc_ops->pkt_log_init = dp_pkt_log_init; ops->misc_ops->pkt_log_con_service = dp_pkt_log_con_service; @@ -5365,31 +5647,31 @@ static inline void dp_mon_cdp_ops_register(struct dp_soc *soc) #ifdef ATH_SUPPORT_NAC_RSSI ops->ctrl_ops->txrx_vdev_config_for_nac_rssi = dp_config_for_nac_rssi; ops->ctrl_ops->txrx_vdev_get_neighbour_rssi = - dp_vdev_get_neighbour_rssi; + dp_vdev_get_neighbour_rssi; #endif #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) ops->ctrl_ops->txrx_update_filter_neighbour_peers = dp_update_filter_neighbour_peers; #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ ops->ctrl_ops->enable_peer_based_pktlog = - dp_enable_peer_based_pktlog; + dp_enable_peer_based_pktlog; #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH) ops->ctrl_ops->txrx_update_peer_pkt_capture_params = - dp_peer_update_pkt_capture_params; + dp_peer_update_pkt_capture_params; #endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT ops->host_stats_ops->txrx_enable_enhanced_stats = - dp_enable_enhanced_stats; + dp_enable_enhanced_stats; ops->host_stats_ops->txrx_disable_enhanced_stats = - dp_disable_enhanced_stats; -#endif /* FEATURE_PERPKT_INFO */ + dp_disable_enhanced_stats; +#endif /* QCA_ENHANCED_STATS_SUPPORT */ #ifdef WDI_EVENT_ENABLE ops->ctrl_ops->txrx_get_pldev = dp_get_pldev; #endif return; } -static inline void dp_mon_cdp_ops_deregister(struct dp_soc *soc) +void dp_mon_cdp_ops_deregister(struct dp_soc *soc) { struct cdp_ops *ops = soc->cdp_soc.ops; @@ -5462,6 +5744,7 @@ QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc) } mon_soc = soc->monitor_soc; + dp_mon_vdev_timer_deinit(soc); dp_mon_cdp_ops_deregister(soc); soc->monitor_soc = NULL; qdf_mem_free(mon_soc); diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 5e211fd290..d25a17947c 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -13,6 +13,11 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#ifndef _DP_MON_H_ +#define _DP_MON_H_ + +#include "dp_htt.h" #ifdef WLAN_TX_PKT_CAPTURE_ENH #include "dp_tx_capture.h" #endif @@ -28,6 +33,14 @@ #define mon_rx_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_RX, params) +#ifndef WLAN_TX_PKT_CAPTURE_ENH +struct dp_pdev_tx_capture { +}; + +struct dp_peer_tx_capture { +}; +#endif + struct dp_mon_ops { QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc); QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev); @@ -76,7 +89,8 @@ struct dp_mon_ops { struct hal_tx_completion_status *ts, struct dp_peer *peer); #endif -#if defined(WDI_EVENT_ENABLE) && !defined(REMOVE_PKT_LOG) +#if defined(WDI_EVENT_ENABLE) &&\ + (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc, uint32_t *msg_word, qdf_nbuf_t htt_t2h_msg); @@ -94,7 +108,9 @@ struct dp_mon_ops { QDF_STATUS (*mon_config_enh_rx_capture)(struct dp_pdev *pdev, uint8_t val); #endif +#ifdef QCA_SUPPORT_BPR QDF_STATUS (*mon_set_bpr_enable)(struct dp_pdev *pdev, int val); +#endif #ifdef ATH_SUPPORT_NAC int (*mon_set_filter_neigh_peers)(struct dp_pdev *pdev, bool val); #endif @@ -119,17 +135,19 @@ struct dp_mon_ops { uint8_t *rx_pkt_hdr); #endif void (*mon_vdev_timer_init)(struct dp_soc *soc); - void (*mon_vdev_timer_start)(struct dp_mon_soc *mon_soc); - bool (*mon_vdev_timer_stop)(struct dp_mon_soc *mon_soc); - void (*mon_vdev_timer_deinit)(struct dp_mon_soc *mon_soc); + void (*mon_vdev_timer_start)(struct dp_soc *soc); + bool (*mon_vdev_timer_stop)(struct dp_soc *soc); + void (*mon_vdev_timer_deinit)(struct dp_soc *soc); void (*mon_reap_timer_init)(struct dp_soc *soc); - 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, + void (*mon_reap_timer_start)(struct dp_soc *soc); + bool (*mon_reap_timer_stop)(struct dp_soc *soc); + void (*mon_reap_timer_deinit)(struct dp_soc *soc); +#ifdef QCA_MCOPY_SUPPORT + QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_pdev *pdev, uint16_t peer_id, uint32_t ppdu_id, uint8_t first_msdu); +#endif void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev, struct dp_peer *ta_peer, uint8_t *mac_addr, @@ -288,6 +306,8 @@ struct dp_mon_pdev { uint64_t status_buf_addr; struct hal_rx_ppdu_info ppdu_info; + /* ppdu_id of last received HTT TX stats */ + uint32_t last_ppdu_id; struct { uint8_t last_user; qdf_nbuf_t buf; @@ -353,7 +373,7 @@ struct dp_mon_peer { struct mon_ops { }; -#ifdef FEATURE_PERPKT_INFO +#if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT) void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf); #else static inline @@ -362,12 +382,49 @@ 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 { -}; +#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ + defined(WLAN_SUPPORT_RX_FLOW_TAG) +/** + * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor + * mode and then tags appropriate packets + * @soc: core txrx main context + * @vdev: pdev on which packet is received + * @msdu: QDF packet buffer on which the protocol tag should be set + * @rx_desc: base address where the RX TLVs start + * Return: void + */ +void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, + struct dp_pdev *dp_pdev, + qdf_nbuf_t msdu, void *rx_desc); +#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ -struct dp_peer_tx_capture { -}; +#if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\ + !defined(WLAN_SUPPORT_RX_FLOW_TAG) +/** + * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor + * mode and then tags appropriate packets + * @soc: core txrx main context + * @vdev: pdev on which packet is received + * @msdu: QDF packet buffer on which the protocol tag should be set + * @rx_desc: base address where the RX TLVs start + * Return: void + */ +static inline +void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, + struct dp_pdev *dp_pdev, + qdf_nbuf_t msdu, void *rx_desc) +{ +} +#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ + +#ifndef WLAN_TX_PKT_CAPTURE_ENH +static inline +QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev, + struct dp_peer *peer_handle, + uint8_t value, uint8_t *peer_mac) +{ + return QDF_STATUS_SUCCESS; +} /** * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID @@ -500,12 +557,6 @@ static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, } #endif -#if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) -static void dp_pktlogmod_exit(struct dp_pdev *handle); -#else -static void dp_pktlogmod_exit(struct dp_pdev *handle) { } -#endif - #ifndef WLAN_TX_PKT_CAPTURE_ENH /** * dp_tx_ppdu_stats_process - Deferred PPDU stats handler @@ -601,7 +652,7 @@ static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev) */ static inline bool monitor_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return false; return pdev->monitor_pdev->enable_reap_timer_non_pkt; @@ -615,7 +666,7 @@ static inline bool monitor_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) */ static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return false; return pdev->monitor_pdev->mcopy_mode; @@ -629,7 +680,7 @@ static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) */ static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return false; return pdev->monitor_pdev->tx_sniffer_enable; @@ -643,7 +694,7 @@ static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) */ static inline bool monitor_is_configured(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return false; return pdev->monitor_pdev->monitor_configured; @@ -656,7 +707,7 @@ static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, struct dp_mon_pdev *mon_pdev; uint32_t msdu_ppdu_id = 0; - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return QDF_STATUS_E_FAILURE; mon_pdev = pdev->monitor_pdev; @@ -668,7 +719,6 @@ static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, 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, @@ -682,9 +732,9 @@ static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, } static inline struct mon_rx_status* -monitor_get_rx_status_addr(struct dp_pdev *pdev) +monitor_get_rx_status(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return NULL; return &pdev->monitor_pdev->ppdu_info.rx_status; @@ -698,7 +748,7 @@ monitor_get_rx_status_addr(struct dp_pdev *pdev) */ static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return false; if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN) @@ -726,7 +776,7 @@ monitor_get_chan_band(struct dp_pdev *pdev) */ static inline void monitor_print_tx_stats(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; DP_PRINT_STATS("ppdu info schedule completion list depth: %d", @@ -747,7 +797,7 @@ static inline void monitor_print_tx_stats(struct dp_pdev *pdev) */ static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return false; return pdev->monitor_pdev->enhanced_stats_en; @@ -762,7 +812,7 @@ static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev) */ static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; pdev->monitor_pdev->mon_chan_num = chan_num; @@ -778,7 +828,7 @@ static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) static inline void monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; pdev->monitor_pdev->mon_chan_freq = chan_freq; @@ -794,7 +844,7 @@ monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) static inline void monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) { - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; pdev->monitor_pdev->mon_chan_band = chan_band; @@ -812,7 +862,7 @@ static inline void monitor_get_mpdu_status(struct dp_pdev *pdev, { struct dp_mon_pdev *mon_pdev; - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; mon_pdev = pdev->monitor_pdev; @@ -895,7 +945,7 @@ static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc) { struct dp_mon_soc *mon_soc; - if (!soc || !soc->monitor_soc) + if (qdf_unlikely(!soc || !soc->monitor_soc)) return false; mon_soc = soc->monitor_soc; @@ -906,7 +956,7 @@ static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc) 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) + if (qdf_unlikely(!soc || !soc->monitor_soc)) return NULL; return &soc->monitor_soc->mon_link_desc_pages[mac_id]; @@ -1450,7 +1500,8 @@ QDF_STATUS monitor_tx_add_to_comp_queue(struct dp_soc *soc, #endif -#if defined(WDI_EVENT_ENABLE) && !defined(REMOVE_PKT_LOG) +#if defined(WDI_EVENT_ENABLE) &&\ + (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) static inline bool monitor_ppdu_stats_ind_handler(struct htt_soc *soc, uint32_t *msg_word, qdf_nbuf_t htt_t2h_msg) @@ -1617,6 +1668,7 @@ static inline QDF_STATUS monitor_config_enh_rx_capture(struct dp_pdev *pdev, } #endif +#ifdef QCA_SUPPORT_BPR static inline QDF_STATUS monitor_set_bpr_enable(struct dp_pdev *pdev, uint32_t val) { @@ -1636,6 +1688,13 @@ static inline QDF_STATUS monitor_set_bpr_enable(struct dp_pdev *pdev, return monitor_ops->mon_set_bpr_enable(pdev, val); } +#else +static inline QDF_STATUS monitor_set_bpr_enable(struct dp_pdev *pdev, + uint32_t val) +{ + return QDF_STATUS_E_FAILURE; +} +#endif #ifdef ATH_SUPPORT_NAC static inline int monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) @@ -1794,8 +1853,8 @@ int monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, bool enable) return monitor_ops->mon_set_pktlog_wifi3(pdev, event, enable); } #else -static inline int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, - bool enable) +static inline int monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, + bool enable) { return 0; } @@ -1923,7 +1982,7 @@ void monitor_reap_timer_deinit(struct dp_soc *soc) return; } - monitor_ops->mon_reap_timer_deinit(mon_soc); + monitor_ops->mon_reap_timer_deinit(soc); } static inline @@ -1943,7 +2002,7 @@ void monitor_reap_timer_start(struct dp_soc *soc) return; } - monitor_ops->mon_reap_timer_start(mon_soc); + monitor_ops->mon_reap_timer_start(soc); } static inline @@ -1963,7 +2022,7 @@ bool monitor_reap_timer_stop(struct dp_soc *soc) return false; } - return monitor_ops->mon_reap_timer_stop(mon_soc); + return monitor_ops->mon_reap_timer_stop(soc); } static inline @@ -2003,7 +2062,7 @@ void monitor_vdev_timer_deinit(struct dp_soc *soc) return; } - monitor_ops->mon_vdev_timer_deinit(mon_soc); + monitor_ops->mon_vdev_timer_deinit(soc); } static inline @@ -2023,7 +2082,7 @@ void monitor_vdev_timer_start(struct dp_soc *soc) return; } - monitor_ops->mon_vdev_timer_start(mon_soc); + monitor_ops->mon_vdev_timer_start(soc); } static inline @@ -2043,32 +2102,41 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc) return false; } - return monitor_ops->mon_vdev_timer_stop(mon_soc); + return monitor_ops->mon_vdev_timer_stop(soc); } +#ifdef QCA_MCOPY_SUPPORT 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; + return QDF_STATUS_E_FAILURE; } 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 QDF_STATUS_E_FAILURE; } - return monitor_ops->mon_mcopy_check_deliver(mon_pdev, peer_id, + return monitor_ops->mon_mcopy_check_deliver(pdev, peer_id, ppdu_id, first_msdu); } +#else +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; +} +#endif static inline void monitor_neighbour_peer_add_ast(struct dp_pdev *pdev, struct dp_peer *ta_peer, @@ -2109,16 +2177,16 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev) #ifdef DP_POWER_SAVE /* - * monitor_stop_reap_timer() - stop reap timer + * monitor_pktlog_reap_pending_frames() - reap pending frames * @pdev: point to dp pdev * - * Return: + * Return: void */ -static inline void monitor_stop_reap_timer(struct dp_pdev *pdev) +static inline void monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev) { struct dp_soc *soc; - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; soc = pdev->soc; @@ -2131,16 +2199,16 @@ static inline void monitor_stop_reap_timer(struct dp_pdev *pdev) } /* - * monitor_start_reap_timer() - start reap timer + * monitor_pktlog_start_reap_timer() - start reap timer * @pdev: point to dp pdev * - * Return: + * Return: void */ -static inline void monitor_start_reap_timer(struct dp_pdev *pdev) +static inline void monitor_pktlog_start_reap_timer(struct dp_pdev *pdev) { struct dp_soc *soc; - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; soc = pdev->soc; @@ -2158,7 +2226,7 @@ void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, struct dp_mon_pdev *mon_pdev; struct dp_neighbour_peer *temp_peer = NULL; - if (!pdev || !pdev->monitor_pdev) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) return; mon_pdev = pdev->monitor_pdev; @@ -2181,3 +2249,35 @@ void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, } qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); } + +static inline +void monitor_pdev_set_mon_vdev(struct dp_vdev *vdev) +{ + struct dp_mon_pdev *mon_pdev = vdev->pdev->monitor_pdev; + + if (!mon_pdev) + return; + + mon_pdev->mvdev = vdev; +} + +QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc); +QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc); +QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev); +QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev); +QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev); +QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev); +QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc); +void dp_mon_cdp_ops_register(struct dp_soc *soc); +void dp_mon_cdp_ops_deregister(struct dp_soc *soc); +void dp_mon_ops_register(struct dp_mon_soc *mon_soc); +QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, + struct dp_pdev *pdev, + int mac_id, + int mac_for_pdev); +#ifdef QCA_ENHANCED_STATS_SUPPORT +QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, + struct cdp_rx_stats_ppdu_user *ppdu_user); +#endif + +#endif /* _DP_MON_H_ */ diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 6e3a84bb0d..d05aa4978d 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -29,10 +29,12 @@ * Monitor Filter mode to string */ static int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = { -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT "DP MON FILTER ENHACHED STATS MODE", +#endif /* QCA_ENHANCED_STATS_SUPPORT */ +#ifdef QCA_MCOPY_SUPPORT "DP MON FILTER MCOPY MODE", -#endif /* FEATURE_PERPKT_INFO */ +#endif /* QCA_MCOPY_SUPPORT */ #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) "DP MON FILTER SMART MONITOR MODE", #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ @@ -48,7 +50,7 @@ static int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = { /** * dp_mon_filter_show_filter() - Show the set filters - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle * @mode: The filter modes * @tlv_filter: tlv filter */ @@ -310,6 +312,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev, dp_mon_filter_show_filter(mon_pdev, 0, filter); } +#ifdef QCA_MONITOR_PKT_SUPPORT /** * dp_mon_filter_reset_mon_srng() * @soc: DP SoC handle @@ -328,8 +331,9 @@ dp_mon_filter_reset_mon_srng(struct dp_soc *soc, struct dp_pdev *pdev, soc); } } +#endif -#if defined(FEATURE_PERPKT_INFO) || defined(ATH_SUPPORT_NAC_RSSI) \ +#if defined(QCA_MCOPY_SUPPORT) || defined(ATH_SUPPORT_NAC_RSSI) \ || defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH) /** * dp_mon_filter_check_co_exist() - Check the co-existing of the @@ -414,6 +418,8 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) #else 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 packet log lite or full can co-exist with * the enable modes. @@ -430,9 +436,10 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) } #endif +#ifdef QCA_MONITOR_PKT_SUPPORT /** * dp_mon_filter_set_mon_cmn() - Setp the common mon filters - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle * @filter: DP mon filter * * Return: QDF_STATUS @@ -466,10 +473,11 @@ static void dp_mon_filter_set_mon_cmn(struct dp_mon_pdev *mon_pdev, filter->tlv_filter.mo_data_filter = mon_pdev->mo_data_filter; filter->tlv_filter.offset_valid = false; } +#endif /** * dp_mon_filter_set_status_cmn() - Setp the common status filters - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle * @filter: Dp mon filters * * Return: QDF_STATUS @@ -535,6 +543,7 @@ static void dp_mon_filter_set_status_cbf(struct dp_pdev *pdev, filter->tlv_filter.enable_mo = 0; } +#ifdef QCA_MONITOR_PKT_SUPPORT /** * dp_mon_filter_set_cbf_cmn() - Set the common cbf mode filters * @pdev: DP pdev handle @@ -562,11 +571,12 @@ static void dp_mon_filter_set_cbf_cmn(struct dp_pdev *pdev, filter->tlv_filter.offset_valid = false; filter->tlv_filter.enable_mo = 0; } +#endif -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT /** * dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter - * @mon_pdev: Monitor DP pdev handle + * @mon_pdev: Monitor pdev handle */ void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev) { @@ -590,24 +600,58 @@ void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev) /** * dp_mon_filter_reset_enhanced_stats() - Reset the enhanced stats filter - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle */ -void dp_mon_filter_reset_enhanced_stats(struct dp_pdev *pdev) +void dp_mon_filter_reset_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; - struct dp_mon_pdev *mon_pdev; - if (!pdev) { + if (!mon_pdev) { dp_mon_filter_err("pdev Context is null"); return; } - mon_pdev = pdev->monitor_pdev; mon_pdev->filter[mode][srng_type] = filter; } +#endif /* QCA_ENHANCED_STATS_SUPPORT */ + +#ifdef QCA_MCOPY_SUPPORT +#ifdef QCA_MONITOR_PKT_SUPPORT +static void +dp_mon_filter_set_reset_mcopy_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE; + enum dp_mon_filter_srng_type srng_type; + + srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? + DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : + DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); + + /* Set the filter */ + if (pfilter->valid) { + dp_mon_filter_set_mon_cmn(mon_pdev, pfilter); + + pfilter->tlv_filter.fp_data_filter = 0; + pfilter->tlv_filter.mo_data_filter = 0; + + dp_mon_filter_show_filter(mon_pdev, mode, pfilter); + mon_pdev->filter[mode][srng_type] = *pfilter; + } else /* Reset the filter */ + mon_pdev->filter[mode][srng_type] = *pfilter; +} +#else +static void +dp_mon_filter_set_reset_mcopy_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ +} +#endif /** * dp_mon_filter_setup_mcopy_mode() - Setup the m_copy mode filter @@ -640,17 +684,7 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev) } /* Enabled the filter */ filter.valid = true; - 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(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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_mcopy_mon_buf(pdev, &filter); /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -696,15 +730,12 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev) } 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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_mcopy_mon_buf(pdev, &filter); srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; mon_pdev->filter[mode][srng_type] = filter; } -#endif /* FEATURE_PERPKT_INFO */ +#endif /* QCA_MCOPY_SUPPORT */ #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) /** @@ -754,22 +785,62 @@ 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 */ -void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev) +void dp_mon_filter_reset_smart_monitor(struct dp_pdev *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; + struct dp_mon_pdev *mon_pdev; - if (!mon_pdev) { + if (!pdev) { dp_mon_filter_err("monitor pdev Context is null"); return; } + mon_pdev = pdev->monitor_pdev; mon_pdev->filter[mode][srng_type] = filter; } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ #ifdef WLAN_RX_PKT_CAPTURE_ENH +#ifdef QCA_MONITOR_PKT_SUPPORT +static void +dp_mon_filter_set_reset_rx_enh_capture_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE; + enum dp_mon_filter_srng_type srng_type; + + srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? + DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : + DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); + + /* Set the filter */ + if (pfilter->valid) { + dp_mon_filter_set_mon_cmn(mon_pdev, pfilter); + + pfilter->tlv_filter.fp_mgmt_filter = 0; + pfilter->tlv_filter.fp_ctrl_filter = 0; + pfilter->tlv_filter.fp_data_filter = 0; + pfilter->tlv_filter.mo_mgmt_filter = 0; + pfilter->tlv_filter.mo_ctrl_filter = 0; + pfilter->tlv_filter.mo_data_filter = 0; + + dp_mon_filter_show_filter(mon_pdev, mode, pfilter); + pdev->monitor_pdev->filter[mode][srng_type] = *pfilter; + } else /* Reset the filter */ + pdev->monitor_pdev->filter[mode][srng_type] = *pfilter; +} +#else +static void +dp_mon_filter_set_reset_rx_enh_capture_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ +} +#endif + /** * dp_mon_filter_setup_rx_enh_capture() - Setup the Rx capture mode filters * @pdev: DP pdev handle @@ -798,21 +869,7 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_mon_cmn(mon_pdev, &filter); - - filter.tlv_filter.fp_mgmt_filter = 0; - filter.tlv_filter.fp_ctrl_filter = 0; - filter.tlv_filter.fp_data_filter = 0; - filter.tlv_filter.mo_mgmt_filter = 0; - filter.tlv_filter.mo_ctrl_filter = 0; - filter.tlv_filter.mo_data_filter = 0; - - 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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_rx_enh_capture_mon_buf(pdev, &filter); /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -873,16 +930,42 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev) } 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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_rx_enh_capture_mon_buf(pdev, &filter); srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; mon_pdev->filter[mode][srng_type] = filter; } #endif /* WLAN_RX_PKT_CAPTURE_ENH */ +#ifdef QCA_MONITOR_PKT_SUPPORT +static void dp_mon_filter_set_reset_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; + enum dp_mon_filter_srng_type srng_type; + + srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? + DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : + DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); + + /* set the filter */ + if (pfilter->valid) { + dp_mon_filter_set_mon_cmn(mon_pdev, pfilter); + + dp_mon_filter_show_filter(mon_pdev, mode, pfilter); + mon_pdev->filter[mode][srng_type] = *pfilter; + } else /* reset the filter */ + mon_pdev->filter[mode][srng_type] = *pfilter; +} +#else +static void dp_mon_filter_set_reset_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ +} +#endif + /** * dp_mon_filter_setup_mon_mode() - Setup the Rx monitor mode filter * @pdev: DP pdev handle @@ -909,13 +992,7 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev) mon_pdev = pdev->monitor_pdev; filter.valid = true; - 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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_mon_buf(pdev, &filter); /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -957,10 +1034,7 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev) } 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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_mon_buf(pdev, &filter); srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; mon_pdev->filter[mode][srng_type] = filter; @@ -1049,23 +1123,56 @@ 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 - * @mon_pdev: Monitor pdev handle + * @pdev: DP pdev handle */ -void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev) +void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *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; + struct dp_mon_pdev *mon_pdev; - if (!mon_pdev) { - dp_mon_filter_err("monitor pdev Context is null"); + if (!pdev) { + dp_mon_filter_err("dp pdev Context is null"); return; } + mon_pdev = pdev->monitor_pdev; mon_pdev->filter[mode][srng_type] = filter; } +#ifdef QCA_MONITOR_PKT_SUPPORT +static void +dp_mon_filter_set_reset_rx_pkt_log_cbf_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; + enum dp_mon_filter_srng_type srng_type; + + srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? + DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : + DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); + + /*set the filter */ + if (pfilter->valid) { + dp_mon_filter_set_cbf_cmn(pdev, pfilter); + + dp_mon_filter_show_filter(mon_pdev, mode, pfilter); + mon_pdev->filter[mode][srng_type] = *pfilter; + } else /* reset the filter */ + mon_pdev->filter[mode][srng_type] = *pfilter; +} +#else +static void +dp_mon_filter_set_reset_rx_pkt_log_cbf_mon_buf(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter) +{ +} +#endif + /** * dp_mon_filter_setup_rx_pkt_log_cbf() - Setup the Rx pktlog CBF mode filter * @pdev: DP pdev handle @@ -1077,13 +1184,14 @@ 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; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); return; } + mon_pdev = pdev->monitor_pdev; soc = pdev->soc; if (!soc) { dp_mon_filter_err("Soc Context is null"); @@ -1102,13 +1210,7 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev) qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter)); filter.valid = true; - dp_mon_filter_set_cbf_cmn(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); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_rx_pkt_log_cbf_mon_buf(pdev, &filter); } /** @@ -1122,7 +1224,7 @@ 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; + struct dp_mon_pdev *mon_pdev; if (!pdev) { QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR, @@ -1130,6 +1232,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; soc = pdev->soc; if (!soc) { QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR, @@ -1137,10 +1240,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev) return; } - srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? - DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : - DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - mon_pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_reset_rx_pkt_log_cbf_mon_buf(pdev, &filter); srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; mon_pdev->filter[mode][srng_type] = filter; @@ -1173,6 +1273,68 @@ static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev) } #endif +#ifdef QCA_MONITOR_PKT_SUPPORT +static QDF_STATUS dp_mon_filter_mon_buf_update(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter, + bool *pmon_mode_set) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + enum dp_mon_filter_srng_type srng_type; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? + DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : + DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); + + dp_mon_filter_ht2_setup(soc, pdev, srng_type, pfilter); + + *pmon_mode_set = pfilter->valid; + if (dp_mon_should_reset_buf_ring_filter(pdev) || *pmon_mode_set) { + status = dp_mon_ht2_rx_ring_cfg(soc, pdev, + srng_type, + &pfilter->tlv_filter); + } else { + /* + * For WIN case the monitor buffer ring is used and it does need + * reset when monitor mode gets enabled/disabled. + */ + if (soc->wlan_cfg_ctx->rxdma1_enable) { + if (mon_pdev->monitor_configured || *pmon_mode_set) { + status = dp_mon_ht2_rx_ring_cfg(soc, pdev, + srng_type, + &pfilter->tlv_filter); + } + } + } + + return status; +} + +static void dp_mon_filter_mon_buf_reset(struct dp_pdev *pdev) +{ + struct dp_soc *soc = pdev->soc; + enum dp_mon_filter_srng_type srng_type; + + srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? + DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : + DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); + + dp_mon_filter_reset_mon_srng(soc, pdev, srng_type); +} +#else +static QDF_STATUS dp_mon_filter_mon_buf_update(struct dp_pdev *pdev, + struct dp_mon_filter *pfilter, + bool *pmon_mode_set) +{ + return QDF_STATUS_SUCCESS; +} + +static void dp_mon_filter_mon_buf_reset(struct dp_pdev *pdev) +{ +} +#endif + /** * dp_mon_filter_update() - Setup the monitor filter setting for a srng * type @@ -1185,8 +1347,6 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) struct dp_soc *soc; bool mon_mode_set = false; struct dp_mon_filter filter = {0}; - 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; @@ -1209,33 +1369,8 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) /* * Setup the filters for the monitor destination ring. */ - if (!soc->wlan_cfg_ctx->rxdma1_enable) - mon_srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF; - - /* - * Setup the filters for the monitor mode. - */ - qdf_mem_zero(&(filter), sizeof(filter)); - dp_mon_filter_ht2_setup(soc, pdev, mon_srng_type, &filter); - - mon_mode_set = filter.valid; - if (dp_mon_should_reset_buf_ring_filter(pdev) || mon_mode_set) { - status = dp_mon_ht2_rx_ring_cfg(soc, pdev, - mon_srng_type, - &filter.tlv_filter); - } else { - /* - * For WIN case the monitor buffer ring is used and it does need - * reset when monitor mode gets enabled/disabled. - */ - if (soc->wlan_cfg_ctx->rxdma1_enable) { - if (mon_pdev->monitor_configured || mon_mode_set) { - status = dp_mon_ht2_rx_ring_cfg(soc, pdev, - mon_srng_type, - &filter.tlv_filter); - } - } - } + status = dp_mon_filter_mon_buf_update(pdev, &filter, + &mon_mode_set); if (status != QDF_STATUS_SUCCESS) { dp_mon_filter_err("%pK: Monitor destination ring filter setting failed", @@ -1258,14 +1393,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) * are not enabled. */ if (!filter.valid && mon_mode_set) - dp_mon_filter_reset_mon_srng(soc, pdev, mon_srng_type); + dp_mon_filter_mon_buf_reset(pdev); if (dp_mon_ht2_rx_ring_cfg(soc, pdev, DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS, &filter.tlv_filter) != QDF_STATUS_SUCCESS) { dp_mon_filter_err("%pK: Monitor status ring filter setting failed", soc); - dp_mon_filter_reset_mon_srng(soc, pdev, mon_srng_type); + dp_mon_filter_mon_buf_reset(pdev); return QDF_STATUS_E_FAILURE; } @@ -1316,7 +1451,7 @@ 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. - * @mon_pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle */ struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev) { diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index c628228b86..f43dc5949d 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -106,10 +106,12 @@ struct dp_mon_filter { * @DP_MON_FILTER_PKT_LOG_LITE_MODE: Packet log lite mode */ enum dp_mon_filter_mode { -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT DP_MON_FILTER_ENHACHED_STATS_MODE, +#endif /* QCA_ENHANCED_STATS_SUPPORT */ +#ifdef QCA_MCOPY_SUPPORT DP_MON_FILTER_MCOPY_MODE, -#endif /* FEATURE_PERPKT_INFO */ +#endif /* QCA_MCOPY_SUPPORT */ #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) DP_MON_FILTER_SMART_MONITOR_MODE, #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ @@ -152,19 +154,21 @@ enum dp_mon_filter_action { DP_MON_FILTER_SET, }; -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT /** * dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter - * @mon_pdev: Monitor DP pdev handle + * @mon_pdev: Monitor pdev handle */ void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev); /*** * dp_mon_filter_reset_enhanced_stats() - Reset the enhanced stats filter - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle */ -void dp_mon_filter_reset_enhanced_stats(struct dp_pdev *pdev); +void dp_mon_filter_reset_enhanced_stats(struct dp_mon_pdev *mon_pdev); +#endif /* QCA_ENHANCED_STATS_SUPPORT */ +#ifdef QCA_MCOPY_SUPPORT /** * dp_mon_filter_setup_mcopy_mode() - Setup the m_copy mode filter * @pdev: DP pdev handle @@ -176,7 +180,7 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev); * @pdev: DP pdev handle */ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev); -#endif /* FEATURE_PERPKT_INFO */ +#endif /* QCA_MCOPY_SUPPORT */ #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) /** @@ -187,9 +191,9 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev); /** * dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter - * @mon_pdev: monitor pdev handle + * @pdev: DP pdev handle */ -void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev); +void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev); #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ #ifdef WLAN_RX_PKT_CAPTURE_ENH @@ -240,9 +244,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 - * @mon_pdev: Monitor pdev handle + * @pdev: DP pdev handle */ -void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev); +void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev); /** * dp_mon_filter_setup_rx_pkt_log_cbf() - Setup the Rx pktlog cbf mode filter diff --git a/dp/wifi3.0/monitor/dp_rx_mon.h b/dp/wifi3.0/monitor/dp_rx_mon.h index 2c7991263b..6fe5b87598 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.h +++ b/dp/wifi3.0/monitor/dp_rx_mon.h @@ -19,6 +19,8 @@ #ifndef _DP_RX_MON_H_ #define _DP_RX_MON_H_ +#include "dp_mon.h" + /* * MON_BUF_MIN_ENTRIES macro defines minimum number of network buffers * to be refilled in the RXDMA monitor buffer ring at init, remaining @@ -112,16 +114,54 @@ dp_rx_mon_status_process(struct dp_soc *soc, struct dp_intr *int_ctx, * * Return: none */ -void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, - uint32_t mac_id, uint32_t quota); - QDF_STATUS dp_rx_pdev_mon_desc_pool_alloc(struct dp_pdev *pdev); QDF_STATUS dp_rx_pdev_mon_buffers_alloc(struct dp_pdev *pdev); void dp_rx_pdev_mon_buffers_free(struct dp_pdev *pdev); void dp_rx_pdev_mon_desc_pool_init(struct dp_pdev *pdev); void dp_rx_pdev_mon_desc_pool_deinit(struct dp_pdev *pdev); void dp_rx_pdev_mon_desc_pool_free(struct dp_pdev *pdev); +#ifdef QCA_MONITOR_PKT_SUPPORT +void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, + uint32_t mac_id, uint32_t quota); + void dp_rx_pdev_mon_buf_buffers_free(struct dp_pdev *pdev, uint32_t mac_id); +QDF_STATUS +dp_rx_pdev_mon_buf_buffers_alloc(struct dp_pdev *pdev, uint32_t mac_id, + bool delayed_replenish); +QDF_STATUS +dp_rx_pdev_mon_buf_desc_pool_alloc(struct dp_pdev *pdev, uint32_t mac_id); +void +dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id); +#else +static inline +void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, + uint32_t mac_id, uint32_t quota) +{ +} + +static inline +void dp_rx_pdev_mon_buf_buffers_free(struct dp_pdev *pdev, uint32_t mac_id) +{ +} + +static inline QDF_STATUS +dp_rx_pdev_mon_buf_buffers_alloc(struct dp_pdev *pdev, uint32_t mac_id, + bool delayed_replenish) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +dp_rx_pdev_mon_buf_desc_pool_alloc(struct dp_pdev *pdev, uint32_t mac_id) +{ + return QDF_STATUS_SUCCESS; +} + +static inline void +dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) +{ +} +#endif QDF_STATUS dp_rx_pdev_mon_status_buffers_alloc(struct dp_pdev *pdev, uint32_t mac_id); @@ -134,13 +174,6 @@ void dp_rx_pdev_mon_status_desc_pool_deinit(struct dp_pdev *pdev, void dp_rx_pdev_mon_status_desc_pool_free(struct dp_pdev *pdev, uint32_t mac_id); void dp_rx_pdev_mon_status_buffers_free(struct dp_pdev *pdev, uint32_t mac_id); -QDF_STATUS -dp_rx_pdev_mon_buf_buffers_alloc(struct dp_pdev *pdev, uint32_t mac_id, - bool delayed_replenish); -QDF_STATUS -dp_rx_pdev_mon_buf_desc_pool_alloc(struct dp_pdev *pdev, uint32_t mac_id); -void -dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id); /* * dp_rx_populate_cbf_hdr - Send CBF frame with htt header @@ -315,6 +348,7 @@ uint32_t dp_rxdma_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, */ void dp_mon_buf_delayed_replenish(struct dp_pdev *pdev); +#ifdef QCA_MONITOR_PKT_SUPPORT /** * dp_rx_mon_link_desc_return() - Return a MPDU link descriptor to HW * (WBM), following error handling @@ -327,6 +361,15 @@ QDF_STATUS dp_rx_mon_link_desc_return(struct dp_pdev *dp_pdev, hal_buff_addrinfo_t buf_addr_info, int mac_id); +#else +static inline QDF_STATUS +dp_rx_mon_link_desc_return(struct dp_pdev *dp_pdev, + hal_buff_addrinfo_t buf_addr_info, + int mac_id) +{ + return QDF_STATUS_SUCCESS; +} +#endif /** * dp_mon_adjust_frag_len() - MPDU and MSDU may spread across diff --git a/dp/wifi3.0/monitor/dp_rx_mon_dest.c b/dp/wifi3.0/monitor/dp_rx_mon_dest.c index 40f4979481..a5e77206c2 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon_dest.c +++ b/dp/wifi3.0/monitor/dp_rx_mon_dest.c @@ -38,7 +38,23 @@ #ifdef WLAN_TX_PKT_CAPTURE_ENH #include "dp_rx_mon_feature.h" +#endif +/* + * PPDU id is from 0 to 64k-1. PPDU id read from status ring and PPDU id + * read from destination ring shall track each other. If the distance of + * two ppdu id is less than 20000. It is assume no wrap around. Otherwise, + * It is assume wrap around. + */ +#define NOT_PPDU_ID_WRAP_AROUND 20000 +/* + * The destination ring processing is stuck if the destrination is not + * moving while status ring moves 16 ppdu. the destination ring processing + * skips this destination ring ppdu as walkaround + */ +#define MON_DEST_RING_STUCK_MAX_CNT 16 + +#ifdef WLAN_TX_PKT_CAPTURE_ENH static inline void dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, qdf_nbuf_t mon_mpdu) @@ -57,6 +73,7 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, dp_handle_tx_capture_from_dest(soc, pdev, mon_mpdu); } +#ifdef QCA_MONITOR_PKT_SUPPORT static void dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv) { @@ -68,6 +85,7 @@ dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv) hal_rx_hw_desc_mpdu_user_id(dp_pdev->soc->hal_soc, rx_desc_tlv); } +#endif #else static inline void dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, @@ -75,26 +93,15 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, { } +#ifdef QCA_MONITOR_PKT_SUPPORT static void dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv) { } #endif +#endif -/* - * PPDU id is from 0 to 64k-1. PPDU id read from status ring and PPDU id - * read from destination ring shall track each other. If the distance of - * two ppdu id is less than 20000. It is assume no wrap around. Otherwise, - * It is assume wrap around. - */ -#define NOT_PPDU_ID_WRAP_AROUND 20000 -/* - * The destination ring processing is stuck if the destrination is not - * moving while status ring moves 16 ppdu. the destination ring processing - * skips this destination ring ppdu as walkaround - */ -#define MON_DEST_RING_STUCK_MAX_CNT 16 - +#ifdef QCA_MONITOR_PKT_SUPPORT /** * dp_rx_mon_link_desc_return() - Return a MPDU link descriptor to HW * (WBM), following error handling @@ -466,903 +473,6 @@ next_msdu: return rx_bufs_used; } -static inline -void dp_rx_msdus_set_payload(struct dp_soc *soc, qdf_nbuf_t msdu) -{ - uint8_t *data; - uint32_t rx_pkt_offset, l2_hdr_offset; - - data = qdf_nbuf_data(msdu); - rx_pkt_offset = soc->rx_mon_pkt_tlv_size; - l2_hdr_offset = hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, data); - qdf_nbuf_pull_head(msdu, rx_pkt_offset + l2_hdr_offset); -} - -#ifdef DP_RX_MON_MEM_FRAG -/** - * dp_rx_mon_fraglist_prepare() - Prepare nbuf fraglist from chained skb - * - * @head_msdu: Parent SKB - * @tail_msdu: Last skb in the chained list - * - * Return: Void - */ -void dp_rx_mon_fraglist_prepare(qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu) -{ - qdf_nbuf_t msdu, mpdu_buf, prev_buf, head_frag_list; - uint32_t frag_list_sum_len; - - dp_err("[%s][%d] decap format raw head %pK head->next %pK last_msdu %pK last_msdu->next %pK", - __func__, __LINE__, head_msdu, head_msdu->next, - tail_msdu, tail_msdu->next); - - /* Single skb accommodating MPDU worth Data */ - if (tail_msdu == head_msdu) - return; - - mpdu_buf = head_msdu; - prev_buf = mpdu_buf; - frag_list_sum_len = 0; - - msdu = qdf_nbuf_next(head_msdu); - /* msdu can't be NULL here as it is multiple skb case here */ - - /* Head frag list to point to second skb */ - head_frag_list = msdu; - - while (msdu) { - frag_list_sum_len += qdf_nbuf_len(msdu); - prev_buf = msdu; - msdu = qdf_nbuf_next(msdu); - } - - qdf_nbuf_append_ext_list(mpdu_buf, head_frag_list, frag_list_sum_len); - - /* Make Parent skb next to NULL */ - qdf_nbuf_set_next(mpdu_buf, NULL); -} - -/** - * dp_rx_mon_frag_restitch_mpdu_from_msdus() - Restitch logic to - * convert to 802.3 header and adjust frag memory pointing to - * dot3 header and payload in case of Non-Raw frame. - * - * @soc: struct dp_soc * - * @mac_id: MAC id - * @head_msdu: MPDU containing all MSDU as a frag - * @tail_msdu: last skb which accommodate MPDU info - * @rx_status: struct cdp_mon_status * - * - * Return: Adjusted nbuf containing MPDU worth info. - */ -static inline -qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc, - uint32_t mac_id, - qdf_nbuf_t head_msdu, - qdf_nbuf_t tail_msdu, - struct cdp_mon_status *rx_status) -{ - uint32_t wifi_hdr_len, sec_hdr_len, msdu_llc_len, - mpdu_buf_len, decap_hdr_pull_bytes, dir, - is_amsdu, amsdu_pad, frag_size, tot_msdu_len; - qdf_frag_t rx_desc, rx_src_desc, rx_dest_desc, frag_addr; - char *hdr_desc; - uint8_t num_frags, frags_iter, l2_hdr_offset; - struct ieee80211_frame *wh; - struct ieee80211_qoscntl *qos; - struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); - int16_t frag_page_offset = 0; - struct hal_rx_mon_dest_buf_info buf_info; - 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) - goto mpdu_stitch_fail; - - rx_desc = qdf_nbuf_get_frag_addr(head_msdu, 0) - rx_mon_tlv_size; - - if (hal_rx_tlv_mpdu_len_err_get(soc->hal_soc, rx_desc)) { - /* It looks like there is some issue on MPDU len err */ - /* Need further investigate if drop the packet */ - DP_STATS_INC(dp_pdev, dropped.mon_rx_drop, 1); - return NULL; - } - - /* Look for FCS error */ - num_frags = qdf_nbuf_get_nr_frags(tail_msdu); - rx_desc = qdf_nbuf_get_frag_addr(tail_msdu, num_frags - 1) - - rx_mon_tlv_size; - rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc, - rx_desc); - 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, - (uint8_t *)&buf_info, - sizeof(buf_info)); - - /* Easy case - The MSDU status indicates that this is a non-decapped - * packet in RAW mode. - */ - if (buf_info.is_decap_raw == 1) { - dp_rx_mon_fraglist_prepare(head_msdu, tail_msdu); - goto mpdu_stitch_done; - } - - l2_hdr_offset = DP_RX_MON_NONRAW_L2_HDR_PAD_BYTE; - - /* Decap mode: - * Calculate the amount of header in decapped packet to knock off based - * on the decap type and the corresponding number of raw bytes to copy - * status header - */ - hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, rx_desc); - - dp_rx_mon_dest_debug("%pK: decap format not raw", soc); - - /* Base size */ - wifi_hdr_len = sizeof(struct ieee80211_frame); - wh = (struct ieee80211_frame *)hdr_desc; - - dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK; - - if (dir == IEEE80211_FC1_DIR_DSTODS) - wifi_hdr_len += 6; - - is_amsdu = 0; - if (wh->i_fc[0] & QDF_IEEE80211_FC0_SUBTYPE_QOS) { - qos = (struct ieee80211_qoscntl *) - (hdr_desc + wifi_hdr_len); - wifi_hdr_len += 2; - - is_amsdu = (qos->i_qos[0] & IEEE80211_QOS_AMSDU); - } - - /*Calculate security header length based on 'Protected' - * and 'EXT_IV' flag - */ - if (wh->i_fc[1] & IEEE80211_FC1_WEP) { - char *iv = (char *)wh + wifi_hdr_len; - - if (iv[3] & KEY_EXTIV) - sec_hdr_len = 8; - else - sec_hdr_len = 4; - } else { - sec_hdr_len = 0; - } - wifi_hdr_len += sec_hdr_len; - - /* MSDU related stuff LLC - AMSDU subframe header etc */ - msdu_llc_len = is_amsdu ? (14 + 8) : 8; - - mpdu_buf_len = wifi_hdr_len + msdu_llc_len; - - /* "Decap" header to remove from MSDU buffer */ - decap_hdr_pull_bytes = 14; - - amsdu_pad = 0; - tot_msdu_len = 0; - - /* - * keeping first MSDU ops outside of loop to avoid multiple - * check handling - */ - - /* Construct src header */ - rx_src_desc = hdr_desc; - - /* - * Update protocol and flow tag for MSDU - * update frag index in ctx_idx field. - * Reset head pointer data of nbuf before updating. - */ - QDF_NBUF_CB_RX_CTX_ID(head_msdu) = 0; - dp_rx_mon_update_protocol_flow_tag(soc, dp_pdev, head_msdu, rx_desc); - - /* Construct destination address */ - frag_addr = qdf_nbuf_get_frag_addr(head_msdu, 0); - frag_size = qdf_nbuf_get_frag_size_by_idx(head_msdu, 0); - /* We will come here in 2 scenario: - * 1. First MSDU of MPDU with single buffer - * 2. First buffer of First MSDU of MPDU with continuation - * - * ------------------------------------------------------------ - * | SINGLE BUFFER (<= RX_MONITOR_BUFFER_SIZE - RX_PKT_TLVS_LEN)| - * ------------------------------------------------------------ - * - * ------------------------------------------------------------ - * | First BUFFER with Continuation | ... | - * | (RX_MONITOR_BUFFER_SIZE - RX_PKT_TLVS_LEN) | | - * ------------------------------------------------------------ - */ - pad_byte_pholder = - (RX_MONITOR_BUFFER_SIZE - soc->rx_pkt_tlv_size) - frag_size; - /* Construct destination address - * -------------------------------------------------------------- - * | RX_PKT_TLV | L2_HDR_PAD | Decap HDR | Payload | - * | | / | - * | >Frag address points here / | - * | \ / | - * | \ This bytes needs to / | - * | \ removed to frame pkt / | - * | ----------------------- | - * | | | - * | | | - * | WIFI +LLC HDR will be added here <-| | - * | | | | - * | >Dest addr will point | | - * | somewhere in this area | | - * -------------------------------------------------------------- - */ - rx_dest_desc = - (frag_addr + decap_hdr_pull_bytes + l2_hdr_offset) - - mpdu_buf_len; - /* Add WIFI and LLC header for 1st MSDU of MPDU */ - qdf_mem_copy(rx_dest_desc, rx_src_desc, mpdu_buf_len); - - frag_page_offset = - (decap_hdr_pull_bytes + l2_hdr_offset) - mpdu_buf_len; - - qdf_nbuf_move_frag_page_offset(head_msdu, 0, frag_page_offset); - - frag_size = qdf_nbuf_get_frag_size_by_idx(head_msdu, 0); - - if (buf_info.first_buffer && buf_info.last_buffer) { - /* MSDU with single bufffer */ - amsdu_pad = frag_size & 0x3; - amsdu_pad = amsdu_pad ? (4 - amsdu_pad) : 0; - if (amsdu_pad && (amsdu_pad <= pad_byte_pholder)) { - char *frag_addr_temp; - qdf_nbuf_trim_add_frag_size(head_msdu, 0, amsdu_pad, - 0); - frag_addr_temp = - (char *)qdf_nbuf_get_frag_addr(head_msdu, 0); - frag_addr_temp = (frag_addr_temp + - qdf_nbuf_get_frag_size_by_idx(head_msdu, 0)) - - amsdu_pad; - qdf_mem_zero(frag_addr_temp, amsdu_pad); - amsdu_pad = 0; - } - } else { - /* - * First buffer of Continuation frame and hence - * amsdu_padding doesn't need to be added - * Increase tot_msdu_len so that amsdu_pad byte - * will be calculated for last frame of MSDU - */ - tot_msdu_len = frag_size; - amsdu_pad = 0; - } - - /* Here amsdu_pad byte will have some value if 1sf buffer was - * Single buffer MSDU and dint had pholder to adjust amsdu padding - * byte in the end - * So dont initialize to ZERO here - */ - pad_byte_pholder = 0; - for (msdu_curr = head_msdu; msdu_curr;) { - /* frag_iter will start from 0 for second skb onwards */ - if (msdu_curr == head_msdu) - frags_iter = 1; - else - frags_iter = 0; - - num_frags = qdf_nbuf_get_nr_frags(msdu_curr); - - for (; frags_iter < num_frags; frags_iter++) { - /* Construct destination address - * ---------------------------------------------------------- - * | RX_PKT_TLV | L2_HDR_PAD | Decap HDR | Payload | Pad | - * | | (First buffer) | | | - * | | / / | - * | >Frag address points here / / | - * | \ / / | - * | \ This bytes needs to / / | - * | \ removed to frame pkt/ / | - * | ---------------------- / | - * | | / Add | - * | | / amsdu pad | - * | LLC HDR will be added here <-| | Byte for | - * | | | | last frame | - * | >Dest addr will point | | if space | - * | somewhere in this area | | available | - * | And amsdu_pad will be created if | | | - * | dint get added in last buffer | | | - * | (First Buffer) | | | - * ---------------------------------------------------------- - */ - frag_addr = - qdf_nbuf_get_frag_addr(msdu_curr, frags_iter); - rx_desc = frag_addr - rx_mon_tlv_size; - - /* - * Update protocol and flow tag for MSDU - * update frag index in ctx_idx field - */ - QDF_NBUF_CB_RX_CTX_ID(msdu_curr) = frags_iter; - dp_rx_mon_update_protocol_flow_tag(soc, dp_pdev, - msdu_curr, rx_desc); - - /* Read buffer info from stored data in tlvs */ - hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_desc, - (uint8_t *)&buf_info, - sizeof(buf_info)); - - frag_size = qdf_nbuf_get_frag_size_by_idx(msdu_curr, - frags_iter); - - /* If Middle buffer, dont add any header */ - if ((!buf_info.first_buffer) && (!buf_info.last_buffer)) { - tot_msdu_len += frag_size; - amsdu_pad = 0; - pad_byte_pholder = 0; - continue; - } - - /* Calculate if current buffer has placeholder - * to accommodate amsdu pad byte - */ - pad_byte_pholder = - (RX_MONITOR_BUFFER_SIZE - soc->rx_pkt_tlv_size) - - frag_size; - /* - * We will come here only only three condition: - * 1. Msdu with single Buffer - * 2. First buffer in case MSDU is spread in multiple - * buffer - * 3. Last buffer in case MSDU is spread in multiple - * buffer - * - * First buffER | Last buffer - * Case 1: 1 | 1 - * Case 2: 1 | 0 - * Case 3: 0 | 1 - * - * In 3rd case only l2_hdr_padding byte will be Zero and - * in other case, It will be 2 Bytes. - */ - if (buf_info.first_buffer) - l2_hdr_offset = DP_RX_MON_NONRAW_L2_HDR_PAD_BYTE; - else - l2_hdr_offset = DP_RX_MON_RAW_L2_HDR_PAD_BYTE; - - if (buf_info.first_buffer) { - /* Src addr from where llc header needs to be copied */ - rx_src_desc = - hal_rx_desc_get_80211_hdr(soc->hal_soc, - rx_desc); - - /* Size of buffer with llc header */ - frag_size = frag_size - - (l2_hdr_offset + decap_hdr_pull_bytes); - frag_size += msdu_llc_len; - - /* Construct destination address */ - rx_dest_desc = frag_addr + - decap_hdr_pull_bytes + l2_hdr_offset; - rx_dest_desc = rx_dest_desc - (msdu_llc_len); - - qdf_mem_copy(rx_dest_desc, rx_src_desc, - msdu_llc_len); - - /* - * Calculate new page offset and create hole - * if amsdu_pad required. - */ - frag_page_offset = l2_hdr_offset + - decap_hdr_pull_bytes; - frag_page_offset = frag_page_offset - - (msdu_llc_len + amsdu_pad); - - qdf_nbuf_move_frag_page_offset(msdu_curr, - frags_iter, - frag_page_offset); - - tot_msdu_len = frag_size; - /* - * No amsdu padding required for first frame of - * continuation buffer - */ - if (!buf_info.last_buffer) { - amsdu_pad = 0; - continue; - } - } else { - tot_msdu_len += frag_size; - } - - /* Will reach to this place in only two case: - * 1. Single buffer MSDU - * 2. Last buffer of MSDU in case of multiple buf MSDU - */ - - /* Check size of buffer if amsdu padding required */ - amsdu_pad = tot_msdu_len & 0x3; - amsdu_pad = amsdu_pad ? (4 - amsdu_pad) : 0; - - /* Create placeholder if current bufer can - * accommodate padding. - */ - if (amsdu_pad && (amsdu_pad <= pad_byte_pholder)) { - char *frag_addr_temp; - - qdf_nbuf_trim_add_frag_size(msdu_curr, - frags_iter, - amsdu_pad, 0); - frag_addr_temp = (char *)qdf_nbuf_get_frag_addr(msdu_curr, frags_iter); - frag_addr_temp = (frag_addr_temp + - qdf_nbuf_get_frag_size_by_idx(msdu_curr, frags_iter)) - - amsdu_pad; - qdf_mem_zero(frag_addr_temp, amsdu_pad); - amsdu_pad = 0; - } - - /* reset tot_msdu_len */ - tot_msdu_len = 0; - } - msdu_curr = qdf_nbuf_next(msdu_curr); - } - - dp_rx_mon_fraglist_prepare(head_msdu, tail_msdu); - - dp_rx_mon_dest_debug("%pK: head_msdu %pK head_msdu->len %u", - soc, head_msdu, head_msdu->len); - -mpdu_stitch_done: - return head_msdu; - -mpdu_stitch_fail: - dp_rx_mon_dest_err("%pK: mpdu_stitch_fail head_msdu %pK", - soc, head_msdu); - return NULL; -} -#endif - -static inline -qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, - uint32_t mac_id, qdf_nbuf_t head_msdu, qdf_nbuf_t last_msdu, - struct cdp_mon_status *rx_status) -{ - qdf_nbuf_t msdu, mpdu_buf, prev_buf, msdu_orig, head_frag_list; - uint32_t decap_format, wifi_hdr_len, sec_hdr_len, msdu_llc_len, - mpdu_buf_len, decap_hdr_pull_bytes, frag_list_sum_len, dir, - is_amsdu, is_first_frag, amsdu_pad; - void *rx_desc; - char *hdr_desc; - unsigned char *dest; - 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; - - 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; - - /* The nbuf has been pulled just beyond the status and points to the - * payload - */ - if (!head_msdu) - goto mpdu_stitch_fail; - - msdu_orig = head_msdu; - - rx_desc = qdf_nbuf_data(msdu_orig); - - if (hal_rx_tlv_mpdu_len_err_get(soc->hal_soc, rx_desc)) { - /* It looks like there is some issue on MPDU len err */ - /* Need further investigate if drop the packet */ - DP_STATS_INC(dp_pdev, dropped.mon_rx_drop, 1); - return NULL; - } - - rx_desc = qdf_nbuf_data(last_msdu); - - rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc, - rx_desc); - 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); */ - - rx_desc = qdf_nbuf_data(head_msdu); - - decap_format = hal_rx_tlv_decap_format_get(soc->hal_soc, rx_desc); - - /* Easy case - The MSDU status indicates that this is a non-decapped - * packet in RAW mode. - */ - if (decap_format == HAL_HW_RX_DECAP_FORMAT_RAW) { - /* Note that this path might suffer from headroom unavailabilty - * - but the RX status is usually enough - */ - - dp_rx_msdus_set_payload(soc, head_msdu); - - dp_rx_mon_dest_debug("%pK: decap format raw head %pK head->next %pK last_msdu %pK last_msdu->next %pK", - soc, head_msdu, head_msdu->next, - last_msdu, last_msdu->next); - - mpdu_buf = head_msdu; - - prev_buf = mpdu_buf; - - frag_list_sum_len = 0; - msdu = qdf_nbuf_next(head_msdu); - is_first_frag = 1; - - while (msdu) { - - dp_rx_msdus_set_payload(soc, msdu); - - if (is_first_frag) { - is_first_frag = 0; - head_frag_list = msdu; - } - - frag_list_sum_len += qdf_nbuf_len(msdu); - - /* Maintain the linking of the cloned MSDUS */ - qdf_nbuf_set_next_ext(prev_buf, msdu); - - /* Move to the next */ - prev_buf = msdu; - msdu = qdf_nbuf_next(msdu); - } - - qdf_nbuf_trim_tail(prev_buf, HAL_RX_FCS_LEN); - - /* If there were more fragments to this RAW frame */ - if (head_frag_list) { - if (frag_list_sum_len < - sizeof(struct ieee80211_frame_min_one)) { - DP_STATS_INC(dp_pdev, dropped.mon_rx_drop, 1); - return NULL; - } - frag_list_sum_len -= HAL_RX_FCS_LEN; - qdf_nbuf_append_ext_list(mpdu_buf, head_frag_list, - frag_list_sum_len); - qdf_nbuf_set_next(mpdu_buf, NULL); - } - - goto mpdu_stitch_done; - } - - /* Decap mode: - * Calculate the amount of header in decapped packet to knock off based - * on the decap type and the corresponding number of raw bytes to copy - * status header - */ - rx_desc = qdf_nbuf_data(head_msdu); - - hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, rx_desc); - - dp_rx_mon_dest_debug("%pK: decap format not raw", soc); - - - /* Base size */ - wifi_hdr_len = sizeof(struct ieee80211_frame); - wh = (struct ieee80211_frame *)hdr_desc; - - dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK; - - if (dir == IEEE80211_FC1_DIR_DSTODS) - wifi_hdr_len += 6; - - is_amsdu = 0; - if (wh->i_fc[0] & QDF_IEEE80211_FC0_SUBTYPE_QOS) { - qos = (struct ieee80211_qoscntl *) - (hdr_desc + wifi_hdr_len); - wifi_hdr_len += 2; - - is_amsdu = (qos->i_qos[0] & IEEE80211_QOS_AMSDU); - } - - /*Calculate security header length based on 'Protected' - * and 'EXT_IV' flag - * */ - if (wh->i_fc[1] & IEEE80211_FC1_WEP) { - char *iv = (char *)wh + wifi_hdr_len; - - if (iv[3] & KEY_EXTIV) - sec_hdr_len = 8; - else - sec_hdr_len = 4; - } else { - sec_hdr_len = 0; - } - wifi_hdr_len += sec_hdr_len; - - /* MSDU related stuff LLC - AMSDU subframe header etc */ - msdu_llc_len = is_amsdu ? (14 + 8) : 8; - - mpdu_buf_len = wifi_hdr_len + msdu_llc_len; - - /* "Decap" header to remove from MSDU buffer */ - decap_hdr_pull_bytes = 14; - - /* Allocate a new nbuf for holding the 802.11 header retrieved from the - * status of the now decapped first msdu. Leave enough headroom for - * accomodating any radio-tap /prism like PHY header - */ - mpdu_buf = qdf_nbuf_alloc(soc->osdev, - MAX_MONITOR_HEADER + mpdu_buf_len, - MAX_MONITOR_HEADER, 4, FALSE); - - if (!mpdu_buf) - goto mpdu_stitch_done; - - /* Copy the MPDU related header and enc headers into the first buffer - * - Note that there can be a 2 byte pad between heaader and enc header - */ - - prev_buf = mpdu_buf; - dest = qdf_nbuf_put_tail(prev_buf, wifi_hdr_len); - if (!dest) - goto mpdu_stitch_fail; - - qdf_mem_copy(dest, hdr_desc, wifi_hdr_len); - hdr_desc += wifi_hdr_len; - -#if 0 - dest = qdf_nbuf_put_tail(prev_buf, sec_hdr_len); - adf_os_mem_copy(dest, hdr_desc, sec_hdr_len); - hdr_desc += sec_hdr_len; -#endif - - /* The first LLC len is copied into the MPDU buffer */ - frag_list_sum_len = 0; - - msdu_orig = head_msdu; - is_first_frag = 1; - amsdu_pad = 0; - - while (msdu_orig) { - - /* TODO: intra AMSDU padding - do we need it ??? */ - - msdu = msdu_orig; - - if (is_first_frag) { - head_frag_list = msdu; - } else { - /* Reload the hdr ptr only on non-first MSDUs */ - rx_desc = qdf_nbuf_data(msdu_orig); - hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, - rx_desc); - } - - /* Copy this buffers MSDU related status into the prev buffer */ - - if (is_first_frag) { - is_first_frag = 0; - } - - /* Update protocol and flow tag for MSDU */ - dp_rx_mon_update_protocol_flow_tag(soc, dp_pdev, - msdu_orig, rx_desc); - - dest = qdf_nbuf_put_tail(prev_buf, - msdu_llc_len + amsdu_pad); - - if (!dest) - goto mpdu_stitch_fail; - - dest += amsdu_pad; - qdf_mem_copy(dest, hdr_desc, msdu_llc_len); - - dp_rx_msdus_set_payload(soc, msdu); - - /* Push the MSDU buffer beyond the decap header */ - qdf_nbuf_pull_head(msdu, decap_hdr_pull_bytes); - frag_list_sum_len += msdu_llc_len + qdf_nbuf_len(msdu) - + amsdu_pad; - - /* Set up intra-AMSDU pad to be added to start of next buffer - - * AMSDU pad is 4 byte pad on AMSDU subframe */ - amsdu_pad = (msdu_llc_len + qdf_nbuf_len(msdu)) & 0x3; - amsdu_pad = amsdu_pad ? (4 - amsdu_pad) : 0; - - /* TODO FIXME How do we handle MSDUs that have fraglist - Should - * probably iterate all the frags cloning them along the way and - * and also updating the prev_buf pointer - */ - - /* Move to the next */ - prev_buf = msdu; - msdu_orig = qdf_nbuf_next(msdu_orig); - - } - -#if 0 - /* Add in the trailer section - encryption trailer + FCS */ - qdf_nbuf_put_tail(prev_buf, HAL_RX_FCS_LEN); - frag_list_sum_len += HAL_RX_FCS_LEN; -#endif - - frag_list_sum_len -= msdu_llc_len; - - /* TODO: Convert this to suitable adf routines */ - qdf_nbuf_append_ext_list(mpdu_buf, head_frag_list, - frag_list_sum_len); - - dp_rx_mon_dest_debug("%pK: mpdu_buf %pK mpdu_buf->len %u", - soc, mpdu_buf, mpdu_buf->len); - -mpdu_stitch_done: - /* Check if this buffer contains the PPDU end status for TSF */ - /* Need revist this code to see where we can get tsf timestamp */ -#if 0 - /* PPDU end TLV will be retrieved from monitor status ring */ - last_mpdu = - (*(((u_int32_t *)&rx_desc->attention)) & - RX_ATTENTION_0_LAST_MPDU_MASK) >> - RX_ATTENTION_0_LAST_MPDU_LSB; - - if (last_mpdu) - rx_status->rs_tstamp.tsf = rx_desc->ppdu_end.tsf_timestamp; - -#endif - return mpdu_buf; - -mpdu_stitch_fail: - if ((mpdu_buf) && (decap_format != HAL_HW_RX_DECAP_FORMAT_RAW)) { - dp_rx_mon_dest_err("%pK: mpdu_stitch_fail mpdu_buf %pK", - soc, mpdu_buf); - /* Free the head buffer */ - qdf_nbuf_free(mpdu_buf); - } - return NULL; -} - -#ifdef DP_RX_MON_MEM_FRAG -#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ - defined(WLAN_SUPPORT_RX_FLOW_TAG) -static inline -void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, - qdf_nbuf_t nbuf) -{ - qdf_nbuf_t ext_list; - - if (qdf_unlikely(!soc)) { - dp_err("Soc[%pK] Null. Can't update pftag to nbuf headroom\n", - soc); - qdf_assert_always(0); - } - - if (!wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(soc->wlan_cfg_ctx)) - return; - - if (qdf_unlikely(!nbuf)) - return; - - /* Return if it dint came from mon Path */ - if (!qdf_nbuf_get_nr_frags(nbuf)) - return; - - /* Headroom must be double of PF_TAG_SIZE as we copy it 1stly to head */ - if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < (DP_RX_MON_TOT_PF_TAG_LEN * 2))) { - dp_err("Nbuf avail Headroom[%d] < 2 * DP_RX_MON_PF_TAG_TOT_LEN[%lu]", - qdf_nbuf_headroom(nbuf), DP_RX_MON_TOT_PF_TAG_LEN); - return; - } - - qdf_nbuf_push_head(nbuf, DP_RX_MON_TOT_PF_TAG_LEN); - qdf_mem_copy(qdf_nbuf_data(nbuf), qdf_nbuf_head(nbuf), - DP_RX_MON_TOT_PF_TAG_LEN); - qdf_nbuf_pull_head(nbuf, DP_RX_MON_TOT_PF_TAG_LEN); - - ext_list = qdf_nbuf_get_ext_list(nbuf); - while (ext_list) { - /* Headroom must be double of PF_TAG_SIZE as we copy it 1stly to head */ - if (qdf_unlikely(qdf_nbuf_headroom(ext_list) < (DP_RX_MON_TOT_PF_TAG_LEN * 2))) { - dp_err("Fraglist Nbuf avail Headroom[%d] < 2 * DP_RX_MON_PF_TAG_TOT_LEN[%lu]", - qdf_nbuf_headroom(ext_list), DP_RX_MON_TOT_PF_TAG_LEN); - ext_list = qdf_nbuf_queue_next(ext_list); - continue; - } - qdf_nbuf_push_head(ext_list, DP_RX_MON_TOT_PF_TAG_LEN); - qdf_mem_copy(qdf_nbuf_data(ext_list), qdf_nbuf_head(ext_list), - DP_RX_MON_TOT_PF_TAG_LEN); - qdf_nbuf_pull_head(ext_list, DP_RX_MON_TOT_PF_TAG_LEN); - ext_list = qdf_nbuf_queue_next(ext_list); - } -} -#else -static inline -void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, - qdf_nbuf_t nbuf) -{ -} -#endif -#else -static inline -void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, - qdf_nbuf_t nbuf) -{ -} -#endif - -/** - * dp_send_mgmt_packet_to_stack(): send indicataion to upper layers - * - * @soc: soc handle - * @nbuf: Mgmt packet - * @pdev: pdev handle - * - * Return: QDF_STATUS_SUCCESS on success - * QDF_STATUS_E_INVAL in error - */ -#ifdef FEATURE_PERPKT_INFO -static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, - qdf_nbuf_t nbuf, - struct dp_pdev *pdev) -{ - 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; - - /* Get addr pointing to80211 header */ - addr = dp_rx_mon_get_nbuf_80211_hdr(nbuf); - if (qdf_unlikely(!addr)) { - qdf_nbuf_free(nbuf); - return QDF_STATUS_E_INVAL; - } - - /*check if this is not a mgmt packet*/ - wh = (struct ieee80211_frame *)addr; - if (((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != - IEEE80211_FC0_TYPE_MGT) && - ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != - IEEE80211_FC0_TYPE_CTL)) { - qdf_nbuf_free(nbuf); - return QDF_STATUS_E_INVAL; - } - nbuf_data = (uint32_t *)qdf_nbuf_push_head(nbuf, 4); - if (!nbuf_data) { - QDF_TRACE(QDF_MODULE_ID_DP, - QDF_TRACE_LEVEL_ERROR, - FL("No headroom")); - qdf_nbuf_free(nbuf); - return QDF_STATUS_E_INVAL; - } - *nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id; - - dp_wdi_event_handler(WDI_EVENT_RX_MGMT_CTRL, soc, nbuf, - HTT_INVALID_PEER, - WDI_NO_VAL, pdev->pdev_id); - return QDF_STATUS_SUCCESS; -} -#else -static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, - qdf_nbuf_t nbuf, - struct dp_pdev *pdev) -{ - return QDF_STATUS_SUCCESS; -} -#endif - /** * dp_rx_extract_radiotap_info(): Extract and populate information in * struct mon_rx_status type @@ -1373,7 +483,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, */ static inline void dp_rx_extract_radiotap_info(struct cdp_mon_status *rx_status, - struct mon_rx_status *rx_mon_status) + struct mon_rx_status *rx_mon_status) { rx_mon_status->tsft = rx_status->cdp_rs_tstamp.cdp_tsf; rx_mon_status->chan_freq = rx_status->rs_freq; @@ -1391,276 +501,6 @@ void dp_rx_extract_radiotap_info(struct cdp_mon_status *rx_status, /* TODO: rx_mon_status->vht_flag_values1 */ } -#ifdef DP_RX_MON_MEM_FRAG -static inline -qdf_nbuf_t dp_rx_mon_restitch_mpdu(struct dp_soc *soc, uint32_t mac_id, - qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu, - struct cdp_mon_status *rs) -{ - if (qdf_nbuf_get_nr_frags(head_msdu)) - return dp_rx_mon_frag_restitch_mpdu_from_msdus(soc, mac_id, - head_msdu, - tail_msdu, rs); - else - return dp_rx_mon_restitch_mpdu_from_msdus(soc, mac_id, - head_msdu, - tail_msdu, rs); -} -#else -static inline -qdf_nbuf_t dp_rx_mon_restitch_mpdu(struct dp_soc *soc, uint32_t mac_id, - qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu, - struct cdp_mon_status *rs) -{ - return dp_rx_mon_restitch_mpdu_from_msdus(soc, mac_id, head_msdu, - tail_msdu, rs); -} -#endif - -#ifdef DP_MON_RSSI_IN_DBM -/* - * dp_rx_mon_rssi_convert(): convert rssi_comb from unit dBm to dB - * to match with radiotap further conversion requirement - * @rx_status: monitor mode rx status pointer - * - * Return: none - */ -static inline -void dp_rx_mon_rssi_convert(struct mon_rx_status *rx_status) -{ - rx_status->rssi_comb = rx_status->rssi_comb - - rx_status->chan_noise_floor; -} -#else -static inline -void dp_rx_mon_rssi_convert(struct mon_rx_status *rx_status) -{ -} -#endif - -/* - * dp_rx_mon_process_dest_pktlog(): function to log packet contents to - * pktlog buffer and send to pktlog module - * @soc: DP soc - * @mac_id: MAC ID - * @mpdu: MPDU buf - * Return: status: 0 - Success, non-zero: Failure - */ -static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc, - uint32_t mac_id, - qdf_nbuf_t mpdu) -{ - uint32_t event, msdu_timestamp = 0; - struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); - void *data; - struct ieee80211_frame *wh; - uint8_t type, subtype; - struct dp_mon_pdev *mon_pdev; - - if (!pdev) - return QDF_STATUS_E_INVAL; - - 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 - data = qdf_nbuf_data(mpdu); - - /* CBF logging required, doesn't matter if it is a full mode - * or lite mode. - * Need to look for mpdu with: - * TYPE = ACTION, SUBTYPE = NO ACK in the header - */ - event = WDI_EVENT_RX_CBF; - - wh = (struct ieee80211_frame *)data; - type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK; - subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; - if (type == IEEE80211_FC0_TYPE_MGT && - subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) { - msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft; - dp_rx_populate_cbf_hdr(soc, - mac_id, event, - mpdu, - msdu_timestamp); - } - } - return QDF_STATUS_SUCCESS; -} - -/* - * dp_rx_mon_deliver(): function to deliver packets to stack - * @soc: DP soc - * @mac_id: MAC ID - * @head_msdu: head of msdu list - * @tail_msdu: tail of msdu list - * - * Return: status: 0 - Success, non-zero: Failure - */ -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; - qdf_nbuf_t mon_skb, skb_next; - qdf_nbuf_t mon_mpdu = NULL; - struct dp_mon_vdev *mon_vdev; - struct dp_mon_pdev *mon_pdev; - - 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; - - /* restitch mon MPDU for delivery via monitor interface */ - mon_mpdu = dp_rx_mon_restitch_mpdu(soc, mac_id, head_msdu, - tail_msdu, rs); - - /* If MPDU restitch fails, free buffers*/ - if (!mon_mpdu) { - dp_info("MPDU restitch failed, free buffers"); - goto mon_deliver_fail; - } - - dp_rx_mon_process_dest_pktlog(soc, mac_id, mon_mpdu); - - /* monitor vap cannot be present when mcopy is enabled - * hence same skb can be consumed - */ - if (mon_pdev->mcopy_mode) - return dp_send_mgmt_packet_to_stack(soc, mon_mpdu, pdev); - - 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(&mon_pdev->ppdu_info.rx_status); - - dp_handle_tx_capture(soc, pdev, mon_mpdu); - - 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); - goto mon_deliver_fail; - } - - dp_rx_mon_update_pf_tag_to_buf_headroom(soc, mon_mpdu); - - mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev, - mon_mpdu, - &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, mon_pdev->mvdev, - (mon_pdev->mvdev ? mon_pdev->mvdev->osif_vdev - : NULL)); - goto mon_deliver_fail; - } - - return QDF_STATUS_SUCCESS; - -mon_deliver_fail: - mon_skb = head_msdu; - while (mon_skb) { - skb_next = qdf_nbuf_next(mon_skb); - - dp_rx_mon_dest_debug("%pK: [%s][%d] mon_skb=%pK len %u", - soc, __func__, __LINE__, mon_skb, mon_skb->len); - - qdf_nbuf_free(mon_skb); - mon_skb = skb_next; - } - return QDF_STATUS_E_INVAL; -} - -/** -* dp_rx_mon_deliver_non_std() -* @soc: core txrx main contex -* @mac_id: MAC ID -* -* This function delivers the radio tap and dummy MSDU -* into user layer application for preamble only PPDU. -* -* Return: QDF_STATUS -*/ -QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, - uint32_t mac_id) -{ - 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_mon_pdev *mon_pdev; - struct dp_mon_vdev *mon_vdev; - - /* Sanity checking */ - if (!pdev || !pdev->monitor_pdev) - goto mon_deliver_non_std_fail; - - mon_pdev = pdev->monitor_pdev; - - 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 = mon_vdev->osif_rx_mon; - dummy_msdu = qdf_nbuf_alloc(soc->osdev, MAX_MONITOR_HEADER, - MAX_MONITOR_HEADER, 4, FALSE); - if (!dummy_msdu) - goto allocate_dummy_msdu_fail; - - qdf_nbuf_set_pktlen(dummy_msdu, 0); - qdf_nbuf_set_next(dummy_msdu, NULL); - - 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(&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); - goto mon_deliver_non_std_fail; - } - - /* deliver to the user layer application */ - osif_rx_mon(mon_pdev->mvdev->osif_vdev, - dummy_msdu, NULL); - - /* Clear rx_status*/ - 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; - -allocate_dummy_msdu_fail: - dp_rx_mon_dest_debug("%pK: mon_skb=%pK ", - soc, dummy_msdu); - -mon_deliver_non_std_fail: - return QDF_STATUS_E_INVAL; -} - void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t mac_id, uint32_t quota) { @@ -1700,9 +540,9 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, if (qdf_unlikely(dp_srng_access_start(int_ctx, soc, mon_dst_srng))) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s %d : HAL Monitor Destination Ring access Failed -- %pK", - __func__, __LINE__, mon_dst_srng); - qdf_spin_unlock_bh(&pdev->mon_lock); + "%s %d : HAL Mon Dest Ring access Failed -- %pK", + __func__, __LINE__, mon_dst_srng); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); return; } @@ -1715,8 +555,9 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, hal_srng_dst_peek(hal_soc, mon_dst_srng))) { qdf_nbuf_t head_msdu, tail_msdu; uint32_t npackets; - head_msdu = (qdf_nbuf_t) NULL; - tail_msdu = (qdf_nbuf_t) NULL; + + head_msdu = (qdf_nbuf_t)NULL; + tail_msdu = (qdf_nbuf_t)NULL; mpdu_rx_bufs_used = dp_rx_mon_mpdu_pop(soc, mac_id, @@ -1765,8 +606,9 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, dp_rx_mon_deliver(soc, mac_id, head_msdu, tail_msdu); } - rxdma_dst_ring_desc = hal_srng_dst_get_next(hal_soc, - mon_dst_srng); + rxdma_dst_ring_desc = + hal_srng_dst_get_next(hal_soc, + mon_dst_srng); } dp_srng_access_end(int_ctx, soc, mon_dst_srng); @@ -1831,43 +673,6 @@ dp_rx_pdev_mon_buf_buffers_alloc(struct dp_pdev *pdev, uint32_t mac_id, return status; } -static QDF_STATUS -dp_rx_pdev_mon_cmn_buffers_alloc(struct dp_pdev *pdev, int mac_id) -{ - struct dp_soc *soc = pdev->soc; - uint8_t pdev_id = pdev->pdev_id; - int mac_for_pdev; - bool delayed_replenish; - QDF_STATUS status = QDF_STATUS_SUCCESS; - struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx; - - delayed_replenish = soc_cfg_ctx->delayed_replenish_entries ? 1 : 0; - mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id, pdev_id); - status = dp_rx_pdev_mon_status_buffers_alloc(pdev, mac_for_pdev); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_err("dp_rx_pdev_mon_status_desc_pool_alloc() failed"); - goto fail; - } - - if (!soc->wlan_cfg_ctx->rxdma1_enable || - !wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) - return status; - - status = dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev, - delayed_replenish); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_err("dp_rx_pdev_mon_buf_desc_pool_alloc() failed"); - goto mon_stat_buf_dealloc; - } - - return status; - -mon_stat_buf_dealloc: - dp_rx_pdev_mon_status_buffers_free(pdev, mac_for_pdev); -fail: - return status; -} - void dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) { @@ -1912,23 +717,6 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) dp_full_mon_attach(pdev); } -static void -dp_rx_pdev_mon_cmn_desc_pool_init(struct dp_pdev *pdev, int mac_id) -{ - struct dp_soc *soc = pdev->soc; - uint32_t mac_for_pdev; - - mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id); - dp_rx_pdev_mon_status_desc_pool_init(pdev, mac_for_pdev); - - if (!soc->wlan_cfg_ctx->rxdma1_enable || - !wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) - return; - - dp_rx_pdev_mon_buf_desc_pool_init(pdev, mac_for_pdev); - dp_link_desc_ring_replenish(soc, mac_for_pdev); -} - static void dp_rx_pdev_mon_buf_desc_pool_deinit(struct dp_pdev *pdev, uint32_t mac_id) { @@ -1946,21 +734,6 @@ dp_rx_pdev_mon_buf_desc_pool_deinit(struct dp_pdev *pdev, uint32_t mac_id) dp_full_mon_detach(pdev); } -static void -dp_rx_pdev_mon_cmn_desc_pool_deinit(struct dp_pdev *pdev, int mac_id) -{ - struct dp_soc *soc = pdev->soc; - uint8_t pdev_id = pdev->pdev_id; - int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); - - dp_rx_pdev_mon_status_desc_pool_deinit(pdev, mac_for_pdev); - - if (!soc->wlan_cfg_ctx->rxdma1_enable) - return; - - dp_rx_pdev_mon_buf_desc_pool_deinit(pdev, mac_for_pdev); -} - static void dp_rx_pdev_mon_buf_desc_pool_free(struct dp_pdev *pdev, uint32_t mac_id) { @@ -1975,18 +748,6 @@ dp_rx_pdev_mon_buf_desc_pool_free(struct dp_pdev *pdev, uint32_t mac_id) dp_rx_desc_pool_free(soc, rx_desc_pool); } -static void -dp_rx_pdev_mon_cmn_desc_pool_free(struct dp_pdev *pdev, int mac_id) -{ - struct dp_soc *soc = pdev->soc; - uint8_t pdev_id = pdev->pdev_id; - int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); - - dp_rx_pdev_mon_status_desc_pool_free(pdev, mac_for_pdev); - dp_rx_pdev_mon_buf_desc_pool_free(pdev, mac_for_pdev); - dp_hw_link_desc_pool_banks_free(soc, mac_for_pdev); -} - void dp_rx_pdev_mon_buf_buffers_free(struct dp_pdev *pdev, uint32_t mac_id) { uint8_t pdev_id = pdev->pdev_id; @@ -2032,141 +793,6 @@ dp_rx_pdev_mon_buf_desc_pool_alloc(struct dp_pdev *pdev, uint32_t mac_id) return dp_rx_desc_pool_alloc(soc, rx_desc_pool_size, rx_desc_pool); } -static QDF_STATUS -dp_rx_pdev_mon_cmn_desc_pool_alloc(struct dp_pdev *pdev, int mac_id) -{ - struct dp_soc *soc = pdev->soc; - uint8_t pdev_id = pdev->pdev_id; - uint32_t mac_for_pdev; - QDF_STATUS status; - - mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); - - /* Allocate sw rx descriptor pool for monitor status ring */ - status = dp_rx_pdev_mon_status_desc_pool_alloc(pdev, mac_for_pdev); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_err("dp_rx_pdev_mon_status_desc_pool_alloc() failed"); - goto fail; - } - - if (!soc->wlan_cfg_ctx->rxdma1_enable || - !wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) - return status; - - /* Allocate sw rx descriptor pool for monitor RxDMA buffer ring */ - status = dp_rx_pdev_mon_buf_desc_pool_alloc(pdev, mac_for_pdev); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_err("dp_rx_pdev_mon_buf_desc_pool_alloc() failed"); - goto mon_status_dealloc; - } - - /* Allocate link descriptors for the monitor link descriptor ring */ - status = dp_hw_link_desc_pool_banks_alloc(soc, mac_for_pdev); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_err("dp_hw_link_desc_pool_banks_alloc() failed"); - goto mon_buf_dealloc; - } - return status; - -mon_buf_dealloc: - dp_rx_pdev_mon_buf_desc_pool_free(pdev, mac_for_pdev); -mon_status_dealloc: - dp_rx_pdev_mon_status_desc_pool_free(pdev, mac_for_pdev); -fail: - return status; -} - -static void -dp_rx_pdev_mon_cmn_buffers_free(struct dp_pdev *pdev, int mac_id) -{ - uint8_t pdev_id = pdev->pdev_id; - struct dp_soc *soc = pdev->soc; - int mac_for_pdev; - - mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id, pdev_id); - dp_rx_pdev_mon_status_buffers_free(pdev, mac_for_pdev); - - if (!soc->wlan_cfg_ctx->rxdma1_enable) - return; - - dp_rx_pdev_mon_buf_buffers_free(pdev, mac_for_pdev); -} - -QDF_STATUS -dp_rx_pdev_mon_desc_pool_alloc(struct dp_pdev *pdev) -{ - QDF_STATUS status; - int mac_id, count; - - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - status = dp_rx_pdev_mon_cmn_desc_pool_alloc(pdev, mac_id); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_rx_mon_dest_err("%pK: %d failed\n", - pdev->soc, mac_id); - - for (count = 0; count < mac_id; count++) - dp_rx_pdev_mon_cmn_desc_pool_free(pdev, count); - - return status; - } - } - return status; -} - -void -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->monitor_pdev->mon_lock); -} - -void -dp_rx_pdev_mon_desc_pool_deinit(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_deinit(pdev, mac_id); - qdf_spinlock_destroy(&pdev->monitor_pdev->mon_lock); -} - -void dp_rx_pdev_mon_desc_pool_free(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_free(pdev, mac_id); -} - -void -dp_rx_pdev_mon_buffers_free(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_buffers_free(pdev, mac_id); - pdev->monitor_pdev->pdev_mon_init = 0; -} - -QDF_STATUS -dp_rx_pdev_mon_buffers_alloc(struct dp_pdev *pdev) -{ - int mac_id; - QDF_STATUS status; - - for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { - status = dp_rx_pdev_mon_cmn_buffers_alloc(pdev, mac_id); - if (!QDF_IS_STATUS_SUCCESS(status)) { - dp_rx_mon_dest_err("%pK: %d failed\n", - pdev->soc, mac_id); - return status; - } - } - return status; -} - #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) uint32_t dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) @@ -2312,3 +938,1500 @@ next_entry: return reap_cnt; } #endif + +static void +dp_rx_pdev_mon_dest_desc_pool_free(struct dp_pdev *pdev, int mac_for_pdev) +{ + struct dp_soc *soc = pdev->soc; + + dp_rx_pdev_mon_buf_desc_pool_free(pdev, mac_for_pdev); + dp_hw_link_desc_pool_banks_free(soc, mac_for_pdev); +} + +static void +dp_rx_pdev_mon_dest_desc_pool_deinit(struct dp_pdev *pdev, int mac_for_pdev) +{ + struct dp_soc *soc = pdev->soc; + + if (!soc->wlan_cfg_ctx->rxdma1_enable) + return; + + dp_rx_pdev_mon_buf_desc_pool_deinit(pdev, mac_for_pdev); +} + +static void +dp_rx_pdev_mon_dest_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_for_pdev) +{ + struct dp_soc *soc = pdev->soc; + + if (!soc->wlan_cfg_ctx->rxdma1_enable || + !wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) + return; + + dp_rx_pdev_mon_buf_desc_pool_init(pdev, mac_for_pdev); + dp_link_desc_ring_replenish(soc, mac_for_pdev); +} + +static void +dp_rx_pdev_mon_dest_buffers_free(struct dp_pdev *pdev, int mac_for_pdev) +{ + struct dp_soc *soc = pdev->soc; + + if (!soc->wlan_cfg_ctx->rxdma1_enable) + return; + + dp_rx_pdev_mon_buf_buffers_free(pdev, mac_for_pdev); +} + +static QDF_STATUS +dp_rx_pdev_mon_dest_buffers_alloc(struct dp_pdev *pdev, int mac_for_pdev) +{ + struct dp_soc *soc = pdev->soc; + struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx; + bool delayed_replenish; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + delayed_replenish = soc_cfg_ctx->delayed_replenish_entries ? 1 : 0; + if (!soc->wlan_cfg_ctx->rxdma1_enable || + !wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) + return status; + + status = dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev, + delayed_replenish); + if (!QDF_IS_STATUS_SUCCESS(status)) + dp_err("dp_rx_pdev_mon_buf_desc_pool_alloc() failed"); + + return status; +} + +static QDF_STATUS +dp_rx_pdev_mon_dest_desc_pool_alloc(struct dp_pdev *pdev, uint32_t mac_for_pdev) +{ + struct dp_soc *soc = pdev->soc; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (!soc->wlan_cfg_ctx->rxdma1_enable || + !wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) + return status; + + /* Allocate sw rx descriptor pool for monitor RxDMA buffer ring */ + status = dp_rx_pdev_mon_buf_desc_pool_alloc(pdev, mac_for_pdev); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_err("dp_rx_pdev_mon_buf_desc_pool_alloc() failed"); + goto fail; + } + + /* Allocate link descriptors for the monitor link descriptor ring */ + status = dp_hw_link_desc_pool_banks_alloc(soc, mac_for_pdev); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_err("dp_hw_link_desc_pool_banks_alloc() failed"); + goto mon_buf_dealloc; + } + + return status; + +mon_buf_dealloc: + dp_rx_pdev_mon_status_desc_pool_free(pdev, mac_for_pdev); +fail: + return status; +} +#else +static void +dp_rx_pdev_mon_dest_desc_pool_free(struct dp_pdev *pdev, int mac_for_pdev) +{ +} + +static void +dp_rx_pdev_mon_dest_desc_pool_deinit(struct dp_pdev *pdev, int mac_for_pdev) +{ +} + +static void +dp_rx_pdev_mon_dest_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_for_pdev) +{ +} + +static void +dp_rx_pdev_mon_dest_buffers_free(struct dp_pdev *pdev, int mac_for_pdev) +{ +} + +static QDF_STATUS +dp_rx_pdev_mon_dest_buffers_alloc(struct dp_pdev *pdev, int mac_for_pdev) +{ + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS +dp_rx_pdev_mon_dest_desc_pool_alloc(struct dp_pdev *pdev, uint32_t mac_for_pdev) +{ + return QDF_STATUS_SUCCESS; +} + +#if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) +uint32_t +dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) +{ + return 0; +} +#endif +#endif + +static void +dp_rx_pdev_mon_cmn_desc_pool_free(struct dp_pdev *pdev, int mac_id) +{ + struct dp_soc *soc = pdev->soc; + uint8_t pdev_id = pdev->pdev_id; + int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); + + dp_rx_pdev_mon_status_desc_pool_free(pdev, mac_for_pdev); + dp_rx_pdev_mon_dest_desc_pool_free(pdev, mac_for_pdev); +} + +void dp_rx_pdev_mon_desc_pool_free(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_free(pdev, mac_id); +} + +static void +dp_rx_pdev_mon_cmn_desc_pool_deinit(struct dp_pdev *pdev, int mac_id) +{ + struct dp_soc *soc = pdev->soc; + uint8_t pdev_id = pdev->pdev_id; + int mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); + + dp_rx_pdev_mon_status_desc_pool_deinit(pdev, mac_for_pdev); + + dp_rx_pdev_mon_dest_desc_pool_deinit(pdev, mac_for_pdev); +} + +void +dp_rx_pdev_mon_desc_pool_deinit(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_deinit(pdev, mac_id); + qdf_spinlock_destroy(&pdev->monitor_pdev->mon_lock); +} + +static void +dp_rx_pdev_mon_cmn_desc_pool_init(struct dp_pdev *pdev, int mac_id) +{ + struct dp_soc *soc = pdev->soc; + uint32_t mac_for_pdev; + + mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id); + dp_rx_pdev_mon_status_desc_pool_init(pdev, mac_for_pdev); + + dp_rx_pdev_mon_dest_desc_pool_init(pdev, mac_for_pdev); +} + +void +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->monitor_pdev->mon_lock); +} + +static void +dp_rx_pdev_mon_cmn_buffers_free(struct dp_pdev *pdev, int mac_id) +{ + uint8_t pdev_id = pdev->pdev_id; + int mac_for_pdev; + + mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id, pdev_id); + dp_rx_pdev_mon_status_buffers_free(pdev, mac_for_pdev); + + dp_rx_pdev_mon_dest_buffers_free(pdev, mac_for_pdev); +} + +void +dp_rx_pdev_mon_buffers_free(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_buffers_free(pdev, mac_id); + pdev->monitor_pdev->pdev_mon_init = 0; +} + +static QDF_STATUS +dp_rx_pdev_mon_cmn_buffers_alloc(struct dp_pdev *pdev, int mac_id) +{ + struct dp_soc *soc = pdev->soc; + uint8_t pdev_id = pdev->pdev_id; + int mac_for_pdev; + bool delayed_replenish; + QDF_STATUS status = QDF_STATUS_SUCCESS; + struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx; + + delayed_replenish = soc_cfg_ctx->delayed_replenish_entries ? 1 : 0; + mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id, pdev_id); + status = dp_rx_pdev_mon_status_buffers_alloc(pdev, mac_for_pdev); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_err("dp_rx_pdev_mon_status_desc_pool_alloc() failed"); + goto fail; + } + + status = dp_rx_pdev_mon_dest_buffers_alloc(pdev, mac_for_pdev); + if (!QDF_IS_STATUS_SUCCESS(status)) + goto mon_stat_buf_dealloc; + + return status; + +mon_stat_buf_dealloc: + dp_rx_pdev_mon_status_buffers_free(pdev, mac_for_pdev); +fail: + return status; +} + +QDF_STATUS +dp_rx_pdev_mon_buffers_alloc(struct dp_pdev *pdev) +{ + int mac_id; + QDF_STATUS status; + + for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { + status = dp_rx_pdev_mon_cmn_buffers_alloc(pdev, mac_id); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_rx_mon_dest_err("%pK: %d failed\n", + pdev->soc, mac_id); + return status; + } + } + return status; +} + +static QDF_STATUS +dp_rx_pdev_mon_cmn_desc_pool_alloc(struct dp_pdev *pdev, int mac_id) +{ + struct dp_soc *soc = pdev->soc; + uint8_t pdev_id = pdev->pdev_id; + uint32_t mac_for_pdev; + QDF_STATUS status; + + mac_for_pdev = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev_id); + + /* Allocate sw rx descriptor pool for monitor status ring */ + status = dp_rx_pdev_mon_status_desc_pool_alloc(pdev, mac_for_pdev); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_err("dp_rx_pdev_mon_status_desc_pool_alloc() failed"); + goto fail; + } + + status = dp_rx_pdev_mon_dest_desc_pool_alloc(pdev, mac_for_pdev); + if (!QDF_IS_STATUS_SUCCESS(status)) + goto mon_status_dealloc; + + return status; + +mon_status_dealloc: + dp_rx_pdev_mon_status_desc_pool_free(pdev, mac_for_pdev); +fail: + return status; +} + +QDF_STATUS +dp_rx_pdev_mon_desc_pool_alloc(struct dp_pdev *pdev) +{ + QDF_STATUS status; + int mac_id, count; + + for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { + status = dp_rx_pdev_mon_cmn_desc_pool_alloc(pdev, mac_id); + if (!QDF_IS_STATUS_SUCCESS(status)) { + dp_rx_mon_dest_err("%pK: %d failed\n", + pdev->soc, mac_id); + + for (count = 0; count < mac_id; count++) + dp_rx_pdev_mon_cmn_desc_pool_free(pdev, count); + + return status; + } + } + return status; +} + +static inline +void dp_rx_msdus_set_payload(struct dp_soc *soc, qdf_nbuf_t msdu) +{ + uint8_t *data; + uint32_t rx_pkt_offset, l2_hdr_offset; + + data = qdf_nbuf_data(msdu); + rx_pkt_offset = soc->rx_mon_pkt_tlv_size; + l2_hdr_offset = hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, data); + qdf_nbuf_pull_head(msdu, rx_pkt_offset + l2_hdr_offset); +} + +static inline qdf_nbuf_t +dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, + uint32_t mac_id, + qdf_nbuf_t head_msdu, + qdf_nbuf_t last_msdu, + struct cdp_mon_status *rx_status) +{ + qdf_nbuf_t msdu, mpdu_buf, prev_buf, msdu_orig, head_frag_list; + uint32_t decap_format, wifi_hdr_len, sec_hdr_len, msdu_llc_len, + mpdu_buf_len, decap_hdr_pull_bytes, frag_list_sum_len, dir, + is_amsdu, is_first_frag, amsdu_pad; + void *rx_desc; + char *hdr_desc; + unsigned char *dest; + 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; + + 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; + + /* The nbuf has been pulled just beyond the status and points to the + * payload + */ + if (!head_msdu) + goto mpdu_stitch_fail; + + msdu_orig = head_msdu; + + rx_desc = qdf_nbuf_data(msdu_orig); + + if (hal_rx_tlv_mpdu_len_err_get(soc->hal_soc, rx_desc)) { + /* It looks like there is some issue on MPDU len err */ + /* Need further investigate if drop the packet */ + DP_STATS_INC(dp_pdev, dropped.mon_rx_drop, 1); + return NULL; + } + + rx_desc = qdf_nbuf_data(last_msdu); + + rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc, + rx_desc); + 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); */ + + rx_desc = qdf_nbuf_data(head_msdu); + + decap_format = hal_rx_tlv_decap_format_get(soc->hal_soc, rx_desc); + + /* Easy case - The MSDU status indicates that this is a non-decapped + * packet in RAW mode. + */ + if (decap_format == HAL_HW_RX_DECAP_FORMAT_RAW) { + /* Note that this path might suffer from headroom unavailabilty + * - but the RX status is usually enough + */ + + dp_rx_msdus_set_payload(soc, head_msdu); + + dp_rx_mon_dest_debug("%pK: decap format raw head %pK head->next %pK last_msdu %pK last_msdu->next %pK", + soc, head_msdu, head_msdu->next, + last_msdu, last_msdu->next); + + mpdu_buf = head_msdu; + + prev_buf = mpdu_buf; + + frag_list_sum_len = 0; + msdu = qdf_nbuf_next(head_msdu); + is_first_frag = 1; + + while (msdu) { + + dp_rx_msdus_set_payload(soc, msdu); + + if (is_first_frag) { + is_first_frag = 0; + head_frag_list = msdu; + } + + frag_list_sum_len += qdf_nbuf_len(msdu); + + /* Maintain the linking of the cloned MSDUS */ + qdf_nbuf_set_next_ext(prev_buf, msdu); + + /* Move to the next */ + prev_buf = msdu; + msdu = qdf_nbuf_next(msdu); + } + + qdf_nbuf_trim_tail(prev_buf, HAL_RX_FCS_LEN); + + /* If there were more fragments to this RAW frame */ + if (head_frag_list) { + if (frag_list_sum_len < + sizeof(struct ieee80211_frame_min_one)) { + DP_STATS_INC(dp_pdev, dropped.mon_rx_drop, 1); + return NULL; + } + frag_list_sum_len -= HAL_RX_FCS_LEN; + qdf_nbuf_append_ext_list(mpdu_buf, head_frag_list, + frag_list_sum_len); + qdf_nbuf_set_next(mpdu_buf, NULL); + } + + goto mpdu_stitch_done; + } + + /* Decap mode: + * Calculate the amount of header in decapped packet to knock off based + * on the decap type and the corresponding number of raw bytes to copy + * status header + */ + rx_desc = qdf_nbuf_data(head_msdu); + + hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, rx_desc); + + dp_rx_mon_dest_debug("%pK: decap format not raw", soc); + + /* Base size */ + wifi_hdr_len = sizeof(struct ieee80211_frame); + wh = (struct ieee80211_frame *)hdr_desc; + + dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK; + + if (dir == IEEE80211_FC1_DIR_DSTODS) + wifi_hdr_len += 6; + + is_amsdu = 0; + if (wh->i_fc[0] & QDF_IEEE80211_FC0_SUBTYPE_QOS) { + qos = (struct ieee80211_qoscntl *) + (hdr_desc + wifi_hdr_len); + wifi_hdr_len += 2; + + is_amsdu = (qos->i_qos[0] & IEEE80211_QOS_AMSDU); + } + + /* Calculate security header length based on 'Protected' + * and 'EXT_IV' flag + */ + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + char *iv = (char *)wh + wifi_hdr_len; + + if (iv[3] & KEY_EXTIV) + sec_hdr_len = 8; + else + sec_hdr_len = 4; + } else { + sec_hdr_len = 0; + } + wifi_hdr_len += sec_hdr_len; + + /* MSDU related stuff LLC - AMSDU subframe header etc */ + msdu_llc_len = is_amsdu ? (14 + 8) : 8; + + mpdu_buf_len = wifi_hdr_len + msdu_llc_len; + + /* "Decap" header to remove from MSDU buffer */ + decap_hdr_pull_bytes = 14; + + /* Allocate a new nbuf for holding the 802.11 header retrieved from the + * status of the now decapped first msdu. Leave enough headroom for + * accomodating any radio-tap /prism like PHY header + */ + mpdu_buf = qdf_nbuf_alloc(soc->osdev, + MAX_MONITOR_HEADER + mpdu_buf_len, + MAX_MONITOR_HEADER, 4, FALSE); + + if (!mpdu_buf) + goto mpdu_stitch_done; + + /* Copy the MPDU related header and enc headers into the first buffer + * - Note that there can be a 2 byte pad between heaader and enc header + */ + + prev_buf = mpdu_buf; + dest = qdf_nbuf_put_tail(prev_buf, wifi_hdr_len); + if (!dest) + goto mpdu_stitch_fail; + + qdf_mem_copy(dest, hdr_desc, wifi_hdr_len); + hdr_desc += wifi_hdr_len; + +#if 0 + dest = qdf_nbuf_put_tail(prev_buf, sec_hdr_len); + adf_os_mem_copy(dest, hdr_desc, sec_hdr_len); + hdr_desc += sec_hdr_len; +#endif + + /* The first LLC len is copied into the MPDU buffer */ + frag_list_sum_len = 0; + + msdu_orig = head_msdu; + is_first_frag = 1; + amsdu_pad = 0; + + while (msdu_orig) { + + /* TODO: intra AMSDU padding - do we need it ??? */ + + msdu = msdu_orig; + + if (is_first_frag) { + head_frag_list = msdu; + } else { + /* Reload the hdr ptr only on non-first MSDUs */ + rx_desc = qdf_nbuf_data(msdu_orig); + hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, + rx_desc); + } + + /* Copy this buffers MSDU related status into the prev buffer */ + + if (is_first_frag) + is_first_frag = 0; + + /* Update protocol and flow tag for MSDU */ + dp_rx_mon_update_protocol_flow_tag(soc, dp_pdev, + msdu_orig, rx_desc); + + dest = qdf_nbuf_put_tail(prev_buf, + msdu_llc_len + amsdu_pad); + + if (!dest) + goto mpdu_stitch_fail; + + dest += amsdu_pad; + qdf_mem_copy(dest, hdr_desc, msdu_llc_len); + + dp_rx_msdus_set_payload(soc, msdu); + + /* Push the MSDU buffer beyond the decap header */ + qdf_nbuf_pull_head(msdu, decap_hdr_pull_bytes); + frag_list_sum_len += msdu_llc_len + qdf_nbuf_len(msdu) + + amsdu_pad; + + /* Set up intra-AMSDU pad to be added to start of next buffer - + * AMSDU pad is 4 byte pad on AMSDU subframe + */ + amsdu_pad = (msdu_llc_len + qdf_nbuf_len(msdu)) & 0x3; + amsdu_pad = amsdu_pad ? (4 - amsdu_pad) : 0; + + /* TODO FIXME How do we handle MSDUs that have fraglist - Should + * probably iterate all the frags cloning them along the way and + * and also updating the prev_buf pointer + */ + + /* Move to the next */ + prev_buf = msdu; + msdu_orig = qdf_nbuf_next(msdu_orig); + } + +#if 0 + /* Add in the trailer section - encryption trailer + FCS */ + qdf_nbuf_put_tail(prev_buf, HAL_RX_FCS_LEN); + frag_list_sum_len += HAL_RX_FCS_LEN; +#endif + + frag_list_sum_len -= msdu_llc_len; + + /* TODO: Convert this to suitable adf routines */ + qdf_nbuf_append_ext_list(mpdu_buf, head_frag_list, + frag_list_sum_len); + + dp_rx_mon_dest_debug("%pK: mpdu_buf %pK mpdu_buf->len %u", + soc, mpdu_buf, mpdu_buf->len); + +mpdu_stitch_done: + /* Check if this buffer contains the PPDU end status for TSF */ + /* Need revist this code to see where we can get tsf timestamp */ +#if 0 + /* PPDU end TLV will be retrieved from monitor status ring */ + last_mpdu = + (*(((u_int32_t *)&rx_desc->attention)) & + RX_ATTENTION_0_LAST_MPDU_MASK) >> + RX_ATTENTION_0_LAST_MPDU_LSB; + + if (last_mpdu) + rx_status->rs_tstamp.tsf = rx_desc->ppdu_end.tsf_timestamp; + +#endif + return mpdu_buf; + +mpdu_stitch_fail: + if ((mpdu_buf) && (decap_format != HAL_HW_RX_DECAP_FORMAT_RAW)) { + dp_rx_mon_dest_err("%pK: mpdu_stitch_fail mpdu_buf %pK", + soc, mpdu_buf); + /* Free the head buffer */ + qdf_nbuf_free(mpdu_buf); + } + return NULL; +} + +#ifdef DP_RX_MON_MEM_FRAG +/** + * dp_rx_mon_fraglist_prepare() - Prepare nbuf fraglist from chained skb + * + * @head_msdu: Parent SKB + * @tail_msdu: Last skb in the chained list + * + * Return: Void + */ +void dp_rx_mon_fraglist_prepare(qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu) +{ + qdf_nbuf_t msdu, mpdu_buf, prev_buf, head_frag_list; + uint32_t frag_list_sum_len; + + dp_err("[%s][%d] decap format raw head %pK head->next %pK last_msdu %pK last_msdu->next %pK", + __func__, __LINE__, head_msdu, head_msdu->next, + tail_msdu, tail_msdu->next); + + /* Single skb accommodating MPDU worth Data */ + if (tail_msdu == head_msdu) + return; + + mpdu_buf = head_msdu; + prev_buf = mpdu_buf; + frag_list_sum_len = 0; + + msdu = qdf_nbuf_next(head_msdu); + /* msdu can't be NULL here as it is multiple skb case here */ + + /* Head frag list to point to second skb */ + head_frag_list = msdu; + + while (msdu) { + frag_list_sum_len += qdf_nbuf_len(msdu); + prev_buf = msdu; + msdu = qdf_nbuf_next(msdu); + } + + qdf_nbuf_append_ext_list(mpdu_buf, head_frag_list, frag_list_sum_len); + + /* Make Parent skb next to NULL */ + qdf_nbuf_set_next(mpdu_buf, NULL); +} + +/** + * dp_rx_mon_frag_restitch_mpdu_from_msdus() - Restitch logic to + * convert to 802.3 header and adjust frag memory pointing to + * dot3 header and payload in case of Non-Raw frame. + * + * @soc: struct dp_soc * + * @mac_id: MAC id + * @head_msdu: MPDU containing all MSDU as a frag + * @tail_msdu: last skb which accommodate MPDU info + * @rx_status: struct cdp_mon_status * + * + * Return: Adjusted nbuf containing MPDU worth info. + */ +static inline qdf_nbuf_t +dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc, + uint32_t mac_id, + qdf_nbuf_t head_msdu, + qdf_nbuf_t tail_msdu, + struct cdp_mon_status *rx_status) +{ + uint32_t wifi_hdr_len, sec_hdr_len, msdu_llc_len, + mpdu_buf_len, decap_hdr_pull_bytes, dir, + is_amsdu, amsdu_pad, frag_size, tot_msdu_len; + qdf_frag_t rx_desc, rx_src_desc, rx_dest_desc, frag_addr; + char *hdr_desc; + uint8_t num_frags, frags_iter, l2_hdr_offset; + struct ieee80211_frame *wh; + struct ieee80211_qoscntl *qos; + struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + int16_t frag_page_offset = 0; + struct hal_rx_mon_dest_buf_info buf_info; + 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) + goto mpdu_stitch_fail; + + rx_desc = qdf_nbuf_get_frag_addr(head_msdu, 0) - rx_mon_tlv_size; + + if (hal_rx_tlv_mpdu_len_err_get(soc->hal_soc, rx_desc)) { + /* It looks like there is some issue on MPDU len err */ + /* Need further investigate if drop the packet */ + DP_STATS_INC(dp_pdev, dropped.mon_rx_drop, 1); + return NULL; + } + + /* Look for FCS error */ + num_frags = qdf_nbuf_get_nr_frags(tail_msdu); + rx_desc = qdf_nbuf_get_frag_addr(tail_msdu, num_frags - 1) - + rx_mon_tlv_size; + rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc, + rx_desc); + 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, + (uint8_t *)&buf_info, + sizeof(buf_info)); + + /* Easy case - The MSDU status indicates that this is a non-decapped + * packet in RAW mode. + */ + if (buf_info.is_decap_raw == 1) { + dp_rx_mon_fraglist_prepare(head_msdu, tail_msdu); + goto mpdu_stitch_done; + } + + l2_hdr_offset = DP_RX_MON_NONRAW_L2_HDR_PAD_BYTE; + + /* Decap mode: + * Calculate the amount of header in decapped packet to knock off based + * on the decap type and the corresponding number of raw bytes to copy + * status header + */ + hdr_desc = hal_rx_desc_get_80211_hdr(soc->hal_soc, rx_desc); + + dp_rx_mon_dest_debug("%pK: decap format not raw", soc); + + /* Base size */ + wifi_hdr_len = sizeof(struct ieee80211_frame); + wh = (struct ieee80211_frame *)hdr_desc; + + dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK; + + if (dir == IEEE80211_FC1_DIR_DSTODS) + wifi_hdr_len += 6; + + is_amsdu = 0; + if (wh->i_fc[0] & QDF_IEEE80211_FC0_SUBTYPE_QOS) { + qos = (struct ieee80211_qoscntl *) + (hdr_desc + wifi_hdr_len); + wifi_hdr_len += 2; + + is_amsdu = (qos->i_qos[0] & IEEE80211_QOS_AMSDU); + } + + /*Calculate security header length based on 'Protected' + * and 'EXT_IV' flag + */ + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + char *iv = (char *)wh + wifi_hdr_len; + + if (iv[3] & KEY_EXTIV) + sec_hdr_len = 8; + else + sec_hdr_len = 4; + } else { + sec_hdr_len = 0; + } + wifi_hdr_len += sec_hdr_len; + + /* MSDU related stuff LLC - AMSDU subframe header etc */ + msdu_llc_len = is_amsdu ? (14 + 8) : 8; + + mpdu_buf_len = wifi_hdr_len + msdu_llc_len; + + /* "Decap" header to remove from MSDU buffer */ + decap_hdr_pull_bytes = 14; + + amsdu_pad = 0; + tot_msdu_len = 0; + + /* + * keeping first MSDU ops outside of loop to avoid multiple + * check handling + */ + + /* Construct src header */ + rx_src_desc = hdr_desc; + + /* + * Update protocol and flow tag for MSDU + * update frag index in ctx_idx field. + * Reset head pointer data of nbuf before updating. + */ + QDF_NBUF_CB_RX_CTX_ID(head_msdu) = 0; + dp_rx_mon_update_protocol_flow_tag(soc, dp_pdev, head_msdu, rx_desc); + + /* Construct destination address */ + frag_addr = qdf_nbuf_get_frag_addr(head_msdu, 0); + frag_size = qdf_nbuf_get_frag_size_by_idx(head_msdu, 0); + /* We will come here in 2 scenario: + * 1. First MSDU of MPDU with single buffer + * 2. First buffer of First MSDU of MPDU with continuation + * + * ------------------------------------------------------------ + * | SINGLE BUFFER (<= RX_MONITOR_BUFFER_SIZE - RX_PKT_TLVS_LEN)| + * ------------------------------------------------------------ + * + * ------------------------------------------------------------ + * | First BUFFER with Continuation | ... | + * | (RX_MONITOR_BUFFER_SIZE - RX_PKT_TLVS_LEN) | | + * ------------------------------------------------------------ + */ + pad_byte_pholder = + (RX_MONITOR_BUFFER_SIZE - soc->rx_pkt_tlv_size) - frag_size; + /* Construct destination address + * -------------------------------------------------------------- + * | RX_PKT_TLV | L2_HDR_PAD | Decap HDR | Payload | + * | | / | + * | >Frag address points here / | + * | \ / | + * | \ This bytes needs to / | + * | \ removed to frame pkt / | + * | ----------------------- | + * | | | + * | | | + * | WIFI +LLC HDR will be added here <-| | + * | | | | + * | >Dest addr will point | | + * | somewhere in this area | | + * -------------------------------------------------------------- + */ + rx_dest_desc = + (frag_addr + decap_hdr_pull_bytes + l2_hdr_offset) - + mpdu_buf_len; + /* Add WIFI and LLC header for 1st MSDU of MPDU */ + qdf_mem_copy(rx_dest_desc, rx_src_desc, mpdu_buf_len); + + frag_page_offset = + (decap_hdr_pull_bytes + l2_hdr_offset) - mpdu_buf_len; + + qdf_nbuf_move_frag_page_offset(head_msdu, 0, frag_page_offset); + + frag_size = qdf_nbuf_get_frag_size_by_idx(head_msdu, 0); + + if (buf_info.first_buffer && buf_info.last_buffer) { + /* MSDU with single bufffer */ + amsdu_pad = frag_size & 0x3; + amsdu_pad = amsdu_pad ? (4 - amsdu_pad) : 0; + if (amsdu_pad && (amsdu_pad <= pad_byte_pholder)) { + char *frag_addr_temp; + + qdf_nbuf_trim_add_frag_size(head_msdu, 0, amsdu_pad, + 0); + frag_addr_temp = + (char *)qdf_nbuf_get_frag_addr(head_msdu, 0); + frag_addr_temp = (frag_addr_temp + + qdf_nbuf_get_frag_size_by_idx(head_msdu, 0)) - + amsdu_pad; + qdf_mem_zero(frag_addr_temp, amsdu_pad); + amsdu_pad = 0; + } + } else { + /* + * First buffer of Continuation frame and hence + * amsdu_padding doesn't need to be added + * Increase tot_msdu_len so that amsdu_pad byte + * will be calculated for last frame of MSDU + */ + tot_msdu_len = frag_size; + amsdu_pad = 0; + } + + /* Here amsdu_pad byte will have some value if 1sf buffer was + * Single buffer MSDU and dint had pholder to adjust amsdu padding + * byte in the end + * So dont initialize to ZERO here + */ + pad_byte_pholder = 0; + for (msdu_curr = head_msdu; msdu_curr;) { + /* frag_iter will start from 0 for second skb onwards */ + if (msdu_curr == head_msdu) + frags_iter = 1; + else + frags_iter = 0; + + num_frags = qdf_nbuf_get_nr_frags(msdu_curr); + + for (; frags_iter < num_frags; frags_iter++) { + /* Construct destination address + * ---------------------------------------------------------- + * | RX_PKT_TLV | L2_HDR_PAD | Decap HDR | Payload | Pad | + * | | (First buffer) | | | + * | | / / | + * | >Frag address points here / / | + * | \ / / | + * | \ This bytes needs to / / | + * | \ removed to frame pkt/ / | + * | ---------------------- / | + * | | / Add | + * | | / amsdu pad | + * | LLC HDR will be added here <-| | Byte for | + * | | | | last frame | + * | >Dest addr will point | | if space | + * | somewhere in this area | | available | + * | And amsdu_pad will be created if | | | + * | dint get added in last buffer | | | + * | (First Buffer) | | | + * ---------------------------------------------------------- + */ + frag_addr = + qdf_nbuf_get_frag_addr(msdu_curr, frags_iter); + rx_desc = frag_addr - rx_mon_tlv_size; + + /* + * Update protocol and flow tag for MSDU + * update frag index in ctx_idx field + */ + QDF_NBUF_CB_RX_CTX_ID(msdu_curr) = frags_iter; + dp_rx_mon_update_protocol_flow_tag(soc, dp_pdev, + msdu_curr, rx_desc); + + /* Read buffer info from stored data in tlvs */ + hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_desc, + (uint8_t *)&buf_info, + sizeof(buf_info)); + + frag_size = qdf_nbuf_get_frag_size_by_idx(msdu_curr, + frags_iter); + + /* If Middle buffer, dont add any header */ + if ((!buf_info.first_buffer) && + (!buf_info.last_buffer)) { + tot_msdu_len += frag_size; + amsdu_pad = 0; + pad_byte_pholder = 0; + continue; + } + + /* Calculate if current buffer has placeholder + * to accommodate amsdu pad byte + */ + pad_byte_pholder = + (RX_MONITOR_BUFFER_SIZE - soc->rx_pkt_tlv_size) + - frag_size; + /* + * We will come here only only three condition: + * 1. Msdu with single Buffer + * 2. First buffer in case MSDU is spread in multiple + * buffer + * 3. Last buffer in case MSDU is spread in multiple + * buffer + * + * First buffER | Last buffer + * Case 1: 1 | 1 + * Case 2: 1 | 0 + * Case 3: 0 | 1 + * + * In 3rd case only l2_hdr_padding byte will be Zero and + * in other case, It will be 2 Bytes. + */ + if (buf_info.first_buffer) + l2_hdr_offset = + DP_RX_MON_NONRAW_L2_HDR_PAD_BYTE; + else + l2_hdr_offset = DP_RX_MON_RAW_L2_HDR_PAD_BYTE; + + if (buf_info.first_buffer) { + /* Src addr from where llc header needs to be copied */ + rx_src_desc = + hal_rx_desc_get_80211_hdr(soc->hal_soc, + rx_desc); + + /* Size of buffer with llc header */ + frag_size = frag_size - + (l2_hdr_offset + decap_hdr_pull_bytes); + frag_size += msdu_llc_len; + + /* Construct destination address */ + rx_dest_desc = frag_addr + + decap_hdr_pull_bytes + l2_hdr_offset; + rx_dest_desc = rx_dest_desc - (msdu_llc_len); + + qdf_mem_copy(rx_dest_desc, rx_src_desc, + msdu_llc_len); + + /* + * Calculate new page offset and create hole + * if amsdu_pad required. + */ + frag_page_offset = l2_hdr_offset + + decap_hdr_pull_bytes; + frag_page_offset = frag_page_offset - + (msdu_llc_len + amsdu_pad); + + qdf_nbuf_move_frag_page_offset(msdu_curr, + frags_iter, + frag_page_offset); + + tot_msdu_len = frag_size; + /* + * No amsdu padding required for first frame of + * continuation buffer + */ + if (!buf_info.last_buffer) { + amsdu_pad = 0; + continue; + } + } else { + tot_msdu_len += frag_size; + } + + /* Will reach to this place in only two case: + * 1. Single buffer MSDU + * 2. Last buffer of MSDU in case of multiple buf MSDU + */ + + /* Check size of buffer if amsdu padding required */ + amsdu_pad = tot_msdu_len & 0x3; + amsdu_pad = amsdu_pad ? (4 - amsdu_pad) : 0; + + /* Create placeholder if current bufer can + * accommodate padding. + */ + if (amsdu_pad && (amsdu_pad <= pad_byte_pholder)) { + char *frag_addr_temp; + + qdf_nbuf_trim_add_frag_size(msdu_curr, + frags_iter, + amsdu_pad, 0); + frag_addr_temp = (char *)qdf_nbuf_get_frag_addr(msdu_curr, + frags_iter); + frag_addr_temp = (frag_addr_temp + + qdf_nbuf_get_frag_size_by_idx(msdu_curr, frags_iter)) - + amsdu_pad; + qdf_mem_zero(frag_addr_temp, amsdu_pad); + amsdu_pad = 0; + } + + /* reset tot_msdu_len */ + tot_msdu_len = 0; + } + msdu_curr = qdf_nbuf_next(msdu_curr); + } + + dp_rx_mon_fraglist_prepare(head_msdu, tail_msdu); + + dp_rx_mon_dest_debug("%pK: head_msdu %pK head_msdu->len %u", + soc, head_msdu, head_msdu->len); + +mpdu_stitch_done: + return head_msdu; + +mpdu_stitch_fail: + dp_rx_mon_dest_err("%pK: mpdu_stitch_fail head_msdu %pK", + soc, head_msdu); + return NULL; +} +#endif + +#ifdef DP_RX_MON_MEM_FRAG +static inline +qdf_nbuf_t dp_rx_mon_restitch_mpdu(struct dp_soc *soc, uint32_t mac_id, + qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu, + struct cdp_mon_status *rs) +{ + if (qdf_nbuf_get_nr_frags(head_msdu)) + return dp_rx_mon_frag_restitch_mpdu_from_msdus(soc, mac_id, + head_msdu, + tail_msdu, rs); + else + return dp_rx_mon_restitch_mpdu_from_msdus(soc, mac_id, + head_msdu, + tail_msdu, rs); +} +#else +static inline +qdf_nbuf_t dp_rx_mon_restitch_mpdu(struct dp_soc *soc, uint32_t mac_id, + qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu, + struct cdp_mon_status *rs) +{ + return dp_rx_mon_restitch_mpdu_from_msdus(soc, mac_id, head_msdu, + tail_msdu, rs); +} +#endif + +#ifdef DP_RX_MON_MEM_FRAG +#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ + defined(WLAN_SUPPORT_RX_FLOW_TAG) +static inline +void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ + qdf_nbuf_t ext_list; + + if (qdf_unlikely(!soc)) { + dp_err("Soc[%pK] Null. Can't update pftag to nbuf headroom\n", + soc); + qdf_assert_always(0); + } + + if (!wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(soc->wlan_cfg_ctx)) + return; + + if (qdf_unlikely(!nbuf)) + return; + + /* Return if it dint came from mon Path */ + if (!qdf_nbuf_get_nr_frags(nbuf)) + return; + + /* Headroom must be double of PF_TAG_SIZE as we copy it 1stly to head */ + if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < (DP_RX_MON_TOT_PF_TAG_LEN * 2))) { + dp_err("Nbuf avail Headroom[%d] < 2 * DP_RX_MON_PF_TAG_TOT_LEN[%lu]", + qdf_nbuf_headroom(nbuf), DP_RX_MON_TOT_PF_TAG_LEN); + return; + } + + qdf_nbuf_push_head(nbuf, DP_RX_MON_TOT_PF_TAG_LEN); + qdf_mem_copy(qdf_nbuf_data(nbuf), qdf_nbuf_head(nbuf), + DP_RX_MON_TOT_PF_TAG_LEN); + qdf_nbuf_pull_head(nbuf, DP_RX_MON_TOT_PF_TAG_LEN); + + ext_list = qdf_nbuf_get_ext_list(nbuf); + while (ext_list) { + /* Headroom must be double of PF_TAG_SIZE + * as we copy it 1stly to head + */ + if (qdf_unlikely(qdf_nbuf_headroom(ext_list) < (DP_RX_MON_TOT_PF_TAG_LEN * 2))) { + dp_err("Fraglist Nbuf avail Headroom[%d] < 2 * DP_RX_MON_PF_TAG_TOT_LEN[%lu]", + qdf_nbuf_headroom(ext_list), + DP_RX_MON_TOT_PF_TAG_LEN); + ext_list = qdf_nbuf_queue_next(ext_list); + continue; + } + qdf_nbuf_push_head(ext_list, DP_RX_MON_TOT_PF_TAG_LEN); + qdf_mem_copy(qdf_nbuf_data(ext_list), qdf_nbuf_head(ext_list), + DP_RX_MON_TOT_PF_TAG_LEN); + qdf_nbuf_pull_head(ext_list, DP_RX_MON_TOT_PF_TAG_LEN); + ext_list = qdf_nbuf_queue_next(ext_list); + } +} +#else +static inline +void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ +} +#endif +#else +static inline +void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ +} +#endif + +#ifdef DP_MON_RSSI_IN_DBM +/* + * dp_rx_mon_rssi_convert(): convert rssi_comb from unit dBm to dB + * to match with radiotap further conversion requirement + * @rx_status: monitor mode rx status pointer + * + * Return: none + */ +static inline +void dp_rx_mon_rssi_convert(struct mon_rx_status *rx_status) +{ + rx_status->rssi_comb = rx_status->rssi_comb - + rx_status->chan_noise_floor; +} +#else +static inline +void dp_rx_mon_rssi_convert(struct mon_rx_status *rx_status) +{ +} +#endif + +/** + * dp_send_mgmt_packet_to_stack(): send indicataion to upper layers + * + * @soc: soc handle + * @nbuf: Mgmt packet + * @pdev: pdev handle + * + * Return: QDF_STATUS_SUCCESS on success + * QDF_STATUS_E_INVAL in error + */ +#ifdef QCA_MCOPY_SUPPORT +static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, + qdf_nbuf_t nbuf, + struct dp_pdev *pdev) +{ + 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; + + /* Get addr pointing to80211 header */ + addr = dp_rx_mon_get_nbuf_80211_hdr(nbuf); + if (qdf_unlikely(!addr)) { + qdf_nbuf_free(nbuf); + return QDF_STATUS_E_INVAL; + } + + /*check if this is not a mgmt packet*/ + wh = (struct ieee80211_frame *)addr; + if (((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != + IEEE80211_FC0_TYPE_MGT) && + ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != + IEEE80211_FC0_TYPE_CTL)) { + qdf_nbuf_free(nbuf); + return QDF_STATUS_E_INVAL; + } + nbuf_data = (uint32_t *)qdf_nbuf_push_head(nbuf, 4); + if (!nbuf_data) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + FL("No headroom")); + qdf_nbuf_free(nbuf); + return QDF_STATUS_E_INVAL; + } + *nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id; + + dp_wdi_event_handler(WDI_EVENT_RX_MGMT_CTRL, soc, nbuf, + HTT_INVALID_PEER, + WDI_NO_VAL, pdev->pdev_id); + return QDF_STATUS_SUCCESS; +} +#else +static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, + qdf_nbuf_t nbuf, + struct dp_pdev *pdev) +{ + return QDF_STATUS_SUCCESS; +} +#endif /* QCA_MCOPY_SUPPORT */ + +/* + * dp_rx_mon_process_dest_pktlog(): function to log packet contents to + * pktlog buffer and send to pktlog module + * @soc: DP soc + * @mac_id: MAC ID + * @mpdu: MPDU buf + * Return: status: 0 - Success, non-zero: Failure + */ +static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc, + uint32_t mac_id, + qdf_nbuf_t mpdu) +{ + uint32_t event, msdu_timestamp = 0; + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + void *data; + struct ieee80211_frame *wh; + uint8_t type, subtype; + struct dp_mon_pdev *mon_pdev; + + if (!pdev) + return QDF_STATUS_E_INVAL; + + 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 + data = qdf_nbuf_data(mpdu); + + /* CBF logging required, doesn't matter if it is a full mode + * or lite mode. + * Need to look for mpdu with: + * TYPE = ACTION, SUBTYPE = NO ACK in the header + */ + event = WDI_EVENT_RX_CBF; + + wh = (struct ieee80211_frame *)data; + type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; + if (type == IEEE80211_FC0_TYPE_MGT && + subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) { + msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft; + dp_rx_populate_cbf_hdr(soc, + mac_id, event, + mpdu, + msdu_timestamp); + } + } + return QDF_STATUS_SUCCESS; +} + +/* + * dp_rx_mon_deliver(): function to deliver packets to stack + * @soc: DP soc + * @mac_id: MAC ID + * @head_msdu: head of msdu list + * @tail_msdu: tail of msdu list + * + * Return: status: 0 - Success, non-zero: Failure + */ +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; + qdf_nbuf_t mon_skb, skb_next; + qdf_nbuf_t mon_mpdu = NULL; + struct dp_mon_vdev *mon_vdev; + struct dp_mon_pdev *mon_pdev; + + 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; + + /* restitch mon MPDU for delivery via monitor interface */ + mon_mpdu = dp_rx_mon_restitch_mpdu(soc, mac_id, head_msdu, + tail_msdu, rs); + + /* If MPDU restitch fails, free buffers*/ + if (!mon_mpdu) { + dp_info("MPDU restitch failed, free buffers"); + goto mon_deliver_fail; + } + + dp_rx_mon_process_dest_pktlog(soc, mac_id, mon_mpdu); + + /* monitor vap cannot be present when mcopy is enabled + * hence same skb can be consumed + */ + if (mon_pdev->mcopy_mode) + return dp_send_mgmt_packet_to_stack(soc, mon_mpdu, pdev); + + 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(&mon_pdev->ppdu_info.rx_status); + + dp_handle_tx_capture(soc, pdev, mon_mpdu); + + 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); + goto mon_deliver_fail; + } + + dp_rx_mon_update_pf_tag_to_buf_headroom(soc, mon_mpdu); + mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev, + mon_mpdu, + &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, mon_pdev->mvdev, + (mon_pdev->mvdev ? mon_pdev->mvdev->osif_vdev + : NULL)); + goto mon_deliver_fail; + } + + return QDF_STATUS_SUCCESS; + +mon_deliver_fail: + mon_skb = head_msdu; + while (mon_skb) { + skb_next = qdf_nbuf_next(mon_skb); + + dp_rx_mon_dest_debug("%pK: [%s][%d] mon_skb=%pK len %u", + soc, __func__, __LINE__, + mon_skb, mon_skb->len); + + qdf_nbuf_free(mon_skb); + mon_skb = skb_next; + } + return QDF_STATUS_E_INVAL; +} + +/** +* dp_rx_mon_deliver_non_std() +* @soc: core txrx main contex +* @mac_id: MAC ID +* +* This function delivers the radio tap and dummy MSDU +* into user layer application for preamble only PPDU. +* +* Return: QDF_STATUS +*/ +QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, + uint32_t mac_id) +{ + 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_mon_pdev *mon_pdev; + struct dp_mon_vdev *mon_vdev; + + /* Sanity checking */ + if (!pdev || !pdev->monitor_pdev) + goto mon_deliver_non_std_fail; + + mon_pdev = pdev->monitor_pdev; + + 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 = mon_vdev->osif_rx_mon; + dummy_msdu = qdf_nbuf_alloc(soc->osdev, MAX_MONITOR_HEADER, + MAX_MONITOR_HEADER, 4, FALSE); + if (!dummy_msdu) + goto allocate_dummy_msdu_fail; + + qdf_nbuf_set_pktlen(dummy_msdu, 0); + qdf_nbuf_set_next(dummy_msdu, NULL); + + 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(&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); + goto mon_deliver_non_std_fail; + } + + /* deliver to the user layer application */ + osif_rx_mon(mon_pdev->mvdev->osif_vdev, + dummy_msdu, NULL); + + /* Clear rx_status*/ + 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; + +allocate_dummy_msdu_fail: + dp_rx_mon_dest_debug("%pK: mon_skb=%pK ", + soc, dummy_msdu); + +mon_deliver_non_std_fail: + return QDF_STATUS_E_INVAL; +} diff --git a/dp/wifi3.0/monitor/dp_rx_mon_status.c b/dp/wifi3.0/monitor/dp_rx_mon_status.c index a954536ee0..e046fc5c2a 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon_status.c +++ b/dp/wifi3.0/monitor/dp_rx_mon_status.c @@ -180,7 +180,7 @@ dp_send_ack_frame_to_stack(struct dp_soc *soc, } #endif -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT static inline void dp_rx_populate_rx_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, struct cdp_rx_indication_ppdu *cdp_rx_ppdu) @@ -540,7 +540,8 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, struct cdp_rx_indication_ppdu *cdp_rx_ppdu) { } -#endif +#endif/* QCA_ENHANCED_STATS_SUPPORT */ + /** * dp_rx_stats_update() - Update per-peer statistics * @soc: Datapath SOC handle @@ -549,7 +550,7 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, * * Return: None */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT static inline void dp_rx_rate_stats_update(struct dp_peer *peer, struct cdp_rx_indication_ppdu *ppdu, uint32_t user) @@ -812,7 +813,7 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS); } } -#endif +#endif/* QCA_ENHANCED_STATS_SUPPORT */ /** * dp_rx_handle_mcopy_mode() - Allocate and deliver first MSDU payload @@ -826,7 +827,7 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, * Return: QDF_STATUS_SUCCESS - If nbuf to be freed by caller * QDF_STATUS_E_ALREADY - If nbuf not to be freed by caller */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_MCOPY_SUPPORT static inline QDF_STATUS dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, qdf_nbuf_t nbuf, @@ -882,7 +883,7 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, { return QDF_STATUS_SUCCESS; } -#endif +#endif /* QCA_MCOPY_SUPPORT */ /** * dp_rx_mcopy_handle_last_mpdu() - cache and delive last MPDU header in a @@ -894,7 +895,7 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, * * Return: void */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_MCOPY_SUPPORT static inline void dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, @@ -967,7 +968,7 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev, qdf_nbuf_t status_nbuf) { } -#endif +#endif /* QCA_MCOPY_SUPPORT */ /** * dp_rx_mcopy_process_ppdu_info() - update mcopy ppdu info @@ -976,7 +977,7 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev, * * Return: void */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_MCOPY_SUPPORT static inline void dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, @@ -1022,9 +1023,9 @@ dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev, uint32_t tlv_status) { } -#endif +#endif /* QCA_MCOPY_SUPPORT */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_MCOPY_SUPPORT static inline void dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, @@ -1085,7 +1086,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, qdf_nbuf_t status_nbuf) { } -#endif +#endif /* QCA_MCOPY_SUPPORT */ /** * dp_rx_handle_smart_mesh_mode() - Deliver header for smart mesh @@ -1492,7 +1493,7 @@ dp_cfr_rcc_mode_status(struct dp_pdev *pdev) * * Return: none */ -#ifdef FEATURE_PERPKT_INFO +#ifdef QCA_ENHANCED_STATS_SUPPORT static inline void dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info) @@ -1591,7 +1592,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info) { } -#endif +#endif/* QCA_ENHANCED_STATS_SUPPORT */ /** * dp_rx_process_peer_based_pktlog() - Process Rx pktlog if peer based diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_global_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_global_obj.c index 089cfa1f9d..5656d9194c 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_global_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_global_obj.c @@ -29,6 +29,8 @@ /* Global object, it is declared globally */ struct wlan_objmgr_global *g_umac_glb_obj; +qdf_export_symbol(g_umac_glb_obj); + /* ** APIs to Create/Delete Global object APIs */ diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 170d6952a1..083a9e9ee5 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -29,7 +29,7 @@ #include "cfg_ucfg_api.h" #include "hal_api.h" #include "dp_types.h" - +#include /* * The max allowed size for tx comp ring is 8191. @@ -1277,6 +1277,8 @@ void wlan_cfg_set_mon_delayed_replenish_entries( cfg->delayed_replenish_entries = val; } +qdf_export_symbol(wlan_cfg_set_mon_delayed_replenish_entries); + int wlan_cfg_get_mon_delayed_replenish_entries(struct wlan_cfg_dp_soc_ctxt *cfg) { return cfg->delayed_replenish_entries; @@ -1313,6 +1315,8 @@ int wlan_cfg_get_max_ast_idx(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->max_ast_idx; } +qdf_export_symbol(wlan_cfg_get_max_ast_idx); + void wlan_cfg_set_tx_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, int context, int mask) { @@ -1410,6 +1414,8 @@ int wlan_cfg_get_hw_mac_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int pdev_idx) return cfg->hw_macid[pdev_idx]; } +qdf_export_symbol(wlan_cfg_get_hw_mac_idx); + int wlan_cfg_get_target_pdev_id(struct wlan_cfg_dp_soc_ctxt *cfg, int hw_macid) { @@ -1438,6 +1444,8 @@ int wlan_cfg_get_pdev_idx(struct wlan_cfg_dp_soc_ctxt *cfg, int hw_macid) return cfg->hw_macid_pdev_id_map[hw_macid]; } +qdf_export_symbol(wlan_cfg_get_pdev_idx); + void wlan_cfg_set_ce_ring_mask(struct wlan_cfg_dp_soc_ctxt *cfg, int context, int mask) { @@ -1549,6 +1557,8 @@ int wlan_cfg_per_pdev_lmac_ring(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->per_pdev_lmac_ring; } +qdf_export_symbol(wlan_cfg_per_pdev_lmac_ring); + #ifdef DP_MEMORY_OPT int wlan_cfg_num_tcl_data_rings(struct wlan_cfg_dp_soc_ctxt *cfg) { @@ -1716,6 +1726,8 @@ int wlan_cfg_get_num_mac_rings(struct wlan_cfg_dp_pdev_ctxt *cfg) return cfg->num_mac_rings; } +qdf_export_symbol(wlan_cfg_get_num_mac_rings); + bool wlan_cfg_is_gro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) { return cfg->gro_enabled; @@ -1919,6 +1931,8 @@ wlan_cfg_get_dp_soc_rx_sw_desc_weight(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->rx_sw_desc_weight; } +qdf_export_symbol(wlan_cfg_get_dp_soc_rx_sw_desc_weight); + int wlan_cfg_get_dp_soc_rx_sw_desc_num(struct wlan_cfg_dp_soc_ctxt *cfg) { @@ -2014,6 +2028,8 @@ bool wlan_cfg_is_rx_flow_tag_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->is_rx_flow_tag_enabled; } +qdf_export_symbol(wlan_cfg_is_rx_flow_tag_enabled); + #ifdef WLAN_SUPPORT_RX_FISA bool wlan_cfg_is_rx_fisa_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) { @@ -2068,6 +2084,8 @@ wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->is_rx_mon_protocol_flow_tag_enabled; } +qdf_export_symbol(wlan_cfg_is_rx_mon_protocol_flow_tag_enabled); + void wlan_cfg_set_tx_per_pkt_vdev_id_check(struct wlan_cfg_dp_soc_ctxt *cfg, bool val) @@ -2171,6 +2189,8 @@ wlan_cfg_is_delay_mon_replenish(struct wlan_cfg_dp_soc_ctxt *cfg) return cfg->delay_mon_replenish; } +qdf_export_symbol(wlan_cfg_is_delay_mon_replenish); + void wlan_cfg_dp_soc_ctx_dump(struct wlan_cfg_dp_soc_ctxt *cfg) { dp_info("DP CFG SoC ctx: delay_mon_replenish = %d,",