diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 47f91441b694..c9f6d343b79a 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1742,7 +1742,7 @@ struct hdd_context { #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH struct qdf_periodic_work bus_bw_work; int cur_vote_level; - spinlock_t bus_bw_lock; + qdf_spinlock_t bus_bw_lock; int cur_rx_level; uint64_t prev_no_rx_offload_pkts; uint64_t prev_rx_offload_pkts; @@ -2278,6 +2278,27 @@ QDF_STATUS __wlan_hdd_validate_mac_address(struct qdf_mac_addr *mac_addr, const char *func); #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH +/** + * hdd_bus_bw_compute_prev_txrx_stats() - get tx and rx stats + * @adapter: hdd adapter reference + * + * This function get the collected tx and rx stats before starting + * the bus bandwidth timer. + * + * Return: None + */ +void hdd_bus_bw_compute_prev_txrx_stats(struct hdd_adapter *adapter); + +/** + * hdd_bus_bw_compute_reset_prev_txrx_stats() - reset previous tx and rx stats + * @adapter: hdd adapter reference + * + * This function resets the adapter previous tx rx stats. + * + * Return: None + */ +void hdd_bus_bw_compute_reset_prev_txrx_stats(struct hdd_adapter *adapter); + /** * hdd_bus_bw_compute_timer_start() - start the bandwidth timer * @hdd_ctx: the global hdd context @@ -2340,6 +2361,16 @@ void hdd_bus_bandwidth_deinit(struct hdd_context *hdd_ctx); #define GET_BW_COMPUTE_INTV(config) ((config)->bus_bw_compute_interval) #else +static inline +void hdd_bus_bw_compute_prev_txrx_stats(struct hdd_adapter *adapter) +{ +} + +static inline +void hdd_bus_bw_compute_reset_prev_txrx_stats(struct hdd_adapter *adapter) +{ +} + static inline void hdd_bus_bw_compute_timer_start(struct hdd_context *hdd_ctx) { diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 9367d09c183e..00d519507eec 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -1448,19 +1448,9 @@ static void hdd_send_association_event(struct net_device *dev, roam_info->tdls_prohibited, adapter->vdev); #endif - -#ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH /* start timer in sta/p2p_cli */ - spin_lock_bh(&hdd_ctx->bus_bw_lock); - adapter->prev_tx_packets = adapter->stats.tx_packets; - adapter->prev_rx_packets = adapter->stats.rx_packets; - cdp_get_intra_bss_fwd_pkts_count( - cds_get_context(QDF_MODULE_ID_SOC), adapter->vdev_id, - &adapter->prev_fwd_tx_packets, - &adapter->prev_fwd_rx_packets); - spin_unlock_bh(&hdd_ctx->bus_bw_lock); + hdd_bus_bw_compute_prev_txrx_stats(adapter); hdd_bus_bw_compute_timer_start(hdd_ctx); -#endif } else if (eConnectionState_IbssConnected == /* IBss Associated */ sta_ctx->conn_info.conn_state) { policy_mgr_update_connection_info(hdd_ctx->psoc, @@ -1501,16 +1491,9 @@ static void hdd_send_association_event(struct net_device *dev, false, adapter->vdev); -#ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH /* stop timer in sta/p2p_cli */ - spin_lock_bh(&hdd_ctx->bus_bw_lock); - adapter->prev_tx_packets = 0; - adapter->prev_rx_packets = 0; - adapter->prev_fwd_tx_packets = 0; - adapter->prev_fwd_rx_packets = 0; - spin_unlock_bh(&hdd_ctx->bus_bw_lock); + hdd_bus_bw_compute_reset_prev_txrx_stats(adapter); hdd_bus_bw_compute_timer_try_stop(hdd_ctx); -#endif } hdd_ipa_set_tx_flow_info(); diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 17c9070d8ca9..f80cbbb1b386 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2245,26 +2245,13 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, QDF_TRACE_DEFAULT_PDEV_ID, QDF_PROTO_TYPE_MGMT, QDF_PROTO_MGMT_ASSOC)); -#ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH /* start timer in sap/p2p_go */ if (ap_ctx->ap_active == false) { - spin_lock_bh(&hdd_ctx->bus_bw_lock); - adapter->prev_tx_packets = - adapter->stats.tx_packets; - adapter->prev_rx_packets = - adapter->stats.rx_packets; - - cdp_get_intra_bss_fwd_pkts_count( - cds_get_context(QDF_MODULE_ID_SOC), - adapter->vdev_id, - &adapter->prev_fwd_tx_packets, - &adapter->prev_fwd_rx_packets); - - spin_unlock_bh(&hdd_ctx->bus_bw_lock); + hdd_bus_bw_compute_prev_txrx_stats(adapter); hdd_bus_bw_compute_timer_start(hdd_ctx); } -#endif ap_ctx->ap_active = true; + #ifdef FEATURE_WLAN_AUTO_SHUTDOWN wlan_hdd_auto_shutdown_enable(hdd_ctx, false); #endif @@ -2424,18 +2411,12 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, NULL, adapter->device_mode); } -#ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH /*stop timer in sap/p2p_go */ if (ap_ctx->ap_active == false) { - spin_lock_bh(&hdd_ctx->bus_bw_lock); - adapter->prev_tx_packets = 0; - adapter->prev_rx_packets = 0; - adapter->prev_fwd_tx_packets = 0; - adapter->prev_fwd_rx_packets = 0; - spin_unlock_bh(&hdd_ctx->bus_bw_lock); + hdd_bus_bw_compute_reset_prev_txrx_stats(adapter); hdd_bus_bw_compute_timer_try_stop(hdd_ctx); } -#endif + hdd_green_ap_del_sta(hdd_ctx); break; diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 9f23213249e0..dd6fd1d2ad5e 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -8383,8 +8383,9 @@ static void __hdd_bus_bw_work_handler(struct hdd_context *hdd_ctx) adapter->prev_rx_packets); if (adapter->device_mode == QDF_SAP_MODE || - adapter->device_mode == QDF_P2P_GO_MODE || - adapter->device_mode == QDF_IBSS_MODE) { + adapter->device_mode == QDF_P2P_GO_MODE || + adapter->device_mode == QDF_IBSS_MODE || + adapter->device_mode == QDF_NDI_MODE) { ret = cdp_get_intra_bss_fwd_pkts_count( cds_get_context(QDF_MODULE_ID_SOC), @@ -8409,12 +8410,12 @@ static void __hdd_bus_bw_work_handler(struct hdd_context *hdd_ctx) total_rx += adapter->stats.rx_packets; total_tx += adapter->stats.tx_packets; - spin_lock_bh(&hdd_ctx->bus_bw_lock); + qdf_spin_lock_bh(&hdd_ctx->bus_bw_lock); adapter->prev_tx_packets = adapter->stats.tx_packets; adapter->prev_rx_packets = adapter->stats.rx_packets; adapter->prev_fwd_tx_packets = fwd_tx_packets; adapter->prev_fwd_rx_packets = fwd_rx_packets; - spin_unlock_bh(&hdd_ctx->bus_bw_lock); + qdf_spin_unlock_bh(&hdd_ctx->bus_bw_lock); connected = true; } @@ -8469,7 +8470,7 @@ int hdd_bus_bandwidth_init(struct hdd_context *hdd_ctx) hdd_enter(); - spin_lock_init(&hdd_ctx->bus_bw_lock); + qdf_spinlock_create(&hdd_ctx->bus_bw_lock); status = qdf_periodic_work_create(&hdd_ctx->bus_bw_work, hdd_bus_bw_work_handler, hdd_ctx); @@ -8485,6 +8486,7 @@ void hdd_bus_bandwidth_deinit(struct hdd_context *hdd_ctx) QDF_BUG(!qdf_periodic_work_stop_sync(&hdd_ctx->bus_bw_work)); qdf_periodic_work_destroy(&hdd_ctx->bus_bw_work); + qdf_spinlock_destroy(&hdd_ctx->bus_bw_lock); hdd_exit(); } @@ -13112,6 +13114,33 @@ void hdd_bus_bw_compute_timer_try_stop(struct hdd_context *hdd_ctx) hdd_exit(); } + +void hdd_bus_bw_compute_prev_txrx_stats(struct hdd_adapter *adapter) +{ + struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + + qdf_spin_lock_bh(&hdd_ctx->bus_bw_lock); + adapter->prev_tx_packets = adapter->stats.tx_packets; + adapter->prev_rx_packets = adapter->stats.rx_packets; + cdp_get_intra_bss_fwd_pkts_count(cds_get_context(QDF_MODULE_ID_SOC), + adapter->vdev_id, + &adapter->prev_fwd_tx_packets, + &adapter->prev_fwd_rx_packets); + qdf_spin_unlock_bh(&hdd_ctx->bus_bw_lock); +} + +void hdd_bus_bw_compute_reset_prev_txrx_stats(struct hdd_adapter *adapter) +{ + struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + + qdf_spin_lock_bh(&hdd_ctx->bus_bw_lock); + adapter->prev_tx_packets = 0; + adapter->prev_rx_packets = 0; + adapter->prev_fwd_tx_packets = 0; + adapter->prev_fwd_rx_packets = 0; + qdf_spin_unlock_bh(&hdd_ctx->bus_bw_lock); +} + #endif /*WLAN_FEATURE_DP_BUS_BANDWIDTH*/ /** diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c index 5c365c17ad51..61c04596e5ab 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.c +++ b/core/hdd/src/wlan_hdd_nan_datapath.c @@ -40,6 +40,7 @@ #include "cfg_nan_api.h" #include "wlan_mlme_ucfg_api.h" #include "qdf_util.h" +#include /** * hdd_nan_datapath_target_config() - Configure NAN datapath features @@ -854,6 +855,8 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, /* perform following steps for first new peer ind */ if (fist_peer) { hdd_info("Set ctx connection state to connected"); + hdd_bus_bw_compute_prev_txrx_stats(adapter); + hdd_bus_bw_compute_timer_start(hdd_ctx); sta_ctx->conn_info.conn_state = eConnectionState_NdiConnected; hdd_wmm_connect(adapter, roam_info, eCSR_BSS_TYPE_NDI); wlan_hdd_netif_queue_control(adapter, @@ -864,7 +867,6 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id, return 0; } - /** * hdd_ndp_peer_departed_handler() - Handle NDP peer departed indication * @adapter: pointer to adapter context @@ -916,6 +918,8 @@ void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id, hdd_info("Stop netif tx queues."); wlan_hdd_netif_queue_control(adapter, WLAN_STOP_ALL_NETIF_QUEUE, WLAN_CONTROL_PATH); + hdd_bus_bw_compute_reset_prev_txrx_stats(adapter); + hdd_bus_bw_compute_timer_try_stop(hdd_ctx); } hdd_exit();