Browse Source

qcacld-3.0: Add bearer switch infra

When there are more than one audio transport mediums
are available, there is a possibility to switch the
audio transport medium from one medium to another
medium.
To provide this support to switch the audio transport
medium, add a bearer switch infra in host driver.

Change-Id: I9d828d52a2c03e8e4e2c0a284ff0dd7510798dbe
CRs-Fixed: 3609864
Ashish Kumar Dhanotiya 1 year ago
parent
commit
44ac03a6ee

+ 7 - 2
Kbuild

@@ -1643,8 +1643,10 @@ MLME_INC += $(LL_SAP_INC)
 
 ifeq ($(CONFIG_WLAN_FEATURE_LL_LT_SAP), y)
 MLME_OBJS += $(LL_SAP_DIR)/dispatcher/src/wlan_ll_sap_ucfg_api.o \
+		$(LL_SAP_DIR)/dispatcher/src/wlan_ll_sap_api.o \
 		$(LL_SAP_DIR)/core/src/wlan_ll_sap_main.o \
-		$(LL_SAP_DIR)/core/src/wlan_ll_lt_sap_main.o
+		$(LL_SAP_DIR)/core/src/wlan_ll_lt_sap_main.o \
+		$(LL_SAP_DIR)/core/src/wlan_ll_lt_sap_bearer_switch.o
 endif
 
 $(call add-wlan-objs,mlme,$(MLME_OBJS))
@@ -1844,7 +1846,10 @@ POLICY_MGR_OBJS := $(POLICY_MGR_DIR)/src/wlan_policy_mgr_action.o \
 	$(POLICY_MGR_DIR)/src/wlan_policy_mgr_get_set_utils.o \
 	$(POLICY_MGR_DIR)/src/wlan_policy_mgr_init_deinit.o \
 	$(POLICY_MGR_DIR)/src/wlan_policy_mgr_ucfg.o \
-	$(POLICY_MGR_DIR)/src/wlan_policy_mgr_pcl.o \
+	$(POLICY_MGR_DIR)/src/wlan_policy_mgr_pcl.o
+ifeq ($(CONFIG_WLAN_FEATURE_LL_LT_SAP), y)
+POLICY_MGR_OBJS += $(POLICY_MGR_DIR)/src/wlan_policy_mgr_ll_sap.o
+endif
 
 $(call add-wlan-objs,policy_mgr,$(POLICY_MGR_OBJS))
 

+ 37 - 0
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_ll_sap.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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.
+ */
+
+/**
+ * DOC: contains policy manager ll_sap definitions specific to the ll_sap module
+ */
+
+#include "wlan_objmgr_psoc_obj.h"
+
+/**
+ * wlan_policy_mgr_get_ll_lt_sap_vdev() - Get ll_lt_sap vdev
+ * @psoc: PSOC object
+ *
+ * API to find ll_lt_sap vdev pointer
+ *
+ * This API increments the ref count of the vdev object internally, the
+ * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
+ * ref count
+ *
+ * Return: vdev pointer
+ *         NULL on FAILURE
+ */
+struct wlan_objmgr_vdev *
+wlan_policy_mgr_get_ll_lt_sap_vdev(struct wlan_objmgr_psoc *psoc);

+ 50 - 0
components/cmn_services/policy_mgr/src/wlan_policy_mgr_ll_sap.c

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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.
+ */
+
+/**
+ * DOC: contains policy manager ll_sap definitions specific to the ll_sap module
+ */
+
+#include "wlan_policy_mgr_ll_sap.h"
+#include "wlan_policy_mgr_public_struct.h"
+#include "wlan_policy_mgr_api.h"
+#include "wlan_policy_mgr_i.h"
+#include "wlan_cmn.h"
+
+struct wlan_objmgr_vdev *
+wlan_policy_mgr_get_ll_lt_sap_vdev(struct wlan_objmgr_psoc *psoc)
+{
+	uint8_t ll_lt_sap_cnt;
+	uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
+	struct wlan_objmgr_vdev *vdev;
+
+	ll_lt_sap_cnt = policy_mgr_get_mode_specific_conn_info(
+							psoc, NULL,
+							vdev_id_list,
+							PM_LL_LT_SAP_MODE);
+
+	/* Currently only 1 ll_lt_sap is supported */
+	if (ll_lt_sap_cnt != 1) {
+		policy_mgr_err("invalid number of ll_lt_sap %d", ll_lt_sap_cnt);
+		return NULL;
+	}
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id_list[0],
+						    WLAN_LL_SAP_ID);
+	if (!vdev)
+		policy_mgr_err("vdev is NULL");
+	return vdev;
+}

