1 /*
2 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /**
19 * DOC: This file contains definitions for target_if roaming offload.
20 */
21
22 #include "qdf_types.h"
23 #include "target_if_cm_roam_offload.h"
24 #include "target_if.h"
25 #include "wmi_unified_sta_api.h"
26 #include "wlan_mlme_dbg.h"
27 #include "wlan_mlme_api.h"
28 #include "wlan_crypto_global_api.h"
29 #include "wlan_mlme_main.h"
30 #include "wlan_cm_roam_api.h"
31 #include <target_if_vdev_mgr_rx_ops.h>
32 #include <target_if_vdev_mgr_tx_ops.h>
33 #include "target_if_cm_roam_event.h"
34 #include <target_if_psoc_wake_lock.h>
35 #include "wlan_psoc_mlme_api.h"
36
37 static struct wmi_unified
target_if_cm_roam_get_wmi_handle_from_vdev(struct wlan_objmgr_vdev * vdev)38 *target_if_cm_roam_get_wmi_handle_from_vdev(struct wlan_objmgr_vdev *vdev)
39 {
40 struct wlan_objmgr_pdev *pdev;
41 struct wmi_unified *wmi_handle;
42
43 pdev = wlan_vdev_get_pdev(vdev);
44 if (!pdev) {
45 target_if_err("PDEV is NULL");
46 return NULL;
47 }
48
49 wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
50 if (!wmi_handle) {
51 target_if_err("wmi_handle is null");
52 return NULL;
53 }
54
55 return wmi_handle;
56 }
57
58 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
59 /**
60 * target_if_cm_roam_send_vdev_set_pcl_cmd - Send set vdev pcl
61 * command to wmi.
62 * @vdev: VDEV object pointer
63 * @req: Pointer to the pcl request msg
64 *
65 * Return: QDF_STATUS
66 */
67 static QDF_STATUS
target_if_cm_roam_send_vdev_set_pcl_cmd(struct wlan_objmgr_vdev * vdev,struct set_pcl_req * req)68 target_if_cm_roam_send_vdev_set_pcl_cmd(struct wlan_objmgr_vdev *vdev,
69 struct set_pcl_req *req)
70 {
71 wmi_unified_t wmi_handle;
72 struct set_pcl_cmd_params params;
73
74 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
75 if (!wmi_handle)
76 return QDF_STATUS_E_FAILURE;
77
78 params.weights = &req->chan_weights;
79 params.vdev_id = req->vdev_id;
80
81 return wmi_unified_vdev_set_pcl_cmd(wmi_handle, ¶ms);
82 }
83
84 /**
85 * target_if_cm_roam_send_roam_invoke_cmd - Send roam invoke command to wmi.
86 * @vdev: VDEV object pointer
87 * @req: Pointer to the roam invoke request msg
88 *
89 * Return: QDF_STATUS
90 */
91 static QDF_STATUS
target_if_cm_roam_send_roam_invoke_cmd(struct wlan_objmgr_vdev * vdev,struct roam_invoke_req * req)92 target_if_cm_roam_send_roam_invoke_cmd(struct wlan_objmgr_vdev *vdev,
93 struct roam_invoke_req *req)
94 {
95 wmi_unified_t wmi_handle;
96
97 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
98 if (!wmi_handle)
99 return QDF_STATUS_E_FAILURE;
100
101 return wmi_unified_roam_invoke_cmd(wmi_handle, req);
102 }
103
104 /**
105 * target_if_cm_roam_send_roam_sync_complete - Send roam sync complete to wmi.
106 * @vdev: VDEV object pointer
107 *
108 * Return: QDF_STATUS
109 */
110 static QDF_STATUS
target_if_cm_roam_send_roam_sync_complete(struct wlan_objmgr_vdev * vdev)111 target_if_cm_roam_send_roam_sync_complete(struct wlan_objmgr_vdev *vdev)
112 {
113 wmi_unified_t wmi_handle;
114 QDF_STATUS status;
115 struct wlan_objmgr_psoc *psoc;
116
117 psoc = wlan_vdev_get_psoc(vdev);
118 if (!psoc) {
119 target_if_err("psoc handle is NULL");
120 return QDF_STATUS_E_FAILURE;
121 }
122
123 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
124 if (!wmi_handle)
125 return QDF_STATUS_E_FAILURE;
126
127 status = wmi_unified_roam_synch_complete_cmd(wmi_handle,
128 wlan_vdev_get_id(vdev));
129 target_if_allow_pm_after_roam_sync(psoc);
130
131 return status;
132 }
133
134 /**
135 * target_if_roam_set_param() - set roam params in fw
136 * @wmi_handle: wmi handle
137 * @vdev_id: vdev id
138 * @param_id: parameter id
139 * @param_value: parameter value
140 *
141 * Return: QDF_STATUS_SUCCESS for success or error code
142 */
143 static QDF_STATUS
target_if_roam_set_param(wmi_unified_t wmi_handle,uint8_t vdev_id,uint32_t param_id,uint32_t param_value)144 target_if_roam_set_param(wmi_unified_t wmi_handle, uint8_t vdev_id,
145 uint32_t param_id, uint32_t param_value)
146 {
147 struct vdev_set_params roam_param = {0};
148
149 roam_param.vdev_id = vdev_id;
150 roam_param.param_id = param_id;
151 roam_param.param_value = param_value;
152
153 return wmi_unified_roam_set_param_send(wmi_handle, &roam_param);
154 }
155
156 /**
157 * target_if_cm_roam_rt_stats_config() - Send enable/disable roam event stats
158 * commands to wmi
159 * @vdev: vdev object
160 * @vdev_id: vdev id
161 * @rstats_config: roam event stats config parameters
162 *
163 * Return: QDF_STATUS
164 */
165 static QDF_STATUS
target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint8_t rstats_config)166 target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
167 uint8_t vdev_id, uint8_t rstats_config)
168 {
169 QDF_STATUS status = QDF_STATUS_E_FAILURE;
170 wmi_unified_t wmi_handle;
171
172 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
173 if (!wmi_handle)
174 return status;
175
176 status = target_if_roam_set_param(wmi_handle,
177 vdev_id,
178 WMI_ROAM_PARAM_ROAM_EVENTS_CONFIG,
179 rstats_config);
180
181 if (QDF_IS_STATUS_ERROR(status))
182 target_if_err("Failed to set "
183 "WMI_ROAM_PARAM_ROAM_EVENTS_CONFIG");
184
185 return status;
186 }
187
188 /**
189 * target_if_cm_roam_mcc_disallow() - Send enable/disable roam mcc disallow
190 * commands to wmi
191 * @vdev: vdev object
192 * @vdev_id: vdev id
193 * @is_mcc_disallowed: is mcc disallowed
194 *
195 * Return: QDF_STATUS
196 */
197 static QDF_STATUS
target_if_cm_roam_mcc_disallow(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint8_t is_mcc_disallowed)198 target_if_cm_roam_mcc_disallow(struct wlan_objmgr_vdev *vdev,
199 uint8_t vdev_id, uint8_t is_mcc_disallowed)
200 {
201 QDF_STATUS status = QDF_STATUS_E_FAILURE;
202 wmi_unified_t wmi_handle;
203
204 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
205 if (!wmi_handle)
206 return status;
207
208 status = target_if_roam_set_param(wmi_handle,
209 vdev_id,
210 WMI_ROAM_PARAM_ROAM_MCC_DISALLOW,
211 is_mcc_disallowed);
212
213 if (QDF_IS_STATUS_ERROR(status))
214 target_if_err("Failed to set roam mcc disallow");
215
216 return status;
217 }
218
219 #ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
220 /**
221 * target_if_cm_roam_linkspeed_state() - Send link speed state for roaming
222 * commands to wmi
223 * @vdev: vdev object
224 * @vdev_id: vdev id
225 * @is_linkspeed_good: true, don't need low rssi roaming
226 *
227 * Return: QDF_STATUS
228 */
229 static QDF_STATUS
target_if_cm_roam_linkspeed_state(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,bool is_linkspeed_good)230 target_if_cm_roam_linkspeed_state(struct wlan_objmgr_vdev *vdev,
231 uint8_t vdev_id, bool is_linkspeed_good)
232 {
233 QDF_STATUS status = QDF_STATUS_E_FAILURE;
234 wmi_unified_t wmi_handle;
235
236 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
237 if (!wmi_handle)
238 return status;
239
240 status = target_if_roam_set_param(wmi_handle,
241 vdev_id,
242 WMI_ROAM_PARAM_LINKSPEED_STATE,
243 is_linkspeed_good);
244
245 if (QDF_IS_STATUS_ERROR(status))
246 target_if_err("Failed to set WMI_ROAM_PARAM_LINKSPEED_STATE");
247
248 return status;
249 }
250 #else
251 static inline QDF_STATUS
target_if_cm_roam_linkspeed_state(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,bool is_linkspeed_good)252 target_if_cm_roam_linkspeed_state(struct wlan_objmgr_vdev *vdev,
253 uint8_t vdev_id, bool is_linkspeed_good)
254 {
255 return QDF_STATUS_SUCCESS;
256 }
257 #endif
258
259 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
260 /**
261 * target_if_cm_roam_vendor_handoff_config() - Send vendor handoff config
262 * command to fw
263 * @vdev: vdev object
264 * @vdev_id: vdev id
265 * @param_id: param id
266 *
267 * Return: QDF_STATUS
268 */
269 static QDF_STATUS
target_if_cm_roam_vendor_handoff_config(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint32_t param_id)270 target_if_cm_roam_vendor_handoff_config(struct wlan_objmgr_vdev *vdev,
271 uint8_t vdev_id, uint32_t param_id)
272 {
273 wmi_unified_t wmi_handle;
274
275 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
276 if (!wmi_handle)
277 return QDF_STATUS_E_FAILURE;
278
279 return wmi_unified_roam_vendor_handoff_req_cmd(wmi_handle,
280 vdev_id, param_id);
281 }
282
283 /**
284 * target_if_cm_roam_register_vendor_handoff_ops() - Register tx ops to send
285 * vendor handoff config command to fw
286 * @tx_ops: structure of tx function pointers for roaming related commands
287 *
288 * Return: none
289 */
target_if_cm_roam_register_vendor_handoff_ops(struct wlan_cm_roam_tx_ops * tx_ops)290 static void target_if_cm_roam_register_vendor_handoff_ops(
291 struct wlan_cm_roam_tx_ops *tx_ops)
292 {
293 tx_ops->send_roam_vendor_handoff_config =
294 target_if_cm_roam_vendor_handoff_config;
295 }
296 #else
target_if_cm_roam_register_vendor_handoff_ops(struct wlan_cm_roam_tx_ops * tx_ops)297 static inline void target_if_cm_roam_register_vendor_handoff_ops(
298 struct wlan_cm_roam_tx_ops *tx_ops)
299 {
300 }
301 #endif
302
303 #ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
304 /**
305 * target_if_cm_roam_register_linkspeed_state() - Register tx ops to send
306 * roam link speed state command to fw
307 * @tx_ops: structure of tx function pointers for roaming related commands
308 *
309 * Return: none
310 */
311 static inline void
target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops * tx_ops)312 target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops *tx_ops)
313 {
314 tx_ops->send_roam_linkspeed_state =
315 target_if_cm_roam_linkspeed_state;
316 }
317 #else
318 static inline void
target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops * tx_ops)319 target_if_cm_roam_register_linkspeed_state(struct wlan_cm_roam_tx_ops *tx_ops)
320 {
321 }
322 #endif
323
324 /**
325 * target_if_cm_roam_ho_delay_config() - Send roam HO delay value to wmi
326 * @vdev: vdev object
327 * @vdev_id: vdev id
328 * @roam_ho_delay: roam hand-off delay value
329 *
330 * Return: QDF_STATUS
331 */
332 static QDF_STATUS
target_if_cm_roam_ho_delay_config(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint16_t roam_ho_delay)333 target_if_cm_roam_ho_delay_config(struct wlan_objmgr_vdev *vdev,
334 uint8_t vdev_id, uint16_t roam_ho_delay)
335 {
336 QDF_STATUS status = QDF_STATUS_E_FAILURE;
337 wmi_unified_t wmi_handle;
338
339 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
340 if (!wmi_handle)
341 return status;
342
343 status = target_if_roam_set_param(
344 wmi_handle,
345 vdev_id,
346 WMI_ROAM_PARAM_ROAM_HO_DELAY_RUNTIME_CONFIG,
347 roam_ho_delay);
348
349 if (QDF_IS_STATUS_ERROR(status))
350 target_if_err("Failed to set "
351 "WMI_ROAM_PARAM_ROAM_HO_DELAY_RUNTIME_CONFIG");
352
353 return status;
354 }
355
356 /**
357 * target_if_cm_exclude_rm_partial_scan_freq() - Indicate to FW whether to
358 * exclude the channels in roam full scan that are already scanned as part of
359 * partial scan or not.
360 * @vdev: vdev object
361 * @exclude_rm_partial_scan_freq: Include/exclude the channels in roam full scan
362 * that are already scanned as part of partial scan.
363 *
364 * Return: QDF_STATUS
365 */
366 static QDF_STATUS
target_if_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_vdev * vdev,uint8_t exclude_rm_partial_scan_freq)367 target_if_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_vdev *vdev,
368 uint8_t exclude_rm_partial_scan_freq)
369 {
370 QDF_STATUS status = QDF_STATUS_E_FAILURE;
371 uint8_t vdev_id;
372 wmi_unified_t wmi_handle;
373
374 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
375 if (!wmi_handle)
376 return status;
377
378 vdev_id = wlan_vdev_get_id(vdev);
379 status = target_if_roam_set_param(
380 wmi_handle, vdev_id,
381 WMI_ROAM_PARAM_ROAM_CONTROL_FULL_SCAN_CHANNEL_OPTIMIZATION,
382 exclude_rm_partial_scan_freq);
383
384 if (QDF_IS_STATUS_ERROR(status))
385 target_if_err("Failed to set WMI_ROAM_PARAM_ROAM_CONTROL_FULL_SCAN_CHANNEL_OPTIMIZATION");
386
387 return status;
388 }
389
390 /**
391 * target_if_cm_roam_full_scan_6ghz_on_disc() - Indicate to FW whether to
392 * include the 6 GHz channels in roam full scan only on prior discovery of any
393 * 6 GHz support in the environment or by default.
394 * @vdev: vdev object
395 * @roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full scan:
396 * 1 - Include only on prior discovery of any 6 GHz support in the environment
397 * 0 - Include all the supported 6 GHz channels by default
398 *
399 * Return: QDF_STATUS
400 */
401 static QDF_STATUS
target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev * vdev,uint8_t roam_full_scan_6ghz_on_disc)402 target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev *vdev,
403 uint8_t roam_full_scan_6ghz_on_disc)
404 {
405 QDF_STATUS status = QDF_STATUS_E_FAILURE;
406 uint8_t vdev_id;
407 wmi_unified_t wmi_handle;
408
409 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
410 if (!wmi_handle)
411 return status;
412
413 vdev_id = wlan_vdev_get_id(vdev);
414 status = target_if_roam_set_param(wmi_handle, vdev_id,
415 WMI_ROAM_PARAM_ROAM_CONTROL_FULL_SCAN_6GHZ_PSC_ONLY_WITH_RNR,
416 roam_full_scan_6ghz_on_disc);
417
418 if (QDF_IS_STATUS_ERROR(status))
419 target_if_err("Failed to set WMI_ROAM_PARAM_ROAM_CONTROL_FULL_SCAN_6GHZ_PSC_ONLY_WITH_RNR");
420
421 return status;
422 }
423
424 /**
425 * target_if_cm_roam_rssi_diff_6ghz() - Send the roam RSSI diff value to FW
426 * which is used to decide how better the RSSI of the new/roamable 6GHz AP
427 * should be for roaming.
428 * @vdev: vdev object
429 * @roam_rssi_diff_6ghz: RSSI diff value to be used for roaming to 6 GHz AP
430 *
431 * Return: QDF_STATUS
432 */
433 static QDF_STATUS
target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev * vdev,uint8_t roam_rssi_diff_6ghz)434 target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev,
435 uint8_t roam_rssi_diff_6ghz)
436 {
437 QDF_STATUS status = QDF_STATUS_E_FAILURE;
438 uint8_t vdev_id;
439 wmi_unified_t wmi_handle;
440
441 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
442 if (!wmi_handle)
443 return status;
444
445 vdev_id = wlan_vdev_get_id(vdev);
446 status = target_if_roam_set_param(
447 wmi_handle, vdev_id,
448 WMI_ROAM_PARAM_ROAM_RSSI_BOOST_FOR_6GHZ_CAND_AP,
449 roam_rssi_diff_6ghz);
450
451 if (QDF_IS_STATUS_ERROR(status))
452 target_if_err("Failed to set WMI_ROAM_PARAM_ROAM_RSSI_BOOST_FOR_6GHZ_CAND_AP");
453
454 return status;
455 }
456
457 static QDF_STATUS
458 target_if_cm_roam_scan_offload_rssi_thresh(
459 wmi_unified_t wmi_handle,
460 struct wlan_roam_offload_scan_rssi_params *req);
461
462 /**
463 * target_if_cm_roam_scan_offload_rssi_params() - Set the RSSI parameters
464 * for roam offload scan
465 * @vdev: vdev object
466 * @roam_rssi_params: structure containing parameters for roam offload scan
467 * based on RSSI
468 *
469 * Return: QDF_STATUS
470 */
471 static QDF_STATUS
target_if_cm_roam_scan_offload_rssi_params(struct wlan_objmgr_vdev * vdev,struct wlan_roam_offload_scan_rssi_params * roam_rssi_params)472 target_if_cm_roam_scan_offload_rssi_params(
473 struct wlan_objmgr_vdev *vdev,
474 struct wlan_roam_offload_scan_rssi_params *roam_rssi_params)
475 {
476 QDF_STATUS status = QDF_STATUS_E_FAILURE;
477 wmi_unified_t wmi_handle;
478
479 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
480 if (!wmi_handle)
481 return status;
482
483 status = target_if_cm_roam_scan_offload_rssi_thresh(wmi_handle,
484 roam_rssi_params);
485
486 return status;
487 }
488
489 static void
target_if_check_hi_rssi_5ghz_support(wmi_unified_t wmi_handle,struct wlan_roam_offload_scan_rssi_params * roam_rssi_params)490 target_if_check_hi_rssi_5ghz_support(
491 wmi_unified_t wmi_handle,
492 struct wlan_roam_offload_scan_rssi_params *roam_rssi_params)
493 {
494 if ((roam_rssi_params->flags &
495 ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G) &&
496 wmi_service_enabled(wmi_handle,
497 wmi_service_5ghz_hi_rssi_roam_support)) {
498 target_if_debug("FW supports Hi RSSI roam in 5 GHz");
499 roam_rssi_params->flags |=
500 WMI_ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G;
501 } else {
502 roam_rssi_params->flags &=
503 ~ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G;
504 }
505 }
506
507 static void
target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops * tx_ops)508 target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
509 {
510 tx_ops->send_vdev_set_pcl_cmd = target_if_cm_roam_send_vdev_set_pcl_cmd;
511 tx_ops->send_roam_invoke_cmd = target_if_cm_roam_send_roam_invoke_cmd;
512 tx_ops->send_roam_sync_complete_cmd = target_if_cm_roam_send_roam_sync_complete;
513 tx_ops->send_roam_rt_stats_config = target_if_cm_roam_rt_stats_config;
514 tx_ops->send_roam_ho_delay_config = target_if_cm_roam_ho_delay_config;
515 tx_ops->send_roam_mcc_disallow = target_if_cm_roam_mcc_disallow;
516 tx_ops->send_exclude_rm_partial_scan_freq =
517 target_if_cm_exclude_rm_partial_scan_freq;
518 tx_ops->send_roam_full_scan_6ghz_on_disc =
519 target_if_cm_roam_full_scan_6ghz_on_disc;
520 tx_ops->send_roam_scan_offload_rssi_params =
521 target_if_cm_roam_scan_offload_rssi_params;
522 target_if_cm_roam_register_vendor_handoff_ops(tx_ops);
523 target_if_cm_roam_register_linkspeed_state(tx_ops);
524 }
525 #else
526 static inline void
target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops * tx_ops)527 target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
528 {}
529
530 static QDF_STATUS
target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint8_t rstats_config)531 target_if_cm_roam_rt_stats_config(struct wlan_objmgr_vdev *vdev,
532 uint8_t vdev_id, uint8_t rstats_config)
533 {
534 return QDF_STATUS_E_NOSUPPORT;
535 }
536
537 static QDF_STATUS
target_if_cm_roam_ho_delay_config(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint16_t roam_ho_delay)538 target_if_cm_roam_ho_delay_config(struct wlan_objmgr_vdev *vdev,
539 uint8_t vdev_id, uint16_t roam_ho_delay)
540 {
541 return QDF_STATUS_E_NOSUPPORT;
542 }
543
544 static QDF_STATUS
target_if_cm_roam_mcc_disallow(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id,uint8_t is_mcc_disallowed)545 target_if_cm_roam_mcc_disallow(struct wlan_objmgr_vdev *vdev,
546 uint8_t vdev_id, uint8_t is_mcc_disallowed)
547 {
548 return QDF_STATUS_E_NOSUPPORT;
549 }
550
551 static QDF_STATUS
target_if_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_vdev * vdev,uint8_t exclude_rm_partial_scan_freq)552 target_if_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_vdev *vdev,
553 uint8_t exclude_rm_partial_scan_freq)
554 {
555 return QDF_STATUS_E_NOSUPPORT;
556 }
557
558 static QDF_STATUS
target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev * vdev,uint8_t roam_full_scan_6ghz_on_disc)559 target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev *vdev,
560 uint8_t roam_full_scan_6ghz_on_disc)
561 {
562 return QDF_STATUS_E_NOSUPPORT;
563 }
564
565 static QDF_STATUS
target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev * vdev,uint8_t roam_rssi_diff_6ghz)566 target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev,
567 uint8_t roam_rssi_diff_6ghz)
568 {
569 return QDF_STATUS_E_NOSUPPORT;
570 }
571
572 static inline void
target_if_check_hi_rssi_5ghz_support(wmi_unified_t wmi_handle,struct wlan_roam_offload_scan_rssi_params * roam_rssi_params)573 target_if_check_hi_rssi_5ghz_support(
574 wmi_unified_t wmi_handle,
575 struct wlan_roam_offload_scan_rssi_params *roam_rssi_params)
576 {}
577 #endif
578
579 /**
580 * target_if_vdev_set_param() - set per vdev params in fw
581 * @wmi_handle: wmi handle
582 * @vdev_id: vdev id
583 * @param_id: parameter id
584 * @param_value: parameter value
585 *
586 * Return: QDF_STATUS_SUCCESS for success or error code
587 */
588 static QDF_STATUS
target_if_vdev_set_param(wmi_unified_t wmi_handle,uint32_t vdev_id,uint32_t param_id,uint32_t param_value)589 target_if_vdev_set_param(wmi_unified_t wmi_handle, uint32_t vdev_id,
590 uint32_t param_id, uint32_t param_value)
591 {
592 struct vdev_set_params param = {0};
593
594 if (!target_if_is_vdev_valid(vdev_id)) {
595 target_if_err("vdev_id: %d is invalid, reject the req: param id %d val %d",
596 vdev_id, param_id, param_value);
597 return QDF_STATUS_E_INVAL;
598 }
599
600 param.vdev_id = vdev_id;
601 param.param_id = param_id;
602 param.param_value = param_value;
603
604 return wmi_unified_vdev_set_param_send(wmi_handle, ¶m);
605 }
606
target_if_cm_roam_scan_offload_mode(wmi_unified_t wmi_handle,struct wlan_roam_scan_offload_params * rso_mode_cfg)607 static QDF_STATUS target_if_cm_roam_scan_offload_mode(
608 wmi_unified_t wmi_handle,
609 struct wlan_roam_scan_offload_params *rso_mode_cfg)
610 {
611 return wmi_unified_roam_scan_offload_mode_cmd(wmi_handle,
612 rso_mode_cfg);
613 }
614
615 static
target_if_check_index_setparam(struct dev_set_param * param,uint32_t paramid,uint32_t paramvalue,uint8_t index,uint8_t n_params)616 QDF_STATUS target_if_check_index_setparam(struct dev_set_param *param,
617 uint32_t paramid,
618 uint32_t paramvalue,
619 uint8_t index, uint8_t n_params)
620 {
621 if (index >= n_params) {
622 target_if_err("Index:%d OOB to fill param", index);
623 return QDF_STATUS_E_FAILURE;
624 }
625 param[index].param_id = paramid;
626 param[index].param_value = paramvalue;
627 return QDF_STATUS_SUCCESS;
628 }
629
630 #define MAX_PARAMS_CM_ROAM_SCAN_BMISS 2
631 /*
632 * params being sent:
633 * wmi_vdev_param_bmiss_first_bcnt
634 * wmi_vdev_param_bmiss_final_bcnt
635 */
636
637 /**
638 * target_if_cm_roam_scan_bmiss_cnt() - set bmiss count to fw
639 * @wmi_handle: wmi handle
640 * @req: bmiss count parameters
641 *
642 * Set first & final bmiss count to fw.
643 *
644 * Return: QDF status
645 */
646 static QDF_STATUS
target_if_cm_roam_scan_bmiss_cnt(wmi_unified_t wmi_handle,struct wlan_roam_beacon_miss_cnt * req)647 target_if_cm_roam_scan_bmiss_cnt(wmi_unified_t wmi_handle,
648 struct wlan_roam_beacon_miss_cnt *req)
649 {
650 QDF_STATUS status;
651 struct dev_set_param setparam[MAX_PARAMS_CM_ROAM_SCAN_BMISS];
652 struct set_multiple_pdev_vdev_param params = {};
653 uint8_t index = 0;
654
655 target_if_debug("vdev_id:%d, first_bcnt: %d, final_bcnt: %d",
656 req->vdev_id, req->roam_bmiss_first_bcnt,
657 req->roam_bmiss_final_bcnt);
658
659 status = target_if_check_index_setparam(
660 setparam,
661 wmi_vdev_param_bmiss_first_bcnt,
662 req->roam_bmiss_first_bcnt,
663 index++,
664 MAX_PARAMS_CM_ROAM_SCAN_BMISS);
665 if (QDF_IS_STATUS_ERROR(status))
666 goto error;
667
668 status = target_if_check_index_setparam(
669 setparam,
670 wmi_vdev_param_bmiss_final_bcnt,
671 req->roam_bmiss_final_bcnt, index++,
672 MAX_PARAMS_CM_ROAM_SCAN_BMISS);
673 if (QDF_IS_STATUS_ERROR(status))
674 goto error;
675
676 params.param_type = MLME_VDEV_SETPARAM;
677 params.dev_id = req->vdev_id;
678 params.n_params = index;
679 params.params = setparam;
680
681 status = wmi_unified_multiple_vdev_param_send(wmi_handle, ¶ms);
682 if (QDF_IS_STATUS_ERROR(status))
683 target_if_err("failed to set bmiss first,final bcntset params");
684
685 error:
686 return status;
687 }
688
689 #define MAX_PARAMS_CM_ROAM_SCAN_BMISS_TIMEOUT 2
690 /*
691 * params being sent:
692 * wmi_vdev_param_bmiss_first_bcnt
693 * wmi_vdev_param_bmiss_final_bcnt
694 */
695
696 /**
697 * target_if_cm_roam_scan_bmiss_timeout() - set conbmiss timeout to fw
698 * @wmi_handle: wmi handle
699 * @req: bmiss timeout parameters
700 *
701 * Set bmiss timeout to fw.
702 *
703 * Return: QDF status
704 */
705 static QDF_STATUS
target_if_cm_roam_scan_bmiss_timeout(wmi_unified_t wmi_handle,struct wlan_roam_bmiss_timeout * req)706 target_if_cm_roam_scan_bmiss_timeout(wmi_unified_t wmi_handle,
707 struct wlan_roam_bmiss_timeout *req)
708 {
709 QDF_STATUS status;
710 uint32_t vdev_id;
711 uint8_t bmiss_timeout_onwakeup;
712 uint8_t bmiss_timeout_onsleep;
713 struct dev_set_param setparam[MAX_PARAMS_CM_ROAM_SCAN_BMISS_TIMEOUT];
714 struct set_multiple_pdev_vdev_param params = {};
715 uint8_t index = 0;
716
717 vdev_id = req->vdev_id;
718 bmiss_timeout_onwakeup = req->bmiss_timeout_onwakeup;
719 bmiss_timeout_onsleep = req->bmiss_timeout_onsleep;
720
721 target_if_debug("vdev_id %d bmiss_timeout_onwakeup: %dsec, bmiss_timeout_onsleep: %dsec", vdev_id,
722 bmiss_timeout_onwakeup, bmiss_timeout_onsleep);
723 status = target_if_check_index_setparam(
724 setparam,
725 wmi_vdev_param_final_bmiss_time_sec,
726 req->bmiss_timeout_onwakeup, index++,
727 MAX_PARAMS_CM_ROAM_SCAN_BMISS_TIMEOUT);
728 if (QDF_IS_STATUS_ERROR(status))
729 goto error;
730
731 status = target_if_check_index_setparam(
732 setparam,
733 wmi_vdev_param_final_bmiss_time_wow_sec,
734 req->bmiss_timeout_onsleep, index++,
735 MAX_PARAMS_CM_ROAM_SCAN_BMISS_TIMEOUT);
736 if (QDF_IS_STATUS_ERROR(status))
737 goto error;
738
739 params.param_type = MLME_VDEV_SETPARAM;
740 params.dev_id = req->vdev_id;
741 params.n_params = index;
742 params.params = setparam;
743 status = wmi_unified_multiple_vdev_param_send(wmi_handle, ¶ms);
744 if (QDF_IS_STATUS_ERROR(status))
745 target_if_err("failed to set bmiss first,final bcntset params");
746
747 error:
748 return status;
749 }
750
751 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
752 /**
753 * target_if_cm_roam_reason_vsie() - set vdev param
754 * wmi_vdev_param_enable_disable_roam_reason_vsie
755 * @wmi_handle: handle to WMI
756 * @req: roam reason vsie enable parameters
757 *
758 * Return: void
759 */
760 static void
target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,struct wlan_roam_reason_vsie_enable * req)761 target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
762 struct wlan_roam_reason_vsie_enable *req)
763 {
764 QDF_STATUS status;
765
766 status = target_if_vdev_set_param(
767 wmi_handle,
768 req->vdev_id,
769 wmi_vdev_param_enable_disable_roam_reason_vsie,
770 req->enable_roam_reason_vsie);
771
772 if (QDF_IS_STATUS_ERROR(status))
773 target_if_err("Failed to set vdev param %d",
774 wmi_vdev_param_enable_disable_roam_reason_vsie);
775 }
776
777 /**
778 * target_if_cm_roam_triggers() - send roam triggers to WMI
779 * @vdev: vdev
780 * @req: roam triggers parameters
781 *
782 * Return: QDF status
783 */
784 static QDF_STATUS
target_if_cm_roam_triggers(struct wlan_objmgr_vdev * vdev,struct wlan_roam_triggers * req)785 target_if_cm_roam_triggers(struct wlan_objmgr_vdev *vdev,
786 struct wlan_roam_triggers *req)
787 {
788 wmi_unified_t wmi_handle;
789
790 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
791 if (!wmi_handle)
792 return QDF_STATUS_E_FAILURE;
793
794 if (!target_if_is_vdev_valid(req->vdev_id))
795 return QDF_STATUS_E_INVAL;
796
797 return wmi_unified_set_roam_triggers(wmi_handle, req);
798 }
799
800 /**
801 * target_if_cm_roam_scan_get_cckm_mode() - Get the CCKM auth mode
802 * @vdev: vdev object
803 * @auth_mode: Auth mode to be converted
804 *
805 * Based on LFR2.0 or LFR3.0, return the proper auth type
806 *
807 * Return: if LFR2.0, then return WMI_AUTH_CCKM for backward compatibility
808 * if LFR3.0 then return the appropriate auth type
809 */
810 static uint32_t
target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev * vdev,uint32_t auth_mode)811 target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev *vdev,
812 uint32_t auth_mode)
813 {
814 struct wlan_objmgr_psoc *psoc;
815 bool roam_offload_enable;
816
817 psoc = wlan_vdev_get_psoc(vdev);
818 if (!psoc) {
819 target_if_err("psoc handle is NULL");
820 return WMI_AUTH_CCKM;
821 }
822
823 wlan_mlme_get_roaming_offload(psoc, &roam_offload_enable);
824 if (roam_offload_enable)
825 return auth_mode;
826 else
827 return WMI_AUTH_CCKM;
828 }
829
830 /* target_if_cm_roam_disconnect_params(): Send the disconnect roam parameters
831 * to wmi
832 * @wmi_handle: handle to WMI
833 * @command: rso command
834 * @req: disconnect roam parameters
835 *
836 * Return: void
837 */
838 static void
target_if_cm_roam_disconnect_params(wmi_unified_t wmi_handle,uint8_t command,struct wlan_roam_disconnect_params * req)839 target_if_cm_roam_disconnect_params(wmi_unified_t wmi_handle, uint8_t command,
840 struct wlan_roam_disconnect_params *req)
841 {
842 QDF_STATUS status;
843
844 switch (command) {
845 case ROAM_SCAN_OFFLOAD_START:
846 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
847 if (!req->enable)
848 return;
849 break;
850 case ROAM_SCAN_OFFLOAD_STOP:
851 req->enable = false;
852 break;
853 default:
854 break;
855 }
856
857 status = wmi_unified_send_disconnect_roam_params(wmi_handle, req);
858 if (QDF_IS_STATUS_ERROR(status))
859 target_if_err("failed to send disconnect roam parameters");
860 }
861
862 /* target_if_cm_roam_idle_params(): Send the roam idle parameters to wmi
863 * @wmi_handle: handle to WMI
864 * @command: rso command
865 * @req: roam idle parameters
866 *
867 * Return: void
868 */
869 static void
target_if_cm_roam_idle_params(wmi_unified_t wmi_handle,uint8_t command,struct wlan_roam_idle_params * req)870 target_if_cm_roam_idle_params(wmi_unified_t wmi_handle, uint8_t command,
871 struct wlan_roam_idle_params *req)
872 {
873 QDF_STATUS status;
874 bool db2dbm_enabled;
875
876 switch (command) {
877 case ROAM_SCAN_OFFLOAD_START:
878 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
879 break;
880 case ROAM_SCAN_OFFLOAD_STOP:
881 req->enable = false;
882 break;
883 default:
884 break;
885 }
886
887 db2dbm_enabled = wmi_service_enabled(wmi_handle,
888 wmi_service_hw_db2dbm_support);
889 if (!db2dbm_enabled) {
890 req->conn_ap_min_rssi -= NOISE_FLOOR_DBM_DEFAULT;
891 req->conn_ap_min_rssi &= 0x000000ff;
892 }
893
894 status = wmi_unified_send_idle_roam_params(wmi_handle, req);
895 if (QDF_IS_STATUS_ERROR(status))
896 target_if_err("failed to send idle roam parameters");
897 }
898 #else
899 static void
target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,struct wlan_roam_reason_vsie_enable * req)900 target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
901 struct wlan_roam_reason_vsie_enable *req)
902 {
903 }
904
905 static QDF_STATUS
target_if_cm_roam_triggers(struct wlan_objmgr_vdev * vdev,struct wlan_roam_triggers * req)906 target_if_cm_roam_triggers(struct wlan_objmgr_vdev *vdev,
907 struct wlan_roam_triggers *req)
908 {
909 return QDF_STATUS_E_NOSUPPORT;
910 }
911
912 static uint32_t
target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev * vdev,uint32_t auth_mode)913 target_if_cm_roam_scan_get_cckm_mode(struct wlan_objmgr_vdev *vdev,
914 uint32_t auth_mode)
915 {
916 return WMI_AUTH_CCKM;
917 }
918
919 static void
target_if_cm_roam_disconnect_params(wmi_unified_t wmi_handle,uint8_t command,struct wlan_roam_disconnect_params * req)920 target_if_cm_roam_disconnect_params(wmi_unified_t wmi_handle, uint8_t command,
921 struct wlan_roam_disconnect_params *req)
922 {
923 }
924
925 static void
target_if_cm_roam_idle_params(wmi_unified_t wmi_handle,uint8_t command,struct wlan_roam_idle_params * req)926 target_if_cm_roam_idle_params(wmi_unified_t wmi_handle, uint8_t command,
927 struct wlan_roam_idle_params *req)
928 {
929 }
930 #endif
931
932 /**
933 * target_if_cm_roam_scan_offload_rssi_thresh() - Send roam scan rssi threshold
934 * commands to wmi
935 * @wmi_handle: wmi handle
936 * @req: roam scan rssi threshold related parameters
937 *
938 * This function fills some parameters @req and send down roam scan rssi
939 * threshold command to wmi
940 *
941 * Return: QDF_STATUS
942 */
943 static QDF_STATUS
target_if_cm_roam_scan_offload_rssi_thresh(wmi_unified_t wmi_handle,struct wlan_roam_offload_scan_rssi_params * req)944 target_if_cm_roam_scan_offload_rssi_thresh(
945 wmi_unified_t wmi_handle,
946 struct wlan_roam_offload_scan_rssi_params *req)
947 {
948 QDF_STATUS status = QDF_STATUS_SUCCESS;
949 bool db2dbm_enabled;
950
951 db2dbm_enabled = wmi_service_enabled(wmi_handle,
952 wmi_service_hw_db2dbm_support);
953 if (!db2dbm_enabled) {
954 req->rssi_thresh -= NOISE_FLOOR_DBM_DEFAULT;
955 req->rssi_thresh &= 0x000000ff;
956 req->hi_rssi_scan_rssi_ub -= NOISE_FLOOR_DBM_DEFAULT;
957 req->bg_scan_bad_rssi_thresh -= NOISE_FLOOR_DBM_DEFAULT;
958 req->roam_data_rssi_threshold -= NOISE_FLOOR_DBM_DEFAULT;
959 req->good_rssi_threshold -= NOISE_FLOOR_DBM_DEFAULT;
960 req->good_rssi_threshold &= 0x000000ff;
961 }
962
963 req->hi_rssi_scan_rssi_ub &= 0x000000ff;
964 /*
965 * The current Noise floor in firmware is -96dBm. Penalty/Boost
966 * threshold is applied on a weaker signal to make it even more weaker.
967 * So, there is a chance that the user may configure a very low
968 * Penalty/Boost threshold beyond the noise floor. If that is the case,
969 * then suppress the penalty/boost threshold to the noise floor.
970 */
971 if (req->raise_rssi_thresh_5g < NOISE_FLOOR_DBM_DEFAULT) {
972 if (db2dbm_enabled) {
973 req->penalty_threshold_5g = RSSI_MIN_VALUE;
974 req->boost_threshold_5g = RSSI_MAX_VALUE;
975 } else {
976 req->penalty_threshold_5g = 0;
977 }
978 } else {
979 if (db2dbm_enabled) {
980 req->boost_threshold_5g = req->raise_rssi_thresh_5g;
981 } else {
982 req->boost_threshold_5g =
983 (req->raise_rssi_thresh_5g -
984 NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
985 }
986 }
987
988 if (req->drop_rssi_thresh_5g < NOISE_FLOOR_DBM_DEFAULT) {
989 if (db2dbm_enabled)
990 req->penalty_threshold_5g = RSSI_MIN_VALUE;
991 else
992 req->penalty_threshold_5g = 0;
993 } else {
994 if (db2dbm_enabled) {
995 req->penalty_threshold_5g = req->drop_rssi_thresh_5g;
996 } else {
997 req->penalty_threshold_5g =
998 (req->drop_rssi_thresh_5g -
999 NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
1000 }
1001 }
1002
1003 if (req->early_stop_scan_enable) {
1004 if (!db2dbm_enabled) {
1005 req->roam_earlystop_thres_min -=
1006 NOISE_FLOOR_DBM_DEFAULT;
1007 req->roam_earlystop_thres_max -=
1008 NOISE_FLOOR_DBM_DEFAULT;
1009 }
1010 } else {
1011 if (db2dbm_enabled) {
1012 req->roam_earlystop_thres_min = RSSI_MIN_VALUE;
1013 req->roam_earlystop_thres_max = RSSI_MIN_VALUE;
1014 } else {
1015 req->roam_earlystop_thres_min = 0;
1016 req->roam_earlystop_thres_max = 0;
1017 }
1018 }
1019
1020 if (req->hi_rssi_scan_rssi_delta)
1021 target_if_check_hi_rssi_5ghz_support(wmi_handle, req);
1022
1023 target_if_debug("RSO_CFG: vdev %d: db2dbm enabled:%d, good_rssi_threshold:%d, early_stop_thresholds en:%d, min:%d, max:%d, roam_scan_rssi_thresh:%d, roam_rssi_thresh_diff:%d",
1024 req->vdev_id, db2dbm_enabled, req->good_rssi_threshold,
1025 req->early_stop_scan_enable,
1026 req->roam_earlystop_thres_min,
1027 req->roam_earlystop_thres_max, req->rssi_thresh,
1028 req->rssi_thresh_diff);
1029 target_if_debug("RSO_CFG: hirssi max cnt:%d, delta:%d, hirssi upper bound:%d, dense rssi thresh offset:%d, dense min aps cnt:%d, traffic_threshold:%d, dense_status:%d",
1030 req->hi_rssi_scan_max_count,
1031 req->hi_rssi_scan_rssi_delta,
1032 req->hi_rssi_scan_rssi_ub,
1033 req->dense_rssi_thresh_offset,
1034 req->dense_min_aps_cnt,
1035 req->traffic_threshold,
1036 req->initial_dense_status);
1037 target_if_debug("RSO_CFG: raise rssi threshold 5g:%d, drop rssi threshold 5g:%d, penalty threshold 5g:%d, boost threshold 5g:%d",
1038 req->raise_rssi_thresh_5g,
1039 req->drop_rssi_thresh_5g,
1040 req->penalty_threshold_5g,
1041 req->boost_threshold_5g);
1042 target_if_debug("RSO_CFG: raise factor 5g:%d, drop factor 5g:%d, max raise rssi 5g:%d, max drop rssi 5g:%d, rssi threshold offset 5g:%d",
1043 req->raise_factor_5g,
1044 req->raise_factor_5g,
1045 req->max_raise_rssi_5g,
1046 req->max_drop_rssi_5g,
1047 req->rssi_thresh_offset_5g);
1048 target_if_debug("RSO_CFG: BG Scan Bad RSSI:%d, bitmap:0x%x Offset for 2G to 5G Roam:%d",
1049 req->bg_scan_bad_rssi_thresh,
1050 req->bg_scan_client_bitmap,
1051 req->roam_bad_rssi_thresh_offset_2g);
1052 target_if_debug("RSO_CFG: Roam data rssi triggers:0x%x, threshold:%d, rx time:%d",
1053 req->roam_data_rssi_threshold_triggers,
1054 req->roam_data_rssi_threshold,
1055 req->rx_data_inactivity_time);
1056
1057 status = wmi_unified_roam_scan_offload_rssi_thresh_cmd(wmi_handle, req);
1058 if (QDF_IS_STATUS_ERROR(status)) {
1059 target_if_err("roam_scan_offload_rssi_thresh_cmd failed %d",
1060 status);
1061 return status;
1062 }
1063
1064 return status;
1065 }
1066
1067 /**
1068 * target_if_cm_roam_scan_offload_scan_period() - set roam offload scan period
1069 * @wmi_handle: wmi handle
1070 * @req: roam scan period parameters
1071 *
1072 * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
1073 *
1074 * Return: QDF status
1075 */
1076 static QDF_STATUS
target_if_cm_roam_scan_offload_scan_period(wmi_unified_t wmi_handle,struct wlan_roam_scan_period_params * req)1077 target_if_cm_roam_scan_offload_scan_period(
1078 wmi_unified_t wmi_handle,
1079 struct wlan_roam_scan_period_params *req)
1080 {
1081 if (!target_if_is_vdev_valid(req->vdev_id)) {
1082 target_if_err("Invalid vdev id:%d", req->vdev_id);
1083 return QDF_STATUS_E_FAILURE;
1084 }
1085
1086 return wmi_unified_roam_scan_offload_scan_period(wmi_handle, req);
1087 }
1088
1089 /**
1090 * target_if_cm_roam_scan_offload_ap_profile() - send roam ap profile to
1091 * firmware
1092 * @vdev: vdev object
1093 * @wmi_handle: wmi handle
1094 * @req: roam ap profile parameters
1095 *
1096 * Send WMI_ROAM_AP_PROFILE parameters to firmware
1097 *
1098 * Return: QDF status
1099 */
1100 static QDF_STATUS
target_if_cm_roam_scan_offload_ap_profile(struct wlan_objmgr_vdev * vdev,wmi_unified_t wmi_handle,struct ap_profile_params * req)1101 target_if_cm_roam_scan_offload_ap_profile(
1102 struct wlan_objmgr_vdev *vdev,
1103 wmi_unified_t wmi_handle,
1104 struct ap_profile_params *req)
1105 {
1106 uint32_t rsn_authmode;
1107 bool db2dbm_enabled;
1108
1109 if (!target_if_is_vdev_valid(req->vdev_id)) {
1110 target_if_err("Invalid vdev id:%d", req->vdev_id);
1111 return QDF_STATUS_E_FAILURE;
1112 }
1113
1114 rsn_authmode = req->profile.rsn_authmode;
1115 if (rsn_authmode == WMI_AUTH_CCKM_WPA ||
1116 rsn_authmode == WMI_AUTH_CCKM_RSNA)
1117 req->profile.rsn_authmode =
1118 target_if_cm_roam_scan_get_cckm_mode(vdev, rsn_authmode);
1119
1120 db2dbm_enabled = wmi_service_enabled(wmi_handle,
1121 wmi_service_hw_db2dbm_support);
1122 if (!req->profile.rssi_abs_thresh) {
1123 if (db2dbm_enabled)
1124 req->profile.rssi_abs_thresh = RSSI_MIN_VALUE;
1125 } else {
1126 if (!db2dbm_enabled)
1127 req->profile.rssi_abs_thresh -=
1128 NOISE_FLOOR_DBM_DEFAULT;
1129 }
1130
1131 if (!db2dbm_enabled) {
1132 req->min_rssi_params[DEAUTH_MIN_RSSI].min_rssi -=
1133 NOISE_FLOOR_DBM_DEFAULT;
1134 req->min_rssi_params[DEAUTH_MIN_RSSI].min_rssi &= 0x000000ff;
1135
1136 req->min_rssi_params[BMISS_MIN_RSSI].min_rssi -=
1137 NOISE_FLOOR_DBM_DEFAULT;
1138 req->min_rssi_params[BMISS_MIN_RSSI].min_rssi &= 0x000000ff;
1139
1140 req->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi -=
1141 NOISE_FLOOR_DBM_DEFAULT;
1142 req->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi &=
1143 0x000000ff;
1144
1145 }
1146
1147 return wmi_unified_send_roam_scan_offload_ap_cmd(wmi_handle, req);
1148 }
1149
1150 /**
1151 * target_if_cm_roam_scan_mawc_params() - send roam macw to
1152 * firmware
1153 * @wmi_handle: wmi handle
1154 * @req: roam macw parameters
1155 *
1156 * Send WMI_ROAM_CONFIGURE_MAWC_CMDID parameters to firmware
1157 *
1158 * Return: QDF status
1159 */
1160 static QDF_STATUS
target_if_cm_roam_scan_mawc_params(wmi_unified_t wmi_handle,struct wlan_roam_mawc_params * req)1161 target_if_cm_roam_scan_mawc_params(wmi_unified_t wmi_handle,
1162 struct wlan_roam_mawc_params *req)
1163 {
1164 if (!wmi_service_enabled(wmi_handle, wmi_service_hw_db2dbm_support))
1165 req->best_ap_rssi_threshold -= NOISE_FLOOR_DBM_DEFAULT;
1166
1167 return wmi_unified_roam_mawc_params_cmd(wmi_handle, req);
1168 }
1169
1170 /**
1171 * target_if_cm_roam_scan_filter() - send roam scan filter to firmware
1172 * @wmi_handle: wmi handle
1173 * @command: rso command
1174 * @req: roam scan filter parameters
1175 *
1176 * Send WMI_ROAM_FILTER_CMDID parameters to firmware
1177 *
1178 * Return: QDF status
1179 */
1180 static QDF_STATUS
target_if_cm_roam_scan_filter(wmi_unified_t wmi_handle,uint8_t command,struct wlan_roam_scan_filter_params * req)1181 target_if_cm_roam_scan_filter(wmi_unified_t wmi_handle, uint8_t command,
1182 struct wlan_roam_scan_filter_params *req)
1183 {
1184 QDF_STATUS status = QDF_STATUS_SUCCESS;
1185
1186 if (!target_if_is_vdev_valid(req->filter_params.vdev_id)) {
1187 target_if_err("Invalid vdev id:%d",
1188 req->filter_params.vdev_id);
1189 return QDF_STATUS_E_FAILURE;
1190 }
1191
1192 if (command != ROAM_SCAN_OFFLOAD_STOP) {
1193 switch (req->reason) {
1194 case REASON_ROAM_SET_DENYLIST_BSSID:
1195 case REASON_ROAM_SET_SSID_ALLOWED:
1196 case REASON_ROAM_SET_FAVORED_BSSID:
1197 break;
1198 case REASON_CTX_INIT:
1199 if (command == ROAM_SCAN_OFFLOAD_START) {
1200 req->filter_params.op_bitmap |=
1201 ROAM_FILTER_OP_BITMAP_LCA_DISALLOW |
1202 ROAM_FILTER_OP_BITMAP_RSSI_REJECTION_OCE;
1203 } else {
1204 target_if_debug("Roam Filter need not be sent");
1205 return QDF_STATUS_SUCCESS;
1206 }
1207 break;
1208 default:
1209 if (command != ROAM_SCAN_OFFLOAD_START) {
1210 target_if_debug("Roam Filter need not be sent");
1211 return QDF_STATUS_SUCCESS;
1212 }
1213 }
1214 }
1215
1216 target_if_debug("RSO_CFG: vdev %d op_bitmap:0x%x num_rssi_rejection_ap:%d delta_rssi:%d",
1217 req->filter_params.vdev_id,
1218 req->filter_params.op_bitmap,
1219 req->filter_params.num_rssi_rejection_ap,
1220 req->filter_params.delta_rssi);
1221 status = wmi_unified_roam_scan_filter_cmd(wmi_handle,
1222 &req->filter_params);
1223 return status;
1224 }
1225
1226 /**
1227 * target_if_cm_roam_scan_btm_offload() - send roam scan btm offload to firmware
1228 * @wmi_handle: wmi handle
1229 * @req: roam scan btm offload parameters
1230 *
1231 * Send WMI_ROAM_BTM_CONFIG_CMDID parameters to firmware
1232 *
1233 * Return: QDF status
1234 */
1235 static QDF_STATUS
target_if_cm_roam_scan_btm_offload(wmi_unified_t wmi_handle,struct wlan_roam_btm_config * req)1236 target_if_cm_roam_scan_btm_offload(wmi_unified_t wmi_handle,
1237 struct wlan_roam_btm_config *req)
1238 {
1239 return wmi_unified_send_btm_config(wmi_handle, req);
1240 }
1241
1242 /**
1243 * target_if_cm_roam_offload_11k_params() - send 11k offload params to firmware
1244 * @wmi_handle: wmi handle
1245 * @req: 11k offload parameters
1246 *
1247 * Send WMI_11K_OFFLOAD_REPORT_CMDID parameters to firmware
1248 *
1249 * Return: QDF status
1250 */
1251 static QDF_STATUS
target_if_cm_roam_offload_11k_params(wmi_unified_t wmi_handle,struct wlan_roam_11k_offload_params * req)1252 target_if_cm_roam_offload_11k_params(wmi_unified_t wmi_handle,
1253 struct wlan_roam_11k_offload_params *req)
1254 {
1255 QDF_STATUS status;
1256
1257 if (!wmi_service_enabled(wmi_handle,
1258 wmi_service_11k_neighbour_report_support)) {
1259 target_if_err("FW doesn't support 11k offload");
1260 return QDF_STATUS_SUCCESS;
1261 }
1262
1263 /* If 11k enable command and ssid length is 0, drop it */
1264 if (req->offload_11k_bitmask &&
1265 !req->neighbor_report_params.ssid.length) {
1266 target_if_debug("SSID Len 0");
1267 return QDF_STATUS_SUCCESS;
1268 }
1269
1270 status = wmi_unified_offload_11k_cmd(wmi_handle, req);
1271
1272 if (status != QDF_STATUS_SUCCESS)
1273 target_if_err("failed to send 11k offload command");
1274
1275 return status;
1276 }
1277
1278 /**
1279 * target_if_cm_roam_bss_load_config() - send bss load config params to firmware
1280 * @wmi_handle: wmi handle
1281 * @req: bss load config parameters
1282 *
1283 * Send WMI_ROAM_BSS_LOAD_CONFIG_CMDID parameters to firmware
1284 *
1285 * Return: QDF status
1286 */
1287 static void
target_if_cm_roam_bss_load_config(wmi_unified_t wmi_handle,struct wlan_roam_bss_load_config * req)1288 target_if_cm_roam_bss_load_config(wmi_unified_t wmi_handle,
1289 struct wlan_roam_bss_load_config *req)
1290 {
1291 QDF_STATUS status;
1292 bool db2dbm_enabled;
1293
1294 db2dbm_enabled = wmi_service_enabled(wmi_handle,
1295 wmi_service_hw_db2dbm_support);
1296 if (!db2dbm_enabled) {
1297 req->rssi_threshold_6ghz -= NOISE_FLOOR_DBM_DEFAULT;
1298 req->rssi_threshold_6ghz &= 0x000000ff;
1299
1300 req->rssi_threshold_5ghz -= NOISE_FLOOR_DBM_DEFAULT;
1301 req->rssi_threshold_5ghz &= 0x000000ff;
1302
1303 req->rssi_threshold_24ghz -= NOISE_FLOOR_DBM_DEFAULT;
1304 req->rssi_threshold_24ghz &= 0x000000ff;
1305 }
1306
1307 target_if_debug("RSO_CFG: bss load trig params vdev_id:%u threshold:%u sample_time:%u 5Ghz RSSI threshold:%d 2.4G rssi threshold:%d",
1308 req->vdev_id, req->bss_load_threshold,
1309 req->bss_load_sample_time, req->rssi_threshold_5ghz,
1310 req->rssi_threshold_24ghz);
1311
1312 status = wmi_unified_send_bss_load_config(wmi_handle, req);
1313 if (QDF_IS_STATUS_ERROR(status))
1314 target_if_err("failed to send bss load trigger config command");
1315 }
1316
1317 static uint32_t
target_if_get_wmi_roam_offload_flag(uint32_t flag)1318 target_if_get_wmi_roam_offload_flag(uint32_t flag)
1319 {
1320 uint32_t roam_offload_flag = 0;
1321
1322 if (flag & WLAN_ROAM_FW_OFFLOAD_ENABLE)
1323 roam_offload_flag |= WMI_ROAM_FW_OFFLOAD_ENABLE_FLAG;
1324
1325 if (flag & WLAN_ROAM_BMISS_FINAL_SCAN_ENABLE)
1326 roam_offload_flag |= WMI_ROAM_BMISS_FINAL_SCAN_ENABLE_FLAG;
1327
1328 if (flag & WLAN_ROAM_SKIP_EAPOL_4WAY_HANDSHAKE)
1329 roam_offload_flag |=
1330 wmi_vdev_param_skip_roam_eapol_4way_handshake;
1331
1332 if (flag & WLAN_ROAM_BMISS_FINAL_SCAN_TYPE)
1333 roam_offload_flag |= WMI_ROAM_BMISS_FINAL_SCAN_TYPE_FLAG;
1334
1335 if (flag & WLAN_ROAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE)
1336 roam_offload_flag |=
1337 wmi_vdev_param_skip_sae_roam_4way_handshake;
1338
1339 return roam_offload_flag;
1340 }
1341
1342 /**
1343 * target_if_cm_roam_send_roam_init - Send roam module init/deinit to firmware
1344 * @vdev: Pointer to Objmgr vdev
1345 * @params: Roam offload init params
1346 *
1347 * Return: QDF_STATUS
1348 */
1349 static QDF_STATUS
target_if_cm_roam_send_roam_init(struct wlan_objmgr_vdev * vdev,struct wlan_roam_offload_init_params * params)1350 target_if_cm_roam_send_roam_init(struct wlan_objmgr_vdev *vdev,
1351 struct wlan_roam_offload_init_params *params)
1352 {
1353 QDF_STATUS status;
1354 wmi_unified_t wmi_handle;
1355 uint32_t flag;
1356
1357 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
1358 if (!wmi_handle)
1359 return QDF_STATUS_E_FAILURE;
1360
1361 flag = target_if_get_wmi_roam_offload_flag(params->roam_offload_flag);
1362 status = target_if_vdev_set_param(wmi_handle, params->vdev_id,
1363 wmi_vdev_param_roam_fw_offload, flag);
1364
1365 return status;
1366 }
1367
1368 /**
1369 * target_if_cm_roam_scan_rssi_change_cmd() - Send WMI_ROAM_SCAN_RSSI_CHANGE
1370 * command to firmware
1371 * @wmi_handle: WMI handle
1372 * @params: RSSI change parameters
1373 *
1374 * Return: QDF_STATUS
1375 */
target_if_cm_roam_scan_rssi_change_cmd(wmi_unified_t wmi_handle,struct wlan_roam_rssi_change_params * params)1376 static QDF_STATUS target_if_cm_roam_scan_rssi_change_cmd(
1377 wmi_unified_t wmi_handle,
1378 struct wlan_roam_rssi_change_params *params)
1379 {
1380 /*
1381 * Start new rssi triggered scan only if it changes by
1382 * RoamRssiDiff value. Beacon weight of 14 means average rssi
1383 * is taken over 14 previous samples + 2 times the current
1384 * beacon's rssi.
1385 */
1386 return wmi_unified_roam_scan_offload_rssi_change_cmd(wmi_handle,
1387 params);
1388 }
1389
1390 /**
1391 * target_if_cm_roam_offload_chan_list - Send WMI_ROAM_CHAN_LIST command to
1392 * firmware
1393 * @wmi_handle: Pointer to wmi handle
1394 * @rso_chan_info: RSO channel list info
1395 *
1396 * Return: QDF_STATUS
1397 */
target_if_cm_roam_offload_chan_list(wmi_unified_t wmi_handle,struct wlan_roam_scan_channel_list * rso_chan_info)1398 static QDF_STATUS target_if_cm_roam_offload_chan_list(
1399 wmi_unified_t wmi_handle,
1400 struct wlan_roam_scan_channel_list *rso_chan_info)
1401 {
1402 return wmi_unified_roam_scan_offload_chan_list_cmd(wmi_handle,
1403 rso_chan_info);
1404 }
1405
1406 /**
1407 * target_if_cm_roam_send_time_sync_cmd - Send time of the day in millisecs
1408 * to firmware.
1409 * @wmi_handle: WMI handle
1410 *
1411 * Return: None
1412 */
1413 static void
target_if_cm_roam_send_time_sync_cmd(wmi_unified_t wmi_handle)1414 target_if_cm_roam_send_time_sync_cmd(wmi_unified_t wmi_handle)
1415 {
1416 return wmi_send_time_stamp_sync_cmd_tlv(wmi_handle);
1417 }
1418
1419 #ifdef WLAN_FEATURE_11BE
1420 static QDF_STATUS
target_if_cm_roam_oem_eht_mlo_bitmap(struct wlan_objmgr_vdev * vdev)1421 target_if_cm_roam_oem_eht_mlo_bitmap(struct wlan_objmgr_vdev *vdev)
1422 {
1423 QDF_STATUS status = QDF_STATUS_E_FAILURE;
1424 wmi_unified_t wmi_handle;
1425 uint32_t oem_eht_bitmap;
1426 struct wlan_objmgr_psoc *psoc;
1427
1428 psoc = wlan_vdev_get_psoc(vdev);
1429 if (!psoc) {
1430 target_if_err("psoc handle is NULL");
1431 return QDF_STATUS_E_NULL_VALUE;
1432 }
1433
1434 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
1435 if (!wmi_handle)
1436 return status;
1437
1438 status = wlan_mlme_get_oem_eht_mlo_config(psoc, &oem_eht_bitmap);
1439 if (QDF_IS_STATUS_ERROR(status))
1440 return status;
1441
1442 status = target_if_roam_set_param(wmi_handle,
1443 wlan_vdev_get_id(vdev),
1444 WMI_ROAM_PARAM_CRYPTO_EHT_CONFIG,
1445 oem_eht_bitmap);
1446
1447 if (QDF_IS_STATUS_ERROR(status))
1448 target_if_err("Failed to set roam oem eht bitmap");
1449
1450 return status;
1451 }
1452 #else
1453 static inline QDF_STATUS
target_if_cm_roam_oem_eht_mlo_bitmap(struct wlan_objmgr_vdev * vdev)1454 target_if_cm_roam_oem_eht_mlo_bitmap(struct wlan_objmgr_vdev *vdev)
1455 {
1456 return QDF_STATUS_SUCCESS;
1457 }
1458 #endif
1459
1460 #ifdef WLAN_FEATURE_11BE_MLO
1461 /**
1462 * target_if_cm_roam_send_mlo_config() - Send roam mlo related commands
1463 * to wmi
1464 * @vdev: vdev object
1465 * @req: roam mlo config parameters
1466 *
1467 * This function is used to send roam mlo related commands to wmi
1468 *
1469 * Return: QDF_STATUS
1470 */
1471 static QDF_STATUS
target_if_cm_roam_send_mlo_config(struct wlan_objmgr_vdev * vdev,struct wlan_roam_mlo_config * req)1472 target_if_cm_roam_send_mlo_config(struct wlan_objmgr_vdev *vdev,
1473 struct wlan_roam_mlo_config *req)
1474 {
1475 QDF_STATUS status;
1476 wmi_unified_t wmi_handle;
1477
1478 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
1479 if (!wmi_handle)
1480 return QDF_STATUS_E_FAILURE;
1481
1482 status = wmi_unified_roam_mlo_config_cmd(wmi_handle, req);
1483
1484 if (status != QDF_STATUS_SUCCESS)
1485 target_if_err("failed to send WMI_ROAM_MLO_CONFIG_CMDID command");
1486
1487 return status;
1488 }
1489
1490 static void
target_if_cm_roam_register_mlo_req_ops(struct wlan_cm_roam_tx_ops * tx_ops)1491 target_if_cm_roam_register_mlo_req_ops(struct wlan_cm_roam_tx_ops *tx_ops)
1492 {
1493 tx_ops->send_roam_mlo_config = target_if_cm_roam_send_mlo_config;
1494 }
1495 #else
1496 static QDF_STATUS
target_if_cm_roam_send_mlo_config(struct wlan_objmgr_vdev * vdev,struct wlan_roam_mlo_config * req)1497 target_if_cm_roam_send_mlo_config(struct wlan_objmgr_vdev *vdev,
1498 struct wlan_roam_mlo_config *req)
1499 {
1500 return QDF_STATUS_SUCCESS;
1501 }
1502
1503 static void
target_if_cm_roam_register_mlo_req_ops(struct wlan_cm_roam_tx_ops * tx_ops)1504 target_if_cm_roam_register_mlo_req_ops(struct wlan_cm_roam_tx_ops *tx_ops)
1505 {
1506 }
1507 #endif
1508
1509 /**
1510 * target_if_cm_roam_send_start() - Send roam start related commands
1511 * to wmi
1512 * @vdev: vdev object
1513 * @req: roam start config parameters
1514 *
1515 * This function is used to send roam start related commands to wmi
1516 *
1517 * Return: QDF_STATUS
1518 */
1519 static QDF_STATUS
target_if_cm_roam_send_start(struct wlan_objmgr_vdev * vdev,struct wlan_roam_start_config * req)1520 target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
1521 struct wlan_roam_start_config *req)
1522 {
1523 QDF_STATUS status = QDF_STATUS_SUCCESS;
1524 wmi_unified_t wmi_handle;
1525 struct wlan_objmgr_psoc *psoc;
1526 uint8_t vdev_id;
1527 bool bss_load_enabled;
1528 bool eht_capab = false;
1529 bool is_mcc_disallowed;
1530
1531 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
1532 if (!wmi_handle)
1533 return QDF_STATUS_E_FAILURE;
1534
1535 target_if_cm_roam_send_time_sync_cmd(wmi_handle);
1536
1537 status = target_if_cm_roam_scan_offload_rssi_thresh(
1538 wmi_handle,
1539 &req->rssi_params);
1540 if (QDF_IS_STATUS_ERROR(status)) {
1541 target_if_err("Sending roam scan offload rssi thresh failed");
1542 goto end;
1543 }
1544
1545 status = target_if_cm_roam_scan_bmiss_cnt(wmi_handle,
1546 &req->beacon_miss_cnt);
1547 if (QDF_IS_STATUS_ERROR(status)) {
1548 target_if_err("vdev set bmiss bcnt param failed");
1549 goto end;
1550 }
1551 status = target_if_cm_roam_scan_bmiss_timeout(wmi_handle,
1552 &req->bmiss_timeout);
1553 if (QDF_IS_STATUS_ERROR(status)) {
1554 target_if_err("vdev set bmiss timeout param failed");
1555 goto end;
1556 }
1557
1558 target_if_cm_roam_reason_vsie(wmi_handle, &req->reason_vsie_enable);
1559
1560 target_if_cm_roam_triggers(vdev, &req->roam_triggers);
1561
1562 /* Opportunistic scan runs on a timer, value set by
1563 * empty_scan_refresh_period. Age out the entries after 3 such
1564 * cycles.
1565 */
1566 if (req->scan_period_params.empty_scan_refresh_period > 0) {
1567 status = target_if_cm_roam_scan_offload_scan_period(
1568 wmi_handle,
1569 &req->scan_period_params);
1570 if (QDF_IS_STATUS_ERROR(status))
1571 goto end;
1572 }
1573
1574 status = target_if_cm_roam_scan_rssi_change_cmd(
1575 wmi_handle, &req->rssi_change_params);
1576 if (QDF_IS_STATUS_ERROR(status)) {
1577 target_if_err("vdev:%d Sending rssi change threshold failed",
1578 req->rssi_change_params.vdev_id);
1579 goto end;
1580 }
1581
1582 status = target_if_cm_roam_scan_offload_ap_profile(
1583 vdev, wmi_handle,
1584 &req->profile_params);
1585 if (QDF_IS_STATUS_ERROR(status))
1586 goto end;
1587
1588 status = target_if_cm_roam_offload_chan_list(wmi_handle,
1589 &req->rso_chan_info);
1590 if (QDF_IS_STATUS_ERROR(status)) {
1591 target_if_err("vdev:%d Send channel list command failed",
1592 req->rso_chan_info.vdev_id);
1593 goto end;
1594 }
1595
1596 if (wmi_service_enabled(wmi_handle, wmi_service_mawc_support)) {
1597 status = target_if_cm_roam_scan_mawc_params(wmi_handle,
1598 &req->mawc_params);
1599 if (QDF_IS_STATUS_ERROR(status)) {
1600 target_if_err("Sending roaming MAWC params failed");
1601 goto end;
1602 }
1603 } else {
1604 target_if_debug("MAWC roaming not supported by firmware");
1605 }
1606
1607 status = target_if_cm_roam_scan_offload_mode(wmi_handle,
1608 &req->rso_config);
1609 if (QDF_IS_STATUS_ERROR(status)) {
1610 target_if_err("vdev:%d Send RSO mode cmd failed",
1611 req->rso_config.vdev_id);
1612 goto end;
1613 }
1614
1615 status = target_if_cm_roam_scan_filter(wmi_handle,
1616 ROAM_SCAN_OFFLOAD_START,
1617 &req->scan_filter_params);
1618 if (QDF_IS_STATUS_ERROR(status)) {
1619 target_if_err("Sending start for roam scan filter failed");
1620 goto end;
1621 }
1622
1623 status = target_if_cm_roam_scan_btm_offload(wmi_handle,
1624 &req->btm_config);
1625 if (QDF_IS_STATUS_ERROR(status)) {
1626 target_if_err("Sending BTM config to fw failed");
1627 goto end;
1628 }
1629
1630 /*
1631 * Send 11k offload enable and bss load trigger parameters
1632 * to FW as part of RSO Start
1633 */
1634 status = target_if_cm_roam_offload_11k_params(wmi_handle,
1635 &req->roam_11k_params);
1636 if (QDF_IS_STATUS_ERROR(status)) {
1637 target_if_err("11k offload enable not sent, status %d", status);
1638 goto end;
1639 }
1640
1641 psoc = wlan_vdev_get_psoc(vdev);
1642 if (!psoc) {
1643 target_if_err("psoc handle is NULL");
1644 return QDF_STATUS_E_INVAL;
1645 }
1646
1647 wlan_mlme_get_bss_load_enabled(psoc, &bss_load_enabled);
1648 if (bss_load_enabled)
1649 target_if_cm_roam_bss_load_config(wmi_handle,
1650 &req->bss_load_config);
1651
1652 target_if_cm_roam_disconnect_params(wmi_handle, ROAM_SCAN_OFFLOAD_START,
1653 &req->disconnect_params);
1654
1655 target_if_cm_roam_idle_params(wmi_handle, ROAM_SCAN_OFFLOAD_START,
1656 &req->idle_params);
1657 wlan_psoc_mlme_get_11be_capab(psoc, &eht_capab);
1658 if (eht_capab)
1659 target_if_cm_roam_send_mlo_config(vdev, &req->roam_mlo_params);
1660
1661 vdev_id = wlan_vdev_get_id(vdev);
1662 if (req->wlan_roam_rt_stats_config)
1663 target_if_cm_roam_rt_stats_config(vdev, vdev_id,
1664 req->wlan_roam_rt_stats_config);
1665
1666 if (req->wlan_roam_ho_delay_config)
1667 target_if_cm_roam_ho_delay_config(
1668 vdev, vdev_id, req->wlan_roam_ho_delay_config);
1669
1670 if (req->wlan_exclude_rm_partial_scan_freq)
1671 target_if_cm_exclude_rm_partial_scan_freq(
1672 vdev, req->wlan_exclude_rm_partial_scan_freq);
1673
1674 if (req->wlan_roam_full_scan_6ghz_on_disc)
1675 target_if_cm_roam_full_scan_6ghz_on_disc(
1676 vdev, req->wlan_roam_full_scan_6ghz_on_disc);
1677
1678 is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc);
1679 target_if_cm_roam_mcc_disallow(vdev, vdev_id, is_mcc_disallowed);
1680
1681 if (req->wlan_roam_rssi_diff_6ghz)
1682 target_if_cm_roam_rssi_diff_6ghz(vdev,
1683 req->wlan_roam_rssi_diff_6ghz);
1684
1685 status = target_if_cm_roam_oem_eht_mlo_bitmap(vdev);
1686 /* add other wmi commands */
1687 end:
1688 return status;
1689 }
1690
1691 #ifdef WLAN_FEATURE_11BE_MLO
1692 static QDF_STATUS
target_if_start_rso_stop_timer(struct wlan_objmgr_vdev * vdev)1693 target_if_start_rso_stop_timer(struct wlan_objmgr_vdev *vdev)
1694 {
1695 struct wlan_objmgr_psoc *psoc;
1696 uint8_t vdev_id;
1697 struct wlan_lmac_if_mlme_rx_ops *rx_ops;
1698 struct vdev_response_timer *vdev_rsp;
1699
1700 psoc = wlan_vdev_get_psoc(vdev);
1701 if (!psoc) {
1702 target_if_err("psoc handle is NULL");
1703 return QDF_STATUS_E_INVAL;
1704 }
1705
1706 vdev_id = wlan_vdev_get_id(vdev);
1707 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
1708 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
1709 mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id,
1710 wlan_psoc_get_id(psoc));
1711 return QDF_STATUS_E_INVAL;
1712 }
1713
1714 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
1715 if (!vdev_rsp) {
1716 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
1717 wlan_psoc_get_id(psoc));
1718 return QDF_STATUS_E_INVAL;
1719 }
1720
1721 vdev_rsp->expire_time = RSO_STOP_RESPONSE_TIMER;
1722
1723 return target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
1724 RSO_STOP_RESPONSE_BIT);
1725 }
1726
1727 static bool
target_if_is_vdev_rsp_valid(struct wlan_objmgr_psoc * psoc,struct vdev_response_timer ** vdev_rsp,struct wlan_lmac_if_mlme_rx_ops * rx_ops,uint8_t vdev_id)1728 target_if_is_vdev_rsp_valid(struct wlan_objmgr_psoc *psoc,
1729 struct vdev_response_timer **vdev_rsp,
1730 struct wlan_lmac_if_mlme_rx_ops *rx_ops,
1731 uint8_t vdev_id)
1732 {
1733 *vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
1734 if (!*vdev_rsp) {
1735 mlme_err("MLO_ROAM: vdev rsp not found for vdev:%d", vdev_id);
1736 return false;
1737 }
1738
1739 if (qdf_atomic_test_bit(RSO_STOP_RESPONSE_BIT,
1740 &((*vdev_rsp)->rsp_status))) {
1741 mlme_debug("MLO_ROAM: RSO bit set on vdev id %d",
1742 (*vdev_rsp)->vdev_id);
1743 return true;
1744 }
1745
1746 /* Failure case vdev_rsp is set to NULL */
1747 *vdev_rsp = NULL;
1748
1749 return false;
1750 }
1751
1752 /**
1753 * target_if_find_active_rso_stop_rsp() - Iterate through ml vdevs to find
1754 * the vdev rsp for which RSO_STOP_RESPONSE_BIT is set.
1755 * @roam_event: Roam event data
1756 *
1757 * This is needed when for e.g.: host sends rso stop on vdev id 0, fw response
1758 * is received on vdev 1.
1759 * Since the timer is vdev specific, this function will iterate through ml vdevs
1760 * to find the vdev_rsp on which RSO_STOP_RESPONSE_BIT is set.
1761 *
1762 * Return: struct vdev_response_timer for success, NULL for failure
1763 */
1764 static struct vdev_response_timer *
target_if_find_active_rso_stop_rsp(struct roam_offload_roam_event * roam_event)1765 target_if_find_active_rso_stop_rsp(struct roam_offload_roam_event *roam_event)
1766 {
1767 struct vdev_response_timer *vdev_rsp = NULL;
1768 struct wlan_lmac_if_mlme_rx_ops *rx_ops;
1769 struct wlan_objmgr_vdev *vdev;
1770 struct wlan_mlo_dev_context *mlo_dev_ctx;
1771 uint8_t i;
1772 QDF_STATUS status;
1773
1774 rx_ops = target_if_vdev_mgr_get_rx_ops(roam_event->psoc);
1775 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
1776 mlme_err("No Rx Ops");
1777 return NULL;
1778 }
1779
1780 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(roam_event->psoc,
1781 roam_event->vdev_id,
1782 WLAN_MLME_SB_ID);
1783 if (!vdev)
1784 return NULL;
1785
1786 /* For legacy case use the incoming vdev */
1787 if (target_if_is_vdev_rsp_valid(roam_event->psoc, &vdev_rsp,
1788 rx_ops, roam_event->vdev_id))
1789 goto end;
1790
1791 mlo_dev_ctx = vdev->mlo_dev_ctx;
1792 if (!mlo_dev_ctx)
1793 goto end;
1794
1795 /*
1796 * if vdev_rsp with RSO_STOP_RESPONSE bit is not set then check for
1797 * the same on other ML vdevs
1798 */
1799 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
1800 if (!mlo_dev_ctx->wlan_vdev_list[i])
1801 continue;
1802
1803 status = wlan_objmgr_vdev_try_get_ref(mlo_dev_ctx->wlan_vdev_list[i],
1804 WLAN_MLO_MGR_ID);
1805 if (QDF_IS_STATUS_ERROR(status))
1806 continue;
1807
1808 if (target_if_is_vdev_rsp_valid(roam_event->psoc, &vdev_rsp,
1809 rx_ops,
1810 wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]))) {
1811 mlo_release_vdev_ref(mlo_dev_ctx->wlan_vdev_list[i]);
1812 goto end;
1813 }
1814
1815 mlo_release_vdev_ref(mlo_dev_ctx->wlan_vdev_list[i]);
1816 }
1817
1818 if (i == WLAN_UMAC_MLO_MAX_VDEVS) {
1819 mlme_err("RSO bit not set on any mlo vdev");
1820 goto end;
1821 }
1822
1823 end:
1824 if (vdev)
1825 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID);
1826
1827 return vdev_rsp;
1828 }
1829
1830 QDF_STATUS
target_if_stop_rso_stop_timer(struct roam_offload_roam_event * roam_event)1831 target_if_stop_rso_stop_timer(struct roam_offload_roam_event *roam_event)
1832 {
1833 QDF_STATUS status = QDF_STATUS_SUCCESS;
1834 struct vdev_response_timer *vdev_rsp;
1835
1836 roam_event->rso_timer_stopped = false;
1837 if (roam_event->reason == ROAM_REASON_RSO_STATUS &&
1838 roam_event->notif == CM_ROAM_NOTIF_HO_FAIL) {
1839 mlme_debug("HO_FAIL happened, wait for HO_FAIL event vdev_id: %u",
1840 roam_event->vdev_id);
1841 }
1842
1843 vdev_rsp = target_if_find_active_rso_stop_rsp(roam_event);
1844 if (!vdev_rsp) {
1845 mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
1846 roam_event->vdev_id,
1847 wlan_psoc_get_id(roam_event->psoc));
1848 return QDF_STATUS_E_INVAL;
1849 }
1850
1851 switch (roam_event->reason) {
1852 case ROAM_REASON_RSO_STATUS:
1853 if (roam_event->notif != CM_ROAM_NOTIF_SCAN_MODE_SUCCESS &&
1854 roam_event->notif != CM_ROAM_NOTIF_SCAN_MODE_FAIL)
1855 break;
1856
1857 /*
1858 * fallthrough if notif == CM_ROAM_NOTIF_SCAN_MODE_SUCCESS or
1859 * notif == CM_ROAM_NOTIF_SCAN_MODE_FAIL
1860 */
1861 fallthrough;
1862 case ROAM_REASON_HO_FAILED:
1863 status = target_if_vdev_mgr_rsp_timer_stop(roam_event->psoc,
1864 vdev_rsp,
1865 RSO_STOP_RESPONSE_BIT);
1866 roam_event->rso_timer_stopped = true;
1867 if (QDF_IS_STATUS_ERROR(status)) {
1868 roam_event->rso_timer_stopped = false;
1869 mlme_err("PSOC_%d VDEV_%d: VDEV MGR RSO Stop RSP Timer stop failed",
1870 roam_event->psoc->soc_objmgr.psoc_id,
1871 roam_event->vdev_id);
1872 }
1873 break;
1874 default:
1875 return status;
1876 }
1877
1878 return status;
1879 }
1880 #else
1881 static inline QDF_STATUS
target_if_start_rso_stop_timer(struct wlan_objmgr_vdev * vdev)1882 target_if_start_rso_stop_timer(struct wlan_objmgr_vdev *vdev)
1883 {
1884 return QDF_STATUS_E_NOSUPPORT;
1885 }
1886 #endif
1887
1888 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
1889 QDF_STATUS
target_if_cm_send_rso_stop_failure_rsp(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)1890 target_if_cm_send_rso_stop_failure_rsp(struct wlan_objmgr_psoc *psoc,
1891 uint8_t vdev_id)
1892 {
1893 struct wlan_cm_roam_rx_ops *roam_rx_ops;
1894 struct roam_offload_roam_event roam_event = {0};
1895
1896 roam_event.vdev_id = vdev_id;
1897 roam_event.psoc = psoc;
1898 roam_event.reason = ROAM_REASON_RSO_STATUS;
1899 roam_event.notif = CM_ROAM_NOTIF_SCAN_MODE_FAIL;
1900 roam_event.rso_timer_stopped = true;
1901
1902 roam_rx_ops = target_if_cm_get_roam_rx_ops(psoc);
1903 if (!roam_rx_ops || !roam_rx_ops->roam_event_rx) {
1904 target_if_err("No valid roam rx ops");
1905 return QDF_STATUS_E_INVAL;
1906 }
1907 roam_rx_ops->roam_event_rx(&roam_event);
1908
1909 return QDF_STATUS_SUCCESS;
1910 }
1911 #endif
1912
1913 static QDF_STATUS
target_if_cm_roam_abort_rso_stop_timer(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)1914 target_if_cm_roam_abort_rso_stop_timer(struct wlan_objmgr_psoc *psoc,
1915 uint8_t vdev_id)
1916 {
1917 struct vdev_response_timer *vdev_rsp;
1918 struct wlan_lmac_if_mlme_rx_ops *rx_ops;
1919
1920 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
1921 if (!rx_ops || !rx_ops->vdev_mgr_start_response) {
1922 mlme_err("No Rx Ops");
1923 return QDF_STATUS_E_INVAL;
1924 }
1925 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
1926 if (!vdev_rsp) {
1927 mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
1928 vdev_id, wlan_psoc_get_id(psoc));
1929 return QDF_STATUS_E_INVAL;
1930 }
1931
1932 return target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
1933 RSO_STOP_RESPONSE_BIT);
1934 }
1935
1936 /**
1937 * target_if_cm_roam_send_stop() - Send roam stop related commands
1938 * to wmi
1939 * @vdev: vdev object
1940 * @req: roam stop config parameters
1941 *
1942 * This function is used to send roam stop related commands to wmi
1943 *
1944 * Return: QDF_STATUS
1945 */
1946 static QDF_STATUS
target_if_cm_roam_send_stop(struct wlan_objmgr_vdev * vdev,struct wlan_roam_stop_config * req)1947 target_if_cm_roam_send_stop(struct wlan_objmgr_vdev *vdev,
1948 struct wlan_roam_stop_config *req)
1949 {
1950 QDF_STATUS status = QDF_STATUS_SUCCESS;
1951 QDF_STATUS timer_start_status = QDF_STATUS_E_NOSUPPORT;
1952 QDF_STATUS rso_stop_status = QDF_STATUS_E_INVAL;
1953 wmi_unified_t wmi_handle;
1954 struct wlan_objmgr_psoc *psoc;
1955 uint8_t vdev_id;
1956
1957 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
1958 if (!wmi_handle)
1959 return QDF_STATUS_E_FAILURE;
1960
1961 psoc = wlan_vdev_get_psoc(vdev);
1962 if (!psoc) {
1963 target_if_err("psoc handle is NULL");
1964 return QDF_STATUS_E_INVAL;
1965 }
1966
1967 /* Send 11k offload disable command to FW as part of RSO Stop */
1968 status = target_if_cm_roam_offload_11k_params(wmi_handle,
1969 &req->roam_11k_params);
1970 if (QDF_IS_STATUS_ERROR(status)) {
1971 target_if_err("11k offload disable not sent, status %d",
1972 status);
1973 goto end;
1974 }
1975
1976 /* Send BTM config as disabled during RSO Stop */
1977 status = target_if_cm_roam_scan_btm_offload(wmi_handle,
1978 &req->btm_config);
1979 if (QDF_IS_STATUS_ERROR(status)) {
1980 target_if_err("Sending BTM config to fw failed");
1981 goto end;
1982 }
1983
1984 if (req->start_rso_stop_timer)
1985 timer_start_status = target_if_start_rso_stop_timer(vdev);
1986
1987 rso_stop_status = target_if_cm_roam_scan_offload_mode(wmi_handle,
1988 &req->rso_config);
1989 if (QDF_IS_STATUS_ERROR(rso_stop_status)) {
1990 target_if_err("vdev:%d Send RSO mode cmd failed",
1991 req->rso_config.vdev_id);
1992 goto end;
1993 }
1994
1995 /*
1996 * After sending the roam scan mode because of a disconnect,
1997 * clear the scan bitmap client as well by sending
1998 * the following command
1999 */
2000 target_if_cm_roam_scan_offload_rssi_thresh(wmi_handle,
2001 &req->rssi_params);
2002
2003 /*
2004 * If the STOP command is due to a disconnect, then
2005 * send the filter command to clear all the filter
2006 * entries. If it is roaming scenario, then do not
2007 * send the cleared entries.
2008 */
2009 if (!req->middle_of_roaming) {
2010 status = target_if_cm_roam_scan_filter(
2011 wmi_handle, ROAM_SCAN_OFFLOAD_STOP,
2012 &req->scan_filter_params);
2013 if (QDF_IS_STATUS_ERROR(status)) {
2014 target_if_err("clear for roam scan filter failed");
2015 goto end;
2016 }
2017 }
2018
2019 target_if_cm_roam_disconnect_params(wmi_handle, ROAM_SCAN_OFFLOAD_STOP,
2020 &req->disconnect_params);
2021
2022 target_if_cm_roam_idle_params(wmi_handle, ROAM_SCAN_OFFLOAD_STOP,
2023 &req->idle_params);
2024 /*
2025 * Disable all roaming triggers if RSO stop is as part of
2026 * disconnect
2027 */
2028 vdev_id = wlan_vdev_get_id(vdev);
2029 if (req->rso_config.rso_mode_info.roam_scan_mode ==
2030 WMI_ROAM_SCAN_MODE_NONE) {
2031 req->roam_triggers.vdev_id = vdev_id;
2032 req->roam_triggers.trigger_bitmap = 0;
2033 req->roam_triggers.roam_scan_scheme_bitmap = 0;
2034 target_if_cm_roam_triggers(vdev, &req->roam_triggers);
2035 }
2036 end:
2037 if (QDF_IS_STATUS_SUCCESS(timer_start_status)) {
2038 if (QDF_IS_STATUS_SUCCESS(rso_stop_status)) {
2039 /*
2040 * Started the timer and send RSO stop to firmware
2041 * successfully. Wait for RSO STOP response from fw.
2042 */
2043 req->send_rso_stop_resp = false;
2044 } else {
2045 /*
2046 * Started the timer and but failed to send RSO stop to
2047 * firmware. Stop the timer and let the response be
2048 * poseted from CM.
2049 */
2050 target_if_cm_roam_abort_rso_stop_timer(psoc,
2051 wlan_vdev_get_id(vdev));
2052 }
2053 }
2054
2055 return status;
2056 }
2057
2058 /**
2059 * target_if_cm_roam_send_update_config() - Send roam update config related
2060 * commands to wmi
2061 * @vdev: vdev object
2062 * @req: roam update config parameters
2063 *
2064 * Return: QDF_STATUS
2065 */
2066 static QDF_STATUS
target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev * vdev,struct wlan_roam_update_config * req)2067 target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
2068 struct wlan_roam_update_config *req)
2069 {
2070 QDF_STATUS status = QDF_STATUS_SUCCESS;
2071 wmi_unified_t wmi_handle;
2072 struct wlan_objmgr_psoc *psoc;
2073 uint8_t vdev_id;
2074 bool is_mcc_disallowed;
2075
2076 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
2077 if (!wmi_handle)
2078 return QDF_STATUS_E_FAILURE;
2079
2080 status = target_if_cm_roam_scan_bmiss_cnt(wmi_handle,
2081 &req->beacon_miss_cnt);
2082 if (QDF_IS_STATUS_ERROR(status)) {
2083 target_if_err("vdev set bmiss bcnt param failed");
2084 goto end;
2085 }
2086
2087 status = target_if_cm_roam_scan_bmiss_timeout(wmi_handle,
2088 &req->bmiss_timeout);
2089 if (QDF_IS_STATUS_ERROR(status)) {
2090 target_if_err("vdev set bmiss timeout param failed");
2091 goto end;
2092 }
2093
2094 status = target_if_cm_roam_scan_filter(wmi_handle,
2095 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2096 &req->scan_filter_params);
2097 if (QDF_IS_STATUS_ERROR(status)) {
2098 target_if_err("Sending update for roam scan filter failed");
2099 goto end;
2100 }
2101
2102 status = target_if_cm_roam_scan_offload_rssi_thresh(
2103 wmi_handle,
2104 &req->rssi_params);
2105 if (QDF_IS_STATUS_ERROR(status)) {
2106 target_if_err("Sending roam scan offload rssi thresh failed");
2107 goto end;
2108 }
2109
2110 if (req->scan_period_params.empty_scan_refresh_period > 0) {
2111 status = target_if_cm_roam_scan_offload_scan_period(
2112 wmi_handle,
2113 &req->scan_period_params);
2114 if (QDF_IS_STATUS_ERROR(status))
2115 goto end;
2116 }
2117
2118 status = target_if_cm_roam_scan_rssi_change_cmd(
2119 wmi_handle, &req->rssi_change_params);
2120 if (QDF_IS_STATUS_ERROR(status)) {
2121 target_if_err("vdev:%d Sending rssi change threshold failed",
2122 req->rssi_change_params.vdev_id);
2123 goto end;
2124 }
2125
2126 status = target_if_cm_roam_scan_offload_ap_profile(
2127 vdev, wmi_handle,
2128 &req->profile_params);
2129 if (QDF_IS_STATUS_ERROR(status))
2130 goto end;
2131
2132 status = target_if_cm_roam_offload_chan_list(wmi_handle,
2133 &req->rso_chan_info);
2134 if (QDF_IS_STATUS_ERROR(status)) {
2135 target_if_err("vdev:%d Send channel list command failed",
2136 req->rso_chan_info.vdev_id);
2137 goto end;
2138 }
2139
2140 psoc = wlan_vdev_get_psoc(vdev);
2141 if (!psoc) {
2142 target_if_err("psoc handle is NULL");
2143 return QDF_STATUS_E_INVAL;
2144 }
2145 vdev_id = wlan_vdev_get_id(vdev);
2146
2147 if (MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
2148 status = target_if_cm_roam_scan_offload_mode(wmi_handle,
2149 &req->rso_config);
2150 if (QDF_IS_STATUS_ERROR(status)) {
2151 target_if_err("vdev:%d Send RSO mode cmd failed",
2152 req->rso_config.vdev_id);
2153 goto end;
2154 }
2155
2156 target_if_cm_roam_disconnect_params(
2157 wmi_handle, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2158 &req->disconnect_params);
2159
2160 target_if_cm_roam_idle_params(
2161 wmi_handle, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2162 &req->idle_params);
2163 target_if_cm_roam_triggers(vdev, &req->roam_triggers);
2164
2165 if (req->wlan_roam_rt_stats_config)
2166 target_if_cm_roam_rt_stats_config(
2167 vdev, vdev_id,
2168 req->wlan_roam_rt_stats_config);
2169
2170 if (req->wlan_roam_ho_delay_config)
2171 target_if_cm_roam_ho_delay_config(
2172 vdev, vdev_id,
2173 req->wlan_roam_ho_delay_config);
2174
2175 if (req->wlan_exclude_rm_partial_scan_freq)
2176 target_if_cm_exclude_rm_partial_scan_freq(
2177 vdev, req->wlan_exclude_rm_partial_scan_freq);
2178
2179 if (req->wlan_roam_full_scan_6ghz_on_disc)
2180 target_if_cm_roam_full_scan_6ghz_on_disc(
2181 vdev, req->wlan_roam_full_scan_6ghz_on_disc);
2182
2183 is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc);
2184 target_if_cm_roam_mcc_disallow(vdev, vdev_id,
2185 is_mcc_disallowed);
2186
2187 if (req->wlan_roam_rssi_diff_6ghz)
2188 target_if_cm_roam_rssi_diff_6ghz(
2189 vdev, req->wlan_roam_rssi_diff_6ghz);
2190
2191 status = target_if_cm_roam_oem_eht_mlo_bitmap(vdev);
2192 }
2193 end:
2194 return status;
2195 }
2196
2197 /**
2198 * target_if_cm_roam_update_freqs() - Send roam frequencies to fw
2199 * @vdev: vdev object
2200 * @req: roam channels to update to firmware
2201 *
2202 * Return: QDF_STATUS
2203 */
2204 static QDF_STATUS
target_if_cm_roam_update_freqs(struct wlan_objmgr_vdev * vdev,struct wlan_roam_scan_channel_list * req)2205 target_if_cm_roam_update_freqs(struct wlan_objmgr_vdev *vdev,
2206 struct wlan_roam_scan_channel_list *req)
2207 {
2208 QDF_STATUS status = QDF_STATUS_SUCCESS;
2209 wmi_unified_t wmi_handle;
2210
2211 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
2212 if (!wmi_handle)
2213 return QDF_STATUS_E_FAILURE;
2214
2215 status = target_if_cm_roam_offload_chan_list(wmi_handle, req);
2216 if (QDF_IS_STATUS_ERROR(status))
2217 target_if_err("vdev:%d Send channel list command failed",
2218 req->vdev_id);
2219
2220 return status;
2221 }
2222
2223 /**
2224 * target_if_cm_roam_abort() - Send roam abort to wmi
2225 * @vdev: vdev object
2226 * @vdev_id: vdev id
2227 *
2228 * Return: QDF_STATUS
2229 */
2230 static QDF_STATUS
target_if_cm_roam_abort(struct wlan_objmgr_vdev * vdev,uint8_t vdev_id)2231 target_if_cm_roam_abort(struct wlan_objmgr_vdev *vdev, uint8_t vdev_id)
2232 {
2233 wmi_unified_t wmi_handle;
2234
2235 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
2236 if (!wmi_handle)
2237 return QDF_STATUS_E_FAILURE;
2238
2239 if (!target_if_is_vdev_valid(vdev_id)) {
2240 target_if_err("Invalid vdev id:%d", vdev_id);
2241 return QDF_STATUS_E_FAILURE;
2242 }
2243 return wmi_unified_roam_scan_offload_cmd(wmi_handle,
2244 WMI_ROAM_SCAN_STOP_CMD,
2245 vdev_id);
2246 }
2247
2248 /**
2249 * target_if_cm_roam_per_config() - Send roam per config related
2250 * commands to wmi
2251 * @vdev: vdev object
2252 * @req: roam per config parameters
2253 *
2254 * Return: QDF_STATUS
2255 */
2256 static QDF_STATUS
target_if_cm_roam_per_config(struct wlan_objmgr_vdev * vdev,struct wlan_per_roam_config_req * req)2257 target_if_cm_roam_per_config(struct wlan_objmgr_vdev *vdev,
2258 struct wlan_per_roam_config_req *req)
2259 {
2260 wmi_unified_t wmi_handle;
2261
2262 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
2263 if (!wmi_handle)
2264 return QDF_STATUS_E_FAILURE;
2265
2266 return wmi_unified_set_per_roam_config(wmi_handle, req);
2267 }
2268
2269 /**
2270 * target_if_cm_roam_send_disable_config() - Send roam disable config related
2271 * commands to wmi
2272 * @vdev: vdev object
2273 * @req: roam disable config parameters
2274 *
2275 * Return: QDF_STATUS
2276 */
2277 static QDF_STATUS
target_if_cm_roam_send_disable_config(struct wlan_objmgr_vdev * vdev,struct roam_disable_cfg * req)2278 target_if_cm_roam_send_disable_config(struct wlan_objmgr_vdev *vdev,
2279 struct roam_disable_cfg *req)
2280 {
2281 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2282 wmi_unified_t wmi_handle;
2283 struct vdev_mlme_obj *vdev_mlme;
2284
2285 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
2286 if (!vdev_mlme) {
2287 target_if_err("Failed to get vdev mlme obj!");
2288 goto end;
2289 }
2290
2291 if (vdev_mlme->mgmt.generic.type != WMI_VDEV_TYPE_STA ||
2292 vdev_mlme->mgmt.generic.subtype != 0) {
2293 target_if_err("This isn't a STA: %d", req->vdev_id);
2294 goto end;
2295 }
2296
2297 wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
2298 if (!wmi_handle)
2299 goto end;
2300
2301 status = target_if_vdev_set_param(
2302 wmi_handle,
2303 req->vdev_id,
2304 wmi_vdev_param_roam_11kv_ctrl,
2305 req->cfg);
2306
2307 if (QDF_IS_STATUS_ERROR(status))
2308 target_if_err("Failed to set wmi_vdev_param_roam_11kv_ctrl");
2309
2310 end:
2311 return status;
2312 }
2313
2314 /**
2315 * target_if_cm_roam_register_rso_req_ops() - Register rso req tx ops functions
2316 * @tx_ops: tx ops
2317 *
2318 * This function is used to register rso req tx ops functions
2319 *
2320 * Return: none
2321 */
2322 static void
target_if_cm_roam_register_rso_req_ops(struct wlan_cm_roam_tx_ops * tx_ops)2323 target_if_cm_roam_register_rso_req_ops(struct wlan_cm_roam_tx_ops *tx_ops)
2324 {
2325 tx_ops->send_roam_offload_init_req = target_if_cm_roam_send_roam_init;
2326 tx_ops->send_roam_start_req = target_if_cm_roam_send_start;
2327 tx_ops->send_roam_stop_offload = target_if_cm_roam_send_stop;
2328 tx_ops->send_roam_update_config = target_if_cm_roam_send_update_config;
2329 tx_ops->send_roam_abort = target_if_cm_roam_abort;
2330 tx_ops->send_roam_per_config = target_if_cm_roam_per_config;
2331 tx_ops->send_roam_triggers = target_if_cm_roam_triggers;
2332 tx_ops->send_roam_disable_config =
2333 target_if_cm_roam_send_disable_config;
2334 tx_ops->send_roam_frequencies = target_if_cm_roam_update_freqs;
2335 target_if_cm_roam_register_mlo_req_ops(tx_ops);
2336 }
2337
target_if_cm_roam_register_tx_ops(struct wlan_cm_roam_tx_ops * tx_ops)2338 QDF_STATUS target_if_cm_roam_register_tx_ops(struct wlan_cm_roam_tx_ops *tx_ops)
2339 {
2340 if (!tx_ops) {
2341 target_if_err("target if tx ops is NULL!");
2342 return QDF_STATUS_E_INVAL;
2343 }
2344
2345 target_if_cm_roam_register_lfr3_ops(tx_ops);
2346 target_if_cm_roam_register_rso_req_ops(tx_ops);
2347
2348 return QDF_STATUS_SUCCESS;
2349 }
2350