Browse Source

qcacld-3.0: Add support for audio transport switch vendor command

Based on the new requirement, add support for vendor command
to switch the audio transport bearer.

Change-Id: I1d3b74c18976b0927ebba228b73af5a10cc67391
CRs-Fixed: 3582788
Ashish Kumar Dhanotiya 1 year ago
parent
commit
a0ad067df0

+ 1 - 0
Kbuild

@@ -139,6 +139,7 @@ HDD_OBJS := 	$(HDD_SRC_DIR)/wlan_hdd_assoc.o \
 		$(HDD_SRC_DIR)/wlan_hdd_tx_rx.o \
 		$(HDD_SRC_DIR)/wlan_hdd_wmm.o \
 		$(HDD_SRC_DIR)/wlan_hdd_wowl.o\
+		$(HDD_SRC_DIR)/wlan_hdd_ll_lt_sap.o\
 
 ifeq ($(CONFIG_UNIT_TEST), y)
 HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_unit_test.o

+ 21 - 0
components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c

@@ -16,6 +16,7 @@
 
 #include "wlan_ll_sap_main.h"
 #include <wlan_objmgr_global_obj.h>
+#include "qca_vendor.h"
 
 static QDF_STATUS ll_sap_psoc_obj_created_notification(struct wlan_objmgr_psoc *psoc, void *arg_list)
 {
@@ -92,3 +93,23 @@ QDF_STATUS ll_sap_deinit(void)
 
 	return ret;
 }
+
+QDF_STATUS ll_lt_sap_request_for_audio_transport_switch(
+						uint8_t transport_switch_type)
+{
+	/*
+	 * 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;
+	}
+
+	return QDF_STATUS_E_RESOURCES;
+}

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

@@ -48,4 +48,14 @@ 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
+ *
+ * Return: True/False
+ */
+QDF_STATUS ll_lt_sap_request_for_audio_transport_switch(
+						uint8_t transport_switch_type);
+
 #endif /* _WLAN_LL_SAP_MAIN_H_ */

+ 16 - 0
components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_ucfg_api.h

@@ -46,6 +46,16 @@ QDF_STATUS ucfg_ll_sap_deinit(void);
  */
 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
+ *
+ * Return: Accepted/Rejected
+ */
+QDF_STATUS ucfg_ll_lt_sap_request_for_audio_transport_switch(
+						uint8_t transport_switch_type);
+
 #else
 static inline QDF_STATUS ucfg_ll_sap_init(void)
 {
@@ -62,6 +72,12 @@ static inline bool ucfg_is_ll_lt_sap_supported(void)
 	return false;
 }
 
+static inline QDF_STATUS
+ucfg_ll_lt_sap_request_for_audio_transport_switch(uint8_t transport_switch_type)
+{
+	return QDF_STATUS_E_INVAL;
+}
+
 #endif /* WLAN_FEATURE_LL_LT_SAP */
 #endif /* _WLAN_LL_SAP_UCFG_API_H_ */
 

+ 7 - 0
components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_ucfg_api.c

@@ -38,3 +38,10 @@ bool ucfg_is_ll_lt_sap_supported(void)
 	return ll_lt_sap_is_supported();
 }
 
+QDF_STATUS ucfg_ll_lt_sap_request_for_audio_transport_switch(
+						uint8_t transport_switch_type)
+{
+	return ll_lt_sap_request_for_audio_transport_switch(
+							transport_switch_type);
+}
+

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

@@ -0,0 +1,60 @@
+/*
+ * 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 ll_lt_sap module
+ */
+
+#ifndef __WLAN_HDD_LL_LT_SAP_H
+#define __WLAN_HDD_LL_LT_SAP_H
+
+#include "wlan_hdd_main.h"
+#include "qca_vendor.h"
+
+extern const struct nla_policy
+	wlan_hdd_ll_lt_sap_transport_switch_policy
+	[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_MAX + 1];
+
+#define FEATURE_LL_LT_SAP_VENDOR_COMMANDS				      \
+{									      \
+	.info.vendor_id = QCA_NL80211_VENDOR_ID,			      \
+	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_AUDIO_TRANSPORT_SWITCH,      \
+	.flags = WIPHY_VENDOR_CMD_NEED_WDEV |				      \
+			WIPHY_VENDOR_CMD_NEED_NETDEV |			      \
+			WIPHY_VENDOR_CMD_NEED_RUNNING,			      \
+	.doit = wlan_hdd_cfg80211_ll_lt_sap_transport_switch,		      \
+	vendor_command_policy(wlan_hdd_ll_lt_sap_transport_switch_policy,     \
+			      QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_MAX)\
+},
+
+/**
+ * wlan_hdd_cfg80211_ll_lt_sap_transport_switch() - Request to switch the
+ * transport
+ * @wiphy:   pointer to wireless wiphy structure.
+ * @wdev:    pointer to wireless_dev structure.
+ * @data:    Pointer to the data to be passed via vendor interface
+ * @data_len:Length of the data to be passed
+ *
+ * Return:   Return the Success or Failure code.
+ */
+int wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
+						 struct wireless_dev *wdev,
+						 const void *data,
+						 int data_len);
+
+#endif /* __WLAN_HDD_LL_LT_SAP_H */