+ 39 - 0
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_bearer_switch.c

@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 "wlan_ll_sap_main.h"
+#include "wlan_ll_lt_sap_bearer_switch.h"
+
+uint32_t ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev)
+{
+	uint32_t request_id;
+	struct ll_sap_vdev_priv_obj *ll_sap_obj;
+
+	ll_sap_obj = ll_sap_get_vdev_priv_obj(vdev);
+
+	if (!ll_sap_obj) {
+		ll_sap_err("vdev %d ll_sap obj null",
+			   wlan_vdev_get_id(vdev));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	request_id = qdf_atomic_inc_return(
+				&ll_sap_obj->bearer_switch_ctx->request_id);
+
+	ll_sap_debug("bearer_switch request_id %d", request_id);
+	return request_id;
+}
+

+ 83 - 0
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_bearer_switch.h

@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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.
+ */
+
+/**
+ * DOC: contains ll_lt_sap declarations specific to the bearer
+ * switch functionalities
+ */
+
+#ifndef _WLAN_LL_LT_SAP_BEARER_SWITCH_H_
+#define _WLAN_LL_LT_SAP_BEARER_SWITCH_H_
+
+#include "wlan_ll_sap_public_structs.h"
+#include <qdf_atomic.h>
+#include "wlan_cmn.h"
+#include "wlan_ll_sap_main.h"
+
+/**
+ * enum bearer_switch_status: Bearer switch request status
+ * @XPAN_BLE_SWITCH_INIT: Init status
+ * @XPAN_BLE_SWITCH_SUCCESS: Bearer switch success
+ * @XPAN_BLE_SWITCH_REJECTED: Bearer switch is rejected
+ * @XPAN_BLE_SWITCH_TIMEOUT: Bearer switch request timed out
+ */
+enum bearer_switch_status {
+	XPAN_BLE_SWITCH_INIT,
+	XPAN_BLE_SWITCH_SUCCESS,
+	XPAN_BLE_SWITCH_REJECTED,
+	XPAN_BLE_SWITCH_TIMEOUT,
+};
+
+/**
+ * struct bearer_switch_request - Data structure to store the bearer switch
+ * request
+ * @requester_cb: Callback which needs to be invoked to indicate the status of
+ * the request to the requester, this callback will be passed by the requester
+ * when requester will send the request.
+ * @arg: Argument passed by requester, this will be returned back in the
+ * callback
+ * @request_id: Unique value to identify the request
+ */
+
+struct bearer_switch_request {
+	requester_callback requester_cb;
+	void *arg;
+	uint32_t request_id;
+};
+
+/**
+ * struct bearer_switch_info - Data structure to store the bearer switch
+ * requests and related information
+ * @request_id: Last allocated request id
+ * @ref_count: Reference count corresponding to each vdev and requester
+ * @last_status: last status of the bearer switch request
+ * @requests: Array of bearer_switch_requests to cache the request information
+ */
+struct bearer_switch_info {
+	qdf_atomic_t request_id;
+	uint8_t ref_count[WLAN_UMAC_PSOC_MAX_VDEVS][XPAN_BLE_SWITCH_REQUESTER_MAX];
+	enum bearer_switch_status last_status;
+	struct bearer_switch_request requests[MAX_BEARER_SWITCH_REQUESTERS];
+};
+
+/**
+ * ll_lt_sap_bearer_switch_get_id() - Get the request id for bearer switch
+ * request
+ * @vdev: Pointer to vdev
+ * Return: Bearer switch request id
+ */
+uint32_t ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev);
+#endif /* _WLAN_LL_LT_SAP_BEARER_SWITCH_H_ */

+ 44 - 0
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.c

@@ -17,6 +17,8 @@
 #include "wlan_ll_lt_sap_main.h"
 #include "wlan_scan_ucfg_api.h"
 #include "wlan_mlme_vdev_mgr_interface.h"
+#include "wlan_ll_sap_main.h"
+#include "wlan_ll_lt_sap_bearer_switch.h"
 
 bool ll_lt_sap_is_supported(void)
 {
@@ -69,3 +71,45 @@ rel_ref:
 
 	return status;
 }
