Bläddra i källkod

qcacld-3.0: Register os_if callback with the bearer switch state machine

Based on the new requirement, host driver needs to send the audio
transport switch request from host driver to user space, to
support this requirement, register os_if callback function with
bearer switch state machine

Change-Id: Ib94ff4d9876e79d984401262253602c975b0fb1e
CRs-Fixed: 3626952
Ashish Kumar Dhanotiya 1 år sedan
förälder
incheckning
8e04c8446a

+ 4 - 1
Kbuild

@@ -1636,8 +1636,10 @@ MLME_OBJS += $(WFA_TGT_IF_DIR)/src/target_if_wfa_testcmd.o \
 
 ####### LL_SAP #######
 LL_SAP_DIR := components/umac/mlme/sap/ll_sap
+LL_SAP_OS_IF_DIR := os_if/mlme/sap/ll_sap
 
 LL_SAP_INC := -I$(WLAN_ROOT)/$(LL_SAP_DIR)/dispatcher/inc \
+		-I$(WLAN_ROOT)/$(LL_SAP_OS_IF_DIR)/inc
 
 MLME_INC += $(LL_SAP_INC)
 
@@ -1646,7 +1648,8 @@ 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_bearer_switch.o
+		$(LL_SAP_DIR)/core/src/wlan_ll_lt_sap_bearer_switch.o \
+		$(LL_SAP_OS_IF_DIR)/src/os_if_ll_sap.o
 endif
 
 $(call add-wlan-objs,mlme,$(MLME_OBJS))

+ 19 - 1
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.c

@@ -150,6 +150,24 @@ QDF_STATUS ll_lt_sap_switch_bearer_to_ble(
 				struct wlan_objmgr_psoc *psoc,
 				struct wlan_bearer_switch_request *bs_request)
 {
-	return bs_sm_deliver_event(psoc, WLAN_BS_SM_EV_SWITCH_TO_WLAN,
+	return bs_sm_deliver_event(psoc, WLAN_BS_SM_EV_SWITCH_TO_NON_WLAN,
 				   sizeof(*bs_request), bs_request);
 }
+
+QDF_STATUS ll_lt_sap_request_for_audio_transport_switch(
+					enum bearer_switch_req_type req_type)
+{
+	/*
+	 * return status as QDF_STATUS_SUCCESS or failure based on the current
+	 * pending requests of the transport switch
+	 */
+	if (req_type == WLAN_BS_REQ_TO_NON_WLAN) {
+		ll_sap_debug("request SWITCH_TYPE_NON_WLAN accepted");
+		return QDF_STATUS_SUCCESS;
+	} else if (req_type == WLAN_BS_REQ_TO_WLAN) {
+		ll_sap_debug("request SWITCH_TYPE_WLAN accepted");
+		return QDF_STATUS_SUCCESS;
+	}
+
+	return QDF_STATUS_E_RESOURCES;
+}

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

@@ -76,4 +76,13 @@ QDF_STATUS
 ll_lt_sap_switch_bearer_to_ble(struct wlan_objmgr_psoc *psoc,
 			       struct wlan_bearer_switch_request *bs_request);
 
+/**
+ * ll_lt_sap_request_for_audio_transport_switch() - Handls audio transport
+ * switch request from userspace
+ * @req_type: requested transport switch type
+ *
+ * Return: True/False
+ */
+QDF_STATUS ll_lt_sap_request_for_audio_transport_switch(
+					enum bearer_switch_req_type req_type);
 #endif /* _WLAN_LL_SAP_MAIN_H_ */

+ 8 - 16
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c

@@ -19,6 +19,8 @@
 #include "qca_vendor.h"
 #include "wlan_ll_lt_sap_main.h"
 
+struct ll_sap_ops *global_ll_sap_ops;
+
 static QDF_STATUS ll_sap_psoc_obj_created_notification(struct wlan_objmgr_psoc *psoc, void *arg_list)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -222,22 +224,12 @@ QDF_STATUS ll_sap_deinit(void)
 	return ret;
 }
 
