xref: /wlan-dirver/qca-wifi-host-cmn/umac/green_ap/dispatcher/src/wlan_green_ap_ucfg_api.c (revision 27d564647e9b50e713c60b0d7e5ea2a9b0a3ae74)
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_enable_egap(struct wlan_objmgr_pdev *pdev)
28 {
29 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
30 	struct wlan_lmac_if_green_ap_tx_ops *green_ap_tx_ops;
31 
32 	if (!pdev) {
33 		green_ap_err("pdev context passed is NULL");
34 		return QDF_STATUS_E_INVAL;
35 	}
36 
37 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
38 			pdev, WLAN_UMAC_COMP_GREEN_AP);
39 	if (!green_ap_ctx) {
40 		green_ap_err("green ap context obtained is NULL");
41 		return QDF_STATUS_E_FAILURE;
42 	}
43 
44 	green_ap_tx_ops = wlan_psoc_get_green_ap_tx_ops(green_ap_ctx);
45 	if (!green_ap_tx_ops) {
46 		green_ap_err("green ap tx ops obtained are NULL");
47 		return  QDF_STATUS_E_FAILURE;
48 	}
49 
50 	if (!green_ap_tx_ops->enable_egap) {
51 		green_ap_err("tx op for sending enbale/disable green ap is NULL");
52 		return QDF_STATUS_E_FAILURE;
53 	}
54 
55 	return green_ap_tx_ops->enable_egap(pdev, &green_ap_ctx->egap_params);
56 }
57 
58 QDF_STATUS ucfg_green_ap_set_ps_config(struct wlan_objmgr_pdev *pdev,
59 				       uint8_t value)
60 {
61 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
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 	qdf_spin_lock_bh(&green_ap_ctx->lock);
76 	if (wlan_is_egap_enabled(green_ap_ctx)) {
77 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
78 		return QDF_STATUS_SUCCESS;
79 	}
80 
81 	green_ap_ctx->ps_enable = value;
82 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
83 
84 	return QDF_STATUS_SUCCESS;
85 }
86 
87 QDF_STATUS ucfg_green_ap_get_ps_config(struct wlan_objmgr_pdev *pdev,
88 				       uint8_t *ps_enable)
89 {
90 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
91 
92 	if (!pdev) {
93 		green_ap_err("pdev context passed is NULL");
94 		return QDF_STATUS_E_INVAL;
95 	}
96 
97 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
98 				pdev, WLAN_UMAC_COMP_GREEN_AP);
99 
100 	if (!green_ap_ctx) {
101 		green_ap_err("green ap context obtained is NULL");
102 		return QDF_STATUS_E_FAILURE;
103 	}
104 
105 	qdf_spin_lock_bh(&green_ap_ctx->lock);
106 	if (wlan_is_egap_enabled(green_ap_ctx)) {
107 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
108 		return QDF_STATUS_SUCCESS;
109 	}
110 
111 	*ps_enable = green_ap_ctx->ps_enable;
112 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
113 
114 	return QDF_STATUS_SUCCESS;
115 }
116 
117 QDF_STATUS ucfg_green_ap_set_transition_time(struct wlan_objmgr_pdev *pdev,
118 					     uint32_t val)
119 {
120 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
121 
122 	if (!pdev) {
123 		green_ap_err("pdev context passed is NULL");
124 		return QDF_STATUS_E_INVAL;
125 	}
126 
127 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
128 			pdev, WLAN_UMAC_COMP_GREEN_AP);
129 
130 	if (!green_ap_ctx) {
131 		green_ap_err("green ap context obtained is NULL");
132 		return QDF_STATUS_E_FAILURE;
133 	}
134 
135 	qdf_spin_lock_bh(&green_ap_ctx->lock);
136 	if (wlan_is_egap_enabled(green_ap_ctx)) {
137 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
138 		return QDF_STATUS_SUCCESS;
139 	}
140 
141 	green_ap_ctx->ps_trans_time = val;
142 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
143 
144 	return QDF_STATUS_SUCCESS;
145 }
146 
147 QDF_STATUS ucfg_green_ap_get_transition_time(struct wlan_objmgr_pdev *pdev,
148 					     uint32_t *ps_trans_time)
149 {
150 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
151 
152 	if (!pdev) {
153 		green_ap_err("pdev context passed is NULL");
154 		return QDF_STATUS_E_INVAL;
155 	}
156 
157 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
158 			pdev, WLAN_UMAC_COMP_GREEN_AP);
159 
160 	if (!green_ap_ctx) {
161 		green_ap_err("green ap context obtained is NULL");
162 		return QDF_STATUS_E_FAILURE;
163 	}
164 
165 	qdf_spin_lock_bh(&green_ap_ctx->lock);
166 	if (wlan_is_egap_enabled(green_ap_ctx)) {
167 		qdf_spin_unlock_bh(&green_ap_ctx->lock);
168 		return QDF_STATUS_SUCCESS;
169 	}
170 
171 	*ps_trans_time = green_ap_ctx->ps_trans_time;
172 	qdf_spin_unlock_bh(&green_ap_ctx->lock);
173 
174 	return QDF_STATUS_SUCCESS;
175 }
176 
177 QDF_STATUS ucfg_green_ap_config(struct wlan_objmgr_pdev *pdev, uint8_t val)
178 {
179 
180 	uint8_t flag;
181 
182 	if (wlan_green_ap_get_capab(pdev) == QDF_STATUS_E_NOSUPPORT) {
183 		green_ap_err("GreenAP not supported on radio\n");
184 		return QDF_STATUS_E_NOSUPPORT;
185 	}
186 
187 	if (val) {
188 		struct wlan_pdev_green_ap_ctx *green_ap_ctx;
189 
190 		wlan_objmgr_pdev_iterate_obj_list(pdev,
191 					WLAN_VDEV_OP,
192 					wlan_green_ap_check_mode,
193 					&flag, 0, WLAN_GREEN_AP_ID);
194 		if (flag == 1) {
195 			green_ap_err("Radio not in AP mode."
196 					"Feature not supported");
197 			return QDF_STATUS_E_NOSUPPORT;
198 		}
199 
200 		green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(pdev,
201 					WLAN_UMAC_COMP_GREEN_AP);
202 
203 		if (!green_ap_ctx) {
204 			green_ap_err("green ap context obtained is NULL");
205 			return QDF_STATUS_E_NOSUPPORT;
206 		}
207 
208 		ucfg_green_ap_set_ps_config(pdev, val);
209 
210 		if (wlan_util_is_vdev_active(pdev, WLAN_GREEN_AP_ID) ==
211 					    QDF_STATUS_SUCCESS)
212 			wlan_green_ap_start(pdev);
213 	} else {
214 		wlan_green_ap_stop(pdev);
215 	}
216 
217 	return QDF_STATUS_SUCCESS;
218 }
219 
220 void ucfg_green_ap_enable_debug_prints(struct wlan_objmgr_pdev *pdev,
221 				uint32_t val)
222 {
223 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
224 
225 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
226 			pdev, WLAN_UMAC_COMP_GREEN_AP);
227 
228 	if (!green_ap_ctx) {
229 		green_ap_err("green ap context obtained is NULL");
230 		return;
231 	}
232 
233 	green_ap_ctx->dbg_enable = val;
234 }
235 
236 bool ucfg_green_ap_get_debug_prints(struct wlan_objmgr_pdev *pdev)
237 {
238 	struct wlan_pdev_green_ap_ctx *green_ap_ctx;
239 
240 	green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(
241 			pdev, WLAN_UMAC_COMP_GREEN_AP);
242 
243 	if (!green_ap_ctx) {
244 		green_ap_err("green ap context obtained is NULL");
245 		return false;
246 	}
247 
248 	return green_ap_ctx->dbg_enable;
249 }
250 
251