+
+QDF_STATUS ll_lt_sap_init(struct wlan_objmgr_vdev *vdev)
+{
+	struct ll_sap_vdev_priv_obj *ll_sap_obj;
+
+	ll_sap_obj = ll_sap_get_vdev_priv_obj(vdev);
+
+	if (!ll_sap_obj) {
+		ll_sap_err("vdev %d ll_sap obj null",
+			   wlan_vdev_get_id(vdev));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	ll_sap_obj->bearer_switch_ctx =
+			qdf_mem_malloc(sizeof(struct bearer_switch_info));
+	if (!ll_sap_obj->bearer_switch_ctx)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_atomic_init(&ll_sap_obj->bearer_switch_ctx->request_id);
+	ll_sap_debug("vdev %d", wlan_vdev_get_id(vdev));
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ll_lt_sap_deinit(struct wlan_objmgr_vdev *vdev)
+{
+	struct ll_sap_vdev_priv_obj *ll_sap_obj;
+
+	ll_sap_obj = ll_sap_get_vdev_priv_obj(vdev);
+
+	if (!ll_sap_obj) {
+		ll_sap_err("vdev %d ll_sap obj null",
+			   wlan_vdev_get_id(vdev));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (ll_sap_obj->bearer_switch_ctx)
+		qdf_mem_free(ll_sap_obj->bearer_switch_ctx);
+	ll_sap_debug("vdev %d", wlan_vdev_get_id(vdev));
+
+	return QDF_STATUS_SUCCESS;
+}

+ 20 - 0
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.h

@@ -23,6 +23,9 @@
 
 #include "wlan_ll_sap_main.h"
 #include "wlan_mlme_public_struct.h"
+#include <i_qdf_types.h>
+#include <qdf_types.h>
+#include "wlan_ll_sap_main.h"
 
 /**
  * ll_lt_sap_is_supported() - Check if ll_lt_sap is supported or not
@@ -44,4 +47,21 @@ QDF_STATUS ll_lt_sap_get_sorted_user_config_acs_ch_list(
 					struct wlan_objmgr_psoc *psoc,
 					uint8_t vdev_id,
 					struct sap_sel_ch_info *ch_info);
+/*
+ * ll_lt_sap_init() - Initialize ll_lt_sap infrastructure
+ * @vdev: Pointer to vdev
+ *
+ * Return: QDF_STATUS_SUCCESS if ll_lt_sap infra initialized successfully else
+ * error code
+ */
+QDF_STATUS ll_lt_sap_init(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * ll_lt_sap_deinit() - De-initialize ll_lt_sap infrastructure
+ * @vdev: Pointer to vdev
+ *
+ * Return: QDF_STATUS_SUCCESS if ll_lt_sap infra de-initialized successfully
+ * else error code
+ */
+QDF_STATUS ll_lt_sap_deinit(struct wlan_objmgr_vdev *vdev);
 #endif /* _WLAN_LL_SAP_MAIN_H_ */

+ 131 - 3
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c

@@ -17,6 +17,7 @@
 #include "wlan_ll_sap_main.h"
 #include <wlan_objmgr_global_obj.h>
 #include "qca_vendor.h"
+#include "wlan_ll_lt_sap_main.h"
 
 static QDF_STATUS ll_sap_psoc_obj_created_notification(struct wlan_objmgr_psoc *psoc, void *arg_list)
 {
@@ -39,6 +40,75 @@ static QDF_STATUS ll_sap_psoc_obj_destroyed_notification(struct wlan_objmgr_psoc
 	/* detach ll_sap_psoc object which will contain cfg items,
 	 * tx and rx ops
 	 */
+	return status;
+}
+
+static QDF_STATUS ll_sap_vdev_obj_created_notification(
+				struct wlan_objmgr_vdev *vdev, void *arg_list)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct ll_sap_vdev_priv_obj *ll_sap_obj;
+
+	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_SAP_MODE)
+		return QDF_STATUS_SUCCESS;
+
+	ll_sap_obj = qdf_mem_malloc(sizeof(*ll_sap_obj));
+	if (!ll_sap_obj)
+		return QDF_STATUS_E_NOMEM;
+
+	status = wlan_objmgr_vdev_component_obj_attach(
+						vdev,
+						WLAN_UMAC_COMP_LL_SAP,
+						(void *)ll_sap_obj,
+						QDF_STATUS_SUCCESS);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		ll_sap_err("vdev %d obj attach failed", wlan_vdev_get_id(vdev));
+		goto ll_sap_vdev_attach_failed;
+	}
+
+	status = ll_lt_sap_init(vdev);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto ll_sap_init_failed;
+
+	return status;
+
+ll_sap_init_failed:
+	wlan_objmgr_vdev_component_obj_detach(vdev,
+					      WLAN_UMAC_COMP_LL_SAP,
+					      ll_sap_obj);
+
+ll_sap_vdev_attach_failed:
+	qdf_mem_free(ll_sap_obj);
+	return status;
+}
+
+static QDF_STATUS ll_sap_vdev_obj_destroyed_notification(
+				struct wlan_objmgr_vdev *vdev, void *arg_list)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct ll_sap_vdev_priv_obj *ll_sap_obj;
+
+	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_SAP_MODE)
+		return QDF_STATUS_SUCCESS;
+
+	ll_sap_obj = ll_sap_get_vdev_priv_obj(vdev);
+
+	if (!ll_sap_obj) {
+		ll_sap_err("vdev %d ll sap obj null",
+			   wlan_vdev_get_id(vdev));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	status = wlan_objmgr_vdev_component_obj_detach(vdev,
+						       WLAN_UMAC_COMP_LL_SAP,
+						       ll_sap_obj);
+	if (QDF_IS_STATUS_ERROR(status))
+		ll_sap_err("vdev %d ll sap obj detach failed, status %d",
+			   wlan_vdev_get_id(vdev), status);
+
+	ll_lt_sap_deinit(vdev);
+
+	qdf_mem_free(ll_sap_obj);
 
 	return status;
 }
@@ -62,10 +132,48 @@ QDF_STATUS ll_sap_init(void)
 							   NULL);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		ll_sap_err("objmgr_register_psoc_destroy_handler failed");