-QDF_STATUS ll_lt_sap_request_for_audio_transport_switch(
-						uint8_t transport_switch_type)
+void ll_sap_register_os_if_cb(struct ll_sap_ops *ll_sap_global_ops)
 {
-	/*
-	 * return status as QDF_STATUS_SUCCESS or failure based on the current
-	 * pending requests of the transport switch
-	 */
-	if (transport_switch_type ==
-		QCA_WLAN_AUDIO_TRANSPORT_SWITCH_TYPE_NON_WLAN) {
-		ll_sap_debug("request SWITCH_TYPE_NON_WLAN accepted");
-		return QDF_STATUS_SUCCESS;
-	} else if (transport_switch_type ==
-				QCA_WLAN_AUDIO_TRANSPORT_SWITCH_TYPE_WLAN) {
-		ll_sap_debug("request SWITCH_TYPE_WLAN accepted");
-		return QDF_STATUS_SUCCESS;
-	}
+	global_ll_sap_ops = ll_sap_global_ops;
+}
 
-	return QDF_STATUS_E_RESOURCES;
+void ll_sap_unregister_os_if_cb(void)
+{
+	global_ll_sap_ops = NULL;
 }

+ 11 - 6
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.h

@@ -23,6 +23,7 @@
 
 #include "wlan_objmgr_psoc_obj.h"
 #include "wlan_objmgr_vdev_obj.h"
+#include "wlan_ll_sap_public_structs.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)
@@ -80,13 +81,17 @@ QDF_STATUS ll_sap_init(void);
 QDF_STATUS ll_sap_deinit(void);
 
 /**
- * ll_lt_sap_request_for_audio_transport_switch() - Check if audio transport
- * switch request can be supported or not
- * @transport_switch_type: requested transport switch type
+ * ll_sap_register_os_if_cb() - Register ll_sap osif callbacks
+ * @ll_sap_global_ops: Ops which needs to be registered
  *
- * Return: True/False
+ * Return: None
  */
-QDF_STATUS ll_lt_sap_request_for_audio_transport_switch(
-						uint8_t transport_switch_type);
+void ll_sap_register_os_if_cb(struct ll_sap_ops *ll_sap_global_ops);
 
+/**
+ * ll_sap_unregister_os_if_cb() - Un-register ll_sap osif callbacks
+ *
+ * Return: None
+ */
+void ll_sap_unregister_os_if_cb(void);
 #endif /* _WLAN_LL_SAP_MAIN_H_ */

+ 15 - 3
components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_public_structs.h

@@ -32,12 +32,12 @@ typedef uint32_t wlan_bs_req_id;
 
 /**
  * enum bearer_switch_req_type: Bearer switch request type
- * @WLAN_BS_REQ_TO_WLAN: Bearer switch request to wlan
  * @WLAN_BS_REQ_TO_NON_WLAN: Bearer switch request to non-wlan
+ * @WLAN_BS_REQ_TO_WLAN: Bearer switch request to wlan
  */
 enum bearer_switch_req_type {
-	WLAN_BS_REQ_TO_WLAN = 0,
-	WLAN_BS_REQ_TO_NON_WLAN = 1,
+	WLAN_BS_REQ_TO_NON_WLAN = 0,
+	WLAN_BS_REQ_TO_WLAN = 1,
 };
 
 /**
@@ -58,6 +58,7 @@ enum bearer_switch_req_source {
  * typedef bearer_switch_requester_cb() - Callback function, which will
  * be invoked with the bearer switch request status.
  * @psoc: Psoc pointer
+ * @vdev_id: Vdev id of the requester
  * @request_id: Request ID
  * @status: Status of the bearer switch request
  * @req_value: Request value for the bearer switch request
@@ -98,4 +99,15 @@ struct wlan_bearer_switch_request {
 	void *arg;
 };
 
+/**
+ * struct ll_sap_ops - ll_sap osif callbacks
+ * @ll_sap_send_audio_transport_switch_req_cb: Send audio transport request to
+ * userspace
+ */
+struct ll_sap_ops {
+		void (*ll_sap_send_audio_transport_switch_req_cb)(
+					struct wlan_objmgr_vdev *vdev,
+					enum bearer_switch_req_type req_type);
+};
+
 #endif /* _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_ */

