1 /*
2  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #include "target_if.h"
18 #include "target_if_ll_sap.h"
19 #include "wlan_ll_sap_public_structs.h"
20 #include "wmi_unified_ll_sap_api.h"
21 #include "../../umac/mlme/sap/ll_sap/core/src/wlan_ll_sap_main.h"
22 #include "wlan_ll_sap_api.h"
23 
24 /**
25  * target_if_send_audio_transport_switch_resp() - Send audio transport switch
26  * response to fw
27  * @psoc: pointer to psoc
28  * @req_type: Bearer switch request type
29  * @status: Status of the bearer switch request
30  *
31  * Return: pointer to tx ops
32  */
target_if_send_audio_transport_switch_resp(struct wlan_objmgr_psoc * psoc,enum bearer_switch_req_type req_type,enum bearer_switch_status status)33 static QDF_STATUS target_if_send_audio_transport_switch_resp(
34 					struct wlan_objmgr_psoc *psoc,
35 					enum bearer_switch_req_type req_type,
36 					enum bearer_switch_status status)
37 {
38 	struct wmi_unified *wmi_handle;
39 
40 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
41 	if (!wmi_handle) {
42 		target_if_err("wmi_handle is null.");
43 		return QDF_STATUS_E_NULL_VALUE;
44 	}
45 
46 	return wmi_unified_audio_transport_switch_resp_send(wmi_handle,
47 							    req_type, status);
48 }
49 
target_if_send_audio_transport_switch_req_event_handler(ol_scn_t scn,uint8_t * event,uint32_t len)50 static int target_if_send_audio_transport_switch_req_event_handler(
51 							ol_scn_t scn,
52 							uint8_t *event,
53 							uint32_t len)
54 {
55 	struct wlan_objmgr_psoc *psoc;
56 	struct ll_sap_psoc_priv_obj *psoc_ll_sap_obj;
57 	enum bearer_switch_req_type req_type;
58 	struct wmi_unified *wmi_handle;
59 	struct wlan_ll_sap_rx_ops *rx_ops;
60 	QDF_STATUS qdf_status;
61 
62 	psoc = target_if_get_psoc_from_scn_hdl(scn);
63 	if (!psoc) {
64 		target_if_err("psoc is null");
65 		return -EINVAL;
66 	}
67 
68 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
69 	if (!wmi_handle) {
70 		target_if_err("wmi_handle is null");
71 		return -EINVAL;
72 	}
73 
74 	psoc_ll_sap_obj = wlan_objmgr_psoc_get_comp_private_obj(
75 							psoc,
76 							WLAN_UMAC_COMP_LL_SAP);
77 
78 	if (!psoc_ll_sap_obj) {
79 		target_if_err("psoc_ll_sap_obj is null");
80 		return -EINVAL;
81 	}
82 
83 	rx_ops = &psoc_ll_sap_obj->rx_ops;
84 	if (!rx_ops || !rx_ops->audio_transport_switch_req) {
85 		target_if_err("Invalid ll_sap rx ops");
86 		return -EINVAL;
87 	}
88 
89 	qdf_status = wmi_extract_audio_transport_switch_req_event(wmi_handle,
90 								  event, len,
91 								  &req_type);
92 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
93 		target_if_err("parsing of event failed, %d", qdf_status);
94 		return -EINVAL;
95 	}
96 	rx_ops->audio_transport_switch_req(psoc, req_type);
97 
98 	return 0;
99 }
100 
101 void
target_if_ll_sap_register_tx_ops(struct wlan_ll_sap_tx_ops * tx_ops)102 target_if_ll_sap_register_tx_ops(struct wlan_ll_sap_tx_ops *tx_ops)
103 {
104 	tx_ops->send_audio_transport_switch_resp =
105 		target_if_send_audio_transport_switch_resp;
106 }
107 
108 void
target_if_ll_sap_register_rx_ops(struct wlan_ll_sap_rx_ops * rx_ops)109 target_if_ll_sap_register_rx_ops(struct wlan_ll_sap_rx_ops *rx_ops)
110 {
111 	rx_ops->audio_transport_switch_req =
112 		wlan_ll_sap_fw_bearer_switch_req;
113 }
114 
115 QDF_STATUS
target_if_ll_sap_register_events(struct wlan_objmgr_psoc * psoc)116 target_if_ll_sap_register_events(struct wlan_objmgr_psoc *psoc)
117 {
118 	QDF_STATUS ret;
119 	wmi_unified_t handle = get_wmi_unified_hdl_from_psoc(psoc);
120 
121 	if (!handle) {
122 		target_if_err("handle is NULL");
123 		return QDF_STATUS_E_FAILURE;
124 	}
125 
126 	ret = wmi_unified_register_event_handler(
127 			handle,
128 			wmi_audio_transport_switch_type_event_id,
129 			target_if_send_audio_transport_switch_req_event_handler,
130 			WMI_RX_SERIALIZER_CTX);
131 	return ret;
132 }
133 
134 QDF_STATUS
target_if_ll_sap_deregister_events(struct wlan_objmgr_psoc * psoc)135 target_if_ll_sap_deregister_events(struct wlan_objmgr_psoc *psoc)
136 {
137 	QDF_STATUS ret;
138 	wmi_unified_t handle = get_wmi_unified_hdl_from_psoc(psoc);
139 
140 	if (!handle) {
141 		target_if_err("handle is NULL");
142 		return QDF_STATUS_E_FAILURE;
143 	}
144 
145 	ret = wmi_unified_unregister_event_handler(
146 			handle,
147 			wmi_audio_transport_switch_type_event_id);
148 	return ret;
149 }
150