Browse Source

Merge "qcacmn: SON convergence"

Linux Build Service Account 8 years ago
parent
commit
c9dda4429c

+ 15 - 0
dp/inc/cdp_txrx_ctrl.h

@@ -250,10 +250,14 @@ cdp_set_inact_params(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
 			u_int16_t inact_normal,
 			u_int16_t inact_overload)
 {
+	if (!soc || !pdev)
+		return false;
+
 	if (soc->ops->ctrl_ops->txrx_set_inact_params)
 		return soc->ops->ctrl_ops->txrx_set_inact_params
 			(pdev, inact_check_interval, inact_normal,
 			inact_overload);
+
 	return false;
 }
 static inline bool
@@ -261,6 +265,9 @@ cdp_start_inact_timer(ol_txrx_soc_handle soc,
 	struct cdp_pdev *pdev,
 	bool enable)
 {
+	if (!soc || !pdev)
+		return false;
+
 	if (soc->ops->ctrl_ops->txrx_start_inact_timer)
 		return soc->ops->ctrl_ops->txrx_start_inact_timer
 			(pdev, enable);
@@ -280,8 +287,12 @@ static inline void
 cdp_set_overload(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
 	bool overload)
 {
+	if (!soc || !pdev)
+		return;
+
 	if (soc->ops->ctrl_ops->txrx_set_overload)
 		return soc->ops->ctrl_ops->txrx_set_overload(pdev, overload);
+
 	return;
 }
 
@@ -294,8 +305,12 @@ cdp_set_overload(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
 static inline bool
 cdp_peer_is_inact(ol_txrx_soc_handle soc, void *peer)
 {
+	if (!soc || !peer)
+		return false;
+
 	if (soc->ops->ctrl_ops->txrx_peer_is_inact)
 		return soc->ops->ctrl_ops->txrx_peer_is_inact(peer);
+
 	return false;
 }
 

+ 1 - 1
dp/inc/cdp_txrx_host_stats.h

@@ -224,7 +224,7 @@ cdp_reset_lro_stats(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
  * @return - pointer to received stat payload
  */
 
-#if ATH_BAND_STEERING || ENHANCED_STATS
+#if defined(QCA_SUPPORT_SON) || defined(ENHANCED_STATS)
 uint32_t *ol_txrx_get_en_stats_base(ol_txrx_pdev_handle txrx_pdev, uint32_t *msg_word,
     uint32_t msg_len, enum htt_cmn_t2h_en_stats_type *type,  enum htt_cmn_t2h_en_stats_status *status);
 #endif

+ 16 - 5
dp/wifi3.0/dp_main.c

@@ -1959,6 +1959,21 @@ dp_get_pdev_reo_dest(struct cdp_pdev *pdev_handle)
 		return cdp_host_reo_dest_ring_unknown;
 }
 
+#ifdef QCA_SUPPORT_SON
+static void dp_son_peer_authorize(struct dp_peer *peer)
+{
+	struct dp_soc *soc;
+	soc = peer->vdev->pdev->soc;
+	peer->peer_bs_inact_flag = 0;
+	peer->peer_bs_inact = soc->pdev_bs_inact_reload;
+	return;
+}
+#else
+static void dp_son_peer_authorize(struct dp_peer *peer)
+{
+	return;
+}
+#endif
 /*
  * dp_set_filter_neighbour_peers() - set filter neighbour peers for smart mesh
  * @pdev_handle: device object
@@ -2057,13 +2072,9 @@ static void dp_peer_authorize(void *peer_handle, uint32_t authorize)
 
 	if (peer != NULL) {
 		soc = peer->vdev->pdev->soc;
-
 		qdf_spin_lock_bh(&soc->peer_ref_mutex);
+		dp_son_peer_authorize(peer);
 		peer->authorize = authorize ? 1 : 0;
-#ifdef notyet /* ATH_BAND_STEERING */
-		peer->peer_bs_inact_flag = 0;
-		peer->peer_bs_inact = soc->pdev_bs_inact_reload;
-#endif
 		qdf_spin_unlock_bh(&soc->peer_ref_mutex);
 	}
 }