-		wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_LL_SAP,
-							   ll_sap_psoc_obj_created_notification,
-							   NULL);
+		goto err_psoc_destroy_reg;
+	}
+
+	/* register vdev create handler functions. */
+	status = wlan_objmgr_register_vdev_create_handler(
+		WLAN_UMAC_COMP_LL_SAP,
+		ll_sap_vdev_obj_created_notification,
+		NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		ll_sap_err("objmgr_register_vdev_create_handler failed");
+		goto err_vdev_create_reg;
+	}
+
+	/* register vdev delete handler functions. */
+	status = wlan_objmgr_register_vdev_destroy_handler(
+		WLAN_UMAC_COMP_LL_SAP,
+		ll_sap_vdev_obj_destroyed_notification,
+		NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		ll_sap_err("objmgr_register_vdev_destroy_handler failed");
+		goto err_vdev_destroy_reg;
 	}
+
+	return status;
+err_vdev_destroy_reg:
+	wlan_objmgr_unregister_vdev_create_handler(
+					WLAN_UMAC_COMP_LL_SAP,
+					ll_sap_vdev_obj_created_notification,
+					NULL);
+
+err_vdev_create_reg:
+	wlan_objmgr_unregister_psoc_destroy_handler(
+					WLAN_UMAC_COMP_LL_SAP,
+					ll_sap_psoc_obj_destroyed_notification,
+					NULL);
+
+err_psoc_destroy_reg:
+	wlan_objmgr_unregister_psoc_create_handler(
+					WLAN_UMAC_COMP_LL_SAP,
+					ll_sap_psoc_obj_created_notification,
+					NULL);
+
 	return status;
 }
 
@@ -73,6 +181,26 @@ QDF_STATUS ll_sap_deinit(void)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS, status;
 
+	/* de-register vdev delete handler functions. */
+	status = wlan_objmgr_unregister_vdev_destroy_handler(
+					WLAN_UMAC_COMP_LL_SAP,
+					ll_sap_vdev_obj_destroyed_notification,
+					NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		ll_sap_err("objmgr_unregister_vdev_destroy_handler failed");
+		ret = status;
+	}
+
+	/* de-register vdev create handler functions. */
+	status = wlan_objmgr_unregister_vdev_create_handler(
+					WLAN_UMAC_COMP_LL_SAP,
+					ll_sap_vdev_obj_created_notification,
+					NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		ll_sap_err("objmgr_unregister_vdev_create_handler failed");
+		ret = status;
+	}
+
 	/* unregister psoc destroy handler functions. */
 	status = wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_LL_SAP,
 							     ll_sap_psoc_obj_destroyed_notification,

+ 31 - 0
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.h

@@ -22,6 +22,7 @@
 #define _WLAN_LL_SAP_MAIN_H_
 
 #include "wlan_objmgr_psoc_obj.h"
+#include "wlan_objmgr_vdev_obj.h"
 
 #define ll_sap_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_LL_SAP, params)
 #define ll_sap_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_LL_SAP, params)
@@ -34,6 +35,36 @@
 #define ll_sap_nofl_debug(params...) \
 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_LL_SAP, params)
 
