diff --git a/Kbuild b/Kbuild index 468da96ca4..8eaed89702 100644 --- a/Kbuild +++ b/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)) diff --git a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.c b/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.c index d469396f5c..a0a49d324b 100644 --- a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.c +++ b/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; +} diff --git a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.h b/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.h index 866906b4a7..0e79ea2fb0 100644 --- a/components/umac/mlme/sap/ll_sap/core/src/wlan_ll_lt_sap_main.h +++ b/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_ */ 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 59d5e32991..dae0d0643c 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 @@ -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; - } - - return QDF_STATUS_E_RESOURCES; + global_ll_sap_ops = ll_sap_global_ops; +} + +void ll_sap_unregister_os_if_cb(void) +{ + global_ll_sap_ops = NULL; } 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 674b0c0a43..7a5ce31f4a 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 @@ -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_ */ diff --git a/components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_public_structs.h b/components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_public_structs.h index 762266a323..12c161d478 100644 --- a/components/umac/mlme/sap/ll_sap/dispatcher/inc/wlan_ll_sap_public_structs.h +++ b/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_ */ 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 56d8920144..d6e391e911 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 @@ -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_ */ 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 78426c013d..a784591179 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 @@ -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(); } diff --git a/core/hdd/inc/wlan_hdd_ll_lt_sap.h b/core/hdd/inc/wlan_hdd_ll_lt_sap.h index 0df0b4b82c..c53ce748be 100644 --- a/core/hdd/inc/wlan_hdd_ll_lt_sap.h +++ b/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 */ diff --git a/core/hdd/src/wlan_hdd_ll_lt_sap.c b/core/hdd/src/wlan_hdd_ll_lt_sap.c index a009054122..95551e8e05 100644 --- a/core/hdd/src/wlan_hdd_ll_lt_sap.c +++ b/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, diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 07f25ff24d..f5f0baab48 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -248,6 +248,7 @@ #include "os_if_dp_local_pkt_capture.h" #include #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(); diff --git a/os_if/mlme/sap/ll_sap/inc/os_if_ll_sap.h b/os_if/mlme/sap/ll_sap/inc/os_if_ll_sap.h new file mode 100644 index 0000000000..017b95bafb --- /dev/null +++ b/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__*/ diff --git a/os_if/mlme/sap/ll_sap/src/os_if_ll_sap.c b/os_if/mlme/sap/ll_sap/src/os_if_ll_sap.c new file mode 100644 index 0000000000..b563bbc672 --- /dev/null +++ b/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(); +} diff --git a/wlan_qcacld3_modules.bzl b/wlan_qcacld3_modules.bzl index 3281be968e..94bc6d3974 100644 --- a/wlan_qcacld3_modules.bzl +++ b/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", ], }, }