+ 0 - 8
dp/wifi3.0/dp_peer.c

@@ -89,11 +89,6 @@ static int dp_peer_find_map_attach(struct dp_soc *soc)
 	 * that are not in use set to 0.
 	 */
 	qdf_mem_zero(soc->peer_id_to_obj_map, peer_map_size);
-#ifdef notyet /* ATH_BAND_STEERING */
-		OS_INIT_TIMER(soc->osdev, &(soc->bs_inact_timer),
-			dp_peer_find_inact_timeout_handler, (void *)soc,
-			QDF_TIMER_TYPE_WAKE_APPS);
-#endif
 	return 0; /* success */
 }
 
@@ -308,9 +303,6 @@ void dp_peer_find_hash_erase(struct dp_soc *soc)
 
 static void dp_peer_find_map_detach(struct dp_soc *soc)
 {
-#ifdef notyet /* ATH_BAND_STEERING */
-	OS_FREE_TIMER(&(soc->bs_inact_timer));
-#endif
 	qdf_mem_free(soc->peer_id_to_obj_map);
 }
 

+ 18 - 4
dp/wifi3.0/dp_types.h

@@ -591,14 +591,28 @@ struct dp_soc {
 #endif
 	qdf_list_t reo_desc_freelist;
 	qdf_spinlock_t reo_desc_freelist_lock;
-
 	/* Obj Mgr SoC */
 	struct wlan_objmgr_psoc *psoc;
-
 	qdf_nbuf_t invalid_peer_head_msdu;
 	qdf_nbuf_t invalid_peer_tail_msdu;
+#ifdef QCA_SUPPORT_SON
+	/* The timer to check station's inactivity status */
+	os_timer_t pdev_bs_inact_timer;
+	/* The current inactivity count reload value
+	   based on overload condition */
+	u_int16_t pdev_bs_inact_reload;
+
+	/* The inactivity timer value when not overloaded */
+	u_int16_t pdev_bs_inact_normal;
+
+	/* The inactivity timer value when overloaded */
+	u_int16_t pdev_bs_inact_overload;
+
+	/* The inactivity timer check interval */
+	u_int16_t pdev_bs_inact_interval;
+	/* Inactivity timer */
+#endif /* QCA_SUPPORT_SON */
 };
-
 #define MAX_RX_MAC_RINGS 2
 /* Same as NAC_MAX_CLENT */
 #define DP_NAC_MAX_CLIENT  24
@@ -612,7 +626,6 @@ enum dp_nac_param_cmd {
 	/* IEEE80211_NAC_PARAM_LIST */
 	DP_NAC_PARAM_LIST,
 };