+/**
+ * struct ll_sap_vdev_priv_obj - ll sap private vdev obj
+ * @bearer_switch_ctx: Bearer switch context
+ */
+struct ll_sap_vdev_priv_obj {
+	struct bearer_switch_info *bearer_switch_ctx;
+};
+
+/**
+ * ll_sap_get_vdev_priv_obj: get ll_sap priv object from vdev object
+ * @vdev: pointer to vdev object
+ *
+ * Return: pointer to ll_sap vdev private object
+ */
+static inline
+struct ll_sap_vdev_priv_obj *ll_sap_get_vdev_priv_obj(
+						struct wlan_objmgr_vdev *vdev)
+{
+	struct ll_sap_vdev_priv_obj *obj;
+
+	if (!vdev) {
+		ll_sap_err("vdev is null");
+		return NULL;
+	}
+	obj = wlan_objmgr_vdev_get_comp_private_obj(vdev,
+						    WLAN_UMAC_COMP_LL_SAP);
+
+	return obj;
+}
+
 /**
  * ll_sap_init() - initializes ll_sap component
  *

+ 45 - 0
components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_api.h

@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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.
+ */
+
+/**
+ * DOC: contains ll_lt_sap API definitions specific to the bearer
+ * switch functionalities
+ */
+
+#ifndef _WLAN_LL_LT_SAP_API_H_
+#define _WLAN_LL_LT_SAP_API_H_
+
+#include <wlan_cmn.h>
+#include <wlan_objmgr_vdev_obj.h>
+
+#ifdef WLAN_FEATURE_LL_LT_SAP
+
+/**
+ * wlan_ll_lt_sap_bearer_switch_get_id() - Get the request id for bearer switch
+ * request
+ * @vdev: Pointer to vdev
+ * Return: Bearer switch request id
+ */
+uint32_t wlan_ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev);
+#else
+
+static inline uint32_t
+wlan_ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev)
+{
+	return 0;
+}
+#endif /* WLAN_FEATURE_LL_LT_SAP */
+#endif /* _WLAN_LL_LT_SAP_API_H_ */

+ 61 - 0
components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_public_structs.h

@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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.
+ */
+
+/**
+ * DOC: contains ll_lt_sap structure definitions specific to the bearer
+ * switch functionalities
+ */
+
+#ifndef _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_
+#define _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_
+
+#include "wlan_objmgr_psoc_obj.h"
+#include <qdf_status.h>
+
+/* Indicates MAX bearer switch requesters at a time */
+#define MAX_BEARER_SWITCH_REQUESTERS 5
+
+/**
+ * enum bearer_switch_requester_source: Bearer switch requester source
+ * @XPAN_BLE_SWITCH_REQUESTER_CONNECT: Bearer switch requester is connect
+ * @XPAN_BLE_SWITCH_REQUESTER_CSA: Bearer switch requester is CSA
+ * @XPAN_BLE_SWITCH_REQUESTER_FW: Bearer switch requester is FW
+ * @XPAN_BLE_SWITCH_REQUESTER_MAX: Indicates MAX bearer switch requester
+ */
+enum bearer_switch_requester_source {
+	XPAN_BLE_SWITCH_REQUESTER_CONNECT,
+	XPAN_BLE_SWITCH_REQUESTER_CSA,
+	XPAN_BLE_SWITCH_REQUESTER_FW,
+	XPAN_BLE_SWITCH_REQUESTER_MAX,
+};
+
+ /**
+  * typedef requester_callback() - Callback function, which will be invoked with
+  * the bearer switch request status.
+  * @psoc: Psoc pointer
+  * @request_id: Request ID
+  * @status: Status of the bearer switch request
+  * @request_params: Request params for the bearer switch request
+  *
+  * Return: None
+  */
+
+typedef void (*requester_callback)(struct wlan_objmgr_psoc *psoc,
+				    uint8_t vdev_id, uint32_t request_id,
+				    QDF_STATUS status,
+				    void *request_params);
+
+#endif /* _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_ */

+ 24 - 0
components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_api.c

@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 "wlan_ll_sap_api.h"
+#include <../../core/src/wlan_ll_lt_sap_bearer_switch.h>
+#include <../../core/src/wlan_ll_lt_sap_main.h>
+
+uint32_t wlan_ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev)
+{
+	return ll_lt_sap_bearer_switch_get_id(vdev);
+}

+ 3 - 0
wlan_qcacld3_modules.bzl

@@ -2091,9 +2091,12 @@ _conditional_srcs = {
     },
     "CONFIG_WLAN_FEATURE_LL_LT_SAP": {
         True: [
+            "components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_api.c",
             "components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_ucfg_api.c",
+            "components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_bearer_switch.c",
             "components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.c",
             "components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c",
+            "components/cmn_services/policy_mgr/src/wlan_policy_mgr_ll_sap.c",
         ],
     },
 }