+ 28 - 3
components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_ucfg_api.h

@@ -22,6 +22,7 @@
 
 #ifndef _WLAN_LL_SAP_UCFG_API_H_
 #define _WLAN_LL_SAP_UCFG_API_H_
+#include "wlan_ll_sap_public_structs.h"
 
 #ifdef WLAN_FEATURE_LL_LT_SAP
 
@@ -49,12 +50,27 @@ bool ucfg_is_ll_lt_sap_supported(void);
 /**
  * ucfg_ll_lt_sap_request_for_audio_transport_switch() - Request to switch the
  * audio transport medium
- * @transport_switch_type: Requested transport switch type
+ * @req_type: Requested transport switch type
  *
  * Return: Accepted/Rejected
  */
 QDF_STATUS ucfg_ll_lt_sap_request_for_audio_transport_switch(
-						uint8_t transport_switch_type);
+					enum bearer_switch_req_type req_type);
+
+/**
+ * ucfg_ll_sap_register_cb() - Register ll_sap osif callbacks
+ * @ll_sap_global_ops: Ops which needs to be registered
+ *
+ * Return: None
+ */
+void ucfg_ll_sap_register_cb(struct ll_sap_ops *ll_sap_global_ops);
+
+/**
+ * ucfg_ll_sap_unregister_cb() - Un-register ll_sap osif callbacks
+ *
+ * Return: None
+ */
+void ucfg_ll_sap_unregister_cb(void);
 
 #else
 static inline QDF_STATUS ucfg_ll_sap_init(void)
@@ -73,11 +89,20 @@ static inline bool ucfg_is_ll_lt_sap_supported(void)
 }
 
 static inline QDF_STATUS
-ucfg_ll_lt_sap_request_for_audio_transport_switch(uint8_t transport_switch_type)
+ucfg_ll_lt_sap_request_for_audio_transport_switch(
+					enum bearer_switch_req_type req_type)
 {
 	return QDF_STATUS_E_INVAL;
 }
 
+static inline void ucfg_ll_sap_register_cb(struct ll_sap_ops *ll_sap_global_ops)
+{
+}
+
+static inline void ucfg_ll_sap_unregister_cb(void)
+{
+}
+
 #endif /* WLAN_FEATURE_LL_LT_SAP */
 #endif /* _WLAN_LL_SAP_UCFG_API_H_ */
 

+ 12 - 3
components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_ucfg_api.c

@@ -39,9 +39,18 @@ bool ucfg_is_ll_lt_sap_supported(void)
 }
 
 QDF_STATUS ucfg_ll_lt_sap_request_for_audio_transport_switch(
-						uint8_t transport_switch_type)
+					enum bearer_switch_req_type req_type)
 {
-	return ll_lt_sap_request_for_audio_transport_switch(
-							transport_switch_type);
+	return ll_lt_sap_request_for_audio_transport_switch(req_type);
+}
+
+void ucfg_ll_sap_register_cb(struct ll_sap_ops *ll_sap_global_ops)
+{
+	ll_sap_register_os_if_cb(ll_sap_global_ops);
+}
+
+void ucfg_ll_sap_unregister_cb(void)
+{
+	ll_sap_unregister_os_if_cb();
 }
 

+ 0 - 12
core/hdd/inc/wlan_hdd_ll_lt_sap.h

@@ -57,16 +57,4 @@ int wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
 						 const void *data,
 						 int data_len);
 
-/**
- * wlan_hdd_send_audio_transport_switch_req_event() - Audio transport switch
- * event
- * @adapter:              pointer to adapter structure.
- * @audio_switch_mode:    audio switch mode.
- *
- * Return:   Return the Success or Failure code.
- */
-int wlan_hdd_send_audio_transport_switch_req_event(struct hdd_adapter *adapter,
-						   uint8_t audio_switch_mode);
-
-
 #endif /* __WLAN_HDD_LL_LT_SAP_H */

+ 4 - 50
core/hdd/src/wlan_hdd_ll_lt_sap.c

@@ -24,6 +24,7 @@
 #include "wlan_ll_sap_ucfg_api.h"
 #include "osif_sync.h"
 #include "wlan_hdd_cfg80211.h"
