xref: /wlan-driver/qca-wifi-host-cmn/umac/dcs/dispatcher/src/wlan_dcs_init_deinit_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /**
19*5113495bSYour Name  * DOC: This file init/deint functions for dcs module.
20*5113495bSYour Name  */
21*5113495bSYour Name 
22*5113495bSYour Name #include "wlan_dcs_init_deinit_api.h"
23*5113495bSYour Name #include "../../core/src/wlan_dcs.h"
24*5113495bSYour Name #include "cfg_dcs.h"
25*5113495bSYour Name #include "cfg_ucfg_api.h"
26*5113495bSYour Name 
27*5113495bSYour Name /**
28*5113495bSYour Name  * wlan_dcs_psoc_obj_create_notification() - dcs psoc create handler
29*5113495bSYour Name  * @psoc: psoc object
30*5113495bSYour Name  * @arg_list: Argument list
31*5113495bSYour Name  *
32*5113495bSYour Name  * return: QDF_STATUS_SUCCESS for success or error code
33*5113495bSYour Name  */
34*5113495bSYour Name static QDF_STATUS
wlan_dcs_psoc_obj_create_notification(struct wlan_objmgr_psoc * psoc,void * arg_list)35*5113495bSYour Name wlan_dcs_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc,
36*5113495bSYour Name 				      void *arg_list)
37*5113495bSYour Name {
38*5113495bSYour Name 	QDF_STATUS status;
39*5113495bSYour Name 	struct dcs_psoc_priv_obj *dcs_psoc_obj;
40*5113495bSYour Name 	uint8_t loop;
41*5113495bSYour Name 
42*5113495bSYour Name 	dcs_psoc_obj = qdf_mem_malloc(sizeof(*dcs_psoc_obj));
43*5113495bSYour Name 
44*5113495bSYour Name 	if (!dcs_psoc_obj)
45*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
46*5113495bSYour Name 
47*5113495bSYour Name 	for (loop = 0; loop < WLAN_DCS_MAX_PDEVS; loop++)
48*5113495bSYour Name 		qdf_spinlock_create(&dcs_psoc_obj->dcs_pdev_priv[loop].lock);
49*5113495bSYour Name 
50*5113495bSYour Name 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
51*5113495bSYour Name 						       WLAN_UMAC_COMP_DCS,
52*5113495bSYour Name 						       dcs_psoc_obj,
53*5113495bSYour Name 						       QDF_STATUS_SUCCESS);
54*5113495bSYour Name 
55*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
56*5113495bSYour Name 		dcs_err("dcs pdev obj attach failed");
57*5113495bSYour Name 		qdf_mem_free(dcs_psoc_obj);
58*5113495bSYour Name 		return status;
59*5113495bSYour Name 	}
60*5113495bSYour Name 
61*5113495bSYour Name 	dcs_info("dcs psoc object attached");
62*5113495bSYour Name 
63*5113495bSYour Name 	return status;
64*5113495bSYour Name }
65*5113495bSYour Name 
66*5113495bSYour Name /**
67*5113495bSYour Name  * wlan_dcs_psoc_obj_destroy_notification() - dcs psoc destroy handler
68*5113495bSYour Name  * @psoc: psoc object
69*5113495bSYour Name  * @arg_list: Argument list
70*5113495bSYour Name  *
71*5113495bSYour Name  * return: QDF_STATUS_SUCCESS for success or error code
72*5113495bSYour Name  */
73*5113495bSYour Name static QDF_STATUS
wlan_dcs_psoc_obj_destroy_notification(struct wlan_objmgr_psoc * psoc,void * arg_list)74*5113495bSYour Name wlan_dcs_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc,
75*5113495bSYour Name 				       void *arg_list)
76*5113495bSYour Name {
77*5113495bSYour Name 	QDF_STATUS status;
78*5113495bSYour Name 	uint8_t loop;
79*5113495bSYour Name 	struct dcs_psoc_priv_obj *dcs_psoc_obj =
80*5113495bSYour Name 		wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_DCS);
81*5113495bSYour Name 
82*5113495bSYour Name 	if (!dcs_psoc_obj) {
83*5113495bSYour Name 		dcs_err("invalid wifi dcs obj");
84*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
85*5113495bSYour Name 	}
86*5113495bSYour Name 
87*5113495bSYour Name 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
88*5113495bSYour Name 						       WLAN_UMAC_COMP_DCS,
89*5113495bSYour Name 						       dcs_psoc_obj);
90*5113495bSYour Name 	for (loop = 0; loop < WLAN_DCS_MAX_PDEVS; loop++) {
91*5113495bSYour Name 		qdf_timer_free(&dcs_psoc_obj->dcs_pdev_priv[loop].
92*5113495bSYour Name 							dcs_disable_timer);
93*5113495bSYour Name 		qdf_spinlock_destroy(&dcs_psoc_obj->dcs_pdev_priv[loop].lock);
94*5113495bSYour Name 	}
95*5113495bSYour Name 	qdf_mem_free(dcs_psoc_obj);
96*5113495bSYour Name 
97*5113495bSYour Name 	return status;
98*5113495bSYour Name }
99*5113495bSYour Name 
wlan_dcs_init(void)100*5113495bSYour Name QDF_STATUS wlan_dcs_init(void)
101*5113495bSYour Name {
102*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
103*5113495bSYour Name 
104*5113495bSYour Name 	status = wlan_objmgr_register_psoc_create_handler(
105*5113495bSYour Name 			WLAN_UMAC_COMP_DCS,
106*5113495bSYour Name 			wlan_dcs_psoc_obj_create_notification,
107*5113495bSYour Name 			NULL);
108*5113495bSYour Name 
109*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
110*5113495bSYour Name 		goto err_psoc_create;
111*5113495bSYour Name 
112*5113495bSYour Name 	status = wlan_objmgr_register_psoc_destroy_handler(
113*5113495bSYour Name 			WLAN_UMAC_COMP_DCS,
114*5113495bSYour Name 			wlan_dcs_psoc_obj_destroy_notification,
115*5113495bSYour Name 			NULL);
116*5113495bSYour Name 
117*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
118*5113495bSYour Name 		goto err_psoc_delete;
119*5113495bSYour Name 
120*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
121*5113495bSYour Name 
122*5113495bSYour Name err_psoc_delete:
123*5113495bSYour Name 	wlan_objmgr_unregister_psoc_create_handler(
124*5113495bSYour Name 			WLAN_UMAC_COMP_DCS,
125*5113495bSYour Name 			wlan_dcs_psoc_obj_create_notification,
126*5113495bSYour Name 			NULL);
127*5113495bSYour Name err_psoc_create:
128*5113495bSYour Name 	return status;
129*5113495bSYour Name }
130*5113495bSYour Name 
wlan_dcs_deinit(void)131*5113495bSYour Name QDF_STATUS wlan_dcs_deinit(void)
132*5113495bSYour Name {
133*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
134*5113495bSYour Name 
135*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_create_handler(
136*5113495bSYour Name 			WLAN_UMAC_COMP_DCS,
137*5113495bSYour Name 			wlan_dcs_psoc_obj_create_notification,
138*5113495bSYour Name 			NULL);
139*5113495bSYour Name 
140*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
141*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
142*5113495bSYour Name 
143*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_destroy_handler(
144*5113495bSYour Name 			WLAN_UMAC_COMP_DCS,
145*5113495bSYour Name 			wlan_dcs_psoc_obj_destroy_notification,
146*5113495bSYour Name 			NULL);
147*5113495bSYour Name 
148*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
149*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
150*5113495bSYour Name 
151*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
152*5113495bSYour Name }
153*5113495bSYour Name 
wlan_dcs_enable(struct wlan_objmgr_psoc * psoc)154*5113495bSYour Name QDF_STATUS wlan_dcs_enable(struct wlan_objmgr_psoc *psoc)
155*5113495bSYour Name {
156*5113495bSYour Name 	return wlan_dcs_attach(psoc);
157*5113495bSYour Name }
158*5113495bSYour Name 
wlan_dcs_disable(struct wlan_objmgr_psoc * psoc)159*5113495bSYour Name QDF_STATUS wlan_dcs_disable(struct wlan_objmgr_psoc *psoc)
160*5113495bSYour Name {
161*5113495bSYour Name 	return wlan_dcs_detach(psoc);
162*5113495bSYour Name }
163*5113495bSYour Name 
wlan_dcs_psoc_open(struct wlan_objmgr_psoc * psoc)164*5113495bSYour Name QDF_STATUS wlan_dcs_psoc_open(struct wlan_objmgr_psoc *psoc)
165*5113495bSYour Name {
166*5113495bSYour Name 	struct dcs_psoc_priv_obj *dcs_psoc_obj;
167*5113495bSYour Name 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
168*5113495bSYour Name 	uint8_t loop;
169*5113495bSYour Name 
170*5113495bSYour Name 	if (!psoc) {
171*5113495bSYour Name 		dcs_err("psoc is NULL");
172*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
173*5113495bSYour Name 	}
174*5113495bSYour Name 
175*5113495bSYour Name 	dcs_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(
176*5113495bSYour Name 			psoc, WLAN_UMAC_COMP_DCS);
177*5113495bSYour Name 	if (!dcs_psoc_obj) {
178*5113495bSYour Name 		dcs_err("dcs psoc private object is NULL");
179*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
180*5113495bSYour Name 	}
181*5113495bSYour Name 
182*5113495bSYour Name 	for (loop = 0; loop < WLAN_DCS_MAX_PDEVS; loop++) {
183*5113495bSYour Name 		dcs_pdev_priv = &dcs_psoc_obj->dcs_pdev_priv[loop];
184*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.dcs_enable_cfg =
185*5113495bSYour Name 					cfg_get(psoc, CFG_DCS_ENABLE);
186*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.dcs_algorithm_process = false;
187*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.dcs_debug =
188*5113495bSYour Name 					cfg_get(psoc, CFG_DCS_DEBUG);
189*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.phy_err_penalty =
190*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_PHY_ERR_PENALTY);
191*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.phy_err_threshold =
192*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_PHY_ERR_THRESHOLD);
193*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.radar_err_threshold =
194*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_RADAR_ERR_THRESHOLD);
195*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.coch_intfr_threshold =
196*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_COCH_INTFR_THRESHOLD);
197*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.user_max_cu =
198*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_USER_MAX_CU);
199*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.intfr_detection_threshold =
200*5113495bSYour Name 			cfg_get(psoc, CFG_DCS_INTFR_DETECTION_THRESHOLD);
201*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.intfr_detection_window =
202*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_INTFR_DETECTION_WINDOW);
203*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.tx_err_threshold =
204*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_TX_ERR_THRESHOLD);
205*5113495bSYour Name 		dcs_pdev_priv->dcs_host_params.force_disable_algorithm =
206*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_DISABLE_ALGORITHM);
207*5113495bSYour Name 		dcs_pdev_priv->dcs_freq_ctrl_params.
208*5113495bSYour Name 					disable_threshold_per_5mins =
209*5113495bSYour Name 			cfg_get(psoc, CFG_DCS_DISABLE_THRESHOLD_PER_5MINS);
210*5113495bSYour Name 		dcs_pdev_priv->dcs_freq_ctrl_params.restart_delay =
211*5113495bSYour Name 				cfg_get(psoc, CFG_DCS_RESTART_DELAY);
212*5113495bSYour Name 
213*5113495bSYour Name 		qdf_timer_init(NULL, &dcs_pdev_priv->dcs_disable_timer,
214*5113495bSYour Name 			       wlan_dcs_disable_timer_fn,
215*5113495bSYour Name 			       &dcs_pdev_priv->dcs_timer_args,
216*5113495bSYour Name 			       QDF_TIMER_TYPE_WAKE_APPS);
217*5113495bSYour Name 	}
218*5113495bSYour Name 
219*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
220*5113495bSYour Name }
221