From a0ad067df039357bb112ceb713484b6a55ac0a47 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Tue, 4 Jul 2023 14:25:47 +0530 Subject: [PATCH] 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 --- Kbuild | 1 + .../sap/ll_sap/core/src/wlan_ll_sap_main.c | 21 +++ .../sap/ll_sap/core/src/wlan_ll_sap_main.h | 10 ++ .../dispatcher/inc/wlan_ll_sap_ucfg_api.h | 16 +++ .../dispatcher/src/wlan_ll_sap_ucfg_api.c | 7 + core/hdd/inc/wlan_hdd_ll_lt_sap.h | 60 ++++++++ core/hdd/src/wlan_hdd_cfg80211.c | 2 + core/hdd/src/wlan_hdd_ll_lt_sap.c | 131 ++++++++++++++++++ wlan_qcacld3_modules.bzl | 1 + 9 files changed, 249 insertions(+) create mode 100644 core/hdd/inc/wlan_hdd_ll_lt_sap.h create mode 100644 core/hdd/src/wlan_hdd_ll_lt_sap.c diff --git a/Kbuild b/Kbuild index b5f450cfb6..e04a21207b 100644 --- a/Kbuild +++ b/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 diff --git a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c b/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c index 093503c5c3..fde88539a3 100644 --- a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c +++ b/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.c @@ -16,6 +16,7 @@ #include "wlan_ll_sap_main.h" #include +#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; +} diff --git a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.h b/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.h index 75cc41a408..a89da4a7a3 100644 --- a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.h +++ b/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_ */ diff --git a/components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_ucfg_api.h b/components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_ucfg_api.h index 75e17d2e39..56d8920144 100644 --- a/components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_ucfg_api.h +++ b/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_ */ diff --git a/components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_ucfg_api.c b/components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_ucfg_api.c index 2265f3785c..78426c013d 100644 --- a/components/umac/mlme/sap/ll_sap/dispatcher/src/wlan_ll_sap_ucfg_api.c +++ b/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); +} + diff --git a/core/hdd/inc/wlan_hdd_ll_lt_sap.h b/core/hdd/inc/wlan_hdd_ll_lt_sap.h new file mode 100644 index 0000000000..c53ce748be --- /dev/null +++ b/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 */ diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 7f409c54f1..0ed83c1b42 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -210,6 +210,7 @@ #include "wlan_mlo_epcs_ucfg_api.h" #include #include +#include /* * 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) diff --git a/core/hdd/src/wlan_hdd_ll_lt_sap.c b/core/hdd/src/wlan_hdd_ll_lt_sap.c new file mode 100644 index 0000000000..6b223b3210 --- /dev/null +++ b/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; +} diff --git a/wlan_qcacld3_modules.bzl b/wlan_qcacld3_modules.bzl index 6d1bc468f4..610e475590 100644 --- a/wlan_qcacld3_modules.bzl +++ b/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",