+#include "os_if_ll_sap.h"
 
 const struct nla_policy
 	wlan_hdd_ll_lt_sap_transport_switch_policy
@@ -54,8 +55,8 @@ __wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_MAX + 1];
-	uint8_t transport_switch_type;
-	uint8_t transport_switch_status;
+	enum qca_wlan_audio_transport_switch_type transport_switch_type;
+	enum qca_wlan_audio_transport_switch_status transport_switch_status;
 	QDF_STATUS status;
 
 	hdd_enter_dev(dev);
@@ -87,7 +88,7 @@ __wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
 			tb[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE]);
 
 	if (!tb[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_STATUS]) {
-		status = ucfg_ll_lt_sap_request_for_audio_transport_switch(
+		status = osif_ll_lt_sap_request_for_audio_transport_switch(
 							transport_switch_type);
 		hdd_debug("Transport switch request type %d status %d",
 			  transport_switch_type, status);
@@ -111,53 +112,6 @@ __wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
 	return -EINVAL;
 }
 
-int wlan_hdd_send_audio_transport_switch_req_event(struct hdd_adapter *adapter,
-						   uint8_t audio_switch_mode)
-{
-	struct sk_buff *vendor_event;
-	struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
-	uint32_t len;
-
-	hdd_enter();
-
-	if (wlan_hdd_validate_context(hdd_ctx)) {
-		hdd_err("Invalid context");
-		return -EINVAL;
-	}
-	if (hdd_validate_adapter(adapter)) {
-		hdd_err("Invalid adapter");
-		return -EINVAL;
-	}
-
-	len = nla_total_size(sizeof(uint8_t)) + NLMSG_HDRLEN;
-
-	vendor_event = wlan_cfg80211_vendor_event_alloc(
-			hdd_ctx->wiphy,
-			&adapter->wdev,
-			len,
-			QCA_NL80211_VENDOR_SUBCMD_AUDIO_TRANSPORT_SWITCH_INDEX,
-			GFP_KERNEL);
-
-	if (!vendor_event) {
-		hdd_err("wlan_cfg80211_vendor_event_alloc failed");
-		return -ENOMEM;
-	}
-
-	if (nla_put_u8(vendor_event,
-		       QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE,
-		       audio_switch_mode)) {
-		hdd_err("VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE put fail");
-		wlan_cfg80211_vendor_free_skb(vendor_event);
-		return -EINVAL;
-	}
-
-	wlan_cfg80211_vendor_event(vendor_event, GFP_KERNEL);
-
-	hdd_debug("transport switch request sent on %s interface",
-		   netdev_name(adapter->dev));
-	return 0;
-}
-
 int wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
 						 struct wireless_dev *wdev,
 						 const void *data,

+ 28 - 0
core/hdd/src/wlan_hdd_main.c

@@ -248,6 +248,7 @@
 #include "os_if_dp_local_pkt_capture.h"
 #include <wlan_mlo_mgr_link_switch.h>
 #include "cdp_txrx_mon.h"
+#include "os_if_ll_sap.h"
 
 #ifdef MULTI_CLIENT_LL_SUPPORT
 #define WLAM_WLM_HOST_DRIVER_PORT_ID 0xFFFFFF
@@ -18982,6 +18983,26 @@ static void hdd_vdev_mgr_unregister_cb(void)
 	osif_vdev_mgr_reset_legacy_cb();
 }
 
