From 777a7dde6eefff632b2d798b34e5050bb8e10af9 Mon Sep 17 00:00:00 2001 From: Sravan Kumar Kairam Date: Thu, 1 Aug 2019 21:46:30 +0530 Subject: [PATCH] qcacld-3.0: Start bus bw computer timer for NAN Currently for NDI interface bus bandwidth timer is not started. As part of this change start the timer when new ndp peer is created and stop the timer when last ndp peer connected is deleted. Change-Id: Ia710ec9872636ee3cefa30815692c2f8c9816687 CRs-Fixed: 2499548 --- core/hdd/inc/wlan_hdd_main.h | 33 ++++++++++++++++++++++- core/hdd/src/wlan_hdd_assoc.c | 21 ++------------- core/hdd/src/wlan_hdd_hostapd.c | 27 +++---------------- core/hdd/src/wlan_hdd_main.c | 39 ++++++++++++++++++++++++---- core/hdd/src/wlan_hdd_nan_datapath.c | 6 ++++- 5 files changed, 77 insertions(+), 49 deletions(-) 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();