xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_utils_api.c (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
1 /*
2  * Copyright (c) 2019 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: wlan_vdev_mgr_utils_api.c
21  *
22  * This file provide definition for APIs to enable Tx Ops and Rx Ops registered
23  * through LMAC
24  */
25 #include <wlan_vdev_mgr_utils_api.h>
26 #include <wlan_vdev_mgr_tgt_if_tx_api.h>
27 #include <cdp_txrx_cmn_struct.h>
28 #include <wlan_mlme_dbg.h>
29 
30 enum wlan_op_mode
31 wlan_util_vdev_get_cdp_txrx_opmode(struct wlan_objmgr_vdev *vdev)
32 {
33 	enum QDF_OPMODE qdf_opmode;
34 	enum wlan_op_mode cdp_txrx_opmode;
35 
36 	qdf_opmode = wlan_vdev_mlme_get_opmode(vdev);
37 	switch (qdf_opmode) {
38 	case QDF_STA_MODE:
39 		cdp_txrx_opmode = wlan_op_mode_sta;
40 		break;
41 	case QDF_SAP_MODE:
42 		cdp_txrx_opmode = wlan_op_mode_ap;
43 		break;
44 	case QDF_MONITOR_MODE:
45 		cdp_txrx_opmode = wlan_op_mode_monitor;
46 		break;
47 	default:
48 		cdp_txrx_opmode = wlan_op_mode_unknown;
49 	};
50 
51 	return cdp_txrx_opmode;
52 }
53 
54 QDF_STATUS
55 wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme,
56 			      enum wlan_mlme_cfg_id param_id,
57 			      struct wlan_vdev_mgr_cfg mlme_cfg)
58 {
59 	struct wlan_objmgr_vdev *vdev;
60 	struct vdev_mlme_proto *mlme_proto;
61 	struct vdev_mlme_mgmt *mlme_mgmt;
62 	struct vdev_mlme_inactivity_params *inactivity_params;
63 	int is_wmi_cmd = 0;
64 	int ret = QDF_STATUS_SUCCESS;
65 	struct vdev_set_params param = {0};
66 
67 	if (!vdev_mlme) {
68 		mlme_err("VDEV MLME is NULL");
69 		return QDF_STATUS_E_FAILURE;
70 	}
71 	vdev = vdev_mlme->vdev;
72 	mlme_proto = &vdev_mlme->proto;
73 	mlme_mgmt = &vdev_mlme->mgmt;
74 	inactivity_params = &mlme_mgmt->inactivity_params;
75 
76 	switch (param_id) {
77 	case WLAN_MLME_CFG_DTIM_PERIOD:
78 		mlme_proto->generic.dtim_period = mlme_cfg.value;
79 		is_wmi_cmd = 1;
80 		break;
81 	case WLAN_MLME_CFG_SLOT_TIME:
82 		mlme_proto->generic.slot_time = mlme_cfg.value;
83 		is_wmi_cmd = 1;
84 		break;
85 	case WLAN_MLME_CFG_PROTECTION_MODE:
86 		mlme_proto->generic.protection_mode = mlme_cfg.value;
87 		is_wmi_cmd = 1;
88 		break;
89 	case WLAN_MLME_CFG_BEACON_INTERVAL:
90 		mlme_proto->generic.beacon_interval = mlme_cfg.value;
91 		is_wmi_cmd = 1;
92 		break;
93 	case WLAN_MLME_CFG_LDPC:
94 		mlme_proto->generic.ldpc = mlme_cfg.value;
95 		is_wmi_cmd = 1;
96 		break;
97 	case WLAN_MLME_CFG_NSS:
98 		mlme_proto->generic.nss = mlme_cfg.value;
99 		is_wmi_cmd = 1;
100 		break;
101 	case WLAN_MLME_CFG_TSF_ADJUST:
102 		mlme_proto->generic.tsfadjust = mlme_cfg.tsf;
103 		break;
104 	case WLAN_MLME_CFG_ASSOC_ID:
105 		mlme_proto->sta.assoc_id = mlme_cfg.value;
106 		break;
107 	case WLAN_MLME_CFG_VHT_CAPS:
108 		mlme_proto->vht_info.caps = mlme_cfg.value;
109 		break;
110 	case WLAN_MLME_CFG_SUBFER:
111 		mlme_proto->vht_info.subfer = mlme_cfg.value;
112 		break;
113 	case WLAN_MLME_CFG_MUBFER:
114 		mlme_proto->vht_info.mubfer = mlme_cfg.value;
115 		break;
116 	case WLAN_MLME_CFG_SUBFEE:
117 		mlme_proto->vht_info.subfee = mlme_cfg.value;
118 		break;
119 	case WLAN_MLME_CFG_MUBFEE:
120 		mlme_proto->vht_info.mubfee = mlme_cfg.value;
121 		break;
122 	case WLAN_MLME_CFG_IMLICIT_BF:
123 		mlme_proto->vht_info.implicit_bf = mlme_cfg.value;
124 		break;
125 	case WLAN_MLME_CFG_SOUNDING_DIM:
126 		mlme_proto->vht_info.sounding_dimension = mlme_cfg.value;
127 		break;
128 	case WLAN_MLME_CFG_TXBF_CAPS:
129 		is_wmi_cmd = 1;
130 		break;
131 	case WLAN_MLME_CFG_HT_CAPS:
132 		mlme_proto->ht_info.ht_caps = mlme_cfg.value;
133 		break;
134 	case WLAN_MLME_CFG_HE_OPS:
135 		mlme_proto->he_ops_info.he_ops = mlme_cfg.value;
136 		is_wmi_cmd = 1;
137 		break;
138 	case WLAN_MLME_CFG_RTS_THRESHOLD:
139 		mlme_mgmt->generic.rts_threshold = mlme_cfg.value;
140 		is_wmi_cmd = 1;
141 		break;
142 	case WLAN_MLME_CFG_FRAG_THRESHOLD:
143 		mlme_mgmt->generic.frag_threshold = mlme_cfg.value;
144 		is_wmi_cmd = 1;
145 		break;
146 	case WLAN_MLME_CFG_PROBE_DELAY:
147 		mlme_mgmt->generic.probe_delay = mlme_cfg.value;
148 		break;
149 	case WLAN_MLME_CFG_REPEAT_PROBE_TIME:
150 		mlme_mgmt->generic.repeat_probe_time = mlme_cfg.value;
151 		break;
152 	case WLAN_MLME_CFG_DROP_UNENCRY:
153 		mlme_mgmt->generic.drop_unencry = mlme_cfg.value;
154 		is_wmi_cmd = 1;
155 		break;
156 	case WLAN_MLME_CFG_TX_PWR_LIMIT:
157 		mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.value;
158 		break;
159 	case WLAN_MLME_CFG_TX_POWER:
160 		mlme_mgmt->generic.tx_power = mlme_cfg.value;
161 		is_wmi_cmd = 1;
162 		break;
163 	case WLAN_MLME_CFG_AMPDU:
164 		mlme_mgmt->generic.ampdu = mlme_cfg.value;
165 		mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF;
166 		is_wmi_cmd = 1;
167 		break;
168 	case WLAN_MLME_CFG_AMSDU:
169 		mlme_mgmt->generic.amsdu = mlme_cfg.value;
170 		mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF;
171 		is_wmi_cmd = 1;
172 		break;
173 	case WLAN_MLME_CFG_BMISS_FIRST_BCNT:
174 		inactivity_params->bmiss_first_bcnt = mlme_cfg.value;
175 		break;
176 	case WLAN_MLME_CFG_BMISS_FINAL_BCNT:
177 		inactivity_params->bmiss_final_bcnt = mlme_cfg.value;
178 		break;
179 	case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME:
180 		inactivity_params->keepalive_min_idle_inactive_time_secs =
181 							mlme_cfg.value;
182 		is_wmi_cmd = 1;
183 		break;
184 	case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME:
185 		inactivity_params->keepalive_max_idle_inactive_time_secs =
186 							mlme_cfg.value;
187 		is_wmi_cmd = 1;
188 		break;
189 	case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME:
190 		inactivity_params->keepalive_max_unresponsive_time_secs =
191 							mlme_cfg.value;
192 		is_wmi_cmd = 1;
193 		break;
194 	case WLAN_MLME_CFG_RATE_FLAGS:
195 		mlme_mgmt->rate_info.rate_flags = mlme_cfg.value;
196 		break;
197 	case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE:
198 		mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.value;
199 		break;
200 	case WLAN_MLME_CFG_MAX_RATE:
201 		mlme_mgmt->rate_info.max_rate = mlme_cfg.value;
202 		break;
203 	case WLAN_MLME_CFG_TX_MGMT_RATE:
204 		mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.value;
205 		break;
206 	case WLAN_MLME_CFG_TX_CHAINMASK:
207 		mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.value;
208 		break;
209 	case WLAN_MLME_CFG_RX_CHAINMASK:
210 		mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.value;
211 		break;
212 	case WLAN_MLME_CFG_PKT_POWERSAVE:
213 		mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.value;
214 		break;
215 	case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM:
216 		mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.value;
217 		break;
218 	case WLAN_MLME_CFG_DYNDTIM_CNT:
219 		mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.value;
220 		break;
221 	case WLAN_MLME_CFG_LISTEN_INTERVAL:
222 		mlme_mgmt->powersave_info.listen_interval = mlme_cfg.value;
223 		break;
224 	case WLAN_MLME_CFG_MODDTIM_CNT:
225 		mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.value;
226 		break;
227 	case WLAN_MLME_CFG_PROILE_IDX:
228 		mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.value;
229 		break;
230 	case WLAN_MLME_CFG_PROFILE_NUM:
231 		mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.value;
232 		break;
233 	case WLAN_MLME_CFG_MBSSID_FLAGS:
234 		mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.value;
235 		break;
236 	case WLAN_MLME_CFG_VDEVID_TRANS:
237 		mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.value;
238 		break;
239 	case WLAN_MLME_CFG_SSID:
240 		if (mlme_cfg.ssid_cfg.length <= WLAN_SSID_MAX_LEN) {
241 			qdf_mem_copy(mlme_mgmt->generic.ssid,
242 				     mlme_cfg.ssid_cfg.mac_ssid,
243 				     mlme_cfg.ssid_cfg.length);
244 			mlme_mgmt->generic.ssid_len =
245 						mlme_cfg.ssid_cfg.length;
246 		} else {
247 			mlme_mgmt->generic.ssid_len = 0;
248 		}
249 
250 		break;
251 	case WLAN_MLME_CFG_TRANS_BSSID:
252 		qdf_mem_copy(mlme_mgmt->mbss_11ax.trans_bssid,
253 			     mlme_cfg.trans_bssid, QDF_MAC_ADDR_SIZE);
254 		break;
255 	case WLAN_MLME_CFG_TYPE:
256 		mlme_mgmt->generic.type = mlme_cfg.value;
257 		break;
258 	case WLAN_MLME_CFG_SUBTYPE:
259 		mlme_mgmt->generic.subtype = mlme_cfg.value;
260 		break;
261 	case WLAN_MLME_CFG_UAPSD:
262 		mlme_proto->sta.uapsd_cfg = mlme_cfg.value;
263 		break;
264 	case WLAN_MLME_CFG_TX_DECAP_TYPE:
265 		mlme_mgmt->generic.tx_decap_type = mlme_cfg.value;
266 		break;
267 	case WLAN_MLME_CFG_RX_DECAP_TYPE:
268 		mlme_mgmt->generic.rx_decap_type = mlme_cfg.value;
269 		break;
270 	case WLAN_MLME_CFG_RATEMASK_TYPE:
271 		mlme_mgmt->rate_info.type = mlme_cfg.value;
272 		break;
273 	case WLAN_MLME_CFG_RATEMASK_LOWER32:
274 		mlme_mgmt->rate_info.lower32 = mlme_cfg.value;
275 		break;
276 	case WLAN_MLME_CFG_RATEMASK_HIGHER32:
277 		mlme_mgmt->rate_info.higher32 = mlme_cfg.value;
278 		break;
279 	case WLAN_MLME_CFG_RATEMASK_LOWER32_2:
280 		mlme_mgmt->rate_info.lower32_2 = mlme_cfg.value;
281 		break;
282 	case WLAN_MLME_CFG_BCN_TX_RATE:
283 		mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.value;
284 		break;
285 	default:
286 		break;
287 	}
288 
289 	if (is_wmi_cmd) {
290 		param.param_id = param_id;
291 		param.vdev_id = wlan_vdev_get_id(vdev);
292 		param.param_value = mlme_cfg.value;
293 		ret = tgt_vdev_mgr_set_param_send(vdev_mlme, &param);
294 	}
295 
296 	return ret;
297 }
298 
299 qdf_export_symbol(wlan_util_vdev_mlme_set_param);
300 
301 void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme,
302 				   enum wlan_mlme_cfg_id param_id,
303 				   uint32_t *value)
304 {
305 	struct vdev_mlme_proto *mlme_proto;
306 	struct vdev_mlme_mgmt *mlme_mgmt;
307 	struct vdev_mlme_inactivity_params *inactivity_params;
308 
309 	if (!vdev_mlme) {
310 		mlme_err("VDEV MLME is NULL");
311 		return;
312 	}
313 	mlme_proto = &vdev_mlme->proto;
314 	mlme_mgmt = &vdev_mlme->mgmt;
315 	inactivity_params = &mlme_mgmt->inactivity_params;
316 
317 	switch (param_id) {
318 	case WLAN_MLME_CFG_DTIM_PERIOD:
319 		*value = mlme_proto->generic.dtim_period;
320 		break;
321 	case WLAN_MLME_CFG_SLOT_TIME:
322 		*value = mlme_proto->generic.slot_time;
323 		break;
324 	case WLAN_MLME_CFG_PROTECTION_MODE:
325 		*value = mlme_proto->generic.protection_mode;
326 		break;
327 	case WLAN_MLME_CFG_BEACON_INTERVAL:
328 		*value = mlme_proto->generic.beacon_interval;
329 		break;
330 	case WLAN_MLME_CFG_LDPC:
331 		*value = mlme_proto->generic.ldpc;
332 		break;
333 	case WLAN_MLME_CFG_NSS:
334 		*value = mlme_proto->generic.nss;
335 		break;
336 	case WLAN_MLME_CFG_ASSOC_ID:
337 		*value = mlme_proto->sta.assoc_id;
338 		break;
339 	case WLAN_MLME_CFG_VHT_CAPS:
340 		*value = mlme_proto->vht_info.caps;
341 		break;
342 	case WLAN_MLME_CFG_SUBFER:
343 		*value = mlme_proto->vht_info.subfer;
344 		break;
345 	case WLAN_MLME_CFG_MUBFER:
346 		*value = mlme_proto->vht_info.mubfer;
347 		break;
348 	case WLAN_MLME_CFG_SUBFEE:
349 		*value = mlme_proto->vht_info.subfee;
350 		break;
351 	case WLAN_MLME_CFG_MUBFEE:
352 		*value = mlme_proto->vht_info.mubfee;
353 		break;
354 	case WLAN_MLME_CFG_IMLICIT_BF:
355 		*value = mlme_proto->vht_info.implicit_bf;
356 		break;
357 	case WLAN_MLME_CFG_SOUNDING_DIM:
358 		*value = mlme_proto->vht_info.sounding_dimension;
359 		break;
360 	case WLAN_MLME_CFG_HT_CAPS:
361 		*value = mlme_proto->ht_info.ht_caps;
362 		break;
363 	case WLAN_MLME_CFG_HE_OPS:
364 		*value = mlme_proto->he_ops_info.he_ops;
365 		break;
366 	case WLAN_MLME_CFG_RTS_THRESHOLD:
367 		*value = mlme_mgmt->generic.rts_threshold;
368 		break;
369 	case WLAN_MLME_CFG_FRAG_THRESHOLD:
370 		*value = mlme_mgmt->generic.frag_threshold;
371 		break;
372 	case WLAN_MLME_CFG_PROBE_DELAY:
373 		*value = mlme_mgmt->generic.probe_delay;
374 		break;
375 	case WLAN_MLME_CFG_REPEAT_PROBE_TIME:
376 		*value = mlme_mgmt->generic.repeat_probe_time;
377 		break;
378 	case WLAN_MLME_CFG_DROP_UNENCRY:
379 		*value = mlme_mgmt->generic.drop_unencry;
380 		break;
381 	case WLAN_MLME_CFG_TX_PWR_LIMIT:
382 		*value = mlme_mgmt->generic.tx_pwrlimit;
383 		break;
384 	case WLAN_MLME_CFG_TX_POWER:
385 		*value = mlme_mgmt->generic.tx_power;
386 		break;
387 	case WLAN_MLME_CFG_AMPDU:
388 		*value = mlme_mgmt->generic.ampdu;
389 		break;
390 	case WLAN_MLME_CFG_AMSDU:
391 		*value = mlme_mgmt->generic.amsdu;
392 		break;
393 	case WLAN_MLME_CFG_SSID_LEN:
394 		*value = mlme_mgmt->generic.ssid_len;
395 		break;
396 	case WLAN_MLME_CFG_BMISS_FIRST_BCNT:
397 		*value = inactivity_params->bmiss_first_bcnt;
398 		break;
399 	case WLAN_MLME_CFG_BMISS_FINAL_BCNT:
400 		*value = inactivity_params->bmiss_final_bcnt;
401 		break;
402 	case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME:
403 		*value =
404 		      inactivity_params->keepalive_min_idle_inactive_time_secs;
405 		break;
406 	case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME:
407 		*value =
408 		      inactivity_params->keepalive_max_idle_inactive_time_secs;
409 		break;
410 	case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME:
411 		*value =
412 		      inactivity_params->keepalive_max_unresponsive_time_secs;
413 		break;
414 	case WLAN_MLME_CFG_RATE_FLAGS:
415 		*value = mlme_mgmt->rate_info.rate_flags;
416 		break;
417 	case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE:
418 		*value = mlme_mgmt->rate_info.per_band_tx_mgmt_rate;
419 		break;
420 	case WLAN_MLME_CFG_MAX_RATE:
421 		*value = mlme_mgmt->rate_info.max_rate;
422 		break;
423 	case WLAN_MLME_CFG_TX_MGMT_RATE:
424 		*value = mlme_mgmt->rate_info.tx_mgmt_rate;
425 		break;
426 	case WLAN_MLME_CFG_TX_CHAINMASK:
427 		*value = mlme_mgmt->chainmask_info.tx_chainmask;
428 		break;
429 	case WLAN_MLME_CFG_RX_CHAINMASK:
430 		*value = mlme_mgmt->chainmask_info.rx_chainmask;
431 		break;
432 	case WLAN_MLME_CFG_PKT_POWERSAVE:
433 		*value = mlme_mgmt->powersave_info.packet_powersave;
434 		break;
435 	case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM:
436 		*value = mlme_mgmt->powersave_info.max_li_of_moddtim;
437 		break;
438 	case WLAN_MLME_CFG_DYNDTIM_CNT:
439 		*value = mlme_mgmt->powersave_info.dyndtim_cnt;
440 		break;
441 	case WLAN_MLME_CFG_LISTEN_INTERVAL:
442 		*value = mlme_mgmt->powersave_info.listen_interval;
443 		break;
444 	case WLAN_MLME_CFG_MODDTIM_CNT:
445 		*value = mlme_mgmt->powersave_info.moddtim_cnt;
446 		break;
447 	case WLAN_MLME_CFG_PROILE_IDX:
448 		*value = mlme_mgmt->mbss_11ax.profile_idx;
449 		break;
450 	case WLAN_MLME_CFG_PROFILE_NUM:
451 		*value = mlme_mgmt->mbss_11ax.profile_num;
452 		break;
453 	case WLAN_MLME_CFG_MBSSID_FLAGS:
454 		*value = mlme_mgmt->mbss_11ax.mbssid_flags;
455 		break;
456 	case WLAN_MLME_CFG_VDEVID_TRANS:
457 		*value = mlme_mgmt->mbss_11ax.vdevid_trans;
458 		break;
459 	case WLAN_MLME_CFG_BCN_TX_RATE:
460 		*value = mlme_mgmt->rate_info.bcn_tx_rate;
461 		break;
462 	case WLAN_MLME_CFG_2G_VHT:
463 		*value = mlme_proto->vht_info.en_2gvht;
464 		break;
465 	case WLAN_MLME_CFG_11AX_STUB:
466 		*value = mlme_mgmt->generic.is_11ax_stub_enabled;
467 		break;
468 	default:
469 		break;
470 	}
471 }
472 
473 qdf_export_symbol(wlan_util_vdev_mlme_get_param);
474 
475 void wlan_util_vdev_get_param(struct wlan_objmgr_vdev *vdev,
476 			      enum wlan_mlme_cfg_id param_id,
477 			      uint32_t *value)
478 {
479 	ucfg_wlan_vdev_mgr_get_param(vdev, param_id, value);
480 }
481 
482 qdf_export_symbol(wlan_util_vdev_get_param);
483