+/**
+ * hdd_ll_sap_register_cb() - Register ll_sap osif callbacks
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS hdd_ll_sap_register_cb(void)
+{
+	return osif_ll_sap_register_cb();
+}
+
+/**
+ * hdd_ll_sap_unregister_cb() - Un-register ll_sap osif callbacks
+ *
+ * Return: void
+ */
+static void hdd_ll_sap_unregister_cb(void)
+{
+	osif_ll_sap_unregister_cb();
+}
+
 /**
  * hdd_component_cb_init() - Initialize component callbacks
  *
@@ -19011,8 +19032,14 @@ static QDF_STATUS hdd_component_cb_init(void)
 	if (QDF_IS_STATUS_ERROR(status))
 		goto hdd_vdev_mgr_unregister_cb;
 
+	status = hdd_ll_sap_register_cb();
+	if (QDF_IS_STATUS_ERROR(status))
+		goto pre_cac_unregister_cb;
+
 	return QDF_STATUS_SUCCESS;
 
+pre_cac_unregister_cb:
+	hdd_pre_cac_unregister_cb();
 hdd_vdev_mgr_unregister_cb:
 	hdd_vdev_mgr_unregister_cb();
 cm_unregister_cb:
@@ -19030,6 +19057,7 @@ cm_unregister_cb:
  */
 static void hdd_component_cb_deinit(void)
 {
+	hdd_ll_sap_unregister_cb();
 	hdd_pre_cac_unregister_cb();
 	hdd_vdev_mgr_unregister_cb();
 	hdd_cm_unregister_cb();

+ 61 - 0
os_if/mlme/sap/ll_sap/inc/os_if_ll_sap.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
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: contains ll_sap definitions specific to the ll_sap module
+ */
+
+#ifndef __OS_IF_LL_SAP_H__
+#define __OS_IF_LL_SAP_H__
+
+#include "qdf_types.h"
+#include "qca_vendor.h"
+
+#ifdef WLAN_FEATURE_LL_LT_SAP
+
+/**
+ * osif_ll_sap_register_cb() - Register ll_sap osif callbacks
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS osif_ll_sap_register_cb(void);
+
+/**
+ * osif_ll_sap_unregister_cb() - un-register ll_sap osif callbacks
+ *
+ * Return: QDF_STATUS
+ */
+void osif_ll_sap_unregister_cb(void);
+
+QDF_STATUS osif_ll_lt_sap_request_for_audio_transport_switch(
+			enum qca_wlan_audio_transport_switch_type req_type);
+
+#else
+static inline QDF_STATUS osif_ll_sap_register_cb(void)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void osif_ll_sap_unregister_cb(void) {}
+
+static inline QDF_STATUS
+osif_ll_lt_sap_request_for_audio_transport_switch(
+			enum qca_wlan_audio_transport_switch_type req_type)
+{
+	return QDF_STATUS_E_INVAL;
+}
+#endif /* WLAN_FEATURE_LL_LT_SAP */
+#endif /* __OS_IF_LL_SAP_H__*/

+ 150 - 0
os_if/mlme/sap/ll_sap/src/os_if_ll_sap.c

@@ -0,0 +1,150 @@
+/*
+ * 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_sap definitions specific to the ll_lt_sap module
+ */
+
+#include "os_if_ll_sap.h"
+#include "wlan_ll_sap_public_structs.h"
+#include "wlan_ll_sap_ucfg_api.h"
+#include "wlan_objmgr_vdev_obj.h"
+#include "wlan_cfg80211.h"
+#include "wlan_osif_priv.h"
+
+/**
+ * osif_convert_audio_transport_switch_req_type_to_qca_type() - Convert
+ * audio transport switch request type to qca audio transport switch req type
+ * @req_type: Request type
+ *
+ * Return:   enum qca_wlan_audio_transport_switch_type
+ */
+static enum qca_wlan_audio_transport_switch_type
+osif_convert_audio_transport_switch_req_type_to_qca_type
+					(enum bearer_switch_req_type req_type)
+{
+	switch (req_type) {
+	case WLAN_BS_REQ_TO_NON_WLAN:
+		return QCA_WLAN_AUDIO_TRANSPORT_SWITCH_TYPE_NON_WLAN;
+	case WLAN_BS_REQ_TO_WLAN:
+		return QCA_WLAN_AUDIO_TRANSPORT_SWITCH_TYPE_WLAN;
+	}
+}
+
+/**
+ * osif_convert_audio_transport_switch_req_type_from_qca_type() - Convert
+ * audio transport switch request type from qca audio transport switch req type
+ * @req_type: Request type.
+ *
+ * Return:   enum bearer_switch_req_type
+ */
+static enum bearer_switch_req_type
+osif_convert_audio_transport_switch_req_type_from_qca_type
+			(enum qca_wlan_audio_transport_switch_type req_type)
+{
+	switch (req_type) {
+	case  QCA_WLAN_AUDIO_TRANSPORT_SWITCH_TYPE_NON_WLAN:
+		return WLAN_BS_REQ_TO_NON_WLAN;
+	case QCA_WLAN_AUDIO_TRANSPORT_SWITCH_TYPE_WLAN:
+		return WLAN_BS_REQ_TO_WLAN;
+	}
+}
+
+/**
+ * wlan_osif_send_audio_transport_switch_req_event() - Send audio transport
+ * switch event
+ * @vdev: pointer to vdev structure.
+ * @req_type: Request type.
+ *
+ * Return: None.
+ */
+static void wlan_osif_send_audio_transport_switch_req_event(
+					struct wlan_objmgr_vdev *vdev,
+					enum bearer_switch_req_type req_type)
+{
+	struct sk_buff *vendor_event;
+	struct wireless_dev *wdev;
+	struct vdev_osif_priv *osif_priv;
+	uint32_t len;
+	enum qca_wlan_audio_transport_switch_type switch_type;
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+
+	osif_priv = wlan_vdev_get_ospriv(vdev);
+	if (!osif_priv) {
+		osif_err("Vdev %d osif_priv is null", vdev_id);
+		return;
+	}
+
+	wdev = osif_priv->wdev;
+	if (!wdev) {
+		osif_err("vdev %d wireless dev is null", vdev_id);
+		return;
+	}
+
+	switch_type =
+		osif_convert_audio_transport_switch_req_type_to_qca_type(
+								req_type);
+	len = nla_total_size(sizeof(uint8_t)) + NLMSG_HDRLEN;
+
+	vendor_event = wlan_cfg80211_vendor_event_alloc(
+			wdev->wiphy, wdev, len,
+			QCA_NL80211_VENDOR_SUBCMD_AUDIO_TRANSPORT_SWITCH_INDEX,
+			GFP_KERNEL);
+
+	if (!vendor_event) {
+		osif_err("vdev %d wlan_cfg80211_vendor_event_alloc failed",
+			 vdev_id);
+		return;
+	}
+
+	if (nla_put_u8(vendor_event,
+		       QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE,
+		       switch_type)) {
+		osif_err("Vdev %d VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE put fail",
+			 vdev_id);
+		wlan_cfg80211_vendor_free_skb(vendor_event);
+		return;
+	}
+
+	wlan_cfg80211_vendor_event(vendor_event, GFP_KERNEL);
+
+	osif_nofl_debug("Vdev %d Audio Transport switch request %d sent",
+			vdev_id, switch_type);
+}
+
+QDF_STATUS osif_ll_lt_sap_request_for_audio_transport_switch(
+			enum qca_wlan_audio_transport_switch_type req_type)
+{
+	return ucfg_ll_lt_sap_request_for_audio_transport_switch(
+		osif_convert_audio_transport_switch_req_type_from_qca_type(
+								req_type));
+}
+
+static struct ll_sap_ops ll_sap_global_ops = {
+	.ll_sap_send_audio_transport_switch_req_cb =
+		wlan_osif_send_audio_transport_switch_req_event,
+};
+
+QDF_STATUS osif_ll_sap_register_cb(void)
+{
+	ucfg_ll_sap_register_cb(&ll_sap_global_ops);
+	return QDF_STATUS_SUCCESS;
+}
+
+void osif_ll_sap_unregister_cb(void)
+{
+	ucfg_ll_sap_unregister_cb();
+}

+ 2 - 0
wlan_qcacld3_modules.bzl

@@ -289,6 +289,7 @@ _fixed_ipaths = [
     "os_if/dp/inc",
     "os_if/fw_offload/inc",
     "os_if/interop_issues_ap/inc",
+    "os_if/mlme/sap/ll_sap/inc",
     "os_if/nan/inc",
     "os_if/p2p/inc",
     "os_if/pkt_capture/inc",
@@ -2097,6 +2098,7 @@ _conditional_srcs = {
             "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",
+            "os_if/mlme/sap/ll_sap/src/os_if_ll_sap.c",
         ],
     },
 }