xref: /wlan-dirver/qca-wifi-host-cmn/umac/green_ap/dispatcher/src/wlan_green_ap_ucfg_api.c (revision 4865edfd190c086bbe2c69aae12a8226f877b91e)
1 /*
2  * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: This file contains green ap north bound interface definitions
21  */
22 
23 #include <qdf_status.h>
24 #include <wlan_green_ap_ucfg_api.h>
25 #include <../../core/src/wlan_green_ap_main_i.h>
26 
27 QDF_STATUS ucfg_green_ap_update_user_config(
28 			struct wlan_objmgr_pdev *pdev,
29 			struct green_ap_user_cfg *green_ap_cfg)
30 {
31 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
32 	struct wlan_green_ap_egap_params *egap_params;
33 
34 	if (!pdev) {
35 		green_ap_err("pdev context passed is NULL");
36 		return QDF_STATUS_E_INVAL;
37 	}
38 
39 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
40 			pdev, WLAN_UMAC_COMP_GREEN_AP);
41 	if (!green_ap_ctx) {
42 		green_ap_err("green ap context obtained is NULL");
43 		return QDF_STATUS_E_FAILURE;
44 	}
45 
46 	qdf_spin_lock_bh(&green_ap_ctx->lock);
47 	egap_params = &green_ap_ctx->egap_params;
48 
49 	egap_params->host_enable_egap = green_ap_cfg->host_enable_egap;
50 	egap_params->egap_inactivity_time = green_ap_cfg->egap_inactivity_time;
51 	egap_params->egap_wait_time = green_ap_cfg->egap_wait_time;
52 	egap_params->egap_feature_flags = green_ap_cfg->egap_feature_flags;
53 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
54 
55 	return QDF_STATUS_SUCCESS;
56 }
57 
58 QDF_STATUS ucfg_green_ap_enable_egap(struct wlan_objmgr_pdev *pdev)
59 {
60 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
61 	struct wlan_lmac_if_green_ap_tx_ops *green_ap_tx_ops;
62 
63 	if (!pdev) {
64 		green_ap_err("pdev context passed is NULL");
65 		return QDF_STATUS_E_INVAL;
66 	}
67 
68 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
69 			pdev, WLAN_UMAC_COMP_GREEN_AP);
70 	if (!green_ap_ctx) {
71 		green_ap_err("green ap context obtained is NULL");
72 		return QDF_STATUS_E_FAILURE;
73 	}
74 
75 	green_ap_tx_ops = wlan_psoc_get_green_ap_tx_ops(green_ap_ctx);
76 	if (!green_ap_tx_ops) {
77 		green_ap_err("green ap tx ops obtained are NULL");
78 		return  QDF_STATUS_E_FAILURE;
79 	}
80 
81 	if (!green_ap_tx_ops->enable_egap) {
82 		green_ap_err("tx op for sending enbale/disable green ap is NULL");
83 		return QDF_STATUS_E_FAILURE;
84 	}
85 
86 	return green_ap_tx_ops->enable_egap(pdev, &green_ap_ctx->egap_params);
87 }
88 
89 QDF_STATUS ucfg_green_ap_set_ps_config(struct wlan_objmgr_pdev *pdev,
90 				       uint8_t value)
91 {
92 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
93 
94 	if (!pdev) {
95 		green_ap_err("pdev context passed is NULL");
96 		return QDF_STATUS_E_INVAL;
97 	}
98 
99 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
100 			pdev, WLAN_UMAC_COMP_GREEN_AP);
101 	if (!green_ap_ctx) {
102 		green_ap_err("green ap context obtained is NULL");
103 		return QDF_STATUS_E_FAILURE;
104 	}
105 
106 	qdf_spin_lock_bh(&green_ap_ctx->lock);
107 	if (wlan_is_egap_enabled(green_ap_ctx)) {
108 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
109 		return QDF_STATUS_SUCCESS;
110 	}
111 
112 	green_ap_ctx->ps_enable = value;
113 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
114 
115 	return QDF_STATUS_SUCCESS;
116 }
117 
118 QDF_STATUS ucfg_green_ap_get_ps_config(struct wlan_objmgr_pdev *pdev,
119 				       uint8_t *ps_enable)
120 {
121 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
122 
123 	if (!pdev) {
124 		green_ap_err("pdev context passed is NULL");
125 		return QDF_STATUS_E_INVAL;
126 	}
127 
128 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
129 				pdev, WLAN_UMAC_COMP_GREEN_AP);
130 
131 	if (!green_ap_ctx) {
132 		green_ap_err("green ap context obtained is NULL");
133 		return QDF_STATUS_E_FAILURE;
134 	}
135 
136 	qdf_spin_lock_bh(&green_ap_ctx->lock);
137 	if (wlan_is_egap_enabled(green_ap_ctx)) {
138 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
139 		return QDF_STATUS_SUCCESS;
140 	}
141 
142 	*ps_enable = green_ap_ctx->ps_enable;
143 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
144 
145 	return QDF_STATUS_SUCCESS;
146 }
147 
148 QDF_STATUS ucfg_green_ap_set_transition_time(struct wlan_objmgr_pdev *pdev,
149 					     uint32_t val)
150 {
151 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
152 
153 	if (!pdev) {
154 		green_ap_err("pdev context passed is NULL");
155 		return QDF_STATUS_E_INVAL;
156 	}
157 
158 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
159 			pdev, WLAN_UMAC_COMP_GREEN_AP);
160 
161 	if (!green_ap_ctx) {
162 		green_ap_err("green ap context obtained is NULL");
163 		return QDF_STATUS_E_FAILURE;
164 	}
165 
166 	qdf_spin_lock_bh(&green_ap_ctx->lock);
167 	if (wlan_is_egap_enabled(green_ap_ctx)) {
168 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
169 		return QDF_STATUS_SUCCESS;
170 	}
171 
172 	green_ap_ctx->ps_trans_time = val;
173 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
174 
175 	return QDF_STATUS_SUCCESS;
176 }
177 
178 QDF_STATUS ucfg_green_ap_get_transition_time(struct wlan_objmgr_pdev *pdev,
179 					     uint32_t *ps_trans_time)
180 {
181 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
182 
183 	if (!pdev) {
184 		green_ap_err("pdev context passed is NULL");
185 		return QDF_STATUS_E_INVAL;
186 	}
187 
188 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
189 			pdev, WLAN_UMAC_COMP_GREEN_AP);
190 
191 	if (!green_ap_ctx) {
192 		green_ap_err("green ap context obtained is NULL");
193 		return QDF_STATUS_E_FAILURE;
194 	}
195 
196 	qdf_spin_lock_bh(&green_ap_ctx->lock);
197 	if (wlan_is_egap_enabled(green_ap_ctx)) {
198 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
199 		return QDF_STATUS_SUCCESS;
200 	}
201 
202 	*ps_trans_time = green_ap_ctx->ps_trans_time;
203 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
204 
205 	return QDF_STATUS_SUCCESS;
206 }
207 
208 QDF_STATUS ucfg_green_ap_config(struct wlan_objmgr_pdev *pdev, uint8_t val)
209 {
210 
211 	uint8_t flag;
212 
213 	if (wlan_green_ap_get_capab(pdev) == QDF_STATUS_E_NOSUPPORT) {
214 		green_ap_err("GreenAP not supported on radio\n");
215 		return QDF_STATUS_E_NOSUPPORT;
216 	}
217 
218 	if (val) {
219 		struct wlan_pdev_green_ap_ctx *green_ap_ctx;
220 
221 		wlan_objmgr_pdev_iterate_obj_list(pdev,
222 					WLAN_VDEV_OP,
223 					wlan_green_ap_check_mode,
224 					&flag, 0, WLAN_GREEN_AP_ID);
225 		if (flag == 1) {
226 			green_ap_err("Radio not in AP mode."
227 					"Feature not supported");
228 			return QDF_STATUS_E_NOSUPPORT;
229 		}
230 
231 		green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(pdev,
232 					WLAN_UMAC_COMP_GREEN_AP);
233 
234 		if (!green_ap_ctx) {
235 			green_ap_err("green ap context obtained is NULL");
236 			return QDF_STATUS_E_NOSUPPORT;
237 		}
238 
239 		ucfg_green_ap_set_ps_config(pdev, val);
240 
241 		if (wlan_util_is_vap_active(pdev, WLAN_GREEN_AP_ID) ==
242 					    QDF_STATUS_SUCCESS)
243 			wlan_green_ap_start(pdev);
244 	} else {
245 		wlan_green_ap_stop(pdev);
246 	}
247 
248 	return QDF_STATUS_SUCCESS;
249 }
250 
251 void ucfg_green_ap_enable_debug_prints(struct wlan_objmgr_pdev *pdev,
252 				uint32_t val)
253 {
254 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
255 
256 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
257 			pdev, WLAN_UMAC_COMP_GREEN_AP);
258 
259 	if (!green_ap_ctx) {
260 		green_ap_err("green ap context obtained is NULL");
261 		return;
262 	}
263 
264 	green_ap_ctx->dbg_enable = val;
265 }
266 
267 bool ucfg_green_ap_get_debug_prints(struct wlan_objmgr_pdev *pdev)
268 {
269 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
270 
271 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
272 			pdev, WLAN_UMAC_COMP_GREEN_AP);
273 
274 	if (!green_ap_ctx) {
275 		green_ap_err("green ap context obtained is NULL");
276 		return false;
277 	}
278 
279 	return green_ap_ctx->dbg_enable;
280 }
281 
282