xref: /wlan-driver/qcacld-3.0/core/cds/src/cds_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: cds_api.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * Connectivity driver services APIs
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include <cds_api.h>
27*5113495bSYour Name #include "sir_types.h"
28*5113495bSYour Name #include "sir_api.h"
29*5113495bSYour Name #include "sir_mac_prot_def.h"
30*5113495bSYour Name #include "sme_api.h"
31*5113495bSYour Name #include "mac_init_api.h"
32*5113495bSYour Name #include "wlan_qct_sys.h"
33*5113495bSYour Name #include "i_cds_packet.h"
34*5113495bSYour Name #include "cds_reg_service.h"
35*5113495bSYour Name #include "wma_types.h"
36*5113495bSYour Name #include "wlan_hdd_main.h"
37*5113495bSYour Name #include "wlan_hdd_power.h"
38*5113495bSYour Name #include "wlan_hdd_tsf.h"
39*5113495bSYour Name #include <linux/vmalloc.h>
40*5113495bSYour Name #if (defined(__ANDROID_COMMON_KERNEL__) && \
41*5113495bSYour Name 	(LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)) && \
42*5113495bSYour Name 	defined(MSM_PLATFORM))
43*5113495bSYour Name #include <linux/qcom-iommu-util.h>
44*5113495bSYour Name #endif
45*5113495bSYour Name #include <scheduler_core.h>
46*5113495bSYour Name 
47*5113495bSYour Name #include "pld_common.h"
48*5113495bSYour Name #include "sap_api.h"
49*5113495bSYour Name #include "bmi.h"
50*5113495bSYour Name #include "ol_fw.h"
51*5113495bSYour Name #include "ol_if_athvar.h"
52*5113495bSYour Name #include "hif.h"
53*5113495bSYour Name #include "wlan_policy_mgr_api.h"
54*5113495bSYour Name #include "cds_utils.h"
55*5113495bSYour Name #include "wlan_logging_sock_svc.h"
56*5113495bSYour Name #include "wma.h"
57*5113495bSYour Name #include "pktlog_ac.h"
58*5113495bSYour Name #include "wlan_policy_mgr_api.h"
59*5113495bSYour Name 
60*5113495bSYour Name #include <cdp_txrx_cmn_reg.h>
61*5113495bSYour Name #include <cdp_txrx_cfg.h>
62*5113495bSYour Name #include <cdp_txrx_misc.h>
63*5113495bSYour Name #include <ol_defines.h>
64*5113495bSYour Name #include <dispatcher_init_deinit.h>
65*5113495bSYour Name #include <cdp_txrx_handle.h>
66*5113495bSYour Name #include <cdp_txrx_host_stats.h>
67*5113495bSYour Name #include "target_type.h"
68*5113495bSYour Name #include "wlan_ocb_ucfg_api.h"
69*5113495bSYour Name #include "wlan_ipa_ucfg_api.h"
70*5113495bSYour Name 
71*5113495bSYour Name #ifdef ENABLE_SMMU_S1_TRANSLATION
72*5113495bSYour Name #include "pld_common.h"
73*5113495bSYour Name #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
74*5113495bSYour Name #include <asm/dma-iommu.h>
75*5113495bSYour Name #endif
76*5113495bSYour Name #include <linux/iommu.h>
77*5113495bSYour Name #endif
78*5113495bSYour Name 
79*5113495bSYour Name #ifdef QCA_WIFI_QCA8074
80*5113495bSYour Name #include <target_if_dp.h>
81*5113495bSYour Name #endif
82*5113495bSYour Name #include "wlan_mlme_ucfg_api.h"
83*5113495bSYour Name #include "cfg_ucfg_api.h"
84*5113495bSYour Name #include "wlan_cp_stats_mc_ucfg_api.h"
85*5113495bSYour Name #include <qdf_hang_event_notifier.h>
86*5113495bSYour Name #include <qdf_notifier.h>
87*5113495bSYour Name #include <qwlan_version.h>
88*5113495bSYour Name #include <qdf_trace.h>
89*5113495bSYour Name #include <qdf_nbuf.h>
90*5113495bSYour Name #include "wlan_dp_ucfg_api.h"
91*5113495bSYour Name #include "wlan_dp_prealloc.h"
92*5113495bSYour Name #include "wlan_dp_api.h"
93*5113495bSYour Name #include "qdf_ipa.h"
94*5113495bSYour Name 
95*5113495bSYour Name /* Preprocessor Definitions and Constants */
96*5113495bSYour Name 
97*5113495bSYour Name /* Preprocessor Definitions and Constants */
98*5113495bSYour Name 
99*5113495bSYour Name /* Data definitions */
100*5113495bSYour Name static struct cds_context g_cds_context;
101*5113495bSYour Name static struct cds_context *gp_cds_context;
102*5113495bSYour Name static struct __qdf_device g_qdf_ctx;
103*5113495bSYour Name 
104*5113495bSYour Name static uint8_t cds_multicast_logging;
105*5113495bSYour Name 
106*5113495bSYour Name #define DRIVER_VER_LEN (11)
107*5113495bSYour Name #define HANG_EVENT_VER_LEN (1)
108*5113495bSYour Name 
109*5113495bSYour Name struct cds_hang_event_fixed_param {
110*5113495bSYour Name 	uint16_t tlv_header;
111*5113495bSYour Name 	uint8_t recovery_reason;
112*5113495bSYour Name 	char driver_version[DRIVER_VER_LEN];
113*5113495bSYour Name 	char hang_event_version[HANG_EVENT_VER_LEN];
114*5113495bSYour Name } qdf_packed;
115*5113495bSYour Name 
116*5113495bSYour Name #ifdef QCA_WIFI_QCA8074
117*5113495bSYour Name static inline int
cds_send_delba(struct cdp_ctrl_objmgr_psoc * psoc,uint8_t vdev_id,uint8_t * peer_macaddr,uint8_t tid,uint8_t reason_code,uint8_t cdp_reason_code)118*5113495bSYour Name cds_send_delba(struct cdp_ctrl_objmgr_psoc *psoc,
119*5113495bSYour Name 	       uint8_t vdev_id, uint8_t *peer_macaddr,
120*5113495bSYour Name 	       uint8_t tid, uint8_t reason_code,
121*5113495bSYour Name 	       uint8_t cdp_reason_code)
122*5113495bSYour Name {
123*5113495bSYour Name 	return wma_dp_send_delba_ind(vdev_id, peer_macaddr, tid,
124*5113495bSYour Name 				     reason_code, cdp_reason_code);
125*5113495bSYour Name }
126*5113495bSYour Name 
127*5113495bSYour Name static struct ol_if_ops  dp_ol_if_ops = {
128*5113495bSYour Name 	.peer_set_default_routing = target_if_peer_set_default_routing,
129*5113495bSYour Name 	.peer_rx_reorder_queue_setup = target_if_peer_rx_reorder_queue_setup,
130*5113495bSYour Name 	.peer_rx_reorder_queue_remove = target_if_peer_rx_reorder_queue_remove,
131*5113495bSYour Name 	.peer_multi_rx_reorder_queue_setup =
132*5113495bSYour Name 		target_if_peer_multi_rx_reorder_queue_setup,
133*5113495bSYour Name 	.is_hw_dbs_capable = policy_mgr_is_dp_hw_dbs_capable,
134*5113495bSYour Name 	.lro_hash_config = target_if_lro_hash_config,
135*5113495bSYour Name 	.rx_invalid_peer = wma_rx_invalid_peer_ind,
136*5113495bSYour Name 	.is_roam_inprogress = wma_is_roam_in_progress,
137*5113495bSYour Name 	.get_con_mode = cds_get_conparam,
138*5113495bSYour Name 	.send_delba = cds_send_delba,
139*5113495bSYour Name 	.dp_rx_get_pending = dp_rx_tm_get_pending,
140*5113495bSYour Name #ifdef DP_MEM_PRE_ALLOC
141*5113495bSYour Name 	.dp_prealloc_get_context = dp_prealloc_get_context_memory,
142*5113495bSYour Name 	.dp_prealloc_put_context = dp_prealloc_put_context_memory,
143*5113495bSYour Name 	.dp_prealloc_get_consistent = dp_prealloc_get_coherent,
144*5113495bSYour Name 	.dp_prealloc_put_consistent = dp_prealloc_put_coherent,
145*5113495bSYour Name 	.dp_get_multi_pages = dp_prealloc_get_multi_pages,
146*5113495bSYour Name 	.dp_put_multi_pages = dp_prealloc_put_multi_pages,
147*5113495bSYour Name #endif
148*5113495bSYour Name 	.dp_get_tx_inqueue = dp_get_tx_inqueue,
149*5113495bSYour Name 	.dp_send_unit_test_cmd = wma_form_unit_test_cmd_and_send,
150*5113495bSYour Name 	.dp_print_fisa_stats = wlan_dp_print_fisa_rx_stats,
151*5113495bSYour Name     /* TODO: Add any other control path calls required to OL_IF/WMA layer */
152*5113495bSYour Name };
153*5113495bSYour Name #else
154*5113495bSYour Name static struct ol_if_ops  dp_ol_if_ops = {
155*5113495bSYour Name 	.dp_rx_get_pending = cds_get_rx_thread_pending,
156*5113495bSYour Name };
157*5113495bSYour Name #endif
158*5113495bSYour Name 
159*5113495bSYour Name static void cds_trigger_recovery_work(void *param);
160*5113495bSYour Name 
161*5113495bSYour Name /**
162*5113495bSYour Name  * struct cds_recovery_call_info - caller information for cds_trigger_recovery
163*5113495bSYour Name  * @func: caller's function name
164*5113495bSYour Name  * @line: caller's line number
165*5113495bSYour Name  */
166*5113495bSYour Name struct cds_recovery_call_info {
167*5113495bSYour Name 	const char *func;
168*5113495bSYour Name 	uint32_t line;
169*5113495bSYour Name } __cds_recovery_caller;
170*5113495bSYour Name 
171*5113495bSYour Name /**
172*5113495bSYour Name  * cds_recovery_work_init() - Initialize recovery work queue
173*5113495bSYour Name  *
174*5113495bSYour Name  * Return: none
175*5113495bSYour Name  */
cds_recovery_work_init(void)176*5113495bSYour Name static QDF_STATUS cds_recovery_work_init(void)
177*5113495bSYour Name {
178*5113495bSYour Name 	qdf_create_work(0, &gp_cds_context->cds_recovery_work,
179*5113495bSYour Name 			cds_trigger_recovery_work, &__cds_recovery_caller);
180*5113495bSYour Name 	gp_cds_context->cds_recovery_wq =
181*5113495bSYour Name 		qdf_create_workqueue("cds_recovery_workqueue");
182*5113495bSYour Name 	if (!gp_cds_context->cds_recovery_wq) {
183*5113495bSYour Name 		cds_err("Failed to create cds_recovery_workqueue");
184*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
185*5113495bSYour Name 	}
186*5113495bSYour Name 
187*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
188*5113495bSYour Name }
189*5113495bSYour Name 
190*5113495bSYour Name /**
191*5113495bSYour Name  * cds_recovery_work_deinit() - Initialize recovery work queue
192*5113495bSYour Name  *
193*5113495bSYour Name  * Return: none
194*5113495bSYour Name  */
cds_recovery_work_deinit(void)195*5113495bSYour Name static void cds_recovery_work_deinit(void)
196*5113495bSYour Name {
197*5113495bSYour Name 	if (gp_cds_context->cds_recovery_wq) {
198*5113495bSYour Name 		qdf_flush_workqueue(0, gp_cds_context->cds_recovery_wq);
199*5113495bSYour Name 		qdf_destroy_workqueue(0, gp_cds_context->cds_recovery_wq);
200*5113495bSYour Name 	}
201*5113495bSYour Name }
202*5113495bSYour Name 
cds_is_drv_connected(void)203*5113495bSYour Name static bool cds_is_drv_connected(void)
204*5113495bSYour Name {
205*5113495bSYour Name 	int ret;
206*5113495bSYour Name 	qdf_device_t qdf_ctx;
207*5113495bSYour Name 
208*5113495bSYour Name 	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
209*5113495bSYour Name 	if (!qdf_ctx)
210*5113495bSYour Name 		return false;
211*5113495bSYour Name 
212*5113495bSYour Name 	ret = pld_is_drv_connected(qdf_ctx->dev);
213*5113495bSYour Name 
214*5113495bSYour Name 	return ((ret > 0) ? true : false);
215*5113495bSYour Name }
216*5113495bSYour Name 
cds_is_drv_supported(void)217*5113495bSYour Name static bool cds_is_drv_supported(void)
218*5113495bSYour Name {
219*5113495bSYour Name 	qdf_device_t qdf_ctx;
220*5113495bSYour Name 	struct pld_platform_cap cap = {0};
221*5113495bSYour Name 
222*5113495bSYour Name 	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
223*5113495bSYour Name 	if (!qdf_ctx)
224*5113495bSYour Name 		return false;
225*5113495bSYour Name 
226*5113495bSYour Name 	pld_get_platform_cap(qdf_ctx->dev, &cap);
227*5113495bSYour Name 
228*5113495bSYour Name 	return ((cap.cap_flag & PLD_HAS_DRV_SUPPORT) ? true : false);
229*5113495bSYour Name }
230*5113495bSYour Name 
cds_wmi_send_recv_qmi(void * buf,uint32_t len,void * cb_ctx,qdf_wmi_recv_qmi_cb wmi_rx_cb)231*5113495bSYour Name static QDF_STATUS cds_wmi_send_recv_qmi(void *buf, uint32_t len, void * cb_ctx,
232*5113495bSYour Name 					qdf_wmi_recv_qmi_cb wmi_rx_cb)
233*5113495bSYour Name {
234*5113495bSYour Name 	qdf_device_t qdf_ctx;
235*5113495bSYour Name 
236*5113495bSYour Name 	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
237*5113495bSYour Name 	if (!qdf_ctx)
238*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
239*5113495bSYour Name 
240*5113495bSYour Name 	if (pld_qmi_send(qdf_ctx->dev, 0, buf, len, cb_ctx, wmi_rx_cb))
241*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
242*5113495bSYour Name 
243*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
244*5113495bSYour Name }
245*5113495bSYour Name 
cds_qmi_indication(void * cb_ctx,qdf_qmi_ind_cb qmi_ind_cb)246*5113495bSYour Name static QDF_STATUS cds_qmi_indication(void *cb_ctx, qdf_qmi_ind_cb qmi_ind_cb)
247*5113495bSYour Name {
248*5113495bSYour Name 	qdf_device_t qdf_ctx;
249*5113495bSYour Name 
250*5113495bSYour Name 	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
251*5113495bSYour Name 	if (!qdf_ctx)
252*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
253*5113495bSYour Name 
254*5113495bSYour Name 	if (pld_qmi_indication(qdf_ctx->dev, cb_ctx, qmi_ind_cb))
255*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
256*5113495bSYour Name 
257*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
258*5113495bSYour Name }
259*5113495bSYour Name 
260*5113495bSYour Name /**
261*5113495bSYour Name  * cds_update_recovery_reason() - update the recovery reason code
262*5113495bSYour Name  * @recovery_reason: recovery reason
263*5113495bSYour Name  *
264*5113495bSYour Name  * Return: None
265*5113495bSYour Name  */
cds_update_recovery_reason(enum qdf_hang_reason recovery_reason)266*5113495bSYour Name static void cds_update_recovery_reason(enum qdf_hang_reason recovery_reason)
267*5113495bSYour Name {
268*5113495bSYour Name 	if (!gp_cds_context) {
269*5113495bSYour Name 		cds_err("gp_cds_context is null");
270*5113495bSYour Name 		return;
271*5113495bSYour Name 	}
272*5113495bSYour Name 
273*5113495bSYour Name 	gp_cds_context->recovery_reason = recovery_reason;
274*5113495bSYour Name }
275*5113495bSYour Name 
276*5113495bSYour Name /**
277*5113495bSYour Name  * cds_sys_reboot_lock_init() - Create lock for system reboot
278*5113495bSYour Name  *
279*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if the lock was created and an error on failure
280*5113495bSYour Name  */
cds_sys_reboot_lock_init(void)281*5113495bSYour Name static QDF_STATUS cds_sys_reboot_lock_init(void)
282*5113495bSYour Name {
283*5113495bSYour Name 	return qdf_mutex_create(&gp_cds_context->sys_reboot_lock);
284*5113495bSYour Name }
285*5113495bSYour Name 
286*5113495bSYour Name /**
287*5113495bSYour Name  * cds_sys_reboot_lock_deinit() - destroy lock for system reboot
288*5113495bSYour Name  *
289*5113495bSYour Name  * Return: none
290*5113495bSYour Name  */
cds_sys_reboot_lock_deinit(void)291*5113495bSYour Name static void cds_sys_reboot_lock_deinit(void)
292*5113495bSYour Name {
293*5113495bSYour Name 	qdf_mutex_destroy(&gp_cds_context->sys_reboot_lock);
294*5113495bSYour Name }
295*5113495bSYour Name 
cds_set_sys_rebooting(void)296*5113495bSYour Name void cds_set_sys_rebooting(void)
297*5113495bSYour Name {
298*5113495bSYour Name 	qdf_mutex_acquire(&gp_cds_context->sys_reboot_lock);
299*5113495bSYour Name 	cds_set_driver_state(CDS_DRIVER_STATE_SYS_REBOOTING);
300*5113495bSYour Name 	qdf_mutex_release(&gp_cds_context->sys_reboot_lock);
301*5113495bSYour Name }
302*5113495bSYour Name 
cds_sys_reboot_protect(void)303*5113495bSYour Name bool cds_sys_reboot_protect(void)
304*5113495bSYour Name {
305*5113495bSYour Name 	enum cds_driver_state state;
306*5113495bSYour Name 
307*5113495bSYour Name 	qdf_mutex_acquire(&gp_cds_context->sys_reboot_lock);
308*5113495bSYour Name 
309*5113495bSYour Name 	state = cds_get_driver_state();
310*5113495bSYour Name 	return __CDS_IS_DRIVER_STATE(state, CDS_DRIVER_STATE_SYS_REBOOTING);
311*5113495bSYour Name }
312*5113495bSYour Name 
cds_sys_reboot_unprotect(void)313*5113495bSYour Name void cds_sys_reboot_unprotect(void)
314*5113495bSYour Name {
315*5113495bSYour Name 	qdf_mutex_release(&gp_cds_context->sys_reboot_lock);
316*5113495bSYour Name }
317*5113495bSYour Name 
cds_init(void)318*5113495bSYour Name QDF_STATUS cds_init(void)
319*5113495bSYour Name {
320*5113495bSYour Name 	QDF_STATUS status;
321*5113495bSYour Name 
322*5113495bSYour Name 	gp_cds_context = &g_cds_context;
323*5113495bSYour Name 
324*5113495bSYour Name 	status = cds_sys_reboot_lock_init();
325*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
326*5113495bSYour Name 		cds_err("Failed to init sys reboot lock; status:%u", status);
327*5113495bSYour Name 		goto deinit;
328*5113495bSYour Name 	}
329*5113495bSYour Name 
330*5113495bSYour Name 	status = cds_recovery_work_init();
331*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
332*5113495bSYour Name 		cds_err("Failed to init recovery work; status:%u", status);
333*5113495bSYour Name 		goto destroy_lock;
334*5113495bSYour Name 	}
335*5113495bSYour Name 
336*5113495bSYour Name 	cds_ssr_protect_init();
337*5113495bSYour Name 
338*5113495bSYour Name 	gp_cds_context->qdf_ctx = &g_qdf_ctx;
339*5113495bSYour Name 
340*5113495bSYour Name 	qdf_register_self_recovery_callback(cds_trigger_recovery_psoc);
341*5113495bSYour Name 	qdf_register_fw_down_callback(cds_is_fw_down);
342*5113495bSYour Name 	qdf_register_is_driver_unloading_callback(cds_is_driver_unloading);
343*5113495bSYour Name 	qdf_register_is_driver_state_module_stop_callback(
344*5113495bSYour Name 					cds_is_driver_state_module_stop);
345*5113495bSYour Name 	qdf_register_recovering_state_query_callback(cds_is_driver_recovering);
346*5113495bSYour Name 	qdf_register_drv_connected_callback(cds_is_drv_connected);
347*5113495bSYour Name 	qdf_register_drv_supported_callback(cds_is_drv_supported);
348*5113495bSYour Name 	qdf_register_wmi_send_recv_qmi_callback(cds_wmi_send_recv_qmi);
349*5113495bSYour Name 	qdf_register_qmi_indication_callback(cds_qmi_indication);
350*5113495bSYour Name 	qdf_register_recovery_reason_update(cds_update_recovery_reason);
351*5113495bSYour Name 	qdf_register_get_bus_reg_dump(pld_get_bus_reg_dump);
352*5113495bSYour Name 
353*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
354*5113495bSYour Name 
355*5113495bSYour Name destroy_lock:
356*5113495bSYour Name 	cds_sys_reboot_lock_deinit();
357*5113495bSYour Name deinit:
358*5113495bSYour Name 	gp_cds_context = NULL;
359*5113495bSYour Name 	qdf_mem_zero(&g_cds_context, sizeof(g_cds_context));
360*5113495bSYour Name 
361*5113495bSYour Name 	return status;
362*5113495bSYour Name }
363*5113495bSYour Name 
364*5113495bSYour Name /**
365*5113495bSYour Name  * cds_deinit() - Deinitialize CDS
366*5113495bSYour Name  *
367*5113495bSYour Name  * This function frees the CDS resources
368*5113495bSYour Name  */
cds_deinit(void)369*5113495bSYour Name void cds_deinit(void)
370*5113495bSYour Name {
371*5113495bSYour Name 	QDF_BUG(gp_cds_context);
372*5113495bSYour Name 	if (!gp_cds_context)
373*5113495bSYour Name 		return;
374*5113495bSYour Name 
375*5113495bSYour Name 	qdf_register_get_bus_reg_dump(NULL);
376*5113495bSYour Name 	qdf_register_recovery_reason_update(NULL);
377*5113495bSYour Name 	qdf_register_recovering_state_query_callback(NULL);
378*5113495bSYour Name 	qdf_register_fw_down_callback(NULL);
379*5113495bSYour Name 	qdf_register_is_driver_unloading_callback(NULL);
380*5113495bSYour Name 	qdf_register_is_driver_state_module_stop_callback(NULL);
381*5113495bSYour Name 	qdf_register_self_recovery_callback(NULL);
382*5113495bSYour Name 	qdf_register_wmi_send_recv_qmi_callback(NULL);
383*5113495bSYour Name 	qdf_register_qmi_indication_callback(NULL);
384*5113495bSYour Name 
385*5113495bSYour Name 	gp_cds_context->qdf_ctx = NULL;
386*5113495bSYour Name 	qdf_mem_zero(&g_qdf_ctx, sizeof(g_qdf_ctx));
387*5113495bSYour Name 
388*5113495bSYour Name 	/* currently, no ssr_protect_deinit */
389*5113495bSYour Name 
390*5113495bSYour Name 	cds_recovery_work_deinit();
391*5113495bSYour Name 	cds_sys_reboot_lock_deinit();
392*5113495bSYour Name 
393*5113495bSYour Name 	gp_cds_context = NULL;
394*5113495bSYour Name 	qdf_mem_zero(&g_cds_context, sizeof(g_cds_context));
395*5113495bSYour Name }
396*5113495bSYour Name 
397*5113495bSYour Name #ifdef FEATURE_WLAN_DIAG_SUPPORT
398*5113495bSYour Name /**
399*5113495bSYour Name  * cds_tdls_tx_rx_mgmt_event()- send tdls mgmt rx tx event
400*5113495bSYour Name  * @event_id: event id
401*5113495bSYour Name  * @tx_rx: tx or rx
402*5113495bSYour Name  * @type: type of frame
403*5113495bSYour Name  * @action_sub_type: action frame type
404*5113495bSYour Name  * @peer_mac: peer mac
405*5113495bSYour Name  *
406*5113495bSYour Name  * This Function sends tdls mgmt rx tx diag event
407*5113495bSYour Name  *
408*5113495bSYour Name  * Return: void.
409*5113495bSYour Name  */
cds_tdls_tx_rx_mgmt_event(uint8_t event_id,uint8_t tx_rx,uint8_t type,uint8_t action_sub_type,uint8_t * peer_mac)410*5113495bSYour Name void cds_tdls_tx_rx_mgmt_event(uint8_t event_id, uint8_t tx_rx,
411*5113495bSYour Name 		uint8_t type, uint8_t action_sub_type, uint8_t *peer_mac)
412*5113495bSYour Name {
413*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(tdls_tx_rx_mgmt,
414*5113495bSYour Name 		struct host_event_tdls_tx_rx_mgmt);
415*5113495bSYour Name 
416*5113495bSYour Name 	tdls_tx_rx_mgmt.event_id = event_id;
417*5113495bSYour Name 	tdls_tx_rx_mgmt.tx_rx = tx_rx;
418*5113495bSYour Name 	tdls_tx_rx_mgmt.type = type;
419*5113495bSYour Name 	tdls_tx_rx_mgmt.action_sub_type = action_sub_type;
420*5113495bSYour Name 	qdf_mem_copy(tdls_tx_rx_mgmt.peer_mac,
421*5113495bSYour Name 			peer_mac, CDS_MAC_ADDRESS_LEN);
422*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&tdls_tx_rx_mgmt,
423*5113495bSYour Name 				EVENT_WLAN_TDLS_TX_RX_MGMT);
424*5113495bSYour Name }
425*5113495bSYour Name #endif
426*5113495bSYour Name 
427*5113495bSYour Name /**
428*5113495bSYour Name  * cds_cfg_update_ac_specs_params() - update ac_specs params
429*5113495bSYour Name  * @olcfg: cfg handle
430*5113495bSYour Name  * @cds_cfg: pointer to cds config
431*5113495bSYour Name  *
432*5113495bSYour Name  * Return: none
433*5113495bSYour Name  */
434*5113495bSYour Name static void
cds_cfg_update_ac_specs_params(struct txrx_pdev_cfg_param_t * olcfg,struct cds_config_info * cds_cfg)435*5113495bSYour Name cds_cfg_update_ac_specs_params(struct txrx_pdev_cfg_param_t *olcfg,
436*5113495bSYour Name 		struct cds_config_info *cds_cfg)
437*5113495bSYour Name {
438*5113495bSYour Name 	int i;
439*5113495bSYour Name 
440*5113495bSYour Name 	if (!olcfg)
441*5113495bSYour Name 		return;
442*5113495bSYour Name 
443*5113495bSYour Name 	if (!cds_cfg)
444*5113495bSYour Name 		return;
445*5113495bSYour Name 
446*5113495bSYour Name 	for (i = 0; i < QCA_WLAN_AC_ALL; i++) {
447*5113495bSYour Name 		olcfg->ac_specs[i].wrr_skip_weight =
448*5113495bSYour Name 			cds_cfg->ac_specs[i].wrr_skip_weight;
449*5113495bSYour Name 		olcfg->ac_specs[i].credit_threshold =
450*5113495bSYour Name 			cds_cfg->ac_specs[i].credit_threshold;
451*5113495bSYour Name 		olcfg->ac_specs[i].send_limit =
452*5113495bSYour Name 			cds_cfg->ac_specs[i].send_limit;
453*5113495bSYour Name 		olcfg->ac_specs[i].credit_reserve =
454*5113495bSYour Name 			cds_cfg->ac_specs[i].credit_reserve;
455*5113495bSYour Name 		olcfg->ac_specs[i].discard_weight =
456*5113495bSYour Name 			cds_cfg->ac_specs[i].discard_weight;
457*5113495bSYour Name 	}
458*5113495bSYour Name }
459*5113495bSYour Name 
460*5113495bSYour Name #if defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(QCA_LL_PDEV_TX_FLOW_CONTROL)
461*5113495bSYour Name static inline void
cds_cdp_set_flow_control_params(struct wlan_objmgr_psoc * psoc,struct txrx_pdev_cfg_param_t * cdp_cfg)462*5113495bSYour Name cds_cdp_set_flow_control_params(struct wlan_objmgr_psoc *psoc,
463*5113495bSYour Name 				struct txrx_pdev_cfg_param_t *cdp_cfg)
464*5113495bSYour Name {
465*5113495bSYour Name 	cdp_cfg->tx_flow_stop_queue_th =
466*5113495bSYour Name 		cfg_get(psoc, CFG_DP_TX_FLOW_STOP_QUEUE_TH);
467*5113495bSYour Name 	cdp_cfg->tx_flow_start_queue_offset =
468*5113495bSYour Name 		cfg_get(psoc, CFG_DP_TX_FLOW_START_QUEUE_OFFSET);
469*5113495bSYour Name }
470*5113495bSYour Name #else
471*5113495bSYour Name static inline void
cds_cdp_set_flow_control_params(struct wlan_objmgr_psoc * psoc,struct txrx_pdev_cfg_param_t * cdp_cfg)472*5113495bSYour Name cds_cdp_set_flow_control_params(struct wlan_objmgr_psoc *psoc,
473*5113495bSYour Name 				struct txrx_pdev_cfg_param_t *cdp_cfg)
474*5113495bSYour Name {}
475*5113495bSYour Name #endif
476*5113495bSYour Name 
477*5113495bSYour Name #ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
478*5113495bSYour Name static inline void
cds_cdp_update_del_ack_params(struct wlan_objmgr_psoc * psoc,struct txrx_pdev_cfg_param_t * cdp_cfg)479*5113495bSYour Name cds_cdp_update_del_ack_params(struct wlan_objmgr_psoc *psoc,
480*5113495bSYour Name 			      struct txrx_pdev_cfg_param_t *cdp_cfg)
481*5113495bSYour Name {
482*5113495bSYour Name 	cdp_cfg->del_ack_enable =
483*5113495bSYour Name 		cfg_get(psoc, CFG_DP_DRIVER_TCP_DELACK_ENABLE);
484*5113495bSYour Name 	cdp_cfg->del_ack_pkt_count =
485*5113495bSYour Name 		cfg_get(psoc, CFG_DP_DRIVER_TCP_DELACK_PKT_CNT);
486*5113495bSYour Name 	cdp_cfg->del_ack_timer_value =
487*5113495bSYour Name 		cfg_get(psoc, CFG_DP_DRIVER_TCP_DELACK_TIMER_VALUE);
488*5113495bSYour Name }
489*5113495bSYour Name #else
490*5113495bSYour Name static inline void
cds_cdp_update_del_ack_params(struct wlan_objmgr_psoc * psoc,struct txrx_pdev_cfg_param_t * cdp_cfg)491*5113495bSYour Name cds_cdp_update_del_ack_params(struct wlan_objmgr_psoc *psoc,
492*5113495bSYour Name 			      struct txrx_pdev_cfg_param_t *cdp_cfg)
493*5113495bSYour Name {}
494*5113495bSYour Name #endif
495*5113495bSYour Name 
496*5113495bSYour Name #ifdef WLAN_SUPPORT_TXRX_HL_BUNDLE
497*5113495bSYour Name static inline void
cds_cdp_update_bundle_params(struct wlan_objmgr_psoc * psoc,struct txrx_pdev_cfg_param_t * cdp_cfg)498*5113495bSYour Name cds_cdp_update_bundle_params(struct wlan_objmgr_psoc *psoc,
499*5113495bSYour Name 			     struct txrx_pdev_cfg_param_t *cdp_cfg)
500*5113495bSYour Name {
501*5113495bSYour Name 	cdp_cfg->bundle_timer_value =
502*5113495bSYour Name 		cfg_get(psoc, CFG_DP_HL_BUNDLE_TIMER_VALUE);
503*5113495bSYour Name 	cdp_cfg->bundle_size =
504*5113495bSYour Name 		cfg_get(psoc, CFG_DP_HL_BUNDLE_SIZE);
505*5113495bSYour Name }
506*5113495bSYour Name #else
507*5113495bSYour Name static inline void
cds_cdp_update_bundle_params(struct wlan_objmgr_psoc * psoc,struct txrx_pdev_cfg_param_t * cdp_cfg)508*5113495bSYour Name cds_cdp_update_bundle_params(struct wlan_objmgr_psoc *psoc,
509*5113495bSYour Name 			     struct txrx_pdev_cfg_param_t *cdp_cfg)
510*5113495bSYour Name {
511*5113495bSYour Name }
512*5113495bSYour Name #endif
513*5113495bSYour Name 
514*5113495bSYour Name /**
515*5113495bSYour Name  * cds_cdp_cfg_attach() - attach data path config module
516*5113495bSYour Name  * @psoc: psoc handle
517*5113495bSYour Name  *
518*5113495bSYour Name  * Return: none
519*5113495bSYour Name  */
cds_cdp_cfg_attach(struct wlan_objmgr_psoc * psoc)520*5113495bSYour Name static void cds_cdp_cfg_attach(struct wlan_objmgr_psoc *psoc)
521*5113495bSYour Name {
522*5113495bSYour Name 	struct txrx_pdev_cfg_param_t cdp_cfg = {0};
523*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
524*5113495bSYour Name 	uint32_t gro_bit_set;
525*5113495bSYour Name 
526*5113495bSYour Name 	cdp_cfg.is_full_reorder_offload = DP_REORDER_OFFLOAD_SUPPORT;
527*5113495bSYour Name 	cdp_cfg.is_uc_offload_enabled = ucfg_ipa_uc_is_enabled();
528*5113495bSYour Name 	cdp_cfg.uc_tx_buffer_count = cfg_get(psoc, CFG_DP_IPA_UC_TX_BUF_COUNT);
529*5113495bSYour Name 	cdp_cfg.uc_tx_buffer_size =
530*5113495bSYour Name 			cfg_get(psoc, CFG_DP_IPA_UC_TX_BUF_SIZE);
531*5113495bSYour Name 	cdp_cfg.uc_rx_indication_ring_count =
532*5113495bSYour Name 		cfg_get(psoc, CFG_DP_IPA_UC_RX_IND_RING_COUNT);
533*5113495bSYour Name 	cdp_cfg.uc_tx_partition_base =
534*5113495bSYour Name 		cfg_get(psoc, CFG_DP_IPA_UC_TX_PARTITION_BASE);
535*5113495bSYour Name 	cdp_cfg.enable_rxthread = ucfg_dp_is_rx_common_thread_enabled(psoc);
536*5113495bSYour Name 	cdp_cfg.ip_tcp_udp_checksum_offload =
537*5113495bSYour Name 		cfg_get(psoc, CFG_DP_TCP_UDP_CKSUM_OFFLOAD);
538*5113495bSYour Name 	cdp_cfg.nan_ip_tcp_udp_checksum_offload =
539*5113495bSYour Name 		cfg_get(psoc, CFG_DP_NAN_TCP_UDP_CKSUM_OFFLOAD);
540*5113495bSYour Name 	cdp_cfg.p2p_ip_tcp_udp_checksum_offload =
541*5113495bSYour Name 		cfg_get(psoc, CFG_DP_P2P_TCP_UDP_CKSUM_OFFLOAD);
542*5113495bSYour Name 	cdp_cfg.legacy_mode_csum_disable =
543*5113495bSYour Name 		cfg_get(psoc, CFG_DP_LEGACY_MODE_CSUM_DISABLE);
544*5113495bSYour Name 	cdp_cfg.ce_classify_enabled =
545*5113495bSYour Name 		cfg_get(psoc, CFG_DP_CE_CLASSIFY_ENABLE);
546*5113495bSYour Name 	cdp_cfg.tso_enable = cfg_get(psoc, CFG_DP_TSO);
547*5113495bSYour Name 	cdp_cfg.lro_enable = cfg_get(psoc, CFG_DP_LRO);
548*5113495bSYour Name 	cdp_cfg.sg_enable = cfg_get(psoc, CFG_DP_SG);
549*5113495bSYour Name 	cdp_cfg.enable_data_stall_detection =
550*5113495bSYour Name 		cfg_get(psoc, CFG_DP_ENABLE_DATA_STALL_DETECTION);
551*5113495bSYour Name 	gro_bit_set = cfg_get(psoc, CFG_DP_GRO);
552*5113495bSYour Name 	if (gro_bit_set & DP_GRO_ENABLE_BIT_SET)
553*5113495bSYour Name 		cdp_cfg.gro_enable = true;
554*5113495bSYour Name 	cdp_cfg.enable_flow_steering =
555*5113495bSYour Name 		cfg_get(psoc, CFG_DP_FLOW_STEERING_ENABLED);
556*5113495bSYour Name 	cdp_cfg.disable_intra_bss_fwd =
557*5113495bSYour Name 		cfg_get(psoc, CFG_DP_AP_STA_SECURITY_SEPERATION);
558*5113495bSYour Name 	cdp_cfg.pktlog_buffer_size =
559*5113495bSYour Name 		cfg_get(psoc, CFG_DP_PKTLOG_BUFFER_SIZE);
560*5113495bSYour Name 
561*5113495bSYour Name 	cds_cdp_update_del_ack_params(psoc, &cdp_cfg);
562*5113495bSYour Name 
563*5113495bSYour Name 	cds_cdp_update_bundle_params(psoc, &cdp_cfg);
564*5113495bSYour Name 
565*5113495bSYour Name 	gp_cds_context->cfg_ctx = cdp_cfg_attach(soc, gp_cds_context->qdf_ctx,
566*5113495bSYour Name 					(void *)(&cdp_cfg));
567*5113495bSYour Name 	if (!gp_cds_context->cfg_ctx) {
568*5113495bSYour Name 		cds_debug("failed to init cfg handle");
569*5113495bSYour Name 		return;
570*5113495bSYour Name 	}
571*5113495bSYour Name 
572*5113495bSYour Name 	/* Configure Receive flow steering */
573*5113495bSYour Name 	cdp_cfg_set_flow_steering(soc, gp_cds_context->cfg_ctx,
574*5113495bSYour Name 				  cfg_get(psoc, CFG_DP_FLOW_STEERING_ENABLED));
575*5113495bSYour Name 
576*5113495bSYour Name 	cds_cdp_set_flow_control_params(psoc, &cdp_cfg);
577*5113495bSYour Name 	cdp_cfg_set_flow_control_parameters(soc, gp_cds_context->cfg_ctx,
578*5113495bSYour Name 					    (void *)&cdp_cfg);
579*5113495bSYour Name 
580*5113495bSYour Name 	/* adjust the cfg_ctx default value based on setting */
581*5113495bSYour Name 	cdp_cfg_set_rx_fwd_disabled(soc, gp_cds_context->cfg_ctx,
582*5113495bSYour Name 				    cfg_get(psoc,
583*5113495bSYour Name 					    CFG_DP_AP_STA_SECURITY_SEPERATION));
584*5113495bSYour Name 
585*5113495bSYour Name 	/*
586*5113495bSYour Name 	 * adjust the packet log enable default value
587*5113495bSYour Name 	 * based on CFG INI setting
588*5113495bSYour Name 	 */
589*5113495bSYour Name 	cdp_cfg_set_packet_log_enabled(soc, gp_cds_context->cfg_ctx,
590*5113495bSYour Name 		(uint8_t)cds_is_packet_log_enabled());
591*5113495bSYour Name 
592*5113495bSYour Name 	/* adjust the ptp rx option default value based on CFG INI setting */
593*5113495bSYour Name 	cdp_cfg_set_ptp_rx_opt_enabled(soc, gp_cds_context->cfg_ctx,
594*5113495bSYour Name 				       (uint8_t)cds_is_ptp_rx_opt_enabled());
595*5113495bSYour Name }
cds_register_all_modules(void)596*5113495bSYour Name static QDF_STATUS cds_register_all_modules(void)
597*5113495bSYour Name {
598*5113495bSYour Name 	QDF_STATUS status;
599*5113495bSYour Name 
600*5113495bSYour Name 	scheduler_register_wma_legacy_handler(&wma_mc_process_handler);
601*5113495bSYour Name 	scheduler_register_sys_legacy_handler(&sys_mc_process_handler);
602*5113495bSYour Name 
603*5113495bSYour Name 	/* Register message queues in given order such that queue priority is
604*5113495bSYour Name 	 * intact:
605*5113495bSYour Name 	 * 1) QDF_MODULE_ID_SYS: Timer queue(legacy SYS queue)
606*5113495bSYour Name 	 * 2) QDF_MODULE_ID_TARGET_IF: Target interface queue
607*5113495bSYour Name 	 * 3) QDF_MODULE_ID_PE: Legacy PE message queue
608*5113495bSYour Name 	 * 4) QDF_MODULE_ID_SME: Legacy SME message queue
609*5113495bSYour Name 	 * 5) QDF_MODULE_ID_OS_IF: OS IF message queue for new components
610*5113495bSYour Name 	 */
611*5113495bSYour Name 	status = scheduler_register_module(QDF_MODULE_ID_SYS,
612*5113495bSYour Name 					&scheduler_timer_q_mq_handler);
613*5113495bSYour Name 	status = scheduler_register_module(QDF_MODULE_ID_TARGET_IF,
614*5113495bSYour Name 					&scheduler_target_if_mq_handler);
615*5113495bSYour Name 	status = scheduler_register_module(QDF_MODULE_ID_PE,
616*5113495bSYour Name 					&pe_mc_process_handler);
617*5113495bSYour Name 	status = scheduler_register_module(QDF_MODULE_ID_SME,
618*5113495bSYour Name 					&sme_mc_process_handler);
619*5113495bSYour Name 	status = scheduler_register_module(QDF_MODULE_ID_OS_IF,
620*5113495bSYour Name 					&scheduler_os_if_mq_handler);
621*5113495bSYour Name 	status = scheduler_register_module(QDF_MODULE_ID_SCAN,
622*5113495bSYour Name 					&scheduler_scan_mq_handler);
623*5113495bSYour Name 	return status;
624*5113495bSYour Name }
625*5113495bSYour Name 
cds_deregister_all_modules(void)626*5113495bSYour Name static QDF_STATUS cds_deregister_all_modules(void)
627*5113495bSYour Name {
628*5113495bSYour Name 	QDF_STATUS status;
629*5113495bSYour Name 
630*5113495bSYour Name 	scheduler_deregister_wma_legacy_handler();
631*5113495bSYour Name 	scheduler_deregister_sys_legacy_handler();
632*5113495bSYour Name 	status = scheduler_deregister_module(QDF_MODULE_ID_SCAN);
633*5113495bSYour Name 	status = scheduler_deregister_module(QDF_MODULE_ID_SYS);
634*5113495bSYour Name 	status = scheduler_deregister_module(QDF_MODULE_ID_TARGET_IF);
635*5113495bSYour Name 	status = scheduler_deregister_module(QDF_MODULE_ID_PE);
636*5113495bSYour Name 	status = scheduler_deregister_module(QDF_MODULE_ID_SME);
637*5113495bSYour Name 	status = scheduler_deregister_module(QDF_MODULE_ID_OS_IF);
638*5113495bSYour Name 
639*5113495bSYour Name 	return status;
640*5113495bSYour Name }
641*5113495bSYour Name 
642*5113495bSYour Name /**
643*5113495bSYour Name  * cds_set_ac_specs_params() - set ac_specs params in cds_config_info
644*5113495bSYour Name  * @cds_cfg: Pointer to cds_config_info
645*5113495bSYour Name  *
646*5113495bSYour Name  * Return: none
647*5113495bSYour Name  */
648*5113495bSYour Name static void
cds_set_ac_specs_params(struct cds_config_info * cds_cfg)649*5113495bSYour Name cds_set_ac_specs_params(struct cds_config_info *cds_cfg)
650*5113495bSYour Name {
651*5113495bSYour Name 	int i;
652*5113495bSYour Name 	struct cds_context *cds_ctx;
653*5113495bSYour Name 
654*5113495bSYour Name 	if (!cds_cfg)
655*5113495bSYour Name 		return;
656*5113495bSYour Name 
657*5113495bSYour Name 	cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
658*5113495bSYour Name 	if (!cds_ctx)
659*5113495bSYour Name 		return;
660*5113495bSYour Name 
661*5113495bSYour Name 	for (i = 0; i < QCA_WLAN_AC_ALL; i++) {
662*5113495bSYour Name 		cds_cfg->ac_specs[i] = cds_ctx->ac_specs[i];
663*5113495bSYour Name 	}
664*5113495bSYour Name }
665*5113495bSYour Name 
cds_hang_event_notifier_call(struct notifier_block * block,unsigned long state,void * data)666*5113495bSYour Name static int cds_hang_event_notifier_call(struct notifier_block *block,
667*5113495bSYour Name 					unsigned long state,
668*5113495bSYour Name 					void *data)
669*5113495bSYour Name {
670*5113495bSYour Name 	struct qdf_notifer_data *cds_hang_data = data;
671*5113495bSYour Name 	uint32_t total_len;
672*5113495bSYour Name 	struct cds_hang_event_fixed_param *cmd;
673*5113495bSYour Name 	uint8_t *cds_hang_evt_buff;
674*5113495bSYour Name 
675*5113495bSYour Name 	if (!cds_hang_data)
676*5113495bSYour Name 		return NOTIFY_STOP_MASK;
677*5113495bSYour Name 
678*5113495bSYour Name 	cds_hang_evt_buff = cds_hang_data->hang_data;
679*5113495bSYour Name 
680*5113495bSYour Name 	if (!cds_hang_evt_buff)
681*5113495bSYour Name 		return NOTIFY_STOP_MASK;
682*5113495bSYour Name 
683*5113495bSYour Name 	total_len = sizeof(*cmd);
684*5113495bSYour Name 	if (cds_hang_data->offset + total_len > QDF_WLAN_HANG_FW_OFFSET)
685*5113495bSYour Name 		return NOTIFY_STOP_MASK;
686*5113495bSYour Name 
687*5113495bSYour Name 	cds_hang_evt_buff = cds_hang_data->hang_data + cds_hang_data->offset;
688*5113495bSYour Name 	cmd = (struct cds_hang_event_fixed_param *)cds_hang_evt_buff;
689*5113495bSYour Name 	QDF_HANG_EVT_SET_HDR(&cmd->tlv_header, HANG_EVT_TAG_CDS,
690*5113495bSYour Name 			     QDF_HANG_GET_STRUCT_TLVLEN(*cmd));
691*5113495bSYour Name 
692*5113495bSYour Name 	cmd->recovery_reason = gp_cds_context->recovery_reason;
693*5113495bSYour Name 
694*5113495bSYour Name 	/* userspace expects a fixed format */
695*5113495bSYour Name 	qdf_mem_set(&cmd->driver_version, DRIVER_VER_LEN, ' ');
696*5113495bSYour Name 	qdf_mem_copy(&cmd->driver_version, QWLAN_VERSIONSTR,
697*5113495bSYour Name 		     qdf_min(sizeof(QWLAN_VERSIONSTR) - 1,
698*5113495bSYour Name 			     (size_t)DRIVER_VER_LEN));
699*5113495bSYour Name 
700*5113495bSYour Name 	/* userspace expects a fixed format */
701*5113495bSYour Name 	qdf_mem_set(&cmd->hang_event_version, HANG_EVENT_VER_LEN, ' ');
702*5113495bSYour Name 	qdf_mem_copy(&cmd->hang_event_version, QDF_HANG_EVENT_VERSION,
703*5113495bSYour Name 		     qdf_min(sizeof(QDF_HANG_EVENT_VERSION) - 1,
704*5113495bSYour Name 			     (size_t)HANG_EVENT_VER_LEN));
705*5113495bSYour Name 
706*5113495bSYour Name 	cds_hang_data->offset += total_len;
707*5113495bSYour Name 	return NOTIFY_OK;
708*5113495bSYour Name }
709*5113495bSYour Name 
710*5113495bSYour Name static qdf_notif_block cds_hang_event_notifier = {
711*5113495bSYour Name 	.notif_block.notifier_call = cds_hang_event_notifier_call,
712*5113495bSYour Name };
713*5113495bSYour Name 
714*5113495bSYour Name /**
715*5113495bSYour Name  * cds_set_exclude_selftx_from_cca_busy_time() - Set exclude self tx time
716*5113495bSYour Name  * from cca busy time bool in cds config
717*5113495bSYour Name  * @exclude_selftx_from_cca_busy: Bool to be stored in cds config
718*5113495bSYour Name  * @cds_cfg: Pointer to cds config
719*5113495bSYour Name  *
720*5113495bSYour Name  * Return: None
721*5113495bSYour Name  */
722*5113495bSYour Name static void
cds_set_exclude_selftx_from_cca_busy_time(bool exclude_selftx_from_cca_busy,struct cds_config_info * cds_cfg)723*5113495bSYour Name cds_set_exclude_selftx_from_cca_busy_time(bool exclude_selftx_from_cca_busy,
724*5113495bSYour Name 					  struct cds_config_info *cds_cfg)
725*5113495bSYour Name {
726*5113495bSYour Name 	cds_cfg->exclude_selftx_from_cca_busy = exclude_selftx_from_cca_busy;
727*5113495bSYour Name }
728*5113495bSYour Name 
729*5113495bSYour Name /**
730*5113495bSYour Name  * cds_open() - open the CDS Module
731*5113495bSYour Name  *
732*5113495bSYour Name  * cds_open() function opens the CDS Scheduler
733*5113495bSYour Name  * Upon successful initialization:
734*5113495bSYour Name  * - All CDS submodules should have been initialized
735*5113495bSYour Name  *
736*5113495bSYour Name  * - The CDS scheduler should have opened
737*5113495bSYour Name  *
738*5113495bSYour Name  * - All the WLAN SW components should have been opened. This includes
739*5113495bSYour Name  * SYS, MAC, SME, WMA and TL.
740*5113495bSYour Name  * @psoc: psoc handle
741*5113495bSYour Name  *
742*5113495bSYour Name  * Return: QDF status
743*5113495bSYour Name  */
cds_open(struct wlan_objmgr_psoc * psoc)744*5113495bSYour Name QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
745*5113495bSYour Name {
746*5113495bSYour Name 	QDF_STATUS status;
747*5113495bSYour Name 	struct cds_config_info *cds_cfg;
748*5113495bSYour Name 	qdf_device_t qdf_ctx;
749*5113495bSYour Name 	struct htc_init_info htcInfo = { 0 };
750*5113495bSYour Name 	struct dp_txrx_soc_attach_params soc_attach_params = {0};
751*5113495bSYour Name 	struct ol_context *ol_ctx;
752*5113495bSYour Name 	struct hif_opaque_softc *scn;
753*5113495bSYour Name 	void *HTCHandle;
754*5113495bSYour Name 	struct hdd_context *hdd_ctx;
755*5113495bSYour Name 	struct cds_context *cds_ctx;
756*5113495bSYour Name 	mac_handle_t mac_handle;
757*5113495bSYour Name 
758*5113495bSYour Name 	cds_debug("Opening CDS");
759*5113495bSYour Name 
760*5113495bSYour Name 	cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
761*5113495bSYour Name 	if (!cds_ctx)
762*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
763*5113495bSYour Name 
764*5113495bSYour Name 	/* Initialize the timer module */
765*5113495bSYour Name 	qdf_timer_module_init();
766*5113495bSYour Name 
767*5113495bSYour Name 	/* Initialize bug reporting structure */
768*5113495bSYour Name 	cds_init_log_completion();
769*5113495bSYour Name 
770*5113495bSYour Name 	hdd_ctx = gp_cds_context->hdd_context;
771*5113495bSYour Name 	if (!hdd_ctx || !hdd_ctx->config) {
772*5113495bSYour Name 		cds_err("Hdd Context is Null");
773*5113495bSYour Name 
774*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
775*5113495bSYour Name 		return status;
776*5113495bSYour Name 	}
777*5113495bSYour Name 
778*5113495bSYour Name 	status = dispatcher_enable();
779*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
780*5113495bSYour Name 		cds_err("Failed to enable dispatcher; status:%d", status);
781*5113495bSYour Name 		return status;
782*5113495bSYour Name 	}
783*5113495bSYour Name 
784*5113495bSYour Name 	/* Now Open the CDS Scheduler */
785*5113495bSYour Name 	status = cds_sched_open(gp_cds_context,
786*5113495bSYour Name 				&gp_cds_context->qdf_sched,
787*5113495bSYour Name 				sizeof(cds_sched_context));
788*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
789*5113495bSYour Name 		cds_alert("Failed to open CDS Scheduler");
790*5113495bSYour Name 		goto err_dispatcher_disable;
791*5113495bSYour Name 	}
792*5113495bSYour Name 
793*5113495bSYour Name 	scn = cds_get_context(QDF_MODULE_ID_HIF);
794*5113495bSYour Name 	if (!scn) {
795*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
796*5113495bSYour Name 		goto err_sched_close;
797*5113495bSYour Name 	}
798*5113495bSYour Name 
799*5113495bSYour Name 	cds_cfg = cds_get_ini_config();
800*5113495bSYour Name 	if (!cds_cfg) {
801*5113495bSYour Name 		cds_err("Cds config is NULL");
802*5113495bSYour Name 
803*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
804*5113495bSYour Name 		goto err_sched_close;
805*5113495bSYour Name 	}
806*5113495bSYour Name 
807*5113495bSYour Name 	hdd_enable_fastpath(hdd_ctx, scn);
808*5113495bSYour Name 
809*5113495bSYour Name 	/* Initialize BMI and Download firmware */
810*5113495bSYour Name 	ol_ctx = cds_get_context(QDF_MODULE_ID_BMI);
811*5113495bSYour Name 	status = bmi_download_firmware(ol_ctx);
812*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
813*5113495bSYour Name 		cds_alert("BMI FIALED status:%d", status);
814*5113495bSYour Name 		goto err_bmi_close;
815*5113495bSYour Name 	}
816*5113495bSYour Name 
817*5113495bSYour Name 	hdd_wlan_update_target_info(hdd_ctx, scn);
818*5113495bSYour Name 
819*5113495bSYour Name 	htcInfo.pContext = ol_ctx;
820*5113495bSYour Name 	htcInfo.TargetFailure = ol_target_failure;
821*5113495bSYour Name 	htcInfo.TargetSendSuspendComplete =
822*5113495bSYour Name 		ucfg_pmo_psoc_target_suspend_acknowledge;
823*5113495bSYour Name 	htcInfo.target_initial_wakeup_cb = ucfg_pmo_psoc_handle_initial_wake_up;
824*5113495bSYour Name 	htcInfo.target_psoc = (void *)psoc;
825*5113495bSYour Name 	htcInfo.cfg_wmi_credit_cnt = hdd_ctx->config->cfg_wmi_credit_cnt;
826*5113495bSYour Name 	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
827*5113495bSYour Name 
828*5113495bSYour Name 	/* Create HTC */
829*5113495bSYour Name 	gp_cds_context->htc_ctx =
830*5113495bSYour Name 		htc_create(scn, &htcInfo, qdf_ctx, cds_get_conparam());
831*5113495bSYour Name 	if (!gp_cds_context->htc_ctx) {
832*5113495bSYour Name 		cds_alert("Failed to Create HTC");
833*5113495bSYour Name 
834*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
835*5113495bSYour Name 		goto err_bmi_close;
836*5113495bSYour Name 	}
837*5113495bSYour Name 	ucfg_pmo_psoc_update_htc_handle(psoc, (void *)gp_cds_context->htc_ctx);
838*5113495bSYour Name 
839*5113495bSYour Name 	status = bmi_done(ol_ctx);
840*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
841*5113495bSYour Name 		cds_alert("Failed to complete BMI phase");
842*5113495bSYour Name 		goto err_htc_close;
843*5113495bSYour Name 	}
844*5113495bSYour Name 
845*5113495bSYour Name 	cds_set_exclude_selftx_from_cca_busy_time(
846*5113495bSYour Name 				hdd_ctx->config->exclude_selftx_from_cca_busy,
847*5113495bSYour Name 				cds_cfg);
848*5113495bSYour Name 	/*Open the WMA module */
849*5113495bSYour Name 	status = wma_open(psoc, hdd_update_tgt_cfg, cds_cfg,
850*5113495bSYour Name 			  hdd_ctx->target_type);
851*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
852*5113495bSYour Name 		cds_alert("Failed to open WMA module");
853*5113495bSYour Name 		goto err_htc_close;
854*5113495bSYour Name 	}
855*5113495bSYour Name 
856*5113495bSYour Name 	/* Number of peers limit differs in each chip version. If peer max
857*5113495bSYour Name 	 * limit configured in ini exceeds more than supported, WMA adjusts
858*5113495bSYour Name 	 * and keeps correct limit in cds_cfg.max_station. So, make sure
859*5113495bSYour Name 	 * config entry hdd_ctx->config->maxNumberOfPeers has adjusted value
860*5113495bSYour Name 	 */
861*5113495bSYour Name 	/* In FTM mode cds_cfg->max_stations will be zero. On updating same
862*5113495bSYour Name 	 * into hdd context config entry, leads to pe_open() to fail, if
863*5113495bSYour Name 	 * con_mode change happens from FTM mode to any other mode.
864*5113495bSYour Name 	 */
865*5113495bSYour Name 	if (QDF_DRIVER_TYPE_PRODUCTION == cds_cfg->driver_type)
866*5113495bSYour Name 		ucfg_mlme_set_sap_max_peers(psoc, cds_cfg->max_station);
867*5113495bSYour Name 
868*5113495bSYour Name 	HTCHandle = cds_get_context(QDF_MODULE_ID_HTC);
869*5113495bSYour Name 	gp_cds_context->cfg_ctx = NULL;
870*5113495bSYour Name 	if (!HTCHandle) {
871*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
872*5113495bSYour Name 		goto err_wma_close;
873*5113495bSYour Name 	}
874*5113495bSYour Name 
875*5113495bSYour Name 	status = htc_wait_target(HTCHandle);
876*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
877*5113495bSYour Name 		cds_alert("Failed to complete BMI phase. status: %d", status);
878*5113495bSYour Name 		QDF_BUG(status == QDF_STATUS_E_NOMEM || cds_is_fw_down());
879*5113495bSYour Name 
880*5113495bSYour Name 		goto err_wma_close;
881*5113495bSYour Name 	}
882*5113495bSYour Name 
883*5113495bSYour Name 	cds_debug("target_type %d 8074:%d 6290:%d 6390: %d 6490: %d 6750: %d",
884*5113495bSYour Name 		  hdd_ctx->target_type,
885*5113495bSYour Name 		  TARGET_TYPE_QCA8074,
886*5113495bSYour Name 		  TARGET_TYPE_QCA6290,
887*5113495bSYour Name 		  TARGET_TYPE_QCA6390,
888*5113495bSYour Name 		  TARGET_TYPE_QCA6490,
889*5113495bSYour Name 		  TARGET_TYPE_QCA6750);
890*5113495bSYour Name 
891*5113495bSYour Name 	/* Set default value to false */
892*5113495bSYour Name 	hdd_ctx->is_wifi3_0_target = false;
893*5113495bSYour Name 
894*5113495bSYour Name 	soc_attach_params.target_type = hdd_ctx->target_type;
895*5113495bSYour Name 	soc_attach_params.target_psoc = htcInfo.target_psoc;
896*5113495bSYour Name 	soc_attach_params.dp_ol_if_ops = &dp_ol_if_ops;
897*5113495bSYour Name 	gp_cds_context->dp_soc =
898*5113495bSYour Name 		ucfg_dp_txrx_soc_attach(&soc_attach_params,
899*5113495bSYour Name 					&hdd_ctx->is_wifi3_0_target);
900*5113495bSYour Name 	if (!gp_cds_context->dp_soc) {
901*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
902*5113495bSYour Name 		goto err_wma_close;
903*5113495bSYour Name 	}
904*5113495bSYour Name 
905*5113495bSYour Name 	wlan_psoc_set_dp_handle(psoc, gp_cds_context->dp_soc);
906*5113495bSYour Name 	ucfg_dp_set_cmn_dp_handle(psoc, gp_cds_context->dp_soc);
907*5113495bSYour Name 	ucfg_pmo_psoc_update_dp_handle(psoc, gp_cds_context->dp_soc);
908*5113495bSYour Name 	ucfg_ocb_update_dp_handle(psoc, gp_cds_context->dp_soc);
909*5113495bSYour Name 
910*5113495bSYour Name 	cds_set_ac_specs_params(cds_cfg);
911*5113495bSYour Name 	cds_cfg_update_ac_specs_params((struct txrx_pdev_cfg_param_t *)
912*5113495bSYour Name 				       gp_cds_context->cfg_ctx, cds_cfg);
913*5113495bSYour Name 	cds_cdp_cfg_attach(psoc);
914*5113495bSYour Name 
915*5113495bSYour Name 	bmi_target_ready(scn, gp_cds_context->cfg_ctx);
916*5113495bSYour Name 
917*5113495bSYour Name 	/* Now proceed to open the MAC */
918*5113495bSYour Name 	status = mac_open(psoc, &mac_handle,
919*5113495bSYour Name 			  gp_cds_context->hdd_context, cds_cfg);
920*5113495bSYour Name 
921*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != status) {
922*5113495bSYour Name 		cds_alert("Failed to open MAC");
923*5113495bSYour Name 		goto err_soc_detach;
924*5113495bSYour Name 	}
925*5113495bSYour Name 	gp_cds_context->mac_context = mac_handle;
926*5113495bSYour Name 
927*5113495bSYour Name 	/* Now proceed to open the SME */
928*5113495bSYour Name 	status = sme_open(mac_handle);
929*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
930*5113495bSYour Name 		cds_alert("Failed to open SME");
931*5113495bSYour Name 		goto err_mac_close;
932*5113495bSYour Name 	}
933*5113495bSYour Name 
934*5113495bSYour Name 	cds_register_all_modules();
935*5113495bSYour Name 
936*5113495bSYour Name 	status = dispatcher_psoc_open(psoc);
937*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
938*5113495bSYour Name 		cds_alert("Failed to open PSOC Components");
939*5113495bSYour Name 		goto deregister_modules;
940*5113495bSYour Name 	}
941*5113495bSYour Name 
942*5113495bSYour Name 	ucfg_mc_cp_stats_register_pmo_handler();
943*5113495bSYour Name 	qdf_hang_event_register_notifier(&cds_hang_event_notifier);
944*5113495bSYour Name 
945*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
946*5113495bSYour Name 
947*5113495bSYour Name deregister_modules:
948*5113495bSYour Name 	cds_deregister_all_modules();
949*5113495bSYour Name 	sme_close(mac_handle);
950*5113495bSYour Name 
951*5113495bSYour Name err_mac_close:
952*5113495bSYour Name 	mac_close(mac_handle);
953*5113495bSYour Name 	gp_cds_context->mac_context = NULL;
954*5113495bSYour Name 
955*5113495bSYour Name err_soc_detach:
956*5113495bSYour Name 	ucfg_dp_txrx_soc_detach(gp_cds_context->dp_soc);
957*5113495bSYour Name 	gp_cds_context->dp_soc = NULL;
958*5113495bSYour Name 
959*5113495bSYour Name 	ucfg_ocb_update_dp_handle(psoc, NULL);
960*5113495bSYour Name 	ucfg_pmo_psoc_update_dp_handle(psoc, NULL);
961*5113495bSYour Name 	wlan_psoc_set_dp_handle(psoc, NULL);
962*5113495bSYour Name 
963*5113495bSYour Name err_wma_close:
964*5113495bSYour Name 	cds_shutdown_notifier_purge();
965*5113495bSYour Name 	wma_close();
966*5113495bSYour Name 	wma_wmi_service_close();
967*5113495bSYour Name 
968*5113495bSYour Name err_htc_close:
969*5113495bSYour Name 	if (gp_cds_context->htc_ctx) {
970*5113495bSYour Name 		htc_destroy(gp_cds_context->htc_ctx);
971*5113495bSYour Name 		gp_cds_context->htc_ctx = NULL;
972*5113495bSYour Name 		ucfg_pmo_psoc_update_htc_handle(psoc, NULL);
973*5113495bSYour Name 	}
974*5113495bSYour Name 
975*5113495bSYour Name err_bmi_close:
976*5113495bSYour Name 	bmi_cleanup(ol_ctx);
977*5113495bSYour Name 
978*5113495bSYour Name err_sched_close:
979*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(cds_sched_close()))
980*5113495bSYour Name 		QDF_DEBUG_PANIC("Failed to close CDS Scheduler");
981*5113495bSYour Name 
982*5113495bSYour Name err_dispatcher_disable:
983*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(dispatcher_disable()))
984*5113495bSYour Name 		QDF_DEBUG_PANIC("Failed to disable dispatcher");
985*5113495bSYour Name 
986*5113495bSYour Name 	return status;
987*5113495bSYour Name } /* cds_open() */
988*5113495bSYour Name 
cds_dp_open(struct wlan_objmgr_psoc * psoc)989*5113495bSYour Name QDF_STATUS cds_dp_open(struct wlan_objmgr_psoc *psoc)
990*5113495bSYour Name {
991*5113495bSYour Name 	QDF_STATUS qdf_status;
992*5113495bSYour Name 	struct dp_txrx_config dp_config;
993*5113495bSYour Name 	struct hdd_context *hdd_ctx;
994*5113495bSYour Name 
995*5113495bSYour Name 	hdd_ctx = gp_cds_context->hdd_context;
996*5113495bSYour Name 	if (!hdd_ctx) {
997*5113495bSYour Name 		cds_err("HDD context is null");
998*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
999*5113495bSYour Name 	}
1000*5113495bSYour Name 
1001*5113495bSYour Name 	qdf_status =
1002*5113495bSYour Name 		ucfg_dp_txrx_pdev_attach(cds_get_context(QDF_MODULE_ID_SOC));
1003*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1004*5113495bSYour Name 		/* Critical Error ...  Cannot proceed further */
1005*5113495bSYour Name 		cds_alert("Failed to open TXRX");
1006*5113495bSYour Name 		QDF_ASSERT(0);
1007*5113495bSYour Name 		goto close;
1008*5113495bSYour Name 	}
1009*5113495bSYour Name 
1010*5113495bSYour Name 	if (hdd_ctx->target_type == TARGET_TYPE_QCA6290 ||
1011*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_QCA6390 ||
1012*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_QCA6490 ||
1013*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_QCA6750 ||
1014*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_KIWI ||
1015*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_MANGO ||
1016*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_PEACH ||
1017*5113495bSYour Name 	    hdd_ctx->target_type == TARGET_TYPE_WCN6450) {
1018*5113495bSYour Name 		qdf_status = cdp_pdev_init(cds_get_context(QDF_MODULE_ID_SOC),
1019*5113495bSYour Name 					   gp_cds_context->htc_ctx,
1020*5113495bSYour Name 					   gp_cds_context->qdf_ctx, 0);
1021*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1022*5113495bSYour Name 			/* Critical Error ...  Cannot proceed further */
1023*5113495bSYour Name 			cds_alert("Failed to init TXRX");
1024*5113495bSYour Name 			QDF_ASSERT(0);
1025*5113495bSYour Name 			goto pdev_detach;
1026*5113495bSYour Name 		}
1027*5113495bSYour Name 	}
1028*5113495bSYour Name 
1029*5113495bSYour Name 	if (cdp_txrx_intr_attach(gp_cds_context->dp_soc)
1030*5113495bSYour Name 				!= QDF_STATUS_SUCCESS) {
1031*5113495bSYour Name 		cds_alert("Failed to attach interrupts");
1032*5113495bSYour Name 		goto pdev_deinit;
1033*5113495bSYour Name 	}
1034*5113495bSYour Name 
1035*5113495bSYour Name 	dp_config.enable_rx_threads =
1036*5113495bSYour Name 		(cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE) ?
1037*5113495bSYour Name 		false : gp_cds_context->cds_cfg->enable_dp_rx_threads;
1038*5113495bSYour Name 
1039*5113495bSYour Name 	qdf_status = ucfg_dp_txrx_init(cds_get_context(QDF_MODULE_ID_SOC),
1040*5113495bSYour Name 				       OL_TXRX_PDEV_ID,
1041*5113495bSYour Name 				       &dp_config);
1042*5113495bSYour Name 
1043*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status))
1044*5113495bSYour Name 		goto intr_close;
1045*5113495bSYour Name 
1046*5113495bSYour Name 	ucfg_pmo_psoc_set_txrx_pdev_id(psoc, OL_TXRX_PDEV_ID);
1047*5113495bSYour Name 	ucfg_ocb_set_txrx_pdev_id(psoc, OL_TXRX_PDEV_ID);
1048*5113495bSYour Name 
1049*5113495bSYour Name 	cdp_set_rtpm_tput_policy_requirement(cds_get_context(QDF_MODULE_ID_SOC),
1050*5113495bSYour Name 					     false);
1051*5113495bSYour Name 
1052*5113495bSYour Name 	cds_debug("CDS successfully Opened");
1053*5113495bSYour Name 
1054*5113495bSYour Name 	if (cdp_cfg_get(gp_cds_context->dp_soc, cfg_dp_tc_based_dyn_gro_enable))
1055*5113495bSYour Name 		ucfg_dp_set_tc_based_dyn_gro(psoc, true);
1056*5113495bSYour Name 	else
1057*5113495bSYour Name 		ucfg_dp_set_tc_based_dyn_gro(psoc, false);
1058*5113495bSYour Name 
1059*5113495bSYour Name 	ucfg_dp_set_tc_ingress_prio(psoc, cdp_cfg_get(gp_cds_context->dp_soc,
1060*5113495bSYour Name 						      cfg_dp_tc_ingress_prio));
1061*5113495bSYour Name 
1062*5113495bSYour Name 	return 0;
1063*5113495bSYour Name 
1064*5113495bSYour Name intr_close:
1065*5113495bSYour Name 	cdp_txrx_intr_detach(gp_cds_context->dp_soc);
1066*5113495bSYour Name 
1067*5113495bSYour Name pdev_deinit:
1068*5113495bSYour Name 	cdp_pdev_deinit(gp_cds_context->dp_soc,
1069*5113495bSYour Name 			OL_TXRX_PDEV_ID, false);
1070*5113495bSYour Name 
1071*5113495bSYour Name pdev_detach:
1072*5113495bSYour Name 	ucfg_dp_txrx_pdev_detach(gp_cds_context->dp_soc, OL_TXRX_PDEV_ID,
1073*5113495bSYour Name 				 false);
1074*5113495bSYour Name 
1075*5113495bSYour Name close:
1076*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
1077*5113495bSYour Name }
1078*5113495bSYour Name 
1079*5113495bSYour Name /**
1080*5113495bSYour Name  * cds_should_suspend_target() - Get value whether target can suspend
1081*5113495bSYour Name  *
1082*5113495bSYour Name  * Return: true if target can suspend, otherwise false
1083*5113495bSYour Name  */
cds_should_suspend_target(void)1084*5113495bSYour Name static bool cds_should_suspend_target(void)
1085*5113495bSYour Name {
1086*5113495bSYour Name 	struct hif_opaque_softc *hif_ctx;
1087*5113495bSYour Name 	struct hif_target_info *tgt_info;
1088*5113495bSYour Name 	uint32_t target_type = TARGET_TYPE_UNKNOWN;
1089*5113495bSYour Name 
1090*5113495bSYour Name 	/* don't suspend during SSR */
1091*5113495bSYour Name 	if (cds_is_driver_recovering())
1092*5113495bSYour Name 		return false;
1093*5113495bSYour Name 
1094*5113495bSYour Name 	/* don't suspend if the driver is in a bad state */
1095*5113495bSYour Name 	if (cds_is_driver_in_bad_state())
1096*5113495bSYour Name 		return false;
1097*5113495bSYour Name 
1098*5113495bSYour Name 	/* if we are in any mode other than FTM we should suspend */
1099*5113495bSYour Name 	if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE)
1100*5113495bSYour Name 		return true;
1101*5113495bSYour Name 
1102*5113495bSYour Name 	hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
1103*5113495bSYour Name 	if (hif_ctx) {
1104*5113495bSYour Name 		tgt_info = hif_get_target_info_handle(hif_ctx);
1105*5113495bSYour Name 		if (tgt_info)
1106*5113495bSYour Name 			target_type = tgt_info->target_type;
1107*5113495bSYour Name 	}
1108*5113495bSYour Name 
1109*5113495bSYour Name 	/*
1110*5113495bSYour Name 	 * for most target we also want to suspend in FTM mode,
1111*5113495bSYour Name 	 * but some targets do not support that.
1112*5113495bSYour Name 	 */
1113*5113495bSYour Name 	if (target_type == TARGET_TYPE_AR6320 ||
1114*5113495bSYour Name 	    target_type == TARGET_TYPE_AR6320V1 ||
1115*5113495bSYour Name 	    target_type == TARGET_TYPE_AR6320V2 ||
1116*5113495bSYour Name 	    target_type == TARGET_TYPE_AR6320V3 ||
1117*5113495bSYour Name 	    target_type == TARGET_TYPE_QCN7605)
1118*5113495bSYour Name 		return false;
1119*5113495bSYour Name 
1120*5113495bSYour Name 	/* target should support suspend in FTM mode */
1121*5113495bSYour Name 	return true;
1122*5113495bSYour Name }
1123*5113495bSYour Name 
1124*5113495bSYour Name #ifdef HIF_USB
cds_suspend_target(tp_wma_handle wma_handle)1125*5113495bSYour Name static inline void cds_suspend_target(tp_wma_handle wma_handle)
1126*5113495bSYour Name {
1127*5113495bSYour Name 	QDF_STATUS status;
1128*5113495bSYour Name 	/* Suspend the target and disable interrupt */
1129*5113495bSYour Name 	status = ucfg_pmo_psoc_suspend_target(wma_handle->psoc, 0);
1130*5113495bSYour Name 	if (status)
1131*5113495bSYour Name 		cds_err("Failed to suspend target, status = %d", status);
1132*5113495bSYour Name }
1133*5113495bSYour Name #else
cds_suspend_target(tp_wma_handle wma_handle)1134*5113495bSYour Name static inline void cds_suspend_target(tp_wma_handle wma_handle)
1135*5113495bSYour Name {
1136*5113495bSYour Name 	QDF_STATUS status;
1137*5113495bSYour Name 	/* Suspend the target and disable interrupt */
1138*5113495bSYour Name 	status = ucfg_pmo_psoc_suspend_target(wma_handle->psoc, 1);
1139*5113495bSYour Name 	if (status)
1140*5113495bSYour Name 		cds_err("Failed to suspend target, status = %d", status);
1141*5113495bSYour Name }
1142*5113495bSYour Name #endif /* HIF_USB */
1143*5113495bSYour Name 
1144*5113495bSYour Name /**
1145*5113495bSYour Name  * cds_pre_enable() - pre enable cds
1146*5113495bSYour Name  *
1147*5113495bSYour Name  * Return: QDF status
1148*5113495bSYour Name  */
cds_pre_enable(void)1149*5113495bSYour Name QDF_STATUS cds_pre_enable(void)
1150*5113495bSYour Name {
1151*5113495bSYour Name 	QDF_STATUS status;
1152*5113495bSYour Name 	int errno;
1153*5113495bSYour Name 	void *scn;
1154*5113495bSYour Name 	void *soc;
1155*5113495bSYour Name 	void *hif_ctx;
1156*5113495bSYour Name 
1157*5113495bSYour Name 	cds_enter();
1158*5113495bSYour Name 
1159*5113495bSYour Name 	if (!gp_cds_context) {
1160*5113495bSYour Name 		cds_err("cds context is null");
1161*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1162*5113495bSYour Name 	}
1163*5113495bSYour Name 
1164*5113495bSYour Name 	if (!gp_cds_context->wma_context) {
1165*5113495bSYour Name 		cds_err("wma context is null");
1166*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1167*5113495bSYour Name 	}
1168*5113495bSYour Name 
1169*5113495bSYour Name 	scn = cds_get_context(QDF_MODULE_ID_HIF);
1170*5113495bSYour Name 	if (!scn)
1171*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1172*5113495bSYour Name 
1173*5113495bSYour Name 	soc = cds_get_context(QDF_MODULE_ID_SOC);
1174*5113495bSYour Name 	if (!soc)
1175*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1176*5113495bSYour Name 
1177*5113495bSYour Name 	/* call Packetlog connect service */
1178*5113495bSYour Name 	if (QDF_GLOBAL_FTM_MODE != cds_get_conparam() &&
1179*5113495bSYour Name 	    QDF_GLOBAL_EPPING_MODE != cds_get_conparam())
1180*5113495bSYour Name 		cdp_pkt_log_con_service(soc, OL_TXRX_PDEV_ID,
1181*5113495bSYour Name 					scn);
1182*5113495bSYour Name 
1183*5113495bSYour Name 	/*call WMA pre start */
1184*5113495bSYour Name 	status = wma_pre_start();
1185*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1186*5113495bSYour Name 		cds_err("Failed to WMA prestart");
1187*5113495bSYour Name 		goto exit_pkt_log;
1188*5113495bSYour Name 	}
1189*5113495bSYour Name 
1190*5113495bSYour Name 	status = htc_start(gp_cds_context->htc_ctx);
1191*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1192*5113495bSYour Name 		cds_err("Failed to Start HTC");
1193*5113495bSYour Name 		goto exit_pkt_log;
1194*5113495bSYour Name 	}
1195*5113495bSYour Name 
1196*5113495bSYour Name 	status = wma_wait_for_ready_event(gp_cds_context->wma_context);
1197*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1198*5113495bSYour Name 		cds_err("Failed to wait for ready event; status: %u", status);
1199*5113495bSYour Name 		goto stop_wmi;
1200*5113495bSYour Name 	}
1201*5113495bSYour Name 
1202*5113495bSYour Name 	errno = cdp_pdev_post_attach(soc, OL_TXRX_PDEV_ID);
1203*5113495bSYour Name 	if (errno) {
1204*5113495bSYour Name 		cds_err("Failed to attach pdev");
1205*5113495bSYour Name 		status = qdf_status_from_os_return(errno);
1206*5113495bSYour Name 		goto stop_wmi;
1207*5113495bSYour Name 	}
1208*5113495bSYour Name 
1209*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1210*5113495bSYour Name 
1211*5113495bSYour Name stop_wmi:
1212*5113495bSYour Name 	/* Send pdev suspend to fw otherwise FW is not aware that
1213*5113495bSYour Name 	 * host is freeing resources.
1214*5113495bSYour Name 	 */
1215*5113495bSYour Name 	if (!(cds_is_driver_recovering() || cds_is_driver_in_bad_state()))
1216*5113495bSYour Name 		cds_suspend_target(gp_cds_context->wma_context);
1217*5113495bSYour Name 
1218*5113495bSYour Name 	hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
1219*5113495bSYour Name 
1220*5113495bSYour Name 	wma_wmi_stop();
1221*5113495bSYour Name 
1222*5113495bSYour Name 	if (hif_ctx) {
1223*5113495bSYour Name 		cds_err("Disable the isr & reset the soc!");
1224*5113495bSYour Name 		hif_disable_isr(hif_ctx);
1225*5113495bSYour Name 		hif_reset_soc(hif_ctx);
1226*5113495bSYour Name 	}
1227*5113495bSYour Name 	htc_stop(gp_cds_context->htc_ctx);
1228*5113495bSYour Name 
1229*5113495bSYour Name 	wma_wmi_work_close();
1230*5113495bSYour Name 
1231*5113495bSYour Name exit_pkt_log:
1232*5113495bSYour Name 	if (QDF_GLOBAL_FTM_MODE != cds_get_conparam() &&
1233*5113495bSYour Name 	    QDF_GLOBAL_EPPING_MODE != cds_get_conparam())
1234*5113495bSYour Name 		cdp_pkt_log_exit(soc, OL_TXRX_PDEV_ID);
1235*5113495bSYour Name 
1236*5113495bSYour Name 	return status;
1237*5113495bSYour Name }
1238*5113495bSYour Name 
cds_enable(struct wlan_objmgr_psoc * psoc)1239*5113495bSYour Name QDF_STATUS cds_enable(struct wlan_objmgr_psoc *psoc)
1240*5113495bSYour Name {
1241*5113495bSYour Name 	QDF_STATUS qdf_status;
1242*5113495bSYour Name 	struct mac_start_params mac_params;
1243*5113495bSYour Name 
1244*5113495bSYour Name 	/* We support only one instance for now ... */
1245*5113495bSYour Name 	if (!gp_cds_context) {
1246*5113495bSYour Name 		cds_err("Invalid CDS context");
1247*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1248*5113495bSYour Name 	}
1249*5113495bSYour Name 
1250*5113495bSYour Name 	if (!gp_cds_context->wma_context) {
1251*5113495bSYour Name 		cds_err("WMA NULL context");
1252*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1253*5113495bSYour Name 	}
1254*5113495bSYour Name 
1255*5113495bSYour Name 	if (!gp_cds_context->mac_context) {
1256*5113495bSYour Name 		cds_err("MAC NULL context");
1257*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1258*5113495bSYour Name 	}
1259*5113495bSYour Name 
1260*5113495bSYour Name 	/* Start the wma */
1261*5113495bSYour Name 	qdf_status = wma_start();
1262*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
1263*5113495bSYour Name 		cds_err("Failed to start wma; status:%d", qdf_status);
1264*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1265*5113495bSYour Name 	}
1266*5113495bSYour Name 
1267*5113495bSYour Name 	/* Start the MAC */
1268*5113495bSYour Name 	qdf_mem_zero(&mac_params, sizeof(mac_params));
1269*5113495bSYour Name 	mac_params.driver_type = QDF_DRIVER_TYPE_PRODUCTION;
1270*5113495bSYour Name 	qdf_status = mac_start(gp_cds_context->mac_context, &mac_params);
1271*5113495bSYour Name 
1272*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != qdf_status) {
1273*5113495bSYour Name 		cds_err("Failed to start MAC; status:%d", qdf_status);
1274*5113495bSYour Name 		goto err_wma_stop;
1275*5113495bSYour Name 	}
1276*5113495bSYour Name 
1277*5113495bSYour Name 	/* START SME */
1278*5113495bSYour Name 	qdf_status = sme_start(gp_cds_context->mac_context);
1279*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1280*5113495bSYour Name 		cds_err("Failed to start SME; status:%d", qdf_status);
1281*5113495bSYour Name 		goto err_mac_stop;
1282*5113495bSYour Name 	}
1283*5113495bSYour Name 
1284*5113495bSYour Name 	qdf_status =
1285*5113495bSYour Name 		ucfg_dp_txrx_attach_target(cds_get_context(QDF_MODULE_ID_SOC),
1286*5113495bSYour Name 					   OL_TXRX_PDEV_ID);
1287*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1288*5113495bSYour Name 		cds_err("Failed to attach DP target; status:%d", qdf_status);
1289*5113495bSYour Name 		goto err_sme_stop;
1290*5113495bSYour Name 	}
1291*5113495bSYour Name 
1292*5113495bSYour Name 	qdf_status = dispatcher_psoc_enable(psoc);
1293*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1294*5113495bSYour Name 		cds_err("dispatcher_psoc_enable failed; status:%d", qdf_status);
1295*5113495bSYour Name 		goto err_soc_target_detach;
1296*5113495bSYour Name 	}
1297*5113495bSYour Name 
1298*5113495bSYour Name 	/* Trigger psoc enable for CLD components */
1299*5113495bSYour Name 	hdd_component_psoc_enable(psoc);
1300*5113495bSYour Name 
1301*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1302*5113495bSYour Name 
1303*5113495bSYour Name err_soc_target_detach:
1304*5113495bSYour Name 	/* NOOP */
1305*5113495bSYour Name 
1306*5113495bSYour Name err_sme_stop:
1307*5113495bSYour Name 	sme_stop(gp_cds_context->mac_context);
1308*5113495bSYour Name 
1309*5113495bSYour Name err_mac_stop:
1310*5113495bSYour Name 	mac_stop(gp_cds_context->mac_context);
1311*5113495bSYour Name 
1312*5113495bSYour Name err_wma_stop:
1313*5113495bSYour Name 	qdf_status = wma_stop();
1314*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1315*5113495bSYour Name 		cds_err("Failed to stop wma");
1316*5113495bSYour Name 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1317*5113495bSYour Name 	}
1318*5113495bSYour Name 
1319*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
1320*5113495bSYour Name } /* cds_enable() */
1321*5113495bSYour Name 
1322*5113495bSYour Name /**
1323*5113495bSYour Name  * cds_disable() - stop/disable cds module
1324*5113495bSYour Name  * @psoc: Psoc pointer
1325*5113495bSYour Name  *
1326*5113495bSYour Name  * Return: QDF status
1327*5113495bSYour Name  */
cds_disable(struct wlan_objmgr_psoc * psoc)1328*5113495bSYour Name QDF_STATUS cds_disable(struct wlan_objmgr_psoc *psoc)
1329*5113495bSYour Name {
1330*5113495bSYour Name 	QDF_STATUS qdf_status;
1331*5113495bSYour Name 	void *handle;
1332*5113495bSYour Name 
1333*5113495bSYour Name 	/* PSOC disable for all new components. It needs to happen before
1334*5113495bSYour Name 	 * target is PDEV suspended such that a component can abort all its
1335*5113495bSYour Name 	 * ongoing transaction with FW. Always keep it before wma_stop() as
1336*5113495bSYour Name 	 * wma_stop() does target PDEV suspend.
1337*5113495bSYour Name 	 */
1338*5113495bSYour Name 
1339*5113495bSYour Name 	/* Trigger psoc disable for CLD components */
1340*5113495bSYour Name 	if (psoc) {
1341*5113495bSYour Name 		hdd_component_psoc_disable(psoc);
1342*5113495bSYour Name 		dispatcher_psoc_disable(psoc);
1343*5113495bSYour Name 	}
1344*5113495bSYour Name 
1345*5113495bSYour Name 	qdf_status = wma_stop();
1346*5113495bSYour Name 
1347*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1348*5113495bSYour Name 		cds_err("Failed to stop wma");
1349*5113495bSYour Name 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1350*5113495bSYour Name 	}
1351*5113495bSYour Name 
1352*5113495bSYour Name 	handle = cds_get_context(QDF_MODULE_ID_PE);
1353*5113495bSYour Name 	if (!handle)
1354*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1355*5113495bSYour Name 
1356*5113495bSYour Name 	umac_stop();
1357*5113495bSYour Name 
1358*5113495bSYour Name 	return qdf_status;
1359*5113495bSYour Name }
1360*5113495bSYour Name 
1361*5113495bSYour Name /**
1362*5113495bSYour Name  * cds_post_disable() - post disable cds module
1363*5113495bSYour Name  *
1364*5113495bSYour Name  * Return: QDF status
1365*5113495bSYour Name  */
cds_post_disable(void)1366*5113495bSYour Name QDF_STATUS cds_post_disable(void)
1367*5113495bSYour Name {
1368*5113495bSYour Name 	tp_wma_handle wma_handle;
1369*5113495bSYour Name 	struct hif_opaque_softc *hif_ctx;
1370*5113495bSYour Name 	struct scheduler_ctx *sched_ctx;
1371*5113495bSYour Name 	QDF_STATUS qdf_status;
1372*5113495bSYour Name 
1373*5113495bSYour Name 	wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
1374*5113495bSYour Name 	if (!wma_handle)
1375*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1376*5113495bSYour Name 
1377*5113495bSYour Name 	hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
1378*5113495bSYour Name 	if (!hif_ctx)
1379*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1380*5113495bSYour Name 
1381*5113495bSYour Name 	/* flush any unprocessed scheduler messages */
1382*5113495bSYour Name 	sched_ctx = scheduler_get_context();
1383*5113495bSYour Name 	if (sched_ctx) {
1384*5113495bSYour Name 		qdf_status = scheduler_disable();
1385*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1386*5113495bSYour Name 			cds_err("Failed to disable scheduler");
1387*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1388*5113495bSYour Name 		}
1389*5113495bSYour Name 	}
1390*5113495bSYour Name 	/*
1391*5113495bSYour Name 	 * With new state machine changes cds_close can be invoked without
1392*5113495bSYour Name 	 * cds_disable. So, send the following clean up prerequisites to fw,
1393*5113495bSYour Name 	 * So Fw and host are in sync for cleanup indication:
1394*5113495bSYour Name 	 * - Send PDEV_SUSPEND indication to firmware
1395*5113495bSYour Name 	 * - Disable HIF Interrupts.
1396*5113495bSYour Name 	 * - Clean up CE tasklets.
1397*5113495bSYour Name 	 */
1398*5113495bSYour Name 
1399*5113495bSYour Name 	cds_debug("send deinit sequence to firmware");
1400*5113495bSYour Name 	if (cds_should_suspend_target())
1401*5113495bSYour Name 		cds_suspend_target(wma_handle);
1402*5113495bSYour Name 	hif_disable_isr(hif_ctx);
1403*5113495bSYour Name 	hif_reset_soc(hif_ctx);
1404*5113495bSYour Name 
1405*5113495bSYour Name 	if (gp_cds_context->htc_ctx) {
1406*5113495bSYour Name 		wma_wmi_stop();
1407*5113495bSYour Name 		htc_stop(gp_cds_context->htc_ctx);
1408*5113495bSYour Name 	}
1409*5113495bSYour Name 
1410*5113495bSYour Name 	qdf_status = cds_close_rx_thread();
1411*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1412*5113495bSYour Name 		cds_err("Failed to close RX thread!");
1413*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1414*5113495bSYour Name 	}
1415*5113495bSYour Name 
1416*5113495bSYour Name 	cdp_pdev_pre_detach(cds_get_context(QDF_MODULE_ID_SOC),
1417*5113495bSYour Name 			    OL_TXRX_PDEV_ID, 1);
1418*5113495bSYour Name 
1419*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1420*5113495bSYour Name }
1421*5113495bSYour Name 
1422*5113495bSYour Name /**
1423*5113495bSYour Name  * cds_close() - close cds module
1424*5113495bSYour Name  * @psoc: Psoc pointer
1425*5113495bSYour Name  *
1426*5113495bSYour Name  * This API allows user to close modules registered
1427*5113495bSYour Name  * with connectivity device services.
1428*5113495bSYour Name  *
1429*5113495bSYour Name  * Return: QDF status
1430*5113495bSYour Name  */
cds_close(struct wlan_objmgr_psoc * psoc)1431*5113495bSYour Name QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc)
1432*5113495bSYour Name {
1433*5113495bSYour Name 	QDF_STATUS qdf_status;
1434*5113495bSYour Name 
1435*5113495bSYour Name 	qdf_hang_event_unregister_notifier(&cds_hang_event_notifier);
1436*5113495bSYour Name 	qdf_status = cds_sched_close();
1437*5113495bSYour Name 	QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1438*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status))
1439*5113495bSYour Name 		cds_err("Failed to close CDS Scheduler");
1440*5113495bSYour Name 
1441*5113495bSYour Name 	dispatcher_psoc_close(psoc);
1442*5113495bSYour Name 
1443*5113495bSYour Name 	qdf_flush_work(&gp_cds_context->cds_recovery_work);
1444*5113495bSYour Name 
1445*5113495bSYour Name 	cds_shutdown_notifier_purge();
1446*5113495bSYour Name 
1447*5113495bSYour Name 	qdf_status = wma_wmi_work_close();
1448*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1449*5113495bSYour Name 		cds_err("Failed to close wma_wmi_work");
1450*5113495bSYour Name 		QDF_ASSERT(0);
1451*5113495bSYour Name 	}
1452*5113495bSYour Name 
1453*5113495bSYour Name 	if (gp_cds_context->htc_ctx) {
1454*5113495bSYour Name 		htc_destroy(gp_cds_context->htc_ctx);
1455*5113495bSYour Name 		ucfg_pmo_psoc_update_htc_handle(psoc, NULL);
1456*5113495bSYour Name 		gp_cds_context->htc_ctx = NULL;
1457*5113495bSYour Name 	}
1458*5113495bSYour Name 
1459*5113495bSYour Name 	qdf_status = sme_close(gp_cds_context->mac_context);
1460*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1461*5113495bSYour Name 		cds_err("Failed to close SME");
1462*5113495bSYour Name 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1463*5113495bSYour Name 	}
1464*5113495bSYour Name 
1465*5113495bSYour Name 	qdf_status = mac_close(gp_cds_context->mac_context);
1466*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1467*5113495bSYour Name 		cds_err("Failed to close MAC");
1468*5113495bSYour Name 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1469*5113495bSYour Name 	}
1470*5113495bSYour Name 
1471*5113495bSYour Name 	gp_cds_context->mac_context = NULL;
1472*5113495bSYour Name 
1473*5113495bSYour Name 	ucfg_dp_txrx_soc_detach(gp_cds_context->dp_soc);
1474*5113495bSYour Name 	gp_cds_context->dp_soc = NULL;
1475*5113495bSYour Name 
1476*5113495bSYour Name 	ucfg_pmo_psoc_update_dp_handle(psoc, NULL);
1477*5113495bSYour Name 	wlan_psoc_set_dp_handle(psoc, NULL);
1478*5113495bSYour Name 
1479*5113495bSYour Name 
1480*5113495bSYour Name 	qdf_status = wma_close();
1481*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1482*5113495bSYour Name 		cds_err("Failed to close wma");
1483*5113495bSYour Name 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1484*5113495bSYour Name 	}
1485*5113495bSYour Name 
1486*5113495bSYour Name 	qdf_status = wma_wmi_service_close();
1487*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1488*5113495bSYour Name 		cds_err("Failed to close wma_wmi_service");
1489*5113495bSYour Name 		QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
1490*5113495bSYour Name 	}
1491*5113495bSYour Name 
1492*5113495bSYour Name 	cds_deinit_ini_config();
1493*5113495bSYour Name 	qdf_timer_module_deinit();
1494*5113495bSYour Name 
1495*5113495bSYour Name 	cds_deregister_all_modules();
1496*5113495bSYour Name 
1497*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1498*5113495bSYour Name }
1499*5113495bSYour Name 
cds_dp_close(struct wlan_objmgr_psoc * psoc)1500*5113495bSYour Name QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc)
1501*5113495bSYour Name {
1502*5113495bSYour Name 	cdp_txrx_intr_detach(gp_cds_context->dp_soc);
1503*5113495bSYour Name 
1504*5113495bSYour Name 	qdf_nbuf_stop_replenish_timer();
1505*5113495bSYour Name 
1506*5113495bSYour Name 	ucfg_dp_txrx_deinit(cds_get_context(QDF_MODULE_ID_SOC));
1507*5113495bSYour Name 
1508*5113495bSYour Name 	cdp_pdev_deinit(cds_get_context(QDF_MODULE_ID_SOC), OL_TXRX_PDEV_ID, 1);
1509*5113495bSYour Name 
1510*5113495bSYour Name 	ucfg_dp_txrx_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC),
1511*5113495bSYour Name 				 OL_TXRX_PDEV_ID, 1);
1512*5113495bSYour Name 
1513*5113495bSYour Name 	ucfg_pmo_psoc_set_txrx_pdev_id(psoc, OL_TXRX_INVALID_PDEV_ID);
1514*5113495bSYour Name 
1515*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1516*5113495bSYour Name }
1517*5113495bSYour Name 
__cds_get_context(QDF_MODULE_ID module_id,const char * func)1518*5113495bSYour Name void *__cds_get_context(QDF_MODULE_ID module_id, const char *func)
1519*5113495bSYour Name {
1520*5113495bSYour Name 	void *context = NULL;
1521*5113495bSYour Name 
1522*5113495bSYour Name 	if (!gp_cds_context) {
1523*5113495bSYour Name 		cds_err("cds context pointer is null (via %s)", func);
1524*5113495bSYour Name 		return NULL;
1525*5113495bSYour Name 	}
1526*5113495bSYour Name 
1527*5113495bSYour Name 	switch (module_id) {
1528*5113495bSYour Name 	case QDF_MODULE_ID_HDD:
1529*5113495bSYour Name 	{
1530*5113495bSYour Name 		context = gp_cds_context->hdd_context;
1531*5113495bSYour Name 		break;
1532*5113495bSYour Name 	}
1533*5113495bSYour Name 
1534*5113495bSYour Name 	case QDF_MODULE_ID_SME:
1535*5113495bSYour Name 	case QDF_MODULE_ID_PE:
1536*5113495bSYour Name 	{
1537*5113495bSYour Name 		/* In all these cases, we just return the MAC Context */
1538*5113495bSYour Name 		context = gp_cds_context->mac_context;
1539*5113495bSYour Name 		break;
1540*5113495bSYour Name 	}
1541*5113495bSYour Name 
1542*5113495bSYour Name 	case QDF_MODULE_ID_WMA:
1543*5113495bSYour Name 	{
1544*5113495bSYour Name 		/* For wma module */
1545*5113495bSYour Name 		context = gp_cds_context->wma_context;
1546*5113495bSYour Name 		break;
1547*5113495bSYour Name 	}
1548*5113495bSYour Name 
1549*5113495bSYour Name 	case QDF_MODULE_ID_QDF:
1550*5113495bSYour Name 	{
1551*5113495bSYour Name 		/* For SYS this is CDS itself */
1552*5113495bSYour Name 		context = gp_cds_context;
1553*5113495bSYour Name 		break;
1554*5113495bSYour Name 	}
1555*5113495bSYour Name 
1556*5113495bSYour Name 	case QDF_MODULE_ID_HIF:
1557*5113495bSYour Name 	{
1558*5113495bSYour Name 		context = gp_cds_context->hif_context;
1559*5113495bSYour Name 		break;
1560*5113495bSYour Name 	}
1561*5113495bSYour Name 
1562*5113495bSYour Name 	case QDF_MODULE_ID_HTC:
1563*5113495bSYour Name 	{
1564*5113495bSYour Name 		context = gp_cds_context->htc_ctx;
1565*5113495bSYour Name 		break;
1566*5113495bSYour Name 	}
1567*5113495bSYour Name 
1568*5113495bSYour Name 	case QDF_MODULE_ID_QDF_DEVICE:
1569*5113495bSYour Name 	{
1570*5113495bSYour Name 		context = gp_cds_context->qdf_ctx;
1571*5113495bSYour Name 		break;
1572*5113495bSYour Name 	}
1573*5113495bSYour Name 
1574*5113495bSYour Name 	case QDF_MODULE_ID_BMI:
1575*5113495bSYour Name 	{
1576*5113495bSYour Name 		context = gp_cds_context->g_ol_context;
1577*5113495bSYour Name 		break;
1578*5113495bSYour Name 	}
1579*5113495bSYour Name 
1580*5113495bSYour Name 	case QDF_MODULE_ID_CFG:
1581*5113495bSYour Name 	{
1582*5113495bSYour Name 		context = gp_cds_context->cfg_ctx;
1583*5113495bSYour Name 		break;
1584*5113495bSYour Name 	}
1585*5113495bSYour Name 
1586*5113495bSYour Name 	case QDF_MODULE_ID_SOC:
1587*5113495bSYour Name 	{
1588*5113495bSYour Name 		context = gp_cds_context->dp_soc;
1589*5113495bSYour Name 		break;
1590*5113495bSYour Name 	}
1591*5113495bSYour Name 
1592*5113495bSYour Name 	default:
1593*5113495bSYour Name 	{
1594*5113495bSYour Name 		cds_err("Module ID %d does not have its context maintained by CDS (via %s)",
1595*5113495bSYour Name 			module_id, func);
1596*5113495bSYour Name 		QDF_ASSERT(0);
1597*5113495bSYour Name 		return NULL;
1598*5113495bSYour Name 	}
1599*5113495bSYour Name 	}
1600*5113495bSYour Name 
1601*5113495bSYour Name 	if (!context)
1602*5113495bSYour Name 		cds_err("Module ID %d context is Null (via %s)",
1603*5113495bSYour Name 			module_id, func);
1604*5113495bSYour Name 
1605*5113495bSYour Name 	return context;
1606*5113495bSYour Name } /* cds_get_context() */
1607*5113495bSYour Name 
1608*5113495bSYour Name /**
1609*5113495bSYour Name  * cds_get_global_context() - get CDS global Context
1610*5113495bSYour Name  *
1611*5113495bSYour Name  * This API allows any user to get the CDS Global Context pointer from a
1612*5113495bSYour Name  * module context data area.
1613*5113495bSYour Name  *
1614*5113495bSYour Name  * Return: pointer to the CDS global context, NULL if the function is
1615*5113495bSYour Name  *	   unable to retrieve the CDS context.
1616*5113495bSYour Name  */
cds_get_global_context(void)1617*5113495bSYour Name void *cds_get_global_context(void)
1618*5113495bSYour Name {
1619*5113495bSYour Name 	if (!gp_cds_context) {
1620*5113495bSYour Name 		/*
1621*5113495bSYour Name 		 * To avoid recursive call, this should not change to
1622*5113495bSYour Name 		 * QDF_TRACE().
1623*5113495bSYour Name 		 */
1624*5113495bSYour Name 		pr_err("%s: global cds context is NULL", __func__);
1625*5113495bSYour Name 	}
1626*5113495bSYour Name 
1627*5113495bSYour Name 	return gp_cds_context;
1628*5113495bSYour Name } /* cds_get_global_context() */
1629*5113495bSYour Name 
1630*5113495bSYour Name /**
1631*5113495bSYour Name  * cds_get_driver_state() - Get current driver state
1632*5113495bSYour Name  *
1633*5113495bSYour Name  * This API returns current driver state stored in global context.
1634*5113495bSYour Name  *
1635*5113495bSYour Name  * Return: Driver state enum
1636*5113495bSYour Name  */
cds_get_driver_state(void)1637*5113495bSYour Name enum cds_driver_state cds_get_driver_state(void)
1638*5113495bSYour Name {
1639*5113495bSYour Name 	if (!gp_cds_context) {
1640*5113495bSYour Name 		cds_err("global cds context is NULL");
1641*5113495bSYour Name 
1642*5113495bSYour Name 		return CDS_DRIVER_STATE_UNINITIALIZED;
1643*5113495bSYour Name 	}
1644*5113495bSYour Name 
1645*5113495bSYour Name 	return gp_cds_context->driver_state;
1646*5113495bSYour Name }
1647*5113495bSYour Name 
1648*5113495bSYour Name /**
1649*5113495bSYour Name  * cds_set_driver_state() - Set current driver state
1650*5113495bSYour Name  * @state:	Driver state to be set to.
1651*5113495bSYour Name  *
1652*5113495bSYour Name  * This API sets driver state to state. This API only sets the state and doesn't
1653*5113495bSYour Name  * clear states, please make sure to use cds_clear_driver_state to clear any
1654*5113495bSYour Name  * state if required.
1655*5113495bSYour Name  *
1656*5113495bSYour Name  * Return: None
1657*5113495bSYour Name  */
cds_set_driver_state(enum cds_driver_state state)1658*5113495bSYour Name void cds_set_driver_state(enum cds_driver_state state)
1659*5113495bSYour Name {
1660*5113495bSYour Name 	if (!gp_cds_context) {
1661*5113495bSYour Name 		cds_err("global cds context is NULL: %x", state);
1662*5113495bSYour Name 
1663*5113495bSYour Name 		return;
1664*5113495bSYour Name 	}
1665*5113495bSYour Name 
1666*5113495bSYour Name 	gp_cds_context->driver_state |= state;
1667*5113495bSYour Name }
1668*5113495bSYour Name 
1669*5113495bSYour Name /**
1670*5113495bSYour Name  * cds_clear_driver_state() - Clear current driver state
1671*5113495bSYour Name  * @state:	Driver state to be cleared.
1672*5113495bSYour Name  *
1673*5113495bSYour Name  * This API clears driver state. This API only clears the state, please make
1674*5113495bSYour Name  * sure to use cds_set_driver_state to set any new states.
1675*5113495bSYour Name  *
1676*5113495bSYour Name  * Return: None
1677*5113495bSYour Name  */
cds_clear_driver_state(enum cds_driver_state state)1678*5113495bSYour Name void cds_clear_driver_state(enum cds_driver_state state)
1679*5113495bSYour Name {
1680*5113495bSYour Name 	if (!gp_cds_context) {
1681*5113495bSYour Name 		cds_err("global cds context is NULL: %x", state);
1682*5113495bSYour Name 
1683*5113495bSYour Name 		return;
1684*5113495bSYour Name 	}
1685*5113495bSYour Name 
1686*5113495bSYour Name 	gp_cds_context->driver_state &= ~state;
1687*5113495bSYour Name }
1688*5113495bSYour Name 
1689*5113495bSYour Name /**
1690*5113495bSYour Name  * cds_alloc_context() - allocate a context within the CDS global Context
1691*5113495bSYour Name  * @module_id: module ID who's context area is being allocated.
1692*5113495bSYour Name  * @module_context: pointer to location where the pointer to the
1693*5113495bSYour Name  *	allocated context is returned. Note this output pointer
1694*5113495bSYour Name  *	is valid only if the API returns QDF_STATUS_SUCCESS
1695*5113495bSYour Name  * @size: size of the context area to be allocated.
1696*5113495bSYour Name  *
1697*5113495bSYour Name  * This API allows any user to allocate a user context area within the
1698*5113495bSYour Name  * CDS Global Context.
1699*5113495bSYour Name  *
1700*5113495bSYour Name  * Return: QDF status
1701*5113495bSYour Name  */
cds_alloc_context(QDF_MODULE_ID module_id,void ** module_context,uint32_t size)1702*5113495bSYour Name QDF_STATUS cds_alloc_context(QDF_MODULE_ID module_id,
1703*5113495bSYour Name 			     void **module_context, uint32_t size)
1704*5113495bSYour Name {
1705*5113495bSYour Name 	void **cds_mod_context = NULL;
1706*5113495bSYour Name 
1707*5113495bSYour Name 	if (!gp_cds_context) {
1708*5113495bSYour Name 		cds_err("cds context is null");
1709*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1710*5113495bSYour Name 	}
1711*5113495bSYour Name 
1712*5113495bSYour Name 	if (!module_context) {
1713*5113495bSYour Name 		cds_err("null param passed");
1714*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1715*5113495bSYour Name 	}
1716*5113495bSYour Name 
1717*5113495bSYour Name 	switch (module_id) {
1718*5113495bSYour Name 	case QDF_MODULE_ID_WMA:
1719*5113495bSYour Name 		cds_mod_context = &gp_cds_context->wma_context;
1720*5113495bSYour Name 		break;
1721*5113495bSYour Name 
1722*5113495bSYour Name 	case QDF_MODULE_ID_HIF:
1723*5113495bSYour Name 		cds_mod_context = &gp_cds_context->hif_context;
1724*5113495bSYour Name 		break;
1725*5113495bSYour Name 
1726*5113495bSYour Name 	case QDF_MODULE_ID_BMI:
1727*5113495bSYour Name 		cds_mod_context = &gp_cds_context->g_ol_context;
1728*5113495bSYour Name 		break;
1729*5113495bSYour Name 
1730*5113495bSYour Name 	default:
1731*5113495bSYour Name 		cds_err("Module ID %i does not have its context allocated by CDS",
1732*5113495bSYour Name 			module_id);
1733*5113495bSYour Name 		QDF_ASSERT(0);
1734*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1735*5113495bSYour Name 	}
1736*5113495bSYour Name 
1737*5113495bSYour Name 	if (*cds_mod_context) {
1738*5113495bSYour Name 		/* Context has already been allocated!
1739*5113495bSYour Name 		 * Prevent double allocation
1740*5113495bSYour Name 		 */
1741*5113495bSYour Name 		cds_err("Module ID %i context has already been allocated",
1742*5113495bSYour Name 			module_id);
1743*5113495bSYour Name 		return QDF_STATUS_E_EXISTS;
1744*5113495bSYour Name 	}
1745*5113495bSYour Name 
1746*5113495bSYour Name 	/* Dynamically allocate the context for module */
1747*5113495bSYour Name 
1748*5113495bSYour Name 	*module_context = qdf_mem_malloc(size);
1749*5113495bSYour Name 
1750*5113495bSYour Name 	if (!*module_context) {
1751*5113495bSYour Name 		cds_err("Failed to allocate Context for module ID %i",
1752*5113495bSYour Name 			module_id);
1753*5113495bSYour Name 		QDF_ASSERT(0);
1754*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1755*5113495bSYour Name 	}
1756*5113495bSYour Name 
1757*5113495bSYour Name 	*cds_mod_context = *module_context;
1758*5113495bSYour Name 
1759*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1760*5113495bSYour Name } /* cds_alloc_context() */
1761*5113495bSYour Name 
1762*5113495bSYour Name /**
1763*5113495bSYour Name  * cds_set_context() - API to set context in global CDS Context
1764*5113495bSYour Name  * @module_id: Module ID
1765*5113495bSYour Name  * @context: Pointer to the Module Context
1766*5113495bSYour Name  *
1767*5113495bSYour Name  * API to set a MODULE Context in global CDS Context
1768*5113495bSYour Name  *
1769*5113495bSYour Name  * Return: QDF_STATUS
1770*5113495bSYour Name  */
cds_set_context(QDF_MODULE_ID module_id,void * context)1771*5113495bSYour Name QDF_STATUS cds_set_context(QDF_MODULE_ID module_id, void *context)
1772*5113495bSYour Name {
1773*5113495bSYour Name 	struct cds_context *p_cds_context = cds_get_global_context();
1774*5113495bSYour Name 
1775*5113495bSYour Name 	if (!p_cds_context) {
1776*5113495bSYour Name 		cds_err("cds context is Invalid");
1777*5113495bSYour Name 		return QDF_STATUS_NOT_INITIALIZED;
1778*5113495bSYour Name 	}
1779*5113495bSYour Name 
1780*5113495bSYour Name 	switch (module_id) {
1781*5113495bSYour Name 	case QDF_MODULE_ID_HDD:
1782*5113495bSYour Name 		p_cds_context->hdd_context = context;
1783*5113495bSYour Name 		break;
1784*5113495bSYour Name 	case QDF_MODULE_ID_HIF:
1785*5113495bSYour Name 		p_cds_context->hif_context = context;
1786*5113495bSYour Name 		break;
1787*5113495bSYour Name 	default:
1788*5113495bSYour Name 		cds_err("Module ID %i does not have its context managed by CDS",
1789*5113495bSYour Name 			module_id);
1790*5113495bSYour Name 		QDF_ASSERT(0);
1791*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1792*5113495bSYour Name 	}
1793*5113495bSYour Name 
1794*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1795*5113495bSYour Name }
1796*5113495bSYour Name 
1797*5113495bSYour Name /**
1798*5113495bSYour Name  * cds_free_context() - free an allocated context within the
1799*5113495bSYour Name  *			CDS global Context
1800*5113495bSYour Name  * @module_id: module ID who's context area is being free
1801*5113495bSYour Name  * @module_context: pointer to module context area to be free'd.
1802*5113495bSYour Name  *
1803*5113495bSYour Name  *  This API allows a user to free the user context area within the
1804*5113495bSYour Name  *  CDS Global Context.
1805*5113495bSYour Name  *
1806*5113495bSYour Name  * Return: QDF status
1807*5113495bSYour Name  */
cds_free_context(QDF_MODULE_ID module_id,void * module_context)1808*5113495bSYour Name QDF_STATUS cds_free_context(QDF_MODULE_ID module_id, void *module_context)
1809*5113495bSYour Name {
1810*5113495bSYour Name 	void **cds_mod_context = NULL;
1811*5113495bSYour Name 
1812*5113495bSYour Name 	if (!gp_cds_context) {
1813*5113495bSYour Name 		cds_err("cds context is null");
1814*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1815*5113495bSYour Name 	}
1816*5113495bSYour Name 
1817*5113495bSYour Name 	if (!module_context) {
1818*5113495bSYour Name 		cds_err("Null param");
1819*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1820*5113495bSYour Name 	}
1821*5113495bSYour Name 
1822*5113495bSYour Name 	switch (module_id) {
1823*5113495bSYour Name 	case QDF_MODULE_ID_WMA:
1824*5113495bSYour Name 		cds_mod_context = &gp_cds_context->wma_context;
1825*5113495bSYour Name 		break;
1826*5113495bSYour Name 
1827*5113495bSYour Name 	case QDF_MODULE_ID_HIF:
1828*5113495bSYour Name 		cds_mod_context = &gp_cds_context->hif_context;
1829*5113495bSYour Name 		break;
1830*5113495bSYour Name 
1831*5113495bSYour Name 	case QDF_MODULE_ID_BMI:
1832*5113495bSYour Name 		cds_mod_context = &gp_cds_context->g_ol_context;
1833*5113495bSYour Name 		break;
1834*5113495bSYour Name 
1835*5113495bSYour Name 	default:
1836*5113495bSYour Name 		cds_err("Module ID %i does not have its context allocated by CDS",
1837*5113495bSYour Name 			module_id);
1838*5113495bSYour Name 		QDF_ASSERT(0);
1839*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1840*5113495bSYour Name 	}
1841*5113495bSYour Name 
1842*5113495bSYour Name 	if (!*cds_mod_context) {
1843*5113495bSYour Name 		/* Context has not been allocated or freed already! */
1844*5113495bSYour Name 		cds_err("Module ID %i context has not been allocated or freed already",
1845*5113495bSYour Name 			module_id);
1846*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1847*5113495bSYour Name 	}
1848*5113495bSYour Name 
1849*5113495bSYour Name 	if (*cds_mod_context != module_context) {
1850*5113495bSYour Name 		cds_err("cds_mod_context != module_context");
1851*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1852*5113495bSYour Name 	}
1853*5113495bSYour Name 
1854*5113495bSYour Name 	qdf_mem_free(module_context);
1855*5113495bSYour Name 
1856*5113495bSYour Name 	*cds_mod_context = NULL;
1857*5113495bSYour Name 
1858*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1859*5113495bSYour Name } /* cds_free_context() */
1860*5113495bSYour Name 
1861*5113495bSYour Name 
1862*5113495bSYour Name /**
1863*5113495bSYour Name  * cds_flush_work() - flush pending works
1864*5113495bSYour Name  * @work: pointer to work
1865*5113495bSYour Name  *
1866*5113495bSYour Name  * Return: none
1867*5113495bSYour Name  */
cds_flush_work(void * work)1868*5113495bSYour Name void cds_flush_work(void *work)
1869*5113495bSYour Name {
1870*5113495bSYour Name 	cancel_work_sync(work);
1871*5113495bSYour Name }
1872*5113495bSYour Name 
1873*5113495bSYour Name /**
1874*5113495bSYour Name  * cds_flush_delayed_work() - flush delayed works
1875*5113495bSYour Name  * @dwork: pointer to delayed work
1876*5113495bSYour Name  *
1877*5113495bSYour Name  * Return: none
1878*5113495bSYour Name  */
cds_flush_delayed_work(void * dwork)1879*5113495bSYour Name void cds_flush_delayed_work(void *dwork)
1880*5113495bSYour Name {
1881*5113495bSYour Name 	cancel_delayed_work_sync(dwork);
1882*5113495bSYour Name }
1883*5113495bSYour Name 
1884*5113495bSYour Name #ifndef REMOVE_PKT_LOG
1885*5113495bSYour Name /**
1886*5113495bSYour Name  * cds_is_packet_log_enabled() - check if packet log is enabled
1887*5113495bSYour Name  *
1888*5113495bSYour Name  * Return: true if packet log is enabled else false
1889*5113495bSYour Name  */
cds_is_packet_log_enabled(void)1890*5113495bSYour Name bool cds_is_packet_log_enabled(void)
1891*5113495bSYour Name {
1892*5113495bSYour Name 	struct hdd_context *hdd_ctx;
1893*5113495bSYour Name 
1894*5113495bSYour Name 	hdd_ctx = gp_cds_context->hdd_context;
1895*5113495bSYour Name 	if ((!hdd_ctx) || (!hdd_ctx->config)) {
1896*5113495bSYour Name 		cds_alert("Hdd Context is Null");
1897*5113495bSYour Name 		return false;
1898*5113495bSYour Name 	}
1899*5113495bSYour Name 	return hdd_ctx->config->enable_packet_log;
1900*5113495bSYour Name }
1901*5113495bSYour Name #endif
1902*5113495bSYour Name 
cds_force_assert_target_via_pld(qdf_device_t qdf)1903*5113495bSYour Name static int cds_force_assert_target_via_pld(qdf_device_t qdf)
1904*5113495bSYour Name {
1905*5113495bSYour Name 	int errno;
1906*5113495bSYour Name 
1907*5113495bSYour Name 	errno = pld_force_assert_target(qdf->dev);
1908*5113495bSYour Name 	if (errno == -EOPNOTSUPP)
1909*5113495bSYour Name 		cds_info("PLD does not support target force assert");
1910*5113495bSYour Name 	else if (errno)
1911*5113495bSYour Name 		cds_err("Failed PLD target force assert; errno %d", errno);
1912*5113495bSYour Name 	else
1913*5113495bSYour Name 		cds_info("Target force assert triggered via PLD");
1914*5113495bSYour Name 
1915*5113495bSYour Name 	return errno;
1916*5113495bSYour Name }
1917*5113495bSYour Name 
cds_force_assert_target_via_wmi(qdf_device_t qdf)1918*5113495bSYour Name static QDF_STATUS cds_force_assert_target_via_wmi(qdf_device_t qdf)
1919*5113495bSYour Name {
1920*5113495bSYour Name 	QDF_STATUS status;
1921*5113495bSYour Name 	t_wma_handle *wma;
1922*5113495bSYour Name 
1923*5113495bSYour Name 	wma = cds_get_context(QDF_MODULE_ID_WMA);
1924*5113495bSYour Name 	if (!wma)
1925*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1926*5113495bSYour Name 
1927*5113495bSYour Name 	status = wma_crash_inject(wma, RECOVERY_SIM_SELF_RECOVERY, 0);
1928*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1929*5113495bSYour Name 		cds_err("Failed target force assert; status %d", status);
1930*5113495bSYour Name 		return status;
1931*5113495bSYour Name 	}
1932*5113495bSYour Name 
1933*5113495bSYour Name 	status = qdf_wait_for_event_completion(&wma->recovery_event,
1934*5113495bSYour Name 				       WMA_CRASH_INJECT_TIMEOUT);
1935*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1936*5113495bSYour Name 		cds_err("Failed target force assert wait; status %d", status);
1937*5113495bSYour Name 		return status;
1938*5113495bSYour Name 	}
1939*5113495bSYour Name 
1940*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1941*5113495bSYour Name }
1942*5113495bSYour Name 
1943*5113495bSYour Name /**
1944*5113495bSYour Name  * cds_force_assert_target() - Send assert command to firmware
1945*5113495bSYour Name  * @qdf: QDF device instance to assert
1946*5113495bSYour Name  *
1947*5113495bSYour Name  * An out-of-band recovery mechanism will cleanup and restart the entire wlan
1948*5113495bSYour Name  * subsystem in the event of a firmware crash. This API injects a firmware
1949*5113495bSYour Name  * crash to start this process when the wlan driver is known to be in a bad
1950*5113495bSYour Name  * state. If a firmware assert inject fails, the wlan driver will schedule
1951*5113495bSYour Name  * the driver recovery anyway, as a best effort attempt to return to a working
1952*5113495bSYour Name  * state.
1953*5113495bSYour Name  *
1954*5113495bSYour Name  * Return: QDF_STATUS
1955*5113495bSYour Name  */
cds_force_assert_target(qdf_device_t qdf)1956*5113495bSYour Name static QDF_STATUS cds_force_assert_target(qdf_device_t qdf)
1957*5113495bSYour Name {
1958*5113495bSYour Name 	int errno;
1959*5113495bSYour Name 	QDF_STATUS status;
1960*5113495bSYour Name 
1961*5113495bSYour Name 	/* first, try target assert inject via pld */
1962*5113495bSYour Name 	errno = cds_force_assert_target_via_pld(qdf);
1963*5113495bSYour Name 	if (!errno)
1964*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1965*5113495bSYour Name 	if (errno != -EOPNOTSUPP)
1966*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1967*5113495bSYour Name 
1968*5113495bSYour Name 	/* pld assert is not supported, try target assert inject via wmi */
1969*5113495bSYour Name 	status = cds_force_assert_target_via_wmi(qdf);
1970*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status))
1971*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1972*5113495bSYour Name 
1973*5113495bSYour Name 	/* wmi assert failed, start recovery without the firmware assert */
1974*5113495bSYour Name 	cds_err("Scheduling recovery work without firmware assert");
1975*5113495bSYour Name 	pld_schedule_recovery_work(qdf->dev, PLD_REASON_DEFAULT);
1976*5113495bSYour Name 
1977*5113495bSYour Name 	return status;
1978*5113495bSYour Name }
1979*5113495bSYour Name 
1980*5113495bSYour Name /**
1981*5113495bSYour Name  * cds_trigger_recovery_handler() - handle a self recovery request
1982*5113495bSYour Name  * @func: the name of the function that called cds_trigger_recovery
1983*5113495bSYour Name  * @line: the line number of the call site which called cds_trigger_recovery
1984*5113495bSYour Name  *
1985*5113495bSYour Name  * Return: none
1986*5113495bSYour Name  */
cds_trigger_recovery_handler(const char * func,const uint32_t line)1987*5113495bSYour Name static void cds_trigger_recovery_handler(const char *func, const uint32_t line)
1988*5113495bSYour Name {
1989*5113495bSYour Name 	QDF_STATUS status;
1990*5113495bSYour Name 	qdf_runtime_lock_t rtl;
1991*5113495bSYour Name 	qdf_device_t qdf;
1992*5113495bSYour Name 	bool ssr_ini_enabled = cds_is_self_recovery_enabled();
1993*5113495bSYour Name 
1994*5113495bSYour Name 	/* NOTE! This code path is delicate! Think very carefully before
1995*5113495bSYour Name 	 * modifying the content or order of the following. Please review any
1996*5113495bSYour Name 	 * potential changes with someone closely familiar with this feature.
1997*5113495bSYour Name 	 */
1998*5113495bSYour Name 
1999*5113495bSYour Name 	if (cds_is_driver_recovering()) {
2000*5113495bSYour Name 		cds_info("WLAN recovery already in progress");
2001*5113495bSYour Name 		return;
2002*5113495bSYour Name 	}
2003*5113495bSYour Name 
2004*5113495bSYour Name 	if (cds_is_driver_in_bad_state()) {
2005*5113495bSYour Name 		cds_info("WLAN has already failed recovery");
2006*5113495bSYour Name 		return;
2007*5113495bSYour Name 	}
2008*5113495bSYour Name 
2009*5113495bSYour Name 	if (cds_is_fw_down()) {
2010*5113495bSYour Name 		cds_info("Firmware has already initiated recovery");
2011*5113495bSYour Name 		return;
2012*5113495bSYour Name 	}
2013*5113495bSYour Name 
2014*5113495bSYour Name 	qdf = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
2015*5113495bSYour Name 	if (!qdf)
2016*5113495bSYour Name 		return;
2017*5113495bSYour Name 
2018*5113495bSYour Name 	/*
2019*5113495bSYour Name 	 * if *wlan* recovery is disabled, crash here for debugging  for
2020*5113495bSYour Name 	 * snoc/IPCI targets.
2021*5113495bSYour Name 	 */
2022*5113495bSYour Name 	if ((qdf->bus_type == QDF_BUS_TYPE_SNOC ||
2023*5113495bSYour Name 	     qdf->bus_type == QDF_BUS_TYPE_IPCI) && !ssr_ini_enabled) {
2024*5113495bSYour Name 		QDF_DEBUG_PANIC("WLAN recovery is not enabled (via %s:%d)",
2025*5113495bSYour Name 				func, line);
2026*5113495bSYour Name 		return;
2027*5113495bSYour Name 	}
2028*5113495bSYour Name 
2029*5113495bSYour Name 	if (cds_is_driver_unloading()) {
2030*5113495bSYour Name 		QDF_DEBUG_PANIC("WLAN is unloading recovery not expected(via %s:%d)",
2031*5113495bSYour Name 				func, line);
2032*5113495bSYour Name 		return;
2033*5113495bSYour Name 	}
2034*5113495bSYour Name 
2035*5113495bSYour Name 	status = qdf_runtime_lock_init(&rtl);
2036*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2037*5113495bSYour Name 		cds_err("qdf_runtime_lock_init failed, status: %d", status);
2038*5113495bSYour Name 		return;
2039*5113495bSYour Name 	}
2040*5113495bSYour Name 
2041*5113495bSYour Name 	status = qdf_runtime_pm_prevent_suspend(&rtl);
2042*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2043*5113495bSYour Name 		cds_err("Failed to acquire runtime pm lock");
2044*5113495bSYour Name 		goto deinit_rtl;
2045*5113495bSYour Name 	}
2046*5113495bSYour Name 
2047*5113495bSYour Name 	cds_err("critical host timeout trigger fw recovery for reason code %d",
2048*5113495bSYour Name 		gp_cds_context->recovery_reason);
2049*5113495bSYour Name 
2050*5113495bSYour Name 	cds_set_recovery_in_progress(true);
2051*5113495bSYour Name 	cds_set_assert_target_in_progress(true);
2052*5113495bSYour Name 	if (pld_force_collect_target_dump(qdf->dev))
2053*5113495bSYour Name 		cds_force_assert_target(qdf);
2054*5113495bSYour Name 	cds_set_assert_target_in_progress(false);
2055*5113495bSYour Name 
2056*5113495bSYour Name 	/* Do not wait for firmware down block wmi transactions */
2057*5113495bSYour Name 	wma_wmi_stop();
2058*5113495bSYour Name 
2059*5113495bSYour Name 	/*
2060*5113495bSYour Name 	 * if *wlan* recovery is disabled, once all the required registers are
2061*5113495bSYour Name 	 * read via the platform driver check and crash the system.
2062*5113495bSYour Name 	 */
2063*5113495bSYour Name 	if (qdf->bus_type == QDF_BUS_TYPE_PCI && !ssr_ini_enabled)
2064*5113495bSYour Name 		QDF_DEBUG_PANIC("WLAN recovery is not enabled (via %s:%d)",
2065*5113495bSYour Name 				func, line);
2066*5113495bSYour Name 
2067*5113495bSYour Name 	status = qdf_runtime_pm_allow_suspend(&rtl);
2068*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
2069*5113495bSYour Name 		cds_err("Failed to release runtime pm lock");
2070*5113495bSYour Name 
2071*5113495bSYour Name deinit_rtl:
2072*5113495bSYour Name 	qdf_runtime_lock_deinit(&rtl);
2073*5113495bSYour Name }
2074*5113495bSYour Name 
cds_trigger_recovery_work(void * context)2075*5113495bSYour Name static void cds_trigger_recovery_work(void *context)
2076*5113495bSYour Name {
2077*5113495bSYour Name 	struct cds_recovery_call_info *call_info = context;
2078*5113495bSYour Name 
2079*5113495bSYour Name 	cds_trigger_recovery_handler(call_info->func, call_info->line);
2080*5113495bSYour Name }
2081*5113495bSYour Name 
__cds_trigger_recovery(enum qdf_hang_reason reason,const char * func,const uint32_t line)2082*5113495bSYour Name void __cds_trigger_recovery(enum qdf_hang_reason reason, const char *func,
2083*5113495bSYour Name 			    const uint32_t line)
2084*5113495bSYour Name {
2085*5113495bSYour Name 	if (!gp_cds_context) {
2086*5113495bSYour Name 		cds_err("gp_cds_context is null");
2087*5113495bSYour Name 		return;
2088*5113495bSYour Name 	}
2089*5113495bSYour Name 
2090*5113495bSYour Name 	gp_cds_context->recovery_reason = reason;
2091*5113495bSYour Name 
2092*5113495bSYour Name 	__cds_recovery_caller.func = func;
2093*5113495bSYour Name 	__cds_recovery_caller.line = line;
2094*5113495bSYour Name 	qdf_queue_work(0, gp_cds_context->cds_recovery_wq,
2095*5113495bSYour Name 		       &gp_cds_context->cds_recovery_work);
2096*5113495bSYour Name }
2097*5113495bSYour Name 
cds_trigger_recovery_psoc(void * psoc,enum qdf_hang_reason reason,const char * func,const uint32_t line)2098*5113495bSYour Name void cds_trigger_recovery_psoc(void *psoc, enum qdf_hang_reason reason,
2099*5113495bSYour Name 			       const char *func, const uint32_t line)
2100*5113495bSYour Name {
2101*5113495bSYour Name 	__cds_trigger_recovery(reason, func, line);
2102*5113495bSYour Name }
2103*5113495bSYour Name 
2104*5113495bSYour Name 
2105*5113495bSYour Name /**
2106*5113495bSYour Name  * cds_get_recovery_reason() - get self recovery reason
2107*5113495bSYour Name  * @reason: recovery reason
2108*5113495bSYour Name  *
2109*5113495bSYour Name  * Return: None
2110*5113495bSYour Name  */
cds_get_recovery_reason(enum qdf_hang_reason * reason)2111*5113495bSYour Name void cds_get_recovery_reason(enum qdf_hang_reason *reason)
2112*5113495bSYour Name {
2113*5113495bSYour Name 	if (!gp_cds_context) {
2114*5113495bSYour Name 		cds_err("gp_cds_context is null");
2115*5113495bSYour Name 		return;
2116*5113495bSYour Name 	}
2117*5113495bSYour Name 
2118*5113495bSYour Name 	*reason = gp_cds_context->recovery_reason;
2119*5113495bSYour Name }
2120*5113495bSYour Name 
2121*5113495bSYour Name /**
2122*5113495bSYour Name  * cds_reset_recovery_reason() - reset the reason to unspecified
2123*5113495bSYour Name  *
2124*5113495bSYour Name  * Return: None
2125*5113495bSYour Name  */
cds_reset_recovery_reason(void)2126*5113495bSYour Name void cds_reset_recovery_reason(void)
2127*5113495bSYour Name {
2128*5113495bSYour Name 	if (!gp_cds_context) {
2129*5113495bSYour Name 		cds_err("gp_cds_context is null");
2130*5113495bSYour Name 		return;
2131*5113495bSYour Name 	}
2132*5113495bSYour Name 
2133*5113495bSYour Name 	gp_cds_context->recovery_reason = QDF_REASON_UNSPECIFIED;
2134*5113495bSYour Name }
2135*5113495bSYour Name 
2136*5113495bSYour Name /**
2137*5113495bSYour Name  * cds_set_wakelock_logging() - Logging of wakelock enabled/disabled
2138*5113495bSYour Name  * @value: Boolean value
2139*5113495bSYour Name  *
2140*5113495bSYour Name  * This function is used to set the flag which will indicate whether
2141*5113495bSYour Name  * logging of wakelock is enabled or not
2142*5113495bSYour Name  *
2143*5113495bSYour Name  * Return: None
2144*5113495bSYour Name  */
cds_set_wakelock_logging(bool value)2145*5113495bSYour Name void cds_set_wakelock_logging(bool value)
2146*5113495bSYour Name {
2147*5113495bSYour Name 	struct cds_context *p_cds_context;
2148*5113495bSYour Name 
2149*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2150*5113495bSYour Name 	if (!p_cds_context) {
2151*5113495bSYour Name 		cds_err("cds context is Invalid");
2152*5113495bSYour Name 		return;
2153*5113495bSYour Name 	}
2154*5113495bSYour Name 	p_cds_context->is_wakelock_log_enabled = value;
2155*5113495bSYour Name }
2156*5113495bSYour Name 
2157*5113495bSYour Name /**
2158*5113495bSYour Name  * cds_is_wakelock_enabled() - Check if logging of wakelock is enabled/disabled
2159*5113495bSYour Name  *
2160*5113495bSYour Name  * This function is used to check whether logging of wakelock is enabled or not
2161*5113495bSYour Name  *
2162*5113495bSYour Name  * Return: true if logging of wakelock is enabled
2163*5113495bSYour Name  */
cds_is_wakelock_enabled(void)2164*5113495bSYour Name bool cds_is_wakelock_enabled(void)
2165*5113495bSYour Name {
2166*5113495bSYour Name 	struct cds_context *p_cds_context;
2167*5113495bSYour Name 
2168*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2169*5113495bSYour Name 	if (!p_cds_context) {
2170*5113495bSYour Name 		cds_err("cds context is Invalid");
2171*5113495bSYour Name 		return false;
2172*5113495bSYour Name 	}
2173*5113495bSYour Name 	return p_cds_context->is_wakelock_log_enabled;
2174*5113495bSYour Name }
2175*5113495bSYour Name 
2176*5113495bSYour Name /**
2177*5113495bSYour Name  * cds_set_ring_log_level() - Sets the log level of a particular ring
2178*5113495bSYour Name  * @ring_id: ring_id
2179*5113495bSYour Name  * @log_level: Log level specified
2180*5113495bSYour Name  *
2181*5113495bSYour Name  * This function converts HLOS values to driver log levels and sets the log
2182*5113495bSYour Name  * level of a particular ring accordingly.
2183*5113495bSYour Name  *
2184*5113495bSYour Name  * Return: None
2185*5113495bSYour Name  */
cds_set_ring_log_level(uint32_t ring_id,uint32_t log_level)2186*5113495bSYour Name void cds_set_ring_log_level(uint32_t ring_id, uint32_t log_level)
2187*5113495bSYour Name {
2188*5113495bSYour Name 	struct cds_context *p_cds_context;
2189*5113495bSYour Name 	uint32_t log_val;
2190*5113495bSYour Name 
2191*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2192*5113495bSYour Name 	if (!p_cds_context) {
2193*5113495bSYour Name 		cds_err("cds context is Invalid");
2194*5113495bSYour Name 		return;
2195*5113495bSYour Name 	}
2196*5113495bSYour Name 
2197*5113495bSYour Name 	switch (log_level) {
2198*5113495bSYour Name 	case LOG_LEVEL_NO_COLLECTION:
2199*5113495bSYour Name 		log_val = WLAN_LOG_LEVEL_OFF;
2200*5113495bSYour Name 		break;
2201*5113495bSYour Name 	case LOG_LEVEL_NORMAL_COLLECT:
2202*5113495bSYour Name 		log_val = WLAN_LOG_LEVEL_NORMAL;
2203*5113495bSYour Name 		break;
2204*5113495bSYour Name 	case LOG_LEVEL_ISSUE_REPRO:
2205*5113495bSYour Name 		log_val = WLAN_LOG_LEVEL_REPRO;
2206*5113495bSYour Name 		break;
2207*5113495bSYour Name 	case LOG_LEVEL_ACTIVE:
2208*5113495bSYour Name 	default:
2209*5113495bSYour Name 		log_val = WLAN_LOG_LEVEL_ACTIVE;
2210*5113495bSYour Name 		break;
2211*5113495bSYour Name 	}
2212*5113495bSYour Name 
2213*5113495bSYour Name 	if (ring_id == RING_ID_WAKELOCK) {
2214*5113495bSYour Name 		p_cds_context->wakelock_log_level = log_val;
2215*5113495bSYour Name 		return;
2216*5113495bSYour Name 	} else if (ring_id == RING_ID_CONNECTIVITY) {
2217*5113495bSYour Name 		p_cds_context->connectivity_log_level = log_val;
2218*5113495bSYour Name 		return;
2219*5113495bSYour Name 	} else if (ring_id == RING_ID_PER_PACKET_STATS) {
2220*5113495bSYour Name 		p_cds_context->packet_stats_log_level = log_val;
2221*5113495bSYour Name 		return;
2222*5113495bSYour Name 	} else if (ring_id == RING_ID_DRIVER_DEBUG) {
2223*5113495bSYour Name 		p_cds_context->driver_debug_log_level = log_val;
2224*5113495bSYour Name 		return;
2225*5113495bSYour Name 	} else if (ring_id == RING_ID_FIRMWARE_DEBUG) {
2226*5113495bSYour Name 		p_cds_context->fw_debug_log_level = log_val;
2227*5113495bSYour Name 		return;
2228*5113495bSYour Name 	}
2229*5113495bSYour Name }
2230*5113495bSYour Name 
2231*5113495bSYour Name /**
2232*5113495bSYour Name  * cds_get_ring_log_level() - Get the a ring id's log level
2233*5113495bSYour Name  * @ring_id: Ring id
2234*5113495bSYour Name  *
2235*5113495bSYour Name  * Fetch and return the log level corresponding to a ring id
2236*5113495bSYour Name  *
2237*5113495bSYour Name  * Return: Log level corresponding to the ring ID
2238*5113495bSYour Name  */
cds_get_ring_log_level(uint32_t ring_id)2239*5113495bSYour Name enum wifi_driver_log_level cds_get_ring_log_level(uint32_t ring_id)
2240*5113495bSYour Name {
2241*5113495bSYour Name 	struct cds_context *p_cds_context;
2242*5113495bSYour Name 
2243*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2244*5113495bSYour Name 	if (!p_cds_context) {
2245*5113495bSYour Name 		cds_err("cds context is Invalid");
2246*5113495bSYour Name 		return WLAN_LOG_LEVEL_OFF;
2247*5113495bSYour Name 	}
2248*5113495bSYour Name 
2249*5113495bSYour Name 	if (ring_id == RING_ID_WAKELOCK)
2250*5113495bSYour Name 		return p_cds_context->wakelock_log_level;
2251*5113495bSYour Name 	else if (ring_id == RING_ID_CONNECTIVITY)
2252*5113495bSYour Name 		return p_cds_context->connectivity_log_level;
2253*5113495bSYour Name 	else if (ring_id == RING_ID_PER_PACKET_STATS)
2254*5113495bSYour Name 		return p_cds_context->packet_stats_log_level;
2255*5113495bSYour Name 	else if (ring_id == RING_ID_DRIVER_DEBUG)
2256*5113495bSYour Name 		return p_cds_context->driver_debug_log_level;
2257*5113495bSYour Name 	else if (ring_id == RING_ID_FIRMWARE_DEBUG)
2258*5113495bSYour Name 		return p_cds_context->fw_debug_log_level;
2259*5113495bSYour Name 
2260*5113495bSYour Name 	return WLAN_LOG_LEVEL_OFF;
2261*5113495bSYour Name }
2262*5113495bSYour Name 
2263*5113495bSYour Name /**
2264*5113495bSYour Name  * cds_set_multicast_logging() - Set mutlicast logging value
2265*5113495bSYour Name  * @value: Value of multicast logging
2266*5113495bSYour Name  *
2267*5113495bSYour Name  * Set the multicast logging value which will indicate
2268*5113495bSYour Name  * whether to multicast host and fw messages even
2269*5113495bSYour Name  * without any registration by userspace entity
2270*5113495bSYour Name  *
2271*5113495bSYour Name  * Return: None
2272*5113495bSYour Name  */
cds_set_multicast_logging(uint8_t value)2273*5113495bSYour Name void cds_set_multicast_logging(uint8_t value)
2274*5113495bSYour Name {
2275*5113495bSYour Name 	cds_multicast_logging = value;
2276*5113495bSYour Name }
2277*5113495bSYour Name 
2278*5113495bSYour Name /**
2279*5113495bSYour Name  * cds_is_multicast_logging() - Get multicast logging value
2280*5113495bSYour Name  *
2281*5113495bSYour Name  * Get the multicast logging value which will indicate
2282*5113495bSYour Name  * whether to multicast host and fw messages even
2283*5113495bSYour Name  * without any registration by userspace entity
2284*5113495bSYour Name  *
2285*5113495bSYour Name  * Return: 0 - Multicast logging disabled, 1 - Multicast logging enabled
2286*5113495bSYour Name  */
cds_is_multicast_logging(void)2287*5113495bSYour Name uint8_t cds_is_multicast_logging(void)
2288*5113495bSYour Name {
2289*5113495bSYour Name 	return cds_multicast_logging;
2290*5113495bSYour Name }
2291*5113495bSYour Name 
2292*5113495bSYour Name /*
2293*5113495bSYour Name  * cds_init_log_completion() - Initialize log param structure
2294*5113495bSYour Name  *
2295*5113495bSYour Name  * This function is used to initialize the logging related
2296*5113495bSYour Name  * parameters
2297*5113495bSYour Name  *
2298*5113495bSYour Name  * Return: None
2299*5113495bSYour Name  */
cds_init_log_completion(void)2300*5113495bSYour Name void cds_init_log_completion(void)
2301*5113495bSYour Name {
2302*5113495bSYour Name 	struct cds_context *p_cds_context;
2303*5113495bSYour Name 
2304*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2305*5113495bSYour Name 	if (!p_cds_context) {
2306*5113495bSYour Name 		cds_err("cds context is Invalid");
2307*5113495bSYour Name 		return;
2308*5113495bSYour Name 	}
2309*5113495bSYour Name 
2310*5113495bSYour Name 	p_cds_context->log_complete.is_fatal = WLAN_LOG_TYPE_NON_FATAL;
2311*5113495bSYour Name 	p_cds_context->log_complete.indicator = WLAN_LOG_INDICATOR_UNUSED;
2312*5113495bSYour Name 	p_cds_context->log_complete.reason_code = WLAN_LOG_REASON_CODE_UNUSED;
2313*5113495bSYour Name 	p_cds_context->log_complete.is_report_in_progress = false;
2314*5113495bSYour Name }
2315*5113495bSYour Name 
2316*5113495bSYour Name /**
2317*5113495bSYour Name  * cds_set_log_completion() - Store the logging params
2318*5113495bSYour Name  * @is_fatal: Indicates if the event triggering bug report is fatal or not
2319*5113495bSYour Name  * @indicator: Source which triggered the bug report
2320*5113495bSYour Name  * @reason_code: Reason for triggering bug report
2321*5113495bSYour Name  * @recovery_needed: If recovery is needed after bug report
2322*5113495bSYour Name  *
2323*5113495bSYour Name  * This function is used to set the logging parameters based on the
2324*5113495bSYour Name  * caller
2325*5113495bSYour Name  *
2326*5113495bSYour Name  * Return: 0 if setting of params is successful
2327*5113495bSYour Name  */
cds_set_log_completion(uint32_t is_fatal,uint32_t indicator,uint32_t reason_code,bool recovery_needed)2328*5113495bSYour Name QDF_STATUS cds_set_log_completion(uint32_t is_fatal,
2329*5113495bSYour Name 		uint32_t indicator,
2330*5113495bSYour Name 		uint32_t reason_code,
2331*5113495bSYour Name 		bool recovery_needed)
2332*5113495bSYour Name {
2333*5113495bSYour Name 	struct cds_context *p_cds_context;
2334*5113495bSYour Name 
2335*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2336*5113495bSYour Name 	if (!p_cds_context) {
2337*5113495bSYour Name 		cds_err("cds context is Invalid");
2338*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2339*5113495bSYour Name 	}
2340*5113495bSYour Name 
2341*5113495bSYour Name 	qdf_spinlock_acquire(&p_cds_context->bug_report_lock);
2342*5113495bSYour Name 	p_cds_context->log_complete.is_fatal = is_fatal;
2343*5113495bSYour Name 	p_cds_context->log_complete.indicator = indicator;
2344*5113495bSYour Name 	p_cds_context->log_complete.reason_code = reason_code;
2345*5113495bSYour Name 	p_cds_context->log_complete.recovery_needed = recovery_needed;
2346*5113495bSYour Name 	p_cds_context->log_complete.is_report_in_progress = true;
2347*5113495bSYour Name 	qdf_spinlock_release(&p_cds_context->bug_report_lock);
2348*5113495bSYour Name 	cds_debug("is_fatal %d indicator %d reason_code %d recovery needed %d",
2349*5113495bSYour Name 		  is_fatal, indicator, reason_code, recovery_needed);
2350*5113495bSYour Name 
2351*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2352*5113495bSYour Name }
2353*5113495bSYour Name 
2354*5113495bSYour Name /**
2355*5113495bSYour Name  * cds_get_and_reset_log_completion() - Get and reset logging related params
2356*5113495bSYour Name  * @is_fatal: Indicates if the event triggering bug report is fatal or not
2357*5113495bSYour Name  * @indicator: Source which triggered the bug report
2358*5113495bSYour Name  * @reason_code: Reason for triggering bug report
2359*5113495bSYour Name  * @recovery_needed: If recovery is needed after bug report
2360*5113495bSYour Name  *
2361*5113495bSYour Name  * This function is used to get the logging related parameters
2362*5113495bSYour Name  *
2363*5113495bSYour Name  * Return: None
2364*5113495bSYour Name  */
cds_get_and_reset_log_completion(uint32_t * is_fatal,uint32_t * indicator,uint32_t * reason_code,bool * recovery_needed)2365*5113495bSYour Name void cds_get_and_reset_log_completion(uint32_t *is_fatal,
2366*5113495bSYour Name 		uint32_t *indicator,
2367*5113495bSYour Name 		uint32_t *reason_code,
2368*5113495bSYour Name 		bool *recovery_needed)
2369*5113495bSYour Name {
2370*5113495bSYour Name 	struct cds_context *p_cds_context;
2371*5113495bSYour Name 
2372*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2373*5113495bSYour Name 	if (!p_cds_context) {
2374*5113495bSYour Name 		cds_err("cds context is Invalid");
2375*5113495bSYour Name 		return;
2376*5113495bSYour Name 	}
2377*5113495bSYour Name 
2378*5113495bSYour Name 	qdf_spinlock_acquire(&p_cds_context->bug_report_lock);
2379*5113495bSYour Name 	*is_fatal =  p_cds_context->log_complete.is_fatal;
2380*5113495bSYour Name 	*indicator = p_cds_context->log_complete.indicator;
2381*5113495bSYour Name 	*reason_code = p_cds_context->log_complete.reason_code;
2382*5113495bSYour Name 	*recovery_needed = p_cds_context->log_complete.recovery_needed;
2383*5113495bSYour Name 
2384*5113495bSYour Name 	/* reset */
2385*5113495bSYour Name 	p_cds_context->log_complete.indicator = WLAN_LOG_INDICATOR_UNUSED;
2386*5113495bSYour Name 	p_cds_context->log_complete.is_fatal = WLAN_LOG_TYPE_NON_FATAL;
2387*5113495bSYour Name 	p_cds_context->log_complete.is_report_in_progress = false;
2388*5113495bSYour Name 	p_cds_context->log_complete.reason_code = WLAN_LOG_REASON_CODE_UNUSED;
2389*5113495bSYour Name 	p_cds_context->log_complete.recovery_needed = false;
2390*5113495bSYour Name 	qdf_spinlock_release(&p_cds_context->bug_report_lock);
2391*5113495bSYour Name }
2392*5113495bSYour Name 
2393*5113495bSYour Name /**
2394*5113495bSYour Name  * cds_is_log_report_in_progress() - Check if bug reporting is in progress
2395*5113495bSYour Name  *
2396*5113495bSYour Name  * This function is used to check if the bug reporting is already in progress
2397*5113495bSYour Name  *
2398*5113495bSYour Name  * Return: true if the bug reporting is in progress
2399*5113495bSYour Name  */
cds_is_log_report_in_progress(void)2400*5113495bSYour Name bool cds_is_log_report_in_progress(void)
2401*5113495bSYour Name {
2402*5113495bSYour Name 	struct cds_context *p_cds_context;
2403*5113495bSYour Name 
2404*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2405*5113495bSYour Name 	if (!p_cds_context) {
2406*5113495bSYour Name 		cds_err("cds context is Invalid");
2407*5113495bSYour Name 		return true;
2408*5113495bSYour Name 	}
2409*5113495bSYour Name 	return p_cds_context->log_complete.is_report_in_progress;
2410*5113495bSYour Name }
2411*5113495bSYour Name 
2412*5113495bSYour Name /**
2413*5113495bSYour Name  * cds_is_fatal_event_enabled() - Return if fatal event is enabled
2414*5113495bSYour Name  *
2415*5113495bSYour Name  * Return true if fatal event is enabled.
2416*5113495bSYour Name  */
cds_is_fatal_event_enabled(void)2417*5113495bSYour Name bool cds_is_fatal_event_enabled(void)
2418*5113495bSYour Name {
2419*5113495bSYour Name 	struct cds_context *p_cds_context;
2420*5113495bSYour Name 
2421*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2422*5113495bSYour Name 	if (!p_cds_context) {
2423*5113495bSYour Name 		cds_err("cds context is Invalid");
2424*5113495bSYour Name 		return false;
2425*5113495bSYour Name 	}
2426*5113495bSYour Name 
2427*5113495bSYour Name 
2428*5113495bSYour Name 	return p_cds_context->enable_fatal_event;
2429*5113495bSYour Name }
2430*5113495bSYour Name 
2431*5113495bSYour Name #ifdef WLAN_FEATURE_TSF_PLUS_SOCK_TS
cds_is_ptp_rx_opt_enabled(void)2432*5113495bSYour Name bool cds_is_ptp_rx_opt_enabled(void)
2433*5113495bSYour Name {
2434*5113495bSYour Name 	struct hdd_context *hdd_ctx;
2435*5113495bSYour Name 	struct cds_context *p_cds_context;
2436*5113495bSYour Name 
2437*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2438*5113495bSYour Name 	if (!p_cds_context) {
2439*5113495bSYour Name 		cds_err("cds context is Invalid");
2440*5113495bSYour Name 		return false;
2441*5113495bSYour Name 	}
2442*5113495bSYour Name 
2443*5113495bSYour Name 	hdd_ctx = (struct hdd_context *)(p_cds_context->hdd_context);
2444*5113495bSYour Name 	if ((!hdd_ctx) || (!hdd_ctx->config)) {
2445*5113495bSYour Name 		cds_err("Hdd Context is Null");
2446*5113495bSYour Name 		return false;
2447*5113495bSYour Name 	}
2448*5113495bSYour Name 
2449*5113495bSYour Name 	return hdd_tsf_is_rx_set(hdd_ctx);
2450*5113495bSYour Name }
2451*5113495bSYour Name 
cds_is_ptp_tx_opt_enabled(void)2452*5113495bSYour Name bool cds_is_ptp_tx_opt_enabled(void)
2453*5113495bSYour Name {
2454*5113495bSYour Name 	struct hdd_context *hdd_ctx;
2455*5113495bSYour Name 	struct cds_context *p_cds_context;
2456*5113495bSYour Name 
2457*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2458*5113495bSYour Name 	if (!p_cds_context) {
2459*5113495bSYour Name 		cds_err("cds context is Invalid");
2460*5113495bSYour Name 		return false;
2461*5113495bSYour Name 	}
2462*5113495bSYour Name 
2463*5113495bSYour Name 	hdd_ctx = (struct hdd_context *)(p_cds_context->hdd_context);
2464*5113495bSYour Name 	if ((!hdd_ctx) || (!hdd_ctx->config)) {
2465*5113495bSYour Name 		cds_err("Hdd Context is Null");
2466*5113495bSYour Name 		return false;
2467*5113495bSYour Name 	}
2468*5113495bSYour Name 
2469*5113495bSYour Name 	return hdd_tsf_is_tx_set(hdd_ctx);
2470*5113495bSYour Name }
2471*5113495bSYour Name #endif
2472*5113495bSYour Name 
2473*5113495bSYour Name /**
2474*5113495bSYour Name  * cds_get_log_indicator() - Get the log flush indicator
2475*5113495bSYour Name  *
2476*5113495bSYour Name  * This function is used to get the log flush indicator
2477*5113495bSYour Name  *
2478*5113495bSYour Name  * Return: log indicator
2479*5113495bSYour Name  */
cds_get_log_indicator(void)2480*5113495bSYour Name uint32_t cds_get_log_indicator(void)
2481*5113495bSYour Name {
2482*5113495bSYour Name 	struct cds_context *p_cds_context;
2483*5113495bSYour Name 	uint32_t indicator;
2484*5113495bSYour Name 
2485*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2486*5113495bSYour Name 	if (!p_cds_context) {
2487*5113495bSYour Name 		cds_err("cds context is Invalid");
2488*5113495bSYour Name 		return WLAN_LOG_INDICATOR_UNUSED;
2489*5113495bSYour Name 	}
2490*5113495bSYour Name 
2491*5113495bSYour Name 	if (cds_is_load_or_unload_in_progress() ||
2492*5113495bSYour Name 	    cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
2493*5113495bSYour Name 		return WLAN_LOG_INDICATOR_UNUSED;
2494*5113495bSYour Name 	}
2495*5113495bSYour Name 
2496*5113495bSYour Name 	qdf_spinlock_acquire(&p_cds_context->bug_report_lock);
2497*5113495bSYour Name 	indicator = p_cds_context->log_complete.indicator;
2498*5113495bSYour Name 	qdf_spinlock_release(&p_cds_context->bug_report_lock);
2499*5113495bSYour Name 	return indicator;
2500*5113495bSYour Name }
2501*5113495bSYour Name 
2502*5113495bSYour Name /**
2503*5113495bSYour Name  * cds_wlan_flush_host_logs_for_fatal() - Wrapper to flush host logs
2504*5113495bSYour Name  *
2505*5113495bSYour Name  * This function is used to send signal to the logger thread to
2506*5113495bSYour Name  * flush the host logs.
2507*5113495bSYour Name  *
2508*5113495bSYour Name  * Return: None
2509*5113495bSYour Name  *
2510*5113495bSYour Name  */
cds_wlan_flush_host_logs_for_fatal(void)2511*5113495bSYour Name void cds_wlan_flush_host_logs_for_fatal(void)
2512*5113495bSYour Name {
2513*5113495bSYour Name 	if (cds_is_log_report_in_progress())
2514*5113495bSYour Name 		wlan_flush_host_logs_for_fatal();
2515*5113495bSYour Name }
2516*5113495bSYour Name 
2517*5113495bSYour Name /**
2518*5113495bSYour Name  * cds_flush_logs() - Report fatal event to userspace
2519*5113495bSYour Name  * @is_fatal: Indicates if the event triggering bug report is fatal or not
2520*5113495bSYour Name  * @indicator: Source which triggered the bug report
2521*5113495bSYour Name  * @reason_code: Reason for triggering bug report
2522*5113495bSYour Name  * @dump_mac_trace: If mac trace are needed in logs.
2523*5113495bSYour Name  * @recovery_needed: If recovery is needed after bug report
2524*5113495bSYour Name  *
2525*5113495bSYour Name  * This function sets the log related params and send the WMI command to the
2526*5113495bSYour Name  * FW to flush its logs. On receiving the flush completion event from the FW
2527*5113495bSYour Name  * the same will be conveyed to userspace
2528*5113495bSYour Name  *
2529*5113495bSYour Name  * Return: 0 on success
2530*5113495bSYour Name  */
cds_flush_logs(uint32_t is_fatal,uint32_t indicator,uint32_t reason_code,bool dump_mac_trace,bool recovery_needed)2531*5113495bSYour Name QDF_STATUS cds_flush_logs(uint32_t is_fatal,
2532*5113495bSYour Name 		uint32_t indicator,
2533*5113495bSYour Name 		uint32_t reason_code,
2534*5113495bSYour Name 		bool dump_mac_trace,
2535*5113495bSYour Name 		bool recovery_needed)
2536*5113495bSYour Name {
2537*5113495bSYour Name 	QDF_STATUS status;
2538*5113495bSYour Name 
2539*5113495bSYour Name 	struct cds_context *p_cds_context;
2540*5113495bSYour Name 
2541*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2542*5113495bSYour Name 	if (!p_cds_context) {
2543*5113495bSYour Name 		cds_err("cds context is Invalid");
2544*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2545*5113495bSYour Name 	}
2546*5113495bSYour Name 	if (!p_cds_context->enable_fatal_event) {
2547*5113495bSYour Name 		cds_err("Fatal event not enabled");
2548*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2549*5113495bSYour Name 	}
2550*5113495bSYour Name 	if (cds_is_load_or_unload_in_progress() ||
2551*5113495bSYour Name 	    cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
2552*5113495bSYour Name 		cds_err("un/Load/SSR in progress");
2553*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2554*5113495bSYour Name 	}
2555*5113495bSYour Name 
2556*5113495bSYour Name 	if (cds_is_log_report_in_progress()) {
2557*5113495bSYour Name 		cds_err("Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
2558*5113495bSYour Name 			is_fatal, indicator, reason_code);
2559*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2560*5113495bSYour Name 	}
2561*5113495bSYour Name 
2562*5113495bSYour Name 	status = cds_set_log_completion(is_fatal, indicator,
2563*5113495bSYour Name 		reason_code, recovery_needed);
2564*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != status) {
2565*5113495bSYour Name 		cds_err("Failed to set log trigger params");
2566*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2567*5113495bSYour Name 	}
2568*5113495bSYour Name 
2569*5113495bSYour Name 	cds_debug("Triggering bug report: type:%d, indicator=%d reason_code=%d",
2570*5113495bSYour Name 		  is_fatal, indicator, reason_code);
2571*5113495bSYour Name 
2572*5113495bSYour Name 	if (dump_mac_trace)
2573*5113495bSYour Name 		qdf_trace_dump_all(p_cds_context->mac_context, 0, 0, 100, 0);
2574*5113495bSYour Name 
2575*5113495bSYour Name 	if (WLAN_LOG_INDICATOR_HOST_ONLY == indicator) {
2576*5113495bSYour Name 		cds_wlan_flush_host_logs_for_fatal();
2577*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
2578*5113495bSYour Name 	}
2579*5113495bSYour Name 
2580*5113495bSYour Name 	status = sme_send_flush_logs_cmd_to_fw();
2581*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2582*5113495bSYour Name 		cds_err("Failed to send flush FW log");
2583*5113495bSYour Name 		cds_init_log_completion();
2584*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2585*5113495bSYour Name 	}
2586*5113495bSYour Name 
2587*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2588*5113495bSYour Name }
2589*5113495bSYour Name 
2590*5113495bSYour Name /**
2591*5113495bSYour Name  * cds_logging_set_fw_flush_complete() - Wrapper for FW log flush completion
2592*5113495bSYour Name  *
2593*5113495bSYour Name  * This function is used to send signal to the logger thread to indicate
2594*5113495bSYour Name  * that the flushing of FW logs is complete by the FW
2595*5113495bSYour Name  *
2596*5113495bSYour Name  * Return: None
2597*5113495bSYour Name  *
2598*5113495bSYour Name  */
cds_logging_set_fw_flush_complete(void)2599*5113495bSYour Name void cds_logging_set_fw_flush_complete(void)
2600*5113495bSYour Name {
2601*5113495bSYour Name 	if (cds_is_fatal_event_enabled())
2602*5113495bSYour Name 		wlan_logging_set_fw_flush_complete();
2603*5113495bSYour Name }
2604*5113495bSYour Name 
2605*5113495bSYour Name /**
2606*5113495bSYour Name  * cds_set_fatal_event() - set fatal event status
2607*5113495bSYour Name  * @value: pending statue to set
2608*5113495bSYour Name  *
2609*5113495bSYour Name  * Return: None
2610*5113495bSYour Name  */
cds_set_fatal_event(bool value)2611*5113495bSYour Name void cds_set_fatal_event(bool value)
2612*5113495bSYour Name {
2613*5113495bSYour Name 	struct cds_context *p_cds_context;
2614*5113495bSYour Name 
2615*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2616*5113495bSYour Name 	if (!p_cds_context) {
2617*5113495bSYour Name 		cds_err("cds context is Invalid");
2618*5113495bSYour Name 		return;
2619*5113495bSYour Name 	}
2620*5113495bSYour Name 	p_cds_context->enable_fatal_event = value;
2621*5113495bSYour Name }
2622*5113495bSYour Name 
2623*5113495bSYour Name /**
2624*5113495bSYour Name  * cds_get_radio_index() - get radio index
2625*5113495bSYour Name  *
2626*5113495bSYour Name  * Return: radio index otherwise, -EINVAL
2627*5113495bSYour Name  */
cds_get_radio_index(void)2628*5113495bSYour Name int cds_get_radio_index(void)
2629*5113495bSYour Name {
2630*5113495bSYour Name 	struct cds_context *p_cds_context;
2631*5113495bSYour Name 
2632*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2633*5113495bSYour Name 	if (!p_cds_context) {
2634*5113495bSYour Name 		/*
2635*5113495bSYour Name 		 * To avoid recursive call, this should not change to
2636*5113495bSYour Name 		 * QDF_TRACE().
2637*5113495bSYour Name 		 */
2638*5113495bSYour Name 		pr_err("%s: cds context is invalid\n", __func__);
2639*5113495bSYour Name 		return -EINVAL;
2640*5113495bSYour Name 	}
2641*5113495bSYour Name 
2642*5113495bSYour Name 	return p_cds_context->radio_index;
2643*5113495bSYour Name }
2644*5113495bSYour Name 
2645*5113495bSYour Name /**
2646*5113495bSYour Name  * cds_set_radio_index() - set radio index
2647*5113495bSYour Name  * @radio_index:	the radio index to set
2648*5113495bSYour Name  *
2649*5113495bSYour Name  * Return: QDF status
2650*5113495bSYour Name  */
cds_set_radio_index(int radio_index)2651*5113495bSYour Name QDF_STATUS cds_set_radio_index(int radio_index)
2652*5113495bSYour Name {
2653*5113495bSYour Name 	struct cds_context *p_cds_context;
2654*5113495bSYour Name 
2655*5113495bSYour Name 	p_cds_context = cds_get_global_context();
2656*5113495bSYour Name 	if (!p_cds_context) {
2657*5113495bSYour Name 		pr_err("%s: cds context is invalid\n", __func__);
2658*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2659*5113495bSYour Name 	}
2660*5113495bSYour Name 
2661*5113495bSYour Name 	p_cds_context->radio_index = radio_index;
2662*5113495bSYour Name 
2663*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2664*5113495bSYour Name }
2665*5113495bSYour Name 
2666*5113495bSYour Name /**
2667*5113495bSYour Name  * cds_init_ini_config() - API to initialize CDS configuration parameters
2668*5113495bSYour Name  * @cfg: CDS Configuration
2669*5113495bSYour Name  *
2670*5113495bSYour Name  * Return: void
2671*5113495bSYour Name  */
2672*5113495bSYour Name 
cds_init_ini_config(struct cds_config_info * cfg)2673*5113495bSYour Name void cds_init_ini_config(struct cds_config_info *cfg)
2674*5113495bSYour Name {
2675*5113495bSYour Name 	struct cds_context *cds_ctx;
2676*5113495bSYour Name 
2677*5113495bSYour Name 	cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
2678*5113495bSYour Name 	if (!cds_ctx)
2679*5113495bSYour Name 		return;
2680*5113495bSYour Name 
2681*5113495bSYour Name 	cds_ctx->cds_cfg = cfg;
2682*5113495bSYour Name }
2683*5113495bSYour Name 
2684*5113495bSYour Name /**
2685*5113495bSYour Name  * cds_deinit_ini_config() - API to free CDS configuration parameters
2686*5113495bSYour Name  *
2687*5113495bSYour Name  * Return: void
2688*5113495bSYour Name  */
cds_deinit_ini_config(void)2689*5113495bSYour Name void cds_deinit_ini_config(void)
2690*5113495bSYour Name {
2691*5113495bSYour Name 	struct cds_context *cds_ctx;
2692*5113495bSYour Name 	struct cds_config_info *cds_cfg;
2693*5113495bSYour Name 
2694*5113495bSYour Name 	cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
2695*5113495bSYour Name 	if (!cds_ctx)
2696*5113495bSYour Name 		return;
2697*5113495bSYour Name 
2698*5113495bSYour Name 	cds_cfg = cds_ctx->cds_cfg;
2699*5113495bSYour Name 	cds_ctx->cds_cfg = NULL;
2700*5113495bSYour Name 
2701*5113495bSYour Name 	if (cds_cfg)
2702*5113495bSYour Name 		qdf_mem_free(cds_cfg);
2703*5113495bSYour Name }
2704*5113495bSYour Name 
2705*5113495bSYour Name /**
2706*5113495bSYour Name  * cds_get_ini_config() - API to get CDS configuration parameters
2707*5113495bSYour Name  *
2708*5113495bSYour Name  * Return: cds config structure
2709*5113495bSYour Name  */
cds_get_ini_config(void)2710*5113495bSYour Name struct cds_config_info *cds_get_ini_config(void)
2711*5113495bSYour Name {
2712*5113495bSYour Name 	struct cds_context *cds_ctx;
2713*5113495bSYour Name 
2714*5113495bSYour Name 	cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
2715*5113495bSYour Name 	if (!cds_ctx)
2716*5113495bSYour Name 		return NULL;
2717*5113495bSYour Name 
2718*5113495bSYour Name 	return cds_ctx->cds_cfg;
2719*5113495bSYour Name }
2720*5113495bSYour Name 
2721*5113495bSYour Name /**
2722*5113495bSYour Name  * cds_is_5_mhz_enabled() - API to get 5MHZ enabled
2723*5113495bSYour Name  *
2724*5113495bSYour Name  * Return: true if 5 mhz is enabled, false otherwise
2725*5113495bSYour Name  */
cds_is_5_mhz_enabled(void)2726*5113495bSYour Name bool cds_is_5_mhz_enabled(void)
2727*5113495bSYour Name {
2728*5113495bSYour Name 	struct cds_context *p_cds_context;
2729*5113495bSYour Name 
2730*5113495bSYour Name 	p_cds_context = cds_get_context(QDF_MODULE_ID_QDF);
2731*5113495bSYour Name 	if (!p_cds_context)
2732*5113495bSYour Name 		return false;
2733*5113495bSYour Name 
2734*5113495bSYour Name 	if (p_cds_context->cds_cfg)
2735*5113495bSYour Name 		return (p_cds_context->cds_cfg->sub_20_channel_width ==
2736*5113495bSYour Name 						WLAN_SUB_20_CH_WIDTH_5);
2737*5113495bSYour Name 
2738*5113495bSYour Name 	return false;
2739*5113495bSYour Name }
2740*5113495bSYour Name 
2741*5113495bSYour Name /**
2742*5113495bSYour Name  * cds_is_10_mhz_enabled() - API to get 10-MHZ enabled
2743*5113495bSYour Name  *
2744*5113495bSYour Name  * Return: true if 10 mhz is enabled, false otherwise
2745*5113495bSYour Name  */
cds_is_10_mhz_enabled(void)2746*5113495bSYour Name bool cds_is_10_mhz_enabled(void)
2747*5113495bSYour Name {
2748*5113495bSYour Name 	struct cds_context *p_cds_context;
2749*5113495bSYour Name 
2750*5113495bSYour Name 	p_cds_context = cds_get_context(QDF_MODULE_ID_QDF);
2751*5113495bSYour Name 	if (!p_cds_context)
2752*5113495bSYour Name 		return false;
2753*5113495bSYour Name 
2754*5113495bSYour Name 	if (p_cds_context->cds_cfg)
2755*5113495bSYour Name 		return (p_cds_context->cds_cfg->sub_20_channel_width ==
2756*5113495bSYour Name 						WLAN_SUB_20_CH_WIDTH_10);
2757*5113495bSYour Name 
2758*5113495bSYour Name 	return false;
2759*5113495bSYour Name }
2760*5113495bSYour Name 
2761*5113495bSYour Name /**
2762*5113495bSYour Name  * cds_is_sub_20_mhz_enabled() - API to get sub 20-MHZ enabled
2763*5113495bSYour Name  *
2764*5113495bSYour Name  * Return: true if 5 or 10 mhz is enabled, false otherwise
2765*5113495bSYour Name  */
cds_is_sub_20_mhz_enabled(void)2766*5113495bSYour Name bool cds_is_sub_20_mhz_enabled(void)
2767*5113495bSYour Name {
2768*5113495bSYour Name 	struct cds_context *p_cds_context;
2769*5113495bSYour Name 
2770*5113495bSYour Name 	p_cds_context = cds_get_context(QDF_MODULE_ID_QDF);
2771*5113495bSYour Name 	if (!p_cds_context)
2772*5113495bSYour Name 		return false;
2773*5113495bSYour Name 
2774*5113495bSYour Name 	if (p_cds_context->cds_cfg)
2775*5113495bSYour Name 		return p_cds_context->cds_cfg->sub_20_channel_width;
2776*5113495bSYour Name 
2777*5113495bSYour Name 	return false;
2778*5113495bSYour Name }
2779*5113495bSYour Name 
2780*5113495bSYour Name /**
2781*5113495bSYour Name  * cds_is_self_recovery_enabled() - API to get self recovery enabled
2782*5113495bSYour Name  *
2783*5113495bSYour Name  * Return: true if self recovery enabled, false otherwise
2784*5113495bSYour Name  */
cds_is_self_recovery_enabled(void)2785*5113495bSYour Name bool cds_is_self_recovery_enabled(void)
2786*5113495bSYour Name {
2787*5113495bSYour Name 	struct cds_context *p_cds_context;
2788*5113495bSYour Name 
2789*5113495bSYour Name 	p_cds_context = cds_get_context(QDF_MODULE_ID_QDF);
2790*5113495bSYour Name 	if (!p_cds_context)
2791*5113495bSYour Name 		return false;
2792*5113495bSYour Name 
2793*5113495bSYour Name 	if (p_cds_context->cds_cfg)
2794*5113495bSYour Name 		return p_cds_context->cds_cfg->self_recovery_enabled;
2795*5113495bSYour Name 
2796*5113495bSYour Name 	return false;
2797*5113495bSYour Name }
2798*5113495bSYour Name 
2799*5113495bSYour Name /**
2800*5113495bSYour Name  * cds_is_fw_down() - Is FW down or not
2801*5113495bSYour Name  *
2802*5113495bSYour Name  * Return: true if FW is down and false otherwise.
2803*5113495bSYour Name  */
cds_is_fw_down(void)2804*5113495bSYour Name bool cds_is_fw_down(void)
2805*5113495bSYour Name {
2806*5113495bSYour Name 	qdf_device_t qdf_ctx;
2807*5113495bSYour Name 
2808*5113495bSYour Name 	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
2809*5113495bSYour Name 	if (!qdf_ctx)
2810*5113495bSYour Name 		return false;
2811*5113495bSYour Name 
2812*5113495bSYour Name 	return pld_is_fw_down(qdf_ctx->dev);
2813*5113495bSYour Name }
2814*5113495bSYour Name 
2815*5113495bSYour Name /**
2816*5113495bSYour Name  * cds_svc_fw_shutdown_ind() - API to send userspace about FW crash
2817*5113495bSYour Name  *
2818*5113495bSYour Name  * @dev: Device Pointer
2819*5113495bSYour Name  *
2820*5113495bSYour Name  * Return: None
2821*5113495bSYour Name  */
cds_svc_fw_shutdown_ind(struct device * dev)2822*5113495bSYour Name void cds_svc_fw_shutdown_ind(struct device *dev)
2823*5113495bSYour Name {
2824*5113495bSYour Name 	hdd_svc_fw_shutdown_ind(dev);
2825*5113495bSYour Name }
2826*5113495bSYour Name 
2827*5113495bSYour Name #ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
2828*5113495bSYour Name /*
2829*5113495bSYour Name  * cds_pkt_stats_to_logger_thread() - send pktstats to user
2830*5113495bSYour Name  * @pl_hdr: Pointer to pl_hdr
2831*5113495bSYour Name  * @pkt_dump: Pointer to pkt_dump data structure.
2832*5113495bSYour Name  * @data: Pointer to data
2833*5113495bSYour Name  *
2834*5113495bSYour Name  * This function is used to send the pkt stats to SVC module.
2835*5113495bSYour Name  *
2836*5113495bSYour Name  * Return: None
2837*5113495bSYour Name  */
cds_pkt_stats_to_logger_thread(void * pl_hdr,void * pkt_dump,void * data)2838*5113495bSYour Name inline void cds_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump,
2839*5113495bSYour Name 						void *data)
2840*5113495bSYour Name {
2841*5113495bSYour Name 	if (cds_get_ring_log_level(RING_ID_PER_PACKET_STATS) !=
2842*5113495bSYour Name 						WLAN_LOG_LEVEL_ACTIVE)
2843*5113495bSYour Name 		return;
2844*5113495bSYour Name 
2845*5113495bSYour Name 	wlan_pkt_stats_to_logger_thread(pl_hdr, pkt_dump, data);
2846*5113495bSYour Name }
2847*5113495bSYour Name #endif
2848*5113495bSYour Name 
2849*5113495bSYour Name /**
2850*5113495bSYour Name  * cds_get_conparam() - Get the connection mode parameters
2851*5113495bSYour Name  *
2852*5113495bSYour Name  * Return the connection mode parameter set by insmod or set during statically
2853*5113495bSYour Name  * linked driver
2854*5113495bSYour Name  *
2855*5113495bSYour Name  * Return: enum QDF_GLOBAL_MODE
2856*5113495bSYour Name  */
cds_get_conparam(void)2857*5113495bSYour Name enum QDF_GLOBAL_MODE cds_get_conparam(void)
2858*5113495bSYour Name {
2859*5113495bSYour Name 	enum QDF_GLOBAL_MODE con_mode;
2860*5113495bSYour Name 
2861*5113495bSYour Name 	con_mode = hdd_get_conparam();
2862*5113495bSYour Name 
2863*5113495bSYour Name 	return con_mode;
2864*5113495bSYour Name }
2865*5113495bSYour Name 
2866*5113495bSYour Name #ifdef FEATURE_HTC_CREDIT_HISTORY
2867*5113495bSYour Name inline void
cds_print_htc_credit_history(uint32_t count,qdf_abstract_print * print,void * print_priv)2868*5113495bSYour Name cds_print_htc_credit_history(uint32_t count, qdf_abstract_print *print,
2869*5113495bSYour Name 			     void *print_priv)
2870*5113495bSYour Name {
2871*5113495bSYour Name 	htc_print_credit_history(gp_cds_context->htc_ctx, count,
2872*5113495bSYour Name 				 print, print_priv);
2873*5113495bSYour Name }
2874*5113495bSYour Name #endif
2875*5113495bSYour Name 
2876*5113495bSYour Name #ifdef FEATURE_ALIGN_STATS_FROM_DP
2877*5113495bSYour Name /**
2878*5113495bSYour Name  * cds_get_cdp_vdev_stats() - Function which retrieves cdp vdev stats
2879*5113495bSYour Name  * @vdev_id: vdev id
2880*5113495bSYour Name  * @vdev_stats: cdp vdev stats retrieves from DP
2881*5113495bSYour Name  *
2882*5113495bSYour Name  * Return: If get cdp vdev stats success return true, otherwise return false
2883*5113495bSYour Name  */
2884*5113495bSYour Name static bool
cds_get_cdp_vdev_stats(uint8_t vdev_id,struct cdp_vdev_stats * vdev_stats)2885*5113495bSYour Name cds_get_cdp_vdev_stats(uint8_t vdev_id, struct cdp_vdev_stats *vdev_stats)
2886*5113495bSYour Name {
2887*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2888*5113495bSYour Name 
2889*5113495bSYour Name 	if (!vdev_stats)
2890*5113495bSYour Name 		return false;
2891*5113495bSYour Name 
2892*5113495bSYour Name 	if (cdp_host_get_vdev_stats(soc, vdev_id, vdev_stats, true))
2893*5113495bSYour Name 		return false;
2894*5113495bSYour Name 
2895*5113495bSYour Name 	return true;
2896*5113495bSYour Name }
2897*5113495bSYour Name 
2898*5113495bSYour Name bool
cds_dp_get_vdev_stats(uint8_t vdev_id,struct cds_vdev_dp_stats * stats)2899*5113495bSYour Name cds_dp_get_vdev_stats(uint8_t vdev_id, struct cds_vdev_dp_stats *stats)
2900*5113495bSYour Name {
2901*5113495bSYour Name 	struct cdp_vdev_stats *vdev_stats;
2902*5113495bSYour Name 	bool ret = false;
2903*5113495bSYour Name 
2904*5113495bSYour Name 	vdev_stats = qdf_mem_malloc(sizeof(*vdev_stats));
2905*5113495bSYour Name 	if (!vdev_stats)
2906*5113495bSYour Name 		return false;
2907*5113495bSYour Name 
2908*5113495bSYour Name 	if (cds_get_cdp_vdev_stats(vdev_id, vdev_stats)) {
2909*5113495bSYour Name 		stats->tx_retries = vdev_stats->tx.retries;
2910*5113495bSYour Name 		stats->tx_retries_mpdu = vdev_stats->tx.retries_mpdu;
2911*5113495bSYour Name 		stats->tx_mpdu_success_with_retries =
2912*5113495bSYour Name 			vdev_stats->tx.mpdu_success_with_retries;
2913*5113495bSYour Name 		ret = true;
2914*5113495bSYour Name 	}
2915*5113495bSYour Name 
2916*5113495bSYour Name 	qdf_mem_free(vdev_stats);
2917*5113495bSYour Name 	return ret;
2918*5113495bSYour Name }
2919*5113495bSYour Name #endif
2920*5113495bSYour Name 
2921*5113495bSYour Name #ifdef ENABLE_SMMU_S1_TRANSLATION
2922*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
cds_smmu_mem_map_setup(qdf_device_t osdev,bool ipa_present)2923*5113495bSYour Name QDF_STATUS cds_smmu_mem_map_setup(qdf_device_t osdev, bool ipa_present)
2924*5113495bSYour Name {
2925*5113495bSYour Name 	struct iommu_domain *domain;
2926*5113495bSYour Name 	bool ipa_smmu_enabled;
2927*5113495bSYour Name 	bool wlan_smmu_enabled;
2928*5113495bSYour Name 
2929*5113495bSYour Name 	domain = pld_smmu_get_domain(osdev->dev);
2930*5113495bSYour Name 	if (domain) {
2931*5113495bSYour Name 		int attr = 0;
2932*5113495bSYour Name 		int errno = qdf_iommu_domain_get_attr(domain,
2933*5113495bSYour Name 						      QDF_DOMAIN_ATTR_S1_BYPASS,
2934*5113495bSYour Name 						      &attr);
2935*5113495bSYour Name 
2936*5113495bSYour Name 		wlan_smmu_enabled = !errno && !attr;
2937*5113495bSYour Name 	} else {
2938*5113495bSYour Name 		cds_info("No SMMU mapping present");
2939*5113495bSYour Name 		wlan_smmu_enabled = false;
2940*5113495bSYour Name 	}
2941*5113495bSYour Name 
2942*5113495bSYour Name 	if (!wlan_smmu_enabled) {
2943*5113495bSYour Name 		osdev->smmu_s1_enabled = false;
2944*5113495bSYour Name 		goto exit_with_success;
2945*5113495bSYour Name 	}
2946*5113495bSYour Name 
2947*5113495bSYour Name 	if (!ipa_present) {
2948*5113495bSYour Name 		osdev->smmu_s1_enabled = true;
2949*5113495bSYour Name 		goto exit_with_success;
2950*5113495bSYour Name 	}
2951*5113495bSYour Name 
2952*5113495bSYour Name 	ipa_smmu_enabled = qdf_get_ipa_smmu_enabled();
2953*5113495bSYour Name 
2954*5113495bSYour Name 	osdev->smmu_s1_enabled = ipa_smmu_enabled && wlan_smmu_enabled;
2955*5113495bSYour Name 	if (ipa_smmu_enabled != wlan_smmu_enabled) {
2956*5113495bSYour Name 		cds_err("SMMU mismatch; IPA:%s, WLAN:%s",
2957*5113495bSYour Name 			ipa_smmu_enabled ? "enabled" : "disabled",
2958*5113495bSYour Name 			wlan_smmu_enabled ? "enabled" : "disabled");
2959*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2960*5113495bSYour Name 	}
2961*5113495bSYour Name 
2962*5113495bSYour Name exit_with_success:
2963*5113495bSYour Name 	osdev->domain = domain;
2964*5113495bSYour Name 
2965*5113495bSYour Name 	cds_info("SMMU S1 %s", osdev->smmu_s1_enabled ? "enabled" : "disabled");
2966*5113495bSYour Name 
2967*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2968*5113495bSYour Name }
2969*5113495bSYour Name 
2970*5113495bSYour Name #else
cds_smmu_mem_map_setup(qdf_device_t osdev,bool ipa_present)2971*5113495bSYour Name QDF_STATUS cds_smmu_mem_map_setup(qdf_device_t osdev, bool ipa_present)
2972*5113495bSYour Name {
2973*5113495bSYour Name 	struct dma_iommu_mapping *mapping;
2974*5113495bSYour Name 	bool ipa_smmu_enabled;
2975*5113495bSYour Name 	bool wlan_smmu_enabled;
2976*5113495bSYour Name 
2977*5113495bSYour Name 	mapping = pld_smmu_get_mapping(osdev->dev);
2978*5113495bSYour Name 	if (mapping) {
2979*5113495bSYour Name 		int attr = 0;
2980*5113495bSYour Name 		int errno = qdf_iommu_domain_get_attr(mapping->domain,
2981*5113495bSYour Name 						      QDF_DOMAIN_ATTR_S1_BYPASS,
2982*5113495bSYour Name 						      &attr);
2983*5113495bSYour Name 
2984*5113495bSYour Name 		wlan_smmu_enabled = !errno && !attr;
2985*5113495bSYour Name 	} else {
2986*5113495bSYour Name 		cds_info("No SMMU mapping present");
2987*5113495bSYour Name 		wlan_smmu_enabled = false;
2988*5113495bSYour Name 	}
2989*5113495bSYour Name 
2990*5113495bSYour Name 	if (!wlan_smmu_enabled) {
2991*5113495bSYour Name 		osdev->smmu_s1_enabled = false;
2992*5113495bSYour Name 		goto exit_with_success;
2993*5113495bSYour Name 	}
2994*5113495bSYour Name 
2995*5113495bSYour Name 	if (!ipa_present) {
2996*5113495bSYour Name 		osdev->smmu_s1_enabled = true;
2997*5113495bSYour Name 		goto exit_with_success;
2998*5113495bSYour Name 	}
2999*5113495bSYour Name 
3000*5113495bSYour Name 	ipa_smmu_enabled = qdf_get_ipa_smmu_enabled();
3001*5113495bSYour Name 
3002*5113495bSYour Name 	osdev->smmu_s1_enabled = ipa_smmu_enabled && wlan_smmu_enabled;
3003*5113495bSYour Name 	if (ipa_smmu_enabled != wlan_smmu_enabled) {
3004*5113495bSYour Name 		cds_err("SMMU mismatch; IPA:%s, WLAN:%s",
3005*5113495bSYour Name 			ipa_smmu_enabled ? "enabled" : "disabled",
3006*5113495bSYour Name 			wlan_smmu_enabled ? "enabled" : "disabled");
3007*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
3008*5113495bSYour Name 	}
3009*5113495bSYour Name 
3010*5113495bSYour Name exit_with_success:
3011*5113495bSYour Name 	osdev->iommu_mapping = mapping;
3012*5113495bSYour Name 
3013*5113495bSYour Name 	cds_info("SMMU S1 %s", osdev->smmu_s1_enabled ? "enabled" : "disabled");
3014*5113495bSYour Name 
3015*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3016*5113495bSYour Name }
3017*5113495bSYour Name #endif
3018*5113495bSYour Name 
3019*5113495bSYour Name #ifdef IPA_OFFLOAD
cds_smmu_map_unmap(bool map,uint32_t num_buf,qdf_mem_info_t * buf_arr)3020*5113495bSYour Name int cds_smmu_map_unmap(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr)
3021*5113495bSYour Name {
3022*5113495bSYour Name 	return ucfg_ipa_uc_smmu_map(map, num_buf, buf_arr);
3023*5113495bSYour Name }
3024*5113495bSYour Name #else
cds_smmu_map_unmap(bool map,uint32_t num_buf,qdf_mem_info_t * buf_arr)3025*5113495bSYour Name int cds_smmu_map_unmap(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr)
3026*5113495bSYour Name {
3027*5113495bSYour Name 	return 0;
3028*5113495bSYour Name }
3029*5113495bSYour Name #endif
3030*5113495bSYour Name 
3031*5113495bSYour Name #else
3032*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
cds_smmu_mem_map_setup(qdf_device_t osdev,bool ipa_present)3033*5113495bSYour Name QDF_STATUS cds_smmu_mem_map_setup(qdf_device_t osdev, bool ipa_present)
3034*5113495bSYour Name {
3035*5113495bSYour Name 	osdev->smmu_s1_enabled = false;
3036*5113495bSYour Name 	osdev->domain = NULL;
3037*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3038*5113495bSYour Name }
3039*5113495bSYour Name #else
cds_smmu_mem_map_setup(qdf_device_t osdev,bool ipa_present)3040*5113495bSYour Name QDF_STATUS cds_smmu_mem_map_setup(qdf_device_t osdev, bool ipa_present)
3041*5113495bSYour Name {
3042*5113495bSYour Name 	osdev->smmu_s1_enabled = false;
3043*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3044*5113495bSYour Name }
3045*5113495bSYour Name #endif
3046*5113495bSYour Name 
cds_smmu_map_unmap(bool map,uint32_t num_buf,qdf_mem_info_t * buf_arr)3047*5113495bSYour Name int cds_smmu_map_unmap(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr)
3048*5113495bSYour Name {
3049*5113495bSYour Name 	return 0;
3050*5113495bSYour Name }
3051*5113495bSYour Name #endif
3052