xref: /wlan-dirver/qca-wifi-host-cmn/umac/green_ap/dispatcher/src/wlan_green_ap_ucfg_api.c (revision 3149adf58a329e17232a4c0e58d460d025edd55a)
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 		wlan_objmgr_pdev_iterate_obj_list(pdev,
221 					WLAN_VDEV_OP,
222 					wlan_green_ap_check_mode,
223 					&flag, 0, WLAN_OBJMGR_ID);
224 		if (flag == 1) {
225 			green_ap_err("Radio not in AP mode."
226 					"Feature not supported");
227 			return QDF_STATUS_E_NOSUPPORT;
228 		}
229 
230 		green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(pdev,
231 					WLAN_UMAC_COMP_GREEN_AP);
232 
233 		if (!green_ap_ctx) {
234 			green_ap_err("green ap context obtained is NULL");
235 			return QDF_STATUS_E_NOSUPPORT;
236 		}
237 
238 		ucfg_green_ap_set_ps_config(pdev, val);
239 
240 		if (wlan_util_is_vap_active(pdev) == QDF_STATUS_SUCCESS)
241 			wlan_green_ap_start(pdev);
242 	} else {
243 		wlan_green_ap_stop(pdev);
244 	}
245 
246 	return QDF_STATUS_SUCCESS;
247 }
248 
249 void ucfg_green_ap_enable_debug_prints(struct wlan_objmgr_pdev *pdev,
250 				uint32_t val)
251 {
252 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
253 
254 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
255 			pdev, WLAN_UMAC_COMP_GREEN_AP);
256 
257 	if (!green_ap_ctx) {
258 		green_ap_err("green ap context obtained is NULL");
259 		return;
260 	}
261 
262 	green_ap_ctx->dbg_enable = val;
263 }
264 
265 bool ucfg_green_ap_get_debug_prints(struct wlan_objmgr_pdev *pdev)
266 {
267 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
268 
269 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
270 			pdev, WLAN_UMAC_COMP_GREEN_AP);
271 
272 	if (!green_ap_ctx) {
273 		green_ap_err("green ap context obtained is NULL");
274 		return false;
275 	}
276 
277 	return green_ap_ctx->dbg_enable;
278 }
279 
280