-
 #define DP_MAC_ADDR_LEN 6
 union dp_align_mac_addr {
 	uint8_t raw[DP_MAC_ADDR_LEN];
@@ -938,6 +951,7 @@ struct dp_peer {
 
 	/* Band steering: Set when node is inactive */
 	uint8_t peer_bs_inact_flag:1;
+	u_int16_t peer_bs_inact; /* inactivity mark count */
 
 	/* NAWDS Flag and Bss Peer bit */
 	uint8_t nawds_enabled:1,

+ 58 - 2
init_deinit/dispatcher/src/dispatcher_init_deinit.c

@@ -33,6 +33,9 @@
 #ifdef WLAN_ATF_ENABLE
 #include <wlan_atf_utils_api.h>
 #endif
+#ifdef QCA_SUPPORT_SON
+#include <wlan_son_pub.h>
+#endif
 #ifdef WIFI_POS_CONVERGED
 #include "wifi_pos_api.h"
 #endif /* WIFI_POS_CONVERGED */
@@ -44,7 +47,6 @@
 #include <wlan_p2p_ucfg_api.h>
 #endif
 #include <wlan_reg_services_api.h>
-
 #ifdef WLAN_CONV_CRYPTO_SUPPORTED
 #include "wlan_crypto_main.h"
 #endif
@@ -194,6 +196,47 @@ static QDF_STATUS tdls_psoc_disable(struct wlan_objmgr_psoc *psoc)
 }
 #endif
 
+#if defined QCA_SUPPORT_SON && QCA_SUPPORT_SON >= 1
+static QDF_STATUS dispatcher_init_son(void)
+{
+	return wlan_son_init();
+}
+static QDF_STATUS son_psoc_open(struct wlan_objmgr_psoc *psoc)
+{
+	return wlan_son_psoc_open(psoc);
+}
+static QDF_STATUS dispatcher_deinit_son(void)
+{
+	return wlan_son_deinit();
+}
+
+static QDF_STATUS son_psoc_close(struct wlan_objmgr_psoc *psoc)
+{
+	return wlan_son_psoc_close(psoc);
+}
+#else
+static QDF_STATUS dispatcher_init_son(void)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS dispatcher_deinit_son(void)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS son_psoc_open(struct wlan_objmgr_psoc *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS son_psoc_close(struct wlan_objmgr_psoc *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+#endif /* END of QCA_SUPPORT_SON */
+
 #ifdef WLAN_PMO_ENABLE
 static QDF_STATUS dispatcher_init_pmo(void)
 {
@@ -587,6 +630,9 @@ QDF_STATUS dispatcher_init(void)
 	if (QDF_STATUS_SUCCESS != dispatcher_offchan_txrx_init())
 		goto offchan_init_fail;
 
+	if (QDF_STATUS_SUCCESS != dispatcher_init_son())
+		goto son_init_fail;
+
 	/*
 	 * scheduler INIT has to be the last as each component's
 	 * initialization has to happen first and then at the end
@@ -598,6 +644,8 @@ QDF_STATUS dispatcher_init(void)
 	return QDF_STATUS_SUCCESS;
 
 scheduler_init_fail:
+	dispatcher_deinit_son();
+son_init_fail:
 	dispatcher_offchan_txrx_deinit();
 offchan_init_fail:
 	dispatcher_regulatory_deinit();
@@ -641,6 +689,8 @@ QDF_STATUS dispatcher_deinit(void)
 	 */
 	QDF_BUG(QDF_STATUS_SUCCESS == scheduler_deinit());
 
+	QDF_BUG(QDF_STATUS_SUCCESS == dispatcher_deinit_son());
+
 	QDF_BUG(QDF_STATUS_SUCCESS == dispatcher_offchan_txrx_deinit());
 
 	QDF_BUG(QDF_STATUS_SUCCESS == dispatcher_regulatory_deinit());
@@ -698,8 +748,12 @@ QDF_STATUS dispatcher_psoc_open(struct wlan_objmgr_psoc *psoc)
 	if (QDF_STATUS_SUCCESS != dispatcher_regulatory_psoc_open(psoc))
 		goto regulatory_psoc_open_fail;
 
-	return QDF_STATUS_SUCCESS;
+	if (QDF_STATUS_SUCCESS != son_psoc_open(psoc))
+		goto psoc_son_fail;
 
+	return QDF_STATUS_SUCCESS;
+psoc_son_fail:
+	regulatory_psoc_close(psoc);
 regulatory_psoc_open_fail:
 	dispatcher_policy_mgr_psoc_close(psoc);
 policy_mgr_psoc_open_fail:
@@ -720,6 +774,8 @@ EXPORT_SYMBOL(dispatcher_psoc_open);
 
 QDF_STATUS dispatcher_psoc_close(struct wlan_objmgr_psoc *psoc)
 {
+	QDF_BUG(QDF_STATUS_SUCCESS == son_psoc_close(psoc));
+
 	QDF_BUG(QDF_STATUS_SUCCESS == dispatcher_regulatory_psoc_close(psoc));
 
 	QDF_BUG(QDF_STATUS_SUCCESS == dispatcher_policy_mgr_psoc_close(psoc));

+ 1 - 0
qdf/inc/qdf_types.h

@@ -390,6 +390,7 @@ typedef enum {
 	QDF_MODULE_ID_REGULATORY,
 	QDF_MODULE_ID_NAN,
 	QDF_MODULE_ID_OFFCHAN_TXRX,
+	QDF_MODULE_ID_SON,
 	QDF_MODULE_ID_ANY,
 	QDF_MODULE_ID_MAX,
 } QDF_MODULE_ID;

+ 19 - 1
target_if/core/src/target_if_main.c

@@ -45,10 +45,12 @@
 #ifdef WLAN_FEATURE_NAN_CONVERGENCE
 #include "target_if_nan.h"
 #endif /* WLAN_FEATURE_NAN_CONVERGENCE */
-
 #ifdef CONVERGED_TDLS_ENABLE
 #include "target_if_tdls.h"
 #endif
+#ifdef QCA_SUPPORT_SON
+#include <target_if_son.h>
+#endif
 
 static struct target_if_ctx *g_target_if_ctx;
 
@@ -129,6 +131,20 @@ static void target_if_wifi_pos_tx_ops_register(
 {
 }
 #endif
+#ifdef QCA_SUPPORT_SON
+static void target_if_son_tx_ops_register(
+			struct wlan_lmac_if_tx_ops *tx_ops)
+{
+	target_if_son_register_tx_ops(tx_ops);
+	return;
+}
+#else
+static void target_if_son_tx_ops_register(
+			struct wlan_lmac_if_tx_ops *tx_ops)
+{
+	return;
+}
+#endif
 
 #ifdef WLAN_FEATURE_NAN_CONVERGENCE
 static void target_if_nan_tx_ops_register(
@@ -187,6 +203,8 @@ QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
 	/* call regulatory callback to register tx ops */
 	target_if_register_regulatory_tx_ops(tx_ops);
 
+	target_if_son_tx_ops_register(tx_ops);
+
 	target_if_tdls_tx_ops_register(tx_ops);
 	/* Converged UMAC components to register their TX-ops here */
 	return QDF_STATUS_SUCCESS;

+ 63 - 0
target_if/son/inc/target_if_son.h

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <ol_if_athvar.h>
+#include <wlan_objmgr_cmn.h>
+#include <wlan_objmgr_psoc_obj.h>
+#include <wlan_objmgr_pdev_obj.h>
+#include <wlan_objmgr_vdev_obj.h>
+#include <wlan_objmgr_peer_obj.h>
+
+void target_if_son_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
+
+bool son_ol_is_peer_inact(struct wlan_objmgr_peer *);
+
+u_int32_t son_ol_get_peer_rate(struct wlan_objmgr_peer *peer, u_int8_t type);
+
+int8_t son_ol_sanitize_util_invtl(struct wlan_objmgr_pdev *pdev,
+				  u_int32_t *sample_period,
+				  u_int32_t *num_of_sample);
+
+bool son_ol_enable(struct wlan_objmgr_pdev *pdev, bool enable);
+
+/* Function pointer to set overload status */
+
+void son_ol_set_overload(struct wlan_objmgr_pdev *pdev, bool overload);
+
+/* Function pointer to set band steering parameters */
+
+bool son_ol_set_params(struct wlan_objmgr_pdev *pdev,
+			      u_int32_t inactivity_check_period,
+			      u_int32_t inactivity_threshold_normal,
+			      u_int32_t inactivity_threshold_overload);
+
+QDF_STATUS son_ol_send_null(struct wlan_objmgr_pdev *pdev,
+			    u_int8_t *macaddr,
+			    struct wlan_objmgr_vdev *vdev);
+
+int son_ol_lmac_create(struct wlan_objmgr_pdev *pdev);
+
+
+int son_ol_lmac_destroy(struct wlan_objmgr_pdev *pdev);
+
+
+void  son_ol_rx_rssi_update(struct wlan_objmgr_pdev *pdev, u_int8_t *macaddres,
+			    u_int8_t status, int8_t rssi, u_int8_t subtype);
+
+void son_ol_rx_rate_update(struct wlan_objmgr_pdev *pdev, u_int8_t *macaddres,
+			   u_int8_t status, u_int32_t rateKbps);

+ 236 - 0
target_if/son/src/target_if_son.c

@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <target_if_son.h>
+#include <wlan_lmac_if_def.h>
+#include <wmi_unified_api.h>
+#include <cdp_txrx_ctrl.h>
+
+#if QCA_SUPPORT_SON
+
+bool son_ol_is_peer_inact(struct wlan_objmgr_peer *peer)
+{
+	struct wlan_objmgr_pdev *pdev = NULL;
+	struct wlan_objmgr_vdev *vdev = NULL;
+
+	wlan_peer_obj_lock(peer);
+	vdev = wlan_peer_get_vdev(peer);
+	wlan_peer_obj_unlock(peer);
+
+	wlan_vdev_obj_lock(vdev);
+	pdev = wlan_vdev_get_pdev(vdev);
+	wlan_vdev_obj_unlock(vdev);
+
+	return cdp_peer_is_inact(ol_if_pdev_get_soc_txhandle(pdev),
+				 (void *)(ol_if_peer_get_txrx_handle(peer)));
+}
+
+u_int32_t son_ol_get_peer_rate(struct wlan_objmgr_peer *peer, u_int8_t type)
+{
+	return ol_if_peer_get_rate(peer, type);
+}
+
+
+bool son_ol_enable(struct wlan_objmgr_pdev *pdev, bool enable)
+{
+
+	return cdp_start_inact_timer(ol_if_pdev_get_soc_txhandle(pdev),
+				(void *)(ol_if_pdev_get_soc_pdev_handle(pdev)),
+				enable);
+}
+
+/* Function pointer to set overload status */
+void son_ol_set_overload(struct wlan_objmgr_pdev *pdev, bool overload)
+{
+	return cdp_set_overload(ol_if_pdev_get_soc_txhandle(pdev),
+				(void *)(ol_if_pdev_get_soc_pdev_handle(pdev)),
+				overload);
+}
+/* Function pointer to set band steering parameters */
+bool son_ol_set_params(struct wlan_objmgr_pdev *pdev,
+			    u_int32_t inactivity_check_period,
+			    u_int32_t inactivity_threshold_normal,
+			    u_int32_t inactivity_threshold_overload)
+{
+
+	return cdp_set_inact_params(ol_if_pdev_get_soc_txhandle(pdev),
+				(void *)ol_if_pdev_get_soc_pdev_handle(pdev),
+				inactivity_check_period,
+				inactivity_threshold_normal,
+				inactivity_threshold_overload);
+}
+
+int8_t son_ol_sanitize_util_invtl(struct wlan_objmgr_pdev *pdev,
+				  u_int32_t *sample_period,
+				  u_int32_t *num_of_sample)
+{
+	return EOK;
+}
+
+QDF_STATUS son_ol_send_null(struct wlan_objmgr_pdev *pdev,
+			 u_int8_t *macaddr,
+			 struct wlan_objmgr_vdev *vdev)
+{
+	struct stats_request_params param = {0};
+	struct wlan_objmgr_psoc *psoc = NULL;
+
+	wlan_pdev_obj_lock(pdev);
+	psoc = wlan_pdev_get_psoc(pdev);
+	wlan_pdev_obj_unlock(pdev);
+
+	if( !psoc)
+		return QDF_STATUS_E_FAILURE;
+
+	param.vdev_id = wlan_vdev_get_id(vdev);
+	param.stats_id = WMI_HOST_REQUEST_INST_STAT;
+
+	return wmi_unified_stats_request_send(psoc->tgt_if_handle,
+					      macaddr, &param);
+}
+
+int son_ol_lmac_create(struct wlan_objmgr_pdev *pdev)
+{
+	return EOK;
+}
+
+int son_ol_lmac_destroy(struct wlan_objmgr_pdev *pdev)
+{
+	return EOK;
+
+}
+
+void  son_ol_rx_rssi_update(struct wlan_objmgr_pdev *pdev, u_int8_t *macaddres,
+			    u_int8_t status, int8_t rssi, u_int8_t subtype)
+{
+	return;
+
+}
+
+void son_ol_rx_rate_update(struct wlan_objmgr_pdev *pdev, u_int8_t *macaddres,
+			   u_int8_t status, u_int32_t rateKbps)
+{
+	return;
+}
+
+void target_if_son_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
+{
+	/* wlan son related function handler */
+	tx_ops->son_tx_ops.son_enable = son_ol_enable;
+	tx_ops->son_tx_ops.set_overload = son_ol_set_overload;
+	tx_ops->son_tx_ops.set_params = son_ol_set_params;
+	tx_ops->son_tx_ops.lmac_create = son_ol_lmac_create;
+	tx_ops->son_tx_ops.lmac_destroy = son_ol_lmac_destroy;
+	tx_ops->son_tx_ops.son_send_null = son_ol_send_null;
+	tx_ops->son_tx_ops.son_rssi_update = son_ol_rx_rssi_update;
+	tx_ops->son_tx_ops.son_rate_update = son_ol_rx_rate_update;
+	tx_ops->son_tx_ops.son_sanity_util_intvl = son_ol_sanitize_util_invtl;
+	tx_ops->son_tx_ops.get_peer_rate = son_ol_get_peer_rate;
+	tx_ops->son_tx_ops.son_node_isinact = son_ol_is_peer_inact;
+	return;
+}
+#else
+void target_if_son_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
+{
+	return;
+}
+int8_t son_ol_sanitize_util_intvl(struct wlan_objmgr_pdev *pdev,
+				  u_int32_t *sample_period,
+				  u_int32_t *num_of_sample)
+{
+	return -EINVAL;
+
+}
+
+u_int32_t son_ol_get_peer_rate(struct wlan_objmgr_peer *peer, u_int8_t type)
+{
+	return 0;
+}
+
+
+bool son_ol_enable(struct wlan_objmgr_pdev *pdev, bool enable)
+{
+	return -EINVAL;
+
+}
+
+
+/* Function pointer to set overload status */
+
+void son_ol_set_overload(struct wlan_objmgr_pdev *pdev, bool overload)
+{
+	return;
+}
+
+
+/* Function pointer to set band steering parameters */
+
+bool son_ol_set_params(struct wlan_objmgr_pdev *dev,
+			     u_int32_t inactivity_check_period,
+			     u_int32_t inactivity_threshold_normal,
+			     u_int32_t inactivity_threshold_overload)
+{
+	return -EINVAL;
+}
+
+
+
+QDF_STATUS son_ol_send_null(struct wlan_objmgr_pdev *pdev,
+			    u_int8_t *macaddr,
+			    struct wlan_objmgr_vdev *vdev)
+{
+	return EOK;
+}
+int8_t son_ol_sanitize_util_invtl(struct wlan_objmgr_pdev *pdev,
+				  u_int32_t *sample_period,
+				  u_int32_t *num_of_sample)
+{
+	return EOK;
+}
+
+int son_ol_lmac_create(struct wlan_objmgr_pdev *pdev)
+{
+	return EOK;
+}
+
+
+int son_ol_lmac_destroy(struct wlan_objmgr_pdev *pdev)
+{
+	return EOK;
+
+}
+
+
+void  son_ol_rx_rssi_update(struct wlan_objmgr_pdev *pdev, u_int8_t *macaddres,
+			    u_int8_t status, int8_t rssi, u_int8_t subtype)
+{
+	return;
+
+}
+
+void son_ol_rx_rate_update(struct wlan_objmgr_pdev *pdev, u_int8_t *macaddres,
+			   u_int8_t status, u_int32_t rateKbps)
+{
+	return;
+}
+
+bool son_ol_is_peer_inact(struct wlan_objmgr_peer *peer)
+{
+	return false;
+}
+#endif

+ 2 - 2
umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h

@@ -947,7 +947,7 @@ is_p2p_oui(const uint8_t *frm)
 }
 
 /**
- * is_qca_whc_oui() - If vendor IE is QCA WHC type
+ * is_qca_son_oui() - If vendor IE is QCA WHC type
  * @frm: vendor IE pointer
  * @whc_subtype: subtype
  *
@@ -956,7 +956,7 @@ is_p2p_oui(const uint8_t *frm)
  * Return: true if its QCA WHC IE
  */
 static inline bool
-is_qca_whc_oui(uint8_t *frm, uint8_t whc_subtype)
+is_qca_son_oui(uint8_t *frm, uint8_t whc_subtype)
 {
 	return (frm[1] > 4) && (LE_READ_4(frm + 2) ==
 		((QCA_OUI_WHC_TYPE << 24) | QCA_OUI)) &&

+ 1 - 0
umac/cmn_services/inc/wlan_cmn.h

@@ -133,6 +133,7 @@ enum wlan_umac_comp_id {
 	WLAN_UMAC_COMP_NAN,
 	WLAN_UMAC_COMP_DFS,
 	WLAN_UMAC_COMP_OFFCHAN_TXRX,
+	WLAN_UMAC_COMP_SON,
 	WLAN_UMAC_COMP_ID_MAX,
 };
 

+ 4 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h

@@ -207,6 +207,7 @@ typedef enum {
 	WLAN_REGULATORY_NB_ID = 22,
 	WLAN_OFFCHAN_TXRX_ID  = 23,
 	WLAN_POLICY_MGR_ID    = 24,
+	WLAN_SON_ID           = 25,
 	WLAN_REF_ID_MAX,
 } wlan_objmgr_ref_dbgid;
 
@@ -241,6 +242,9 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id)
 					"WLAN_ATF_ID",
 					"WLAN_CRYPTO_ID",
 					"WLAN_NAN_ID",
+					"WLAN_REGULATORY_SB_ID",
+					"WLAN_REGULATORY_NB_ID",
+					"WLAN_SON_ID",
 					"WLAN_REF_ID_MAX" };
 
     return (char *)strings[id];

+ 4 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -134,6 +134,10 @@
 #define WLAN_VDEV_FEXT_NO_MULCHAN           0x00200000
 	/*non-beaconing AP VAP*/
 #define WLAN_VDEV_FEXT_NON_BEACON           0x00400000
+/* SPL repeater enabled for SON*/
+#define WLAN_VDEV_FEXT_SON_SPL_RPT          0x00800000
+/* SON IE update in MGMT frame */
+#define WLAN_VDEV_FEXT_SON_INFO_UPDATE      0x01000000
 
 /* VDEV OP flags  */
   /* if the vap destroyed by user */

+ 6 - 1
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -31,12 +31,14 @@
 #ifdef WLAN_ATF_ENABLE
 #include "wlan_atf_utils_defs.h"
 #endif
+#ifdef QCA_SUPPORT_SON
+#include <wlan_son_tgt_api.h>
+#endif
 #include <reg_services_public_struct.h>
 
 #ifdef WLAN_CONV_CRYPTO_SUPPORTED
 #include "wlan_crypto_global_def.h"
 #endif
-
 /* Number of dev type: Direct attach and Offload */
 #define MAX_DEV_TYPE 2
 
@@ -546,6 +548,9 @@ struct wlan_lmac_if_tx_ops {
 #ifdef CONVERGED_P2P_ENABLE
 	struct wlan_lmac_if_p2p_tx_ops p2p;
 #endif
+#ifdef QCA_SUPPORT_SON
+	struct wlan_lmac_if_son_tx_ops son_tx_ops;
+#endif
 
 #ifdef WLAN_ATF_ENABLE
 	struct wlan_lmac_if_atf_tx_ops atf_tx_ops;

+ 2 - 2
umac/scan/dispatcher/src/wlan_scan_utils_api.c

@@ -383,8 +383,8 @@ util_scan_parse_vendor_ie(struct scan_cache_entry *scan_params,
 		scan_params->ie_list.sfa = (uint8_t *)ie;
 	} else if (is_p2p_oui((uint8_t *)ie)) {
 		scan_params->ie_list.p2p = (uint8_t *)ie;
-	} else if (is_qca_whc_oui((uint8_t *)ie,
-	   QCA_OUI_WHC_AP_INFO_SUBTYPE)) {
+	} else if (is_qca_son_oui((uint8_t *)ie,
+				  QCA_OUI_WHC_AP_INFO_SUBTYPE)) {
 		scan_params->ie_list.sonadv = (uint8_t *)ie;
 	} else if (is_ht_cap((uint8_t *)ie)) {
 		/* we only care if there isn't already an HT IE (ANA) */