Browse Source

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
Sravan Kumar Kairam 5 years ago
parent
commit
777a7dde6e

+ 32 - 1
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)
 {

+ 2 - 19
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();
 

+ 4 - 23
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;
 

+ 34 - 5
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*/
 
 /**

+ 5 - 1
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 <cdp_txrx_misc.h>
 
 /**
  * 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();