+ 2 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -210,6 +210,7 @@
 #include "wlan_mlo_epcs_ucfg_api.h"
 #include <wlan_ll_sap_ucfg_api.h>
 #include <wlan_mlo_mgr_link_switch.h>
+#include <wlan_hdd_ll_lt_sap.h>
 /*
  * A value of 100 (milliseconds) can be sent to FW.
  * FW would enable Tx beamforming based on this.
@@ -20452,6 +20453,7 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
 	FEATURE_COAP_OFFLOAD_COMMANDS
 	FEATURE_ML_LINK_STATE_COMMANDS
 	FEATURE_AFC_VENDOR_COMMANDS
+	FEATURE_LL_LT_SAP_VENDOR_COMMANDS
 };
 
 struct hdd_context *hdd_cfg80211_wiphy_alloc(void)

+ 131 - 0
core/hdd/src/wlan_hdd_ll_lt_sap.c

@@ -0,0 +1,131 @@
+/*
+ * 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_definitions specific to the ll_lt_sap module
+ */
+
+#include "wlan_hdd_ll_lt_sap.h"
+#include "wlan_ll_sap_ucfg_api.h"
+#include "osif_sync.h"
+
+const struct nla_policy
+	wlan_hdd_ll_lt_sap_transport_switch_policy
+	[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_MAX + 1] = {
+		[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE] = {
+						.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_STATUS] = {
+						.type = NLA_U8},
+};
+
+/**
+ * __wlan_hdd_cfg80211_ll_lt_sap_transport_switch() - Request to switch the
+ * transport
+ * @wiphy:   pointer to wireless wiphy structure.
+ * @wdev:    pointer to wireless_dev structure.
+ * @data:    Pointer to the data to be passed via vendor interface
+ * @data_len:Length of the data to be passed
+ *
+ * Return:   Return the Success or Failure code.
+ */
+static int
+__wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
+					       struct wireless_dev *wdev,
+					       const void *data,
+					       int data_len)
+{
+	struct net_device *dev = wdev->netdev;
+	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;
+	QDF_STATUS status;
+
+	hdd_enter_dev(dev);
+
+	if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
+		hdd_err("Command not allowed in FTM mode");
+		return -EPERM;
+	}
+
+	if (0 != wlan_hdd_validate_context(hdd_ctx))
+		return -EINVAL;
+
+	if (!adapter)
+		return -EINVAL;
+
+	if (wlan_cfg80211_nla_parse(
+			tb, QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_MAX,
+			data, data_len,
+			wlan_hdd_ll_lt_sap_transport_switch_policy)) {
+		hdd_err("Invalid attribute");
+		return -EINVAL;
+	}
+
+	if (!tb[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_TYPE]) {
+		hdd_err("attr transport switch type failed");
+		return -EINVAL;
+	}
+	transport_switch_type = nla_get_u8(
+			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(
+							transport_switch_type);
+		hdd_debug("Transport switch request type %d status %d",
+			  transport_switch_type, status);
+		return qdf_status_to_os_return(status);
+	}
+
+	transport_switch_status = nla_get_u8(
+			tb[QCA_WLAN_VENDOR_ATTR_AUDIO_TRANSPORT_SWITCH_STATUS]);
+
+	if (transport_switch_status ==
+		QCA_WLAN_AUDIO_TRANSPORT_SWITCH_STATUS_COMPLETED) {
+		hdd_debug("Transport switch request completed");
+		return 0;
+	} else if (transport_switch_status ==
+		QCA_WLAN_AUDIO_TRANSPORT_SWITCH_STATUS_REJECTED) {
+		hdd_debug("Transport switch request rejected");
+		return 0;
+	}
+
+	hdd_err("Invalid transport switch status");
+	return -EINVAL;
+}
+
+int wlan_hdd_cfg80211_ll_lt_sap_transport_switch(struct wiphy *wiphy,
+						 struct wireless_dev *wdev,
+						 const void *data,
+						 int data_len)
+{
+	int errno;
+	struct osif_vdev_sync *vdev_sync;
+
+	errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync);
+	if (errno)
+		return errno;
+
+	errno = __wlan_hdd_cfg80211_ll_lt_sap_transport_switch(wiphy, wdev,
+							       data, data_len);
+
+	osif_vdev_sync_op_stop(vdev_sync);
+
+	return errno;
+}

+ 1 - 0
wlan_qcacld3_modules.bzl

@@ -523,6 +523,7 @@ _fixed_srcs = [
     "core/hdd/src/wlan_hdd_hostapd.c",
     "core/hdd/src/wlan_hdd_ioctl.c",
     "core/hdd/src/wlan_hdd_main.c",
+    "core/hdd/src/wlan_hdd_ll_lt_sap.c",
     "core/hdd/src/wlan_hdd_object_manager.c",
     "core/hdd/src/wlan_hdd_oemdata.c",
     "core/hdd/src/wlan_hdd_p2p.c",