wlan_mlme_ucfg_api.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696
  1. /*
  2. * Copyright (c) 2018-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. * DOC: define UCFG APIs exposed by the mlme component
  20. */
  21. #include "cfg_ucfg_api.h"
  22. #include "cfg_mlme_sta.h"
  23. #include "wlan_mlme_main.h"
  24. #include "wlan_mlme_api.h"
  25. #include "wlan_mlme_ucfg_api.h"
  26. #include "wlan_objmgr_pdev_obj.h"
  27. #include "wlan_mlme_vdev_mgr_interface.h"
  28. #ifdef CONFIG_VDEV_SM
  29. #include <include/wlan_pdev_mlme.h>
  30. #include "wlan_pdev_mlme_api.h"
  31. #endif
  32. #ifdef CONFIG_VDEV_SM
  33. static QDF_STATUS ucfg_mlme_vdev_init(void)
  34. {
  35. return QDF_STATUS_SUCCESS;
  36. }
  37. static QDF_STATUS ucfg_mlme_vdev_deinit(void)
  38. {
  39. return QDF_STATUS_SUCCESS;
  40. }
  41. QDF_STATUS ucfg_mlme_global_init(void)
  42. {
  43. mlme_register_mlme_ext_ops();
  44. return QDF_STATUS_SUCCESS;
  45. }
  46. QDF_STATUS ucfg_mlme_global_deinit(void)
  47. {
  48. return QDF_STATUS_SUCCESS;
  49. }
  50. #else
  51. static QDF_STATUS ucfg_mlme_vdev_init(void)
  52. {
  53. QDF_STATUS status;
  54. status = wlan_objmgr_register_vdev_create_handler(
  55. WLAN_UMAC_COMP_MLME,
  56. mlme_vdev_object_created_notification,
  57. NULL);
  58. if (QDF_IS_STATUS_ERROR(status)) {
  59. mlme_err("unable to register vdev create handle");
  60. return status;
  61. }
  62. status = wlan_objmgr_register_vdev_destroy_handler(
  63. WLAN_UMAC_COMP_MLME,
  64. mlme_vdev_object_destroyed_notification,
  65. NULL);
  66. if (QDF_IS_STATUS_ERROR(status))
  67. mlme_err("unable to register vdev create handle");
  68. return status;
  69. }
  70. static QDF_STATUS ucfg_mlme_vdev_deinit(void)
  71. {
  72. QDF_STATUS status;
  73. status = wlan_objmgr_unregister_vdev_destroy_handler(
  74. WLAN_UMAC_COMP_MLME,
  75. mlme_vdev_object_destroyed_notification,
  76. NULL);
  77. if (QDF_IS_STATUS_ERROR(status))
  78. mlme_err("unable to unregister vdev destroy handle");
  79. status = wlan_objmgr_unregister_vdev_create_handler(
  80. WLAN_UMAC_COMP_MLME,
  81. mlme_vdev_object_created_notification,
  82. NULL);
  83. if (QDF_IS_STATUS_ERROR(status))
  84. mlme_err("unable to unregister vdev create handle");
  85. return status;
  86. }
  87. #endif
  88. QDF_STATUS ucfg_mlme_init(void)
  89. {
  90. QDF_STATUS status;
  91. status = wlan_objmgr_register_psoc_create_handler(
  92. WLAN_UMAC_COMP_MLME,
  93. mlme_psoc_object_created_notification,
  94. NULL);
  95. if (status != QDF_STATUS_SUCCESS) {
  96. mlme_err("unable to register psoc create handle");
  97. return status;
  98. }
  99. status = wlan_objmgr_register_psoc_destroy_handler(
  100. WLAN_UMAC_COMP_MLME,
  101. mlme_psoc_object_destroyed_notification,
  102. NULL);
  103. if (status != QDF_STATUS_SUCCESS) {
  104. mlme_err("unable to register psoc create handle");
  105. return status;
  106. }
  107. status = ucfg_mlme_vdev_init();
  108. if (QDF_IS_STATUS_ERROR(status))
  109. return status;
  110. status = wlan_objmgr_register_peer_create_handler(
  111. WLAN_UMAC_COMP_MLME,
  112. mlme_peer_object_created_notification,
  113. NULL);
  114. if (QDF_IS_STATUS_ERROR(status)) {
  115. mlme_err("peer create register notification failed");
  116. return QDF_STATUS_E_FAILURE;
  117. }
  118. status = wlan_objmgr_register_peer_destroy_handler(
  119. WLAN_UMAC_COMP_MLME,
  120. mlme_peer_object_destroyed_notification,
  121. NULL);
  122. if (QDF_IS_STATUS_ERROR(status)) {
  123. mlme_err("peer destroy register notification failed");
  124. return QDF_STATUS_E_FAILURE;
  125. }
  126. return status;
  127. }
  128. QDF_STATUS ucfg_mlme_deinit(void)
  129. {
  130. QDF_STATUS status;
  131. status = wlan_objmgr_unregister_peer_destroy_handler(
  132. WLAN_UMAC_COMP_MLME,
  133. mlme_peer_object_destroyed_notification,
  134. NULL);
  135. if (QDF_IS_STATUS_ERROR(status))
  136. mlme_err("unable to unregister peer destroy handle");
  137. status = wlan_objmgr_unregister_peer_create_handler(
  138. WLAN_UMAC_COMP_MLME,
  139. mlme_peer_object_created_notification,
  140. NULL);
  141. if (QDF_IS_STATUS_ERROR(status))
  142. mlme_err("unable to unregister peer create handle");
  143. status = ucfg_mlme_vdev_deinit();
  144. if (QDF_IS_STATUS_ERROR(status))
  145. mlme_err("unable to unregister vdev destroy handle");
  146. status = wlan_objmgr_unregister_psoc_destroy_handler(
  147. WLAN_UMAC_COMP_MLME,
  148. mlme_psoc_object_destroyed_notification,
  149. NULL);
  150. if (QDF_IS_STATUS_ERROR(status))
  151. mlme_err("unable to unregister psoc destroy handle");
  152. status = wlan_objmgr_unregister_psoc_create_handler(
  153. WLAN_UMAC_COMP_MLME,
  154. mlme_psoc_object_created_notification,
  155. NULL);
  156. if (status != QDF_STATUS_SUCCESS)
  157. mlme_err("unable to unregister psoc create handle");
  158. return status;
  159. }
  160. QDF_STATUS ucfg_mlme_psoc_open(struct wlan_objmgr_psoc *psoc)
  161. {
  162. QDF_STATUS status;
  163. status = mlme_cfg_on_psoc_enable(psoc);
  164. if (!QDF_IS_STATUS_SUCCESS(status))
  165. mlme_err("Failed to initialize MLME CFG");
  166. return status;
  167. }
  168. void ucfg_mlme_psoc_close(struct wlan_objmgr_psoc *psoc)
  169. {
  170. /* Clear the MLME CFG Structure */
  171. }
  172. #ifdef CONFIG_VDEV_SM
  173. QDF_STATUS ucfg_mlme_pdev_open(struct wlan_objmgr_pdev *pdev)
  174. {
  175. struct pdev_mlme_obj *pdev_mlme;
  176. pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev);
  177. if (!pdev_mlme) {
  178. mlme_err(" PDEV MLME is NULL");
  179. return QDF_STATUS_E_FAILURE;
  180. }
  181. pdev_mlme->mlme_register_ops = mlme_register_vdev_mgr_ops;
  182. return QDF_STATUS_SUCCESS;
  183. }
  184. QDF_STATUS ucfg_mlme_pdev_close(struct wlan_objmgr_pdev *pdev)
  185. {
  186. return QDF_STATUS_SUCCESS;
  187. }
  188. #endif
  189. QDF_STATUS
  190. ucfg_mlme_get_sta_keep_alive_period(struct wlan_objmgr_psoc *psoc,
  191. uint32_t *val)
  192. {
  193. struct wlan_mlme_psoc_obj *mlme_obj;
  194. mlme_obj = mlme_get_psoc_obj(psoc);
  195. if (!mlme_obj) {
  196. *val = cfg_default(CFG_INFRA_STA_KEEP_ALIVE_PERIOD);
  197. return QDF_STATUS_E_INVAL;
  198. }
  199. *val = mlme_obj->cfg.sta.sta_keep_alive_period;
  200. return QDF_STATUS_SUCCESS;
  201. }
  202. QDF_STATUS
  203. ucfg_mlme_get_dfs_master_capability(struct wlan_objmgr_psoc *psoc,
  204. bool *val)
  205. {
  206. struct wlan_mlme_psoc_obj *mlme_obj;
  207. mlme_obj = mlme_get_psoc_obj(psoc);
  208. if (!mlme_obj) {
  209. *val = cfg_default(CFG_ENABLE_DFS_MASTER_CAPABILITY);
  210. return QDF_STATUS_E_INVAL;
  211. }
  212. *val = mlme_obj->cfg.dfs_cfg.dfs_master_capable;
  213. return QDF_STATUS_SUCCESS;
  214. }
  215. QDF_STATUS
  216. ucfg_mlme_get_fine_time_meas_cap(struct wlan_objmgr_psoc *psoc,
  217. uint32_t *fine_time_meas_cap)
  218. {
  219. struct wlan_mlme_psoc_obj *mlme_obj;
  220. mlme_obj = mlme_get_psoc_obj(psoc);
  221. if (!mlme_obj) {
  222. *fine_time_meas_cap =
  223. cfg_default(CFG_FINE_TIME_MEAS_CAPABILITY);
  224. return QDF_STATUS_E_INVAL;
  225. }
  226. *fine_time_meas_cap = mlme_obj->cfg.wifi_pos_cfg.fine_time_meas_cap;
  227. return QDF_STATUS_SUCCESS;
  228. }
  229. QDF_STATUS
  230. ucfg_mlme_set_fine_time_meas_cap(struct wlan_objmgr_psoc *psoc,
  231. uint32_t fine_time_meas_cap)
  232. {
  233. struct wlan_mlme_psoc_obj *mlme_obj;
  234. mlme_obj = mlme_get_psoc_obj(psoc);
  235. if (!mlme_obj)
  236. return QDF_STATUS_E_INVAL;
  237. mlme_obj->cfg.wifi_pos_cfg.fine_time_meas_cap = fine_time_meas_cap;
  238. return QDF_STATUS_SUCCESS;
  239. }
  240. QDF_STATUS
  241. ucfg_mlme_get_dfs_disable_channel_switch(struct wlan_objmgr_psoc *psoc,
  242. bool *dfs_disable_channel_switch)
  243. {
  244. struct wlan_mlme_psoc_obj *mlme_obj;
  245. mlme_obj = mlme_get_psoc_obj(psoc);
  246. if (!mlme_obj) {
  247. *dfs_disable_channel_switch =
  248. cfg_default(CFG_DISABLE_DFS_CH_SWITCH);
  249. return QDF_STATUS_E_INVAL;
  250. }
  251. *dfs_disable_channel_switch =
  252. mlme_obj->cfg.dfs_cfg.dfs_disable_channel_switch;
  253. return QDF_STATUS_SUCCESS;
  254. }
  255. QDF_STATUS
  256. ucfg_mlme_set_dfs_disable_channel_switch(struct wlan_objmgr_psoc *psoc,
  257. bool dfs_disable_channel_switch)
  258. {
  259. struct wlan_mlme_psoc_obj *mlme_obj;
  260. mlme_obj = mlme_get_psoc_obj(psoc);
  261. if (!mlme_obj) {
  262. return QDF_STATUS_E_INVAL;
  263. }
  264. mlme_obj->cfg.dfs_cfg.dfs_disable_channel_switch =
  265. dfs_disable_channel_switch;
  266. return QDF_STATUS_SUCCESS;
  267. }
  268. QDF_STATUS
  269. ucfg_mlme_get_dfs_ignore_cac(struct wlan_objmgr_psoc *psoc,
  270. bool *dfs_ignore_cac)
  271. {
  272. struct wlan_mlme_psoc_obj *mlme_obj;
  273. mlme_obj = mlme_get_psoc_obj(psoc);
  274. if (!mlme_obj) {
  275. *dfs_ignore_cac = cfg_default(CFG_IGNORE_CAC);
  276. return QDF_STATUS_E_INVAL;
  277. }
  278. *dfs_ignore_cac = mlme_obj->cfg.dfs_cfg.dfs_ignore_cac;
  279. return QDF_STATUS_SUCCESS;
  280. }
  281. QDF_STATUS
  282. ucfg_mlme_set_dfs_ignore_cac(struct wlan_objmgr_psoc *psoc,
  283. bool dfs_ignore_cac)
  284. {
  285. struct wlan_mlme_psoc_obj *mlme_obj;
  286. mlme_obj = mlme_get_psoc_obj(psoc);
  287. if (!mlme_obj)
  288. return QDF_STATUS_E_INVAL;
  289. mlme_obj->cfg.dfs_cfg.dfs_ignore_cac = dfs_ignore_cac;
  290. return QDF_STATUS_SUCCESS;
  291. }
  292. QDF_STATUS
  293. ucfg_mlme_get_sap_tx_leakage_threshold(struct wlan_objmgr_psoc *psoc,
  294. uint32_t *sap_tx_leakage_threshold)
  295. {
  296. struct wlan_mlme_psoc_obj *mlme_obj;
  297. mlme_obj = mlme_get_psoc_obj(psoc);
  298. if (!mlme_obj) {
  299. *sap_tx_leakage_threshold =
  300. cfg_default(CFG_SAP_TX_LEAKAGE_THRESHOLD);
  301. return QDF_STATUS_E_INVAL;
  302. }
  303. *sap_tx_leakage_threshold =
  304. mlme_obj->cfg.dfs_cfg.sap_tx_leakage_threshold;
  305. return QDF_STATUS_SUCCESS;
  306. }
  307. QDF_STATUS
  308. ucfg_mlme_set_sap_tx_leakage_threshold(struct wlan_objmgr_psoc *psoc,
  309. uint32_t sap_tx_leakage_threshold)
  310. {
  311. struct wlan_mlme_psoc_obj *mlme_obj;
  312. mlme_obj = mlme_get_psoc_obj(psoc);
  313. if (!mlme_obj)
  314. return QDF_STATUS_E_INVAL;
  315. mlme_obj->cfg.dfs_cfg.sap_tx_leakage_threshold =
  316. sap_tx_leakage_threshold;
  317. return QDF_STATUS_SUCCESS;
  318. }
  319. QDF_STATUS
  320. ucfg_mlme_get_dfs_filter_offload(struct wlan_objmgr_psoc *psoc,
  321. bool *dfs_filter_offload)
  322. {
  323. struct wlan_mlme_psoc_obj *mlme_obj;
  324. mlme_obj = mlme_get_psoc_obj(psoc);
  325. if (!mlme_obj) {
  326. *dfs_filter_offload =
  327. cfg_default(CFG_ENABLE_DFS_PHYERR_FILTEROFFLOAD);
  328. return QDF_STATUS_E_INVAL;
  329. }
  330. *dfs_filter_offload = mlme_obj->cfg.dfs_cfg.dfs_filter_offload;
  331. return QDF_STATUS_SUCCESS;
  332. }
  333. QDF_STATUS
  334. ucfg_mlme_set_dfs_filter_offload(struct wlan_objmgr_psoc *psoc,
  335. bool dfs_filter_offload)
  336. {
  337. struct wlan_mlme_psoc_obj *mlme_obj;
  338. mlme_obj = mlme_get_psoc_obj(psoc);
  339. if (!mlme_obj)
  340. return QDF_STATUS_E_INVAL;
  341. mlme_obj->cfg.dfs_cfg.dfs_filter_offload = dfs_filter_offload;
  342. return QDF_STATUS_SUCCESS;
  343. }
  344. QDF_STATUS
  345. ucfg_mlme_get_pmkid_modes(struct wlan_objmgr_psoc *psoc,
  346. uint32_t *val)
  347. {
  348. struct wlan_mlme_psoc_obj *mlme_obj;
  349. mlme_obj = mlme_get_psoc_obj(psoc);
  350. if (!mlme_obj) {
  351. *val = cfg_default(CFG_PMKID_MODES);
  352. return QDF_STATUS_E_INVAL;
  353. }
  354. *val = mlme_obj->cfg.sta.pmkid_modes;
  355. return QDF_STATUS_SUCCESS;
  356. }
  357. QDF_STATUS
  358. ucfg_mlme_set_pmkid_modes(struct wlan_objmgr_psoc *psoc,
  359. uint32_t val)
  360. {
  361. struct wlan_mlme_psoc_obj *mlme_obj;
  362. mlme_obj = mlme_get_psoc_obj(psoc);
  363. if (!mlme_obj)
  364. return QDF_STATUS_E_INVAL;
  365. mlme_obj->cfg.sta.pmkid_modes = val;
  366. return QDF_STATUS_SUCCESS;
  367. }
  368. QDF_STATUS
  369. ucfg_mlme_get_twt_requestor(struct wlan_objmgr_psoc *psoc,
  370. bool *val)
  371. {
  372. struct wlan_mlme_psoc_obj *mlme_obj;
  373. mlme_obj = mlme_get_psoc_obj(psoc);
  374. if (!mlme_obj) {
  375. *val = cfg_default(CFG_TWT_REQUESTOR);
  376. return QDF_STATUS_E_INVAL;
  377. }
  378. *val = mlme_obj->cfg.twt_cfg.is_twt_requestor_enabled;
  379. return QDF_STATUS_SUCCESS;
  380. }
  381. QDF_STATUS
  382. ucfg_mlme_set_twt_requestor(struct wlan_objmgr_psoc *psoc,
  383. bool val)
  384. {
  385. struct wlan_mlme_psoc_obj *mlme_obj;
  386. mlme_obj = mlme_get_psoc_obj(psoc);
  387. if (!mlme_obj)
  388. return QDF_STATUS_E_INVAL;
  389. mlme_obj->cfg.twt_cfg.is_twt_requestor_enabled = val;
  390. return QDF_STATUS_SUCCESS;
  391. }
  392. QDF_STATUS
  393. ucfg_mlme_get_twt_responder(struct wlan_objmgr_psoc *psoc,
  394. bool *val)
  395. {
  396. struct wlan_mlme_psoc_obj *mlme_obj;
  397. mlme_obj = mlme_get_psoc_obj(psoc);
  398. if (!mlme_obj) {
  399. *val = cfg_default(CFG_TWT_RESPONDER);
  400. return QDF_STATUS_E_INVAL;
  401. }
  402. *val = mlme_obj->cfg.twt_cfg.is_twt_responder_enabled;
  403. return QDF_STATUS_SUCCESS;
  404. }
  405. QDF_STATUS
  406. ucfg_mlme_set_twt_responder(struct wlan_objmgr_psoc *psoc,
  407. bool val)
  408. {
  409. struct wlan_mlme_psoc_obj *mlme_obj;
  410. mlme_obj = mlme_get_psoc_obj(psoc);
  411. if (!mlme_obj)
  412. return QDF_STATUS_E_INVAL;
  413. mlme_obj->cfg.twt_cfg.is_twt_responder_enabled = val;
  414. return QDF_STATUS_SUCCESS;
  415. }
  416. QDF_STATUS
  417. ucfg_mlme_get_bcast_twt(struct wlan_objmgr_psoc *psoc,
  418. bool *val)
  419. {
  420. struct wlan_mlme_psoc_obj *mlme_obj;
  421. mlme_obj = mlme_get_psoc_obj(psoc);
  422. if (!mlme_obj) {
  423. *val = cfg_default(CFG_BCAST_TWT);
  424. return QDF_STATUS_E_INVAL;
  425. }
  426. *val = mlme_obj->cfg.twt_cfg.is_twt_bcast_enabled;
  427. return QDF_STATUS_SUCCESS;
  428. }
  429. QDF_STATUS
  430. ucfg_mlme_set_bcast_twt(struct wlan_objmgr_psoc *psoc,
  431. bool val)
  432. {
  433. struct wlan_mlme_psoc_obj *mlme_obj;
  434. mlme_obj = mlme_get_psoc_obj(psoc);
  435. if (!mlme_obj)
  436. return QDF_STATUS_E_INVAL;
  437. mlme_obj->cfg.twt_cfg.is_twt_bcast_enabled = val;
  438. return QDF_STATUS_SUCCESS;
  439. }
  440. QDF_STATUS
  441. ucfg_mlme_get_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc,
  442. uint32_t *val)
  443. {
  444. struct wlan_mlme_psoc_obj *mlme_obj;
  445. mlme_obj = mlme_get_psoc_obj(psoc);
  446. if (!mlme_obj) {
  447. *val = cfg_default(CFG_TWT_CONGESTION_TIMEOUT);
  448. return QDF_STATUS_E_INVAL;
  449. }
  450. *val = mlme_obj->cfg.twt_cfg.twt_congestion_timeout;
  451. return QDF_STATUS_SUCCESS;
  452. }
  453. QDF_STATUS
  454. ucfg_mlme_set_twt_congestion_timeout(struct wlan_objmgr_psoc *psoc,
  455. uint32_t val)
  456. {
  457. struct wlan_mlme_psoc_obj *mlme_obj;
  458. mlme_obj = mlme_get_psoc_obj(psoc);
  459. if (!mlme_obj)
  460. return QDF_STATUS_E_INVAL;
  461. mlme_obj->cfg.twt_cfg.twt_congestion_timeout = val;
  462. return QDF_STATUS_SUCCESS;
  463. }
  464. QDF_STATUS
  465. ucfg_mlme_get_enable_twt(struct wlan_objmgr_psoc *psoc,
  466. bool *val)
  467. {
  468. struct wlan_mlme_psoc_obj *mlme_obj;
  469. mlme_obj = mlme_get_psoc_obj(psoc);
  470. if (!mlme_obj) {
  471. *val = cfg_default(CFG_ENABLE_TWT);
  472. return QDF_STATUS_E_INVAL;
  473. }
  474. *val = mlme_obj->cfg.twt_cfg.is_twt_enabled;
  475. return QDF_STATUS_SUCCESS;
  476. }
  477. QDF_STATUS
  478. ucfg_mlme_set_enable_twt(struct wlan_objmgr_psoc *psoc,
  479. bool val)
  480. {
  481. struct wlan_mlme_psoc_obj *mlme_obj;
  482. mlme_obj = mlme_get_psoc_obj(psoc);
  483. if (!mlme_obj)
  484. return QDF_STATUS_E_INVAL;
  485. mlme_obj->cfg.twt_cfg.is_twt_enabled = val;
  486. return QDF_STATUS_SUCCESS;
  487. }
  488. QDF_STATUS
  489. ucfg_mlme_get_dot11p_mode(struct wlan_objmgr_psoc *psoc,
  490. enum dot11p_mode *out_mode)
  491. {
  492. struct wlan_mlme_psoc_obj *mlme_obj;
  493. mlme_obj = mlme_get_psoc_obj(psoc);
  494. if (!mlme_obj) {
  495. *out_mode = cfg_default(CFG_DOT11P_MODE);
  496. return QDF_STATUS_E_INVAL;
  497. }
  498. *out_mode = mlme_obj->cfg.sta.dot11p_mode;
  499. return QDF_STATUS_SUCCESS;
  500. }
  501. QDF_STATUS
  502. ucfg_mlme_get_go_cts2self_for_sta(struct wlan_objmgr_psoc *psoc,
  503. bool *val)
  504. {
  505. struct wlan_mlme_psoc_obj *mlme_obj;
  506. mlme_obj = mlme_get_psoc_obj(psoc);
  507. if (!mlme_obj) {
  508. *val = cfg_default(CFG_ENABLE_GO_CTS2SELF_FOR_STA);
  509. return QDF_STATUS_E_INVAL;
  510. }
  511. *val = mlme_obj->cfg.sta.enable_go_cts2self_for_sta;
  512. return QDF_STATUS_SUCCESS;
  513. }
  514. QDF_STATUS
  515. ucfg_mlme_get_force_rsne_override(struct wlan_objmgr_psoc *psoc,
  516. bool *val)
  517. {
  518. struct wlan_mlme_psoc_obj *mlme_obj;
  519. mlme_obj = mlme_get_psoc_obj(psoc);
  520. if (!mlme_obj) {
  521. *val = cfg_default(CFG_FORCE_RSNE_OVERRIDE);
  522. return QDF_STATUS_E_INVAL;
  523. }
  524. *val = mlme_obj->cfg.sta.force_rsne_override;
  525. return QDF_STATUS_SUCCESS;
  526. }
  527. QDF_STATUS
  528. ucfg_mlme_get_qcn_ie_support(struct wlan_objmgr_psoc *psoc,
  529. bool *val)
  530. {
  531. struct wlan_mlme_psoc_obj *mlme_obj;
  532. mlme_obj = mlme_get_psoc_obj(psoc);
  533. if (!mlme_obj) {
  534. *val = cfg_default(CFG_QCN_IE_SUPPORT);
  535. return QDF_STATUS_E_INVAL;
  536. }
  537. *val = mlme_obj->cfg.sta.qcn_ie_support;
  538. return QDF_STATUS_SUCCESS;
  539. }
  540. QDF_STATUS
  541. ucfg_mlme_get_tgt_gtx_usr_cfg(struct wlan_objmgr_psoc *psoc,
  542. uint32_t *val)
  543. {
  544. struct wlan_mlme_psoc_obj *mlme_obj;
  545. mlme_obj = mlme_get_psoc_obj(psoc);
  546. if (!mlme_obj) {
  547. *val = cfg_default(CFG_TGT_GTX_USR_CFG);
  548. return QDF_STATUS_E_INVAL;
  549. }
  550. *val = mlme_obj->cfg.sta.tgt_gtx_usr_cfg;
  551. return QDF_STATUS_SUCCESS;
  552. }
  553. QDF_STATUS
  554. ucfg_mlme_is_override_ht20_40_24g(struct wlan_objmgr_psoc *psoc, bool *val)
  555. {
  556. struct wlan_mlme_psoc_obj *mlme_obj;
  557. mlme_obj = mlme_get_psoc_obj(psoc);
  558. if (!mlme_obj) {
  559. *val = cfg_default(CFG_OBSS_HT40_OVERRIDE_HT40_20_24GHZ);
  560. return QDF_STATUS_E_INVAL;
  561. }
  562. *val = mlme_obj->cfg.obss_ht40.is_override_ht20_40_24g;
  563. return QDF_STATUS_SUCCESS;
  564. }
  565. #ifdef WLAN_FEATURE_ROAM_OFFLOAD
  566. QDF_STATUS
  567. ucfg_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
  568. bool *val)
  569. {
  570. struct wlan_mlme_psoc_obj *mlme_obj;
  571. mlme_obj = mlme_get_psoc_obj(psoc);
  572. if (!mlme_obj) {
  573. *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD);
  574. return QDF_STATUS_E_INVAL;
  575. }
  576. *val = mlme_obj->cfg.lfr.lfr3_roaming_offload;
  577. return QDF_STATUS_SUCCESS;
  578. }
  579. QDF_STATUS
  580. ucfg_mlme_set_roaming_offload(struct wlan_objmgr_psoc *psoc,
  581. bool val)
  582. {
  583. struct wlan_mlme_psoc_obj *mlme_obj;
  584. mlme_obj = mlme_get_psoc_obj(psoc);
  585. if (!mlme_obj)
  586. return QDF_STATUS_E_INVAL;
  587. mlme_obj->cfg.lfr.lfr3_roaming_offload = val;
  588. return QDF_STATUS_SUCCESS;
  589. }
  590. #endif
  591. QDF_STATUS
  592. ucfg_mlme_get_first_scan_bucket_threshold(struct wlan_objmgr_psoc *psoc,
  593. uint8_t *val)
  594. {
  595. struct wlan_mlme_psoc_obj *mlme_obj;
  596. mlme_obj = mlme_get_psoc_obj(psoc);
  597. if (!mlme_obj) {
  598. *val = cfg_default(CFG_LFR_FIRST_SCAN_BUCKET_THRESHOLD);
  599. return QDF_STATUS_E_INVAL;
  600. }
  601. *val = mlme_obj->cfg.lfr.first_scan_bucket_threshold;
  602. return QDF_STATUS_SUCCESS;
  603. }
  604. QDF_STATUS
  605. ucfg_mlme_is_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  606. {
  607. struct wlan_mlme_psoc_obj *mlme_obj;
  608. mlme_obj = mlme_get_psoc_obj(psoc);
  609. if (!mlme_obj) {
  610. *val = cfg_default(CFG_LFR_MAWC_FEATURE_ENABLED);
  611. return QDF_STATUS_E_INVAL;
  612. }
  613. *val = mlme_obj->cfg.lfr.mawc_enabled;
  614. return QDF_STATUS_SUCCESS;
  615. }
  616. QDF_STATUS
  617. ucfg_mlme_set_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool val)
  618. {
  619. struct wlan_mlme_psoc_obj *mlme_obj;
  620. mlme_obj = mlme_get_psoc_obj(psoc);
  621. if (!mlme_obj)
  622. return QDF_STATUS_E_INVAL;
  623. mlme_obj->cfg.lfr.mawc_enabled = val;
  624. return QDF_STATUS_SUCCESS;
  625. }
  626. QDF_STATUS
  627. ucfg_mlme_is_fast_transition_enabled(struct wlan_objmgr_psoc *psoc,
  628. bool *val)
  629. {
  630. struct wlan_mlme_psoc_obj *mlme_obj;
  631. mlme_obj = mlme_get_psoc_obj(psoc);
  632. if (!mlme_obj) {
  633. *val = cfg_default(CFG_LFR_FAST_TRANSITION_ENABLED);
  634. return QDF_STATUS_E_INVAL;
  635. }
  636. *val = mlme_obj->cfg.lfr.fast_transition_enabled;
  637. return QDF_STATUS_SUCCESS;
  638. }
  639. QDF_STATUS
  640. ucfg_mlme_set_fast_transition_enabled(struct wlan_objmgr_psoc *psoc,
  641. bool val)
  642. {
  643. struct wlan_mlme_psoc_obj *mlme_obj;
  644. mlme_obj = mlme_get_psoc_obj(psoc);
  645. if (!mlme_obj)
  646. return QDF_STATUS_E_INVAL;
  647. mlme_obj->cfg.lfr.fast_transition_enabled = val;
  648. return QDF_STATUS_SUCCESS;
  649. }
  650. QDF_STATUS
  651. ucfg_mlme_is_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
  652. bool *val)
  653. {
  654. struct wlan_mlme_psoc_obj *mlme_obj;
  655. mlme_obj = mlme_get_psoc_obj(psoc);
  656. if (!mlme_obj) {
  657. *val = cfg_default(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
  658. return QDF_STATUS_E_INVAL;
  659. }
  660. *val = mlme_obj->cfg.lfr.roam_scan_offload_enabled;
  661. return QDF_STATUS_SUCCESS;
  662. }
  663. QDF_STATUS
  664. ucfg_mlme_set_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
  665. bool val)
  666. {
  667. struct wlan_mlme_psoc_obj *mlme_obj;
  668. mlme_obj = mlme_get_psoc_obj(psoc);
  669. if (!mlme_obj)
  670. return QDF_STATUS_E_INVAL;
  671. mlme_obj->cfg.lfr.roam_scan_offload_enabled = val;
  672. return QDF_STATUS_SUCCESS;
  673. }
  674. QDF_STATUS
  675. ucfg_mlme_get_neighbor_scan_max_chan_time(struct wlan_objmgr_psoc *psoc,
  676. uint16_t *val)
  677. {
  678. struct wlan_mlme_psoc_obj *mlme_obj;
  679. mlme_obj = mlme_get_psoc_obj(psoc);
  680. if (!mlme_obj) {
  681. *val = cfg_default(CFG_LFR_NEIGHBOR_SCAN_MAX_CHAN_TIME);
  682. return QDF_STATUS_E_INVAL;
  683. }
  684. *val = mlme_obj->cfg.lfr.neighbor_scan_max_chan_time;
  685. return QDF_STATUS_SUCCESS;
  686. }
  687. QDF_STATUS
  688. ucfg_mlme_get_neighbor_scan_min_chan_time(struct wlan_objmgr_psoc *psoc,
  689. uint16_t *val)
  690. {
  691. struct wlan_mlme_psoc_obj *mlme_obj;
  692. mlme_obj = mlme_get_psoc_obj(psoc);
  693. if (!mlme_obj) {
  694. *val = cfg_default(CFG_LFR_NEIGHBOR_SCAN_MIN_CHAN_TIME);
  695. return QDF_STATUS_E_INVAL;
  696. }
  697. *val = mlme_obj->cfg.lfr.neighbor_scan_min_chan_time;
  698. return QDF_STATUS_SUCCESS;
  699. }
  700. QDF_STATUS
  701. ucfg_mlme_get_delay_before_vdev_stop(struct wlan_objmgr_psoc *psoc,
  702. uint8_t *val)
  703. {
  704. struct wlan_mlme_psoc_obj *mlme_obj;
  705. mlme_obj = mlme_get_psoc_obj(psoc);
  706. if (!mlme_obj) {
  707. *val = cfg_default(CFG_LFR_DELAY_BEFORE_VDEV_STOP);
  708. return QDF_STATUS_E_INVAL;
  709. }
  710. *val = mlme_obj->cfg.lfr.delay_before_vdev_stop;
  711. return QDF_STATUS_SUCCESS;
  712. }
  713. QDF_STATUS
  714. ucfg_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
  715. uint8_t *val)
  716. {
  717. struct wlan_mlme_psoc_obj *mlme_obj;
  718. mlme_obj = mlme_get_psoc_obj(psoc);
  719. if (!mlme_obj) {
  720. *val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
  721. return QDF_STATUS_E_INVAL;
  722. }
  723. *val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
  724. return QDF_STATUS_SUCCESS;
  725. }
  726. QDF_STATUS
  727. ucfg_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
  728. uint8_t *val)
  729. {
  730. struct wlan_mlme_psoc_obj *mlme_obj;
  731. mlme_obj = mlme_get_psoc_obj(psoc);
  732. if (!mlme_obj) {
  733. *val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
  734. return QDF_STATUS_E_INVAL;
  735. }
  736. *val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
  737. return QDF_STATUS_SUCCESS;
  738. }
  739. QDF_STATUS
  740. ucfg_mlme_is_lfr_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  741. {
  742. struct wlan_mlme_psoc_obj *mlme_obj;
  743. mlme_obj = mlme_get_psoc_obj(psoc);
  744. if (!mlme_obj) {
  745. *val = cfg_default(CFG_LFR_FEATURE_ENABLED);
  746. return QDF_STATUS_E_INVAL;
  747. }
  748. *val = mlme_obj->cfg.lfr.lfr_enabled;
  749. return QDF_STATUS_SUCCESS;
  750. }
  751. QDF_STATUS
  752. ucfg_mlme_set_lfr_enabled(struct wlan_objmgr_psoc *psoc, bool val)
  753. {
  754. struct wlan_mlme_psoc_obj *mlme_obj;
  755. mlme_obj = mlme_get_psoc_obj(psoc);
  756. if (!mlme_obj)
  757. return QDF_STATUS_E_INVAL;
  758. mlme_obj->cfg.lfr.lfr_enabled = val;
  759. return QDF_STATUS_SUCCESS;
  760. }
  761. QDF_STATUS
  762. ucfg_mlme_is_roam_prefer_5ghz(struct wlan_objmgr_psoc *psoc, bool *val)
  763. {
  764. struct wlan_mlme_psoc_obj *mlme_obj;
  765. mlme_obj = mlme_get_psoc_obj(psoc);
  766. if (!mlme_obj) {
  767. *val = cfg_default(CFG_LFR_ROAM_PREFER_5GHZ);
  768. return QDF_STATUS_E_INVAL;
  769. }
  770. *val = mlme_obj->cfg.lfr.roam_prefer_5ghz;
  771. return QDF_STATUS_SUCCESS;
  772. }
  773. QDF_STATUS
  774. ucfg_mlme_set_roam_intra_band(struct wlan_objmgr_psoc *psoc, bool val)
  775. {
  776. struct wlan_mlme_psoc_obj *mlme_obj;
  777. mlme_obj = mlme_get_psoc_obj(psoc);
  778. if (!mlme_obj)
  779. return QDF_STATUS_E_INVAL;
  780. mlme_obj->cfg.lfr.roam_intra_band = val;
  781. return QDF_STATUS_SUCCESS;
  782. }
  783. QDF_STATUS
  784. ucfg_mlme_get_home_away_time(struct wlan_objmgr_psoc *psoc, uint16_t *val)
  785. {
  786. struct wlan_mlme_psoc_obj *mlme_obj;
  787. mlme_obj = mlme_get_psoc_obj(psoc);
  788. if (!mlme_obj) {
  789. *val = cfg_default(CFG_LFR_ROAM_SCAN_HOME_AWAY_TIME);
  790. return QDF_STATUS_E_INVAL;
  791. }
  792. *val = mlme_obj->cfg.lfr.roam_scan_home_away_time;
  793. return QDF_STATUS_SUCCESS;
  794. }
  795. QDF_STATUS
  796. ucfg_mlme_set_fast_roam_in_concurrency_enabled(struct wlan_objmgr_psoc *psoc,
  797. bool val)
  798. {
  799. struct wlan_mlme_psoc_obj *mlme_obj;
  800. mlme_obj = mlme_get_psoc_obj(psoc);
  801. if (!mlme_obj)
  802. return QDF_STATUS_E_INVAL;
  803. mlme_obj->cfg.lfr.enable_fast_roam_in_concurrency = val;
  804. return QDF_STATUS_SUCCESS;
  805. }
  806. #ifdef FEATURE_WLAN_ESE
  807. QDF_STATUS
  808. ucfg_mlme_is_ese_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  809. {
  810. struct wlan_mlme_psoc_obj *mlme_obj;
  811. mlme_obj = mlme_get_psoc_obj(psoc);
  812. if (!mlme_obj) {
  813. *val = cfg_default(CFG_LFR_ESE_FEATURE_ENABLED);
  814. return QDF_STATUS_E_INVAL;
  815. }
  816. *val = mlme_obj->cfg.lfr.ese_enabled;
  817. return QDF_STATUS_SUCCESS;
  818. }
  819. #endif /* FEATURE_WLAN_ESE */
  820. QDF_STATUS
  821. ucfg_mlme_get_opr_rate_set(struct wlan_objmgr_psoc *psoc,
  822. uint8_t *buf, qdf_size_t *len)
  823. {
  824. struct wlan_mlme_psoc_obj *mlme_obj;
  825. mlme_obj = mlme_get_psoc_obj(psoc);
  826. if (!mlme_obj)
  827. return QDF_STATUS_E_INVAL;
  828. return wlan_mlme_get_cfg_str(buf, &mlme_obj->cfg.rates.opr_rate_set,
  829. len);
  830. }
  831. QDF_STATUS
  832. ucfg_mlme_get_ext_opr_rate_set(struct wlan_objmgr_psoc *psoc,
  833. uint8_t *buf, qdf_size_t *len)
  834. {
  835. struct wlan_mlme_psoc_obj *mlme_obj;
  836. mlme_obj = mlme_get_psoc_obj(psoc);
  837. if (!mlme_obj)
  838. return QDF_STATUS_E_INVAL;
  839. return wlan_mlme_get_cfg_str(buf, &mlme_obj->cfg.rates.ext_opr_rate_set,
  840. len);
  841. }
  842. QDF_STATUS
  843. ucfg_mlme_get_supported_mcs_set(struct wlan_objmgr_psoc *psoc,
  844. uint8_t *buf, qdf_size_t *len)
  845. {
  846. struct wlan_mlme_psoc_obj *mlme_obj;
  847. mlme_obj = mlme_get_psoc_obj(psoc);
  848. if (!mlme_obj)
  849. return QDF_STATUS_E_INVAL;
  850. return wlan_mlme_get_cfg_str(buf,
  851. &mlme_obj->cfg.rates.supported_mcs_set,
  852. len);
  853. }
  854. QDF_STATUS
  855. ucfg_mlme_set_supported_mcs_set(struct wlan_objmgr_psoc *psoc,
  856. uint8_t *buf, qdf_size_t len)
  857. {
  858. struct wlan_mlme_psoc_obj *mlme_obj;
  859. mlme_obj = mlme_get_psoc_obj(psoc);
  860. if (!mlme_obj)
  861. return QDF_STATUS_E_INVAL;
  862. return wlan_mlme_set_cfg_str(buf,
  863. &mlme_obj->cfg.rates.supported_mcs_set,
  864. len);
  865. }
  866. QDF_STATUS
  867. ucfg_mlme_get_current_mcs_set(struct wlan_objmgr_psoc *psoc,
  868. uint8_t *buf, qdf_size_t *len)
  869. {
  870. struct wlan_mlme_psoc_obj *mlme_obj;
  871. mlme_obj = mlme_get_psoc_obj(psoc);
  872. if (!mlme_obj)
  873. return QDF_STATUS_E_INVAL;
  874. return wlan_mlme_get_cfg_str(buf,
  875. &mlme_obj->cfg.rates.current_mcs_set,
  876. len);
  877. }
  878. QDF_STATUS
  879. ucfg_mlme_get_wmi_wq_watchdog_timeout(struct wlan_objmgr_psoc *psoc,
  880. uint32_t *wmi_wq_watchdog_timeout)
  881. {
  882. struct wlan_mlme_psoc_obj *mlme_obj;
  883. mlme_obj = mlme_get_psoc_obj(psoc);
  884. if (!mlme_obj) {
  885. *wmi_wq_watchdog_timeout = cfg_default(CFG_WMI_WQ_WATCHDOG);
  886. return QDF_STATUS_E_INVAL;
  887. }
  888. *wmi_wq_watchdog_timeout =
  889. mlme_obj->cfg.timeouts.wmi_wq_watchdog_timeout;
  890. return QDF_STATUS_SUCCESS;
  891. }
  892. QDF_STATUS
  893. ucfg_mlme_set_wmi_wq_watchdog_timeout(struct wlan_objmgr_psoc *psoc,
  894. uint32_t wmi_wq_watchdog_timeout)
  895. {
  896. struct wlan_mlme_psoc_obj *mlme_obj;
  897. mlme_obj = mlme_get_psoc_obj(psoc);
  898. if (!mlme_obj)
  899. return QDF_STATUS_E_INVAL;
  900. if (!cfg_in_range(CFG_WMI_WQ_WATCHDOG, wmi_wq_watchdog_timeout)) {
  901. mlme_err("wmi watchdog bite timeout is invalid %d",
  902. wmi_wq_watchdog_timeout);
  903. return QDF_STATUS_E_INVAL;
  904. }
  905. mlme_obj->cfg.timeouts.wmi_wq_watchdog_timeout =
  906. wmi_wq_watchdog_timeout;
  907. return QDF_STATUS_SUCCESS;
  908. }
  909. QDF_STATUS
  910. ucfg_mlme_stats_get_periodic_display_time(struct wlan_objmgr_psoc *psoc,
  911. uint32_t *periodic_display_time)
  912. {
  913. struct wlan_mlme_psoc_obj *mlme_obj;
  914. mlme_obj = mlme_get_psoc_obj(psoc);
  915. if (!mlme_obj) {
  916. *periodic_display_time =
  917. cfg_default(CFG_PERIODIC_STATS_DISPLAY_TIME);
  918. return QDF_STATUS_E_INVAL;
  919. }
  920. *periodic_display_time =
  921. mlme_obj->cfg.stats.stats_periodic_display_time;
  922. return QDF_STATUS_SUCCESS;
  923. }
  924. QDF_STATUS
  925. ucfg_mlme_stats_get_cfg_values(struct wlan_objmgr_psoc *psoc,
  926. int *link_speed_rssi_high,
  927. int *link_speed_rssi_mid,
  928. int *link_speed_rssi_low,
  929. uint32_t *link_speed_rssi_report)
  930. {
  931. struct wlan_mlme_psoc_obj *mlme_obj;
  932. mlme_obj = mlme_get_psoc_obj(psoc);
  933. if (!mlme_obj) {
  934. *link_speed_rssi_high =
  935. cfg_default(CFG_LINK_SPEED_RSSI_HIGH);
  936. *link_speed_rssi_mid =
  937. cfg_default(CFG_LINK_SPEED_RSSI_MID);
  938. *link_speed_rssi_low =
  939. cfg_default(CFG_LINK_SPEED_RSSI_LOW);
  940. *link_speed_rssi_report =
  941. cfg_default(CFG_REPORT_MAX_LINK_SPEED);
  942. return QDF_STATUS_E_INVAL;
  943. }
  944. *link_speed_rssi_high =
  945. mlme_obj->cfg.stats.stats_link_speed_rssi_high;
  946. *link_speed_rssi_mid =
  947. mlme_obj->cfg.stats.stats_link_speed_rssi_med;
  948. *link_speed_rssi_low =
  949. mlme_obj->cfg.stats.stats_link_speed_rssi_low;
  950. *link_speed_rssi_report =
  951. mlme_obj->cfg.stats.stats_report_max_link_speed_rssi;
  952. return QDF_STATUS_SUCCESS;
  953. }
  954. bool ucfg_mlme_stats_is_link_speed_report_actual(struct wlan_objmgr_psoc *psoc)
  955. {
  956. struct wlan_mlme_psoc_obj *mlme_obj;
  957. int report_link_speed = 0;
  958. mlme_obj = mlme_get_psoc_obj(psoc);
  959. if (!mlme_obj)
  960. report_link_speed = cfg_default(CFG_REPORT_MAX_LINK_SPEED);
  961. else
  962. report_link_speed =
  963. mlme_obj->cfg.stats.stats_report_max_link_speed_rssi;
  964. return (report_link_speed == CFG_STATS_LINK_SPEED_REPORT_ACTUAL);
  965. }
  966. bool ucfg_mlme_stats_is_link_speed_report_max(struct wlan_objmgr_psoc *psoc)
  967. {
  968. struct wlan_mlme_psoc_obj *mlme_obj;
  969. int report_link_speed = 0;
  970. mlme_obj = mlme_get_psoc_obj(psoc);
  971. if (!mlme_obj)
  972. report_link_speed = cfg_default(CFG_REPORT_MAX_LINK_SPEED);
  973. else
  974. report_link_speed =
  975. mlme_obj->cfg.stats.stats_report_max_link_speed_rssi;
  976. return (report_link_speed == CFG_STATS_LINK_SPEED_REPORT_MAX);
  977. }
  978. bool
  979. ucfg_mlme_stats_is_link_speed_report_max_scaled(struct wlan_objmgr_psoc *psoc)
  980. {
  981. struct wlan_mlme_psoc_obj *mlme_obj;
  982. int report_link_speed = 0;
  983. mlme_obj = mlme_get_psoc_obj(psoc);
  984. if (!mlme_obj)
  985. report_link_speed = cfg_default(CFG_REPORT_MAX_LINK_SPEED);
  986. else
  987. report_link_speed =
  988. mlme_obj->cfg.stats.stats_report_max_link_speed_rssi;
  989. return (report_link_speed == CFG_STATS_LINK_SPEED_REPORT_MAX_SCALED);
  990. }
  991. QDF_STATUS
  992. ucfg_mlme_get_ps_data_inactivity_timeout(struct wlan_objmgr_psoc *psoc,
  993. uint32_t *inactivity_timeout)
  994. {
  995. struct wlan_mlme_psoc_obj *mlme_obj;
  996. mlme_obj = mlme_get_psoc_obj(psoc);
  997. if (!mlme_obj) {
  998. *inactivity_timeout =
  999. cfg_default(CFG_PS_DATA_INACTIVITY_TIMEOUT);
  1000. return QDF_STATUS_E_FAILURE;
  1001. }
  1002. *inactivity_timeout = mlme_obj->cfg.timeouts.ps_data_inactivity_timeout;
  1003. return QDF_STATUS_SUCCESS;
  1004. }
  1005. QDF_STATUS
  1006. ucfg_mlme_set_ps_data_inactivity_timeout(struct wlan_objmgr_psoc *psoc,
  1007. uint32_t inactivity_timeout)
  1008. {
  1009. struct wlan_mlme_psoc_obj *mlme_obj;
  1010. mlme_obj = mlme_get_psoc_obj(psoc);
  1011. if (!mlme_obj)
  1012. return QDF_STATUS_E_INVAL;
  1013. if (!cfg_in_range(CFG_PS_DATA_INACTIVITY_TIMEOUT, inactivity_timeout)) {
  1014. mlme_err("inactivity timeout set value is invalid %d",
  1015. inactivity_timeout);
  1016. return QDF_STATUS_E_INVAL;
  1017. }
  1018. mlme_obj->cfg.timeouts.ps_data_inactivity_timeout = inactivity_timeout;
  1019. return QDF_STATUS_SUCCESS;
  1020. }
  1021. QDF_STATUS
  1022. ucfg_mlme_get_sta_keepalive_method(struct wlan_objmgr_psoc *psoc,
  1023. enum station_keepalive_method *val)
  1024. {
  1025. struct wlan_mlme_psoc_obj *mlme_obj;
  1026. mlme_obj = mlme_get_psoc_obj(psoc);
  1027. if (!mlme_obj)
  1028. return QDF_STATUS_E_INVAL;
  1029. *val = mlme_obj->cfg.sta.sta_keepalive_method;
  1030. return QDF_STATUS_SUCCESS;
  1031. }
  1032. QDF_STATUS
  1033. ucfg_mlme_get_enable_deauth_to_disassoc_map(struct wlan_objmgr_psoc *psoc,
  1034. bool *value)
  1035. {
  1036. struct wlan_mlme_psoc_obj *mlme_obj;
  1037. mlme_obj = mlme_get_psoc_obj(psoc);
  1038. if (!mlme_obj)
  1039. return QDF_STATUS_E_INVAL;
  1040. *value = mlme_obj->cfg.gen.enable_deauth_to_disassoc_map;
  1041. return QDF_STATUS_SUCCESS;
  1042. }
  1043. QDF_STATUS
  1044. ucfg_mlme_get_ap_random_bssid_enable(struct wlan_objmgr_psoc *psoc,
  1045. bool *value)
  1046. {
  1047. struct wlan_mlme_psoc_obj *mlme_obj;
  1048. mlme_obj = mlme_get_psoc_obj(psoc);
  1049. if (!mlme_obj)
  1050. return QDF_STATUS_E_INVAL;
  1051. *value = mlme_obj->cfg.sap_cfg.ap_random_bssid_enable;
  1052. return QDF_STATUS_SUCCESS;
  1053. }
  1054. QDF_STATUS
  1055. ucfg_mlme_get_latency_enable(struct wlan_objmgr_psoc *psoc, bool *value)
  1056. {
  1057. struct wlan_mlme_psoc_obj *mlme_obj;
  1058. mlme_obj = mlme_get_psoc_obj(psoc);
  1059. if (!mlme_obj) {
  1060. mlme_err("mlme obj null");
  1061. return QDF_STATUS_E_INVAL;
  1062. }
  1063. *value = mlme_obj->cfg.wlm_config.latency_enable;
  1064. return QDF_STATUS_SUCCESS;
  1065. }
  1066. QDF_STATUS ucfg_mlme_get_ibss_cfg(struct wlan_objmgr_psoc *psoc,
  1067. struct wlan_mlme_ibss_cfg *ibss_cfg)
  1068. {
  1069. struct wlan_mlme_psoc_obj *mlme_obj;
  1070. if (!ibss_cfg)
  1071. return QDF_STATUS_E_FAILURE;
  1072. mlme_obj = mlme_get_psoc_obj(psoc);
  1073. if (!mlme_obj) {
  1074. mlme_err("MLME Obj null on get IBSS config");
  1075. mlme_init_ibss_cfg(psoc, ibss_cfg);
  1076. return QDF_STATUS_E_INVAL;
  1077. }
  1078. *ibss_cfg = mlme_obj->cfg.ibss;
  1079. return QDF_STATUS_SUCCESS;
  1080. }
  1081. QDF_STATUS ucfg_mlme_set_ibss_auto_bssid(struct wlan_objmgr_psoc *psoc,
  1082. uint32_t auto_bssid)
  1083. {
  1084. struct wlan_mlme_psoc_obj *mlme_obj;
  1085. mlme_obj = mlme_get_psoc_obj(psoc);
  1086. if (!mlme_obj) {
  1087. mlme_err("MLME Obj null on get IBSS config");
  1088. return QDF_STATUS_E_INVAL;
  1089. }
  1090. mlme_obj->cfg.ibss.auto_bssid = auto_bssid;
  1091. return QDF_STATUS_SUCCESS;
  1092. }
  1093. #ifdef MWS_COEX
  1094. QDF_STATUS
  1095. ucfg_mlme_get_mws_coex_4g_quick_tdm(struct wlan_objmgr_psoc *psoc,
  1096. uint32_t *val)
  1097. {
  1098. struct wlan_mlme_psoc_obj *mlme_obj;
  1099. mlme_obj = mlme_get_psoc_obj(psoc);
  1100. if (!mlme_obj) {
  1101. *val = cfg_default(CFG_MWS_COEX_4G_QUICK_FTDM);
  1102. mlme_err("mlme obj null");
  1103. return QDF_STATUS_E_INVAL;
  1104. }
  1105. *val = mlme_obj->cfg.mwc.mws_coex_4g_quick_tdm;
  1106. return QDF_STATUS_SUCCESS;
  1107. }
  1108. QDF_STATUS
  1109. ucfg_mlme_get_mws_coex_5g_nr_pwr_limit(struct wlan_objmgr_psoc *psoc,
  1110. uint32_t *val)
  1111. {
  1112. struct wlan_mlme_psoc_obj *mlme_obj;
  1113. mlme_obj = mlme_get_psoc_obj(psoc);
  1114. if (!mlme_obj) {
  1115. *val = cfg_default(CFG_MWS_COEX_5G_NR_PWR_LIMIT);
  1116. mlme_err("mlme obj null");
  1117. return QDF_STATUS_E_INVAL;
  1118. }
  1119. *val = mlme_obj->cfg.mwc.mws_coex_5g_nr_pwr_limit;
  1120. return QDF_STATUS_SUCCESS;
  1121. }
  1122. #endif
  1123. QDF_STATUS
  1124. ucfg_mlme_get_etsi13_srd_chan_in_master_mode(struct wlan_objmgr_psoc *psoc,
  1125. bool *value)
  1126. {
  1127. struct wlan_mlme_psoc_obj *mlme_obj;
  1128. mlme_obj = mlme_get_psoc_obj(psoc);
  1129. if (!mlme_obj) {
  1130. *value = cfg_default(CFG_ETSI13_SRD_CHAN_IN_MASTER_MODE);
  1131. mlme_err("Failed to get MLME Obj");
  1132. return QDF_STATUS_E_INVAL;
  1133. }
  1134. *value = mlme_obj->cfg.reg.etsi13_srd_chan_in_master_mode;
  1135. return QDF_STATUS_SUCCESS;
  1136. }
  1137. QDF_STATUS
  1138. ucfg_mlme_get_11d_in_world_mode(struct wlan_objmgr_psoc *psoc,
  1139. bool *value)
  1140. {
  1141. struct wlan_mlme_psoc_obj *mlme_obj;
  1142. mlme_obj = mlme_get_psoc_obj(psoc);
  1143. if (!mlme_obj) {
  1144. *value = cfg_default(CFG_ENABLE_11D_IN_WORLD_MODE);
  1145. mlme_err("Failed to get MLME Obj");
  1146. return QDF_STATUS_E_INVAL;
  1147. }
  1148. *value = mlme_obj->cfg.reg.enable_11d_in_world_mode;
  1149. return QDF_STATUS_SUCCESS;
  1150. }
  1151. QDF_STATUS
  1152. ucfg_mlme_get_restart_beaconing_on_ch_avoid(struct wlan_objmgr_psoc *psoc,
  1153. uint32_t *value)
  1154. {
  1155. struct wlan_mlme_psoc_obj *mlme_obj;
  1156. mlme_obj = mlme_get_psoc_obj(psoc);
  1157. if (!mlme_obj) {
  1158. *value = cfg_default(CFG_RESTART_BEACONING_ON_CH_AVOID);
  1159. mlme_err("Failed to get MLME Obj");
  1160. return QDF_STATUS_E_INVAL;
  1161. }
  1162. *value = mlme_obj->cfg.reg.restart_beaconing_on_ch_avoid;
  1163. return QDF_STATUS_SUCCESS;
  1164. }
  1165. QDF_STATUS
  1166. ucfg_mlme_get_indoor_channel_support(struct wlan_objmgr_psoc *psoc,
  1167. bool *value)
  1168. {
  1169. struct wlan_mlme_psoc_obj *mlme_obj;
  1170. mlme_obj = mlme_get_psoc_obj(psoc);
  1171. if (!mlme_obj) {
  1172. *value = cfg_default(CFG_INDOOR_CHANNEL_SUPPORT);
  1173. mlme_err("Failed to get MLME Obj");
  1174. return QDF_STATUS_E_INVAL;
  1175. }
  1176. *value = mlme_obj->cfg.reg.indoor_channel_support;
  1177. return QDF_STATUS_SUCCESS;
  1178. }
  1179. QDF_STATUS
  1180. ucfg_mlme_get_scan_11d_interval(struct wlan_objmgr_psoc *psoc,
  1181. uint32_t *value)
  1182. {
  1183. struct wlan_mlme_psoc_obj *mlme_obj;
  1184. mlme_obj = mlme_get_psoc_obj(psoc);
  1185. if (!mlme_obj) {
  1186. *value = cfg_default(CFG_SCAN_11D_INTERVAL);
  1187. mlme_err("Failed to get MLME Obj");
  1188. return QDF_STATUS_E_INVAL;
  1189. }
  1190. *value = mlme_obj->cfg.reg.scan_11d_interval;
  1191. return QDF_STATUS_SUCCESS;
  1192. }
  1193. QDF_STATUS
  1194. ucfg_mlme_get_valid_channel_list(struct wlan_objmgr_psoc *psoc,
  1195. uint8_t *channel_list,
  1196. uint32_t *channel_list_num)
  1197. {
  1198. struct wlan_mlme_psoc_obj *mlme_obj;
  1199. qdf_size_t valid_channel_list_num = 0;
  1200. mlme_obj = mlme_get_psoc_obj(psoc);
  1201. if (!mlme_obj) {
  1202. qdf_uint8_array_parse(cfg_default(CFG_VALID_CHANNEL_LIST),
  1203. channel_list,
  1204. CFG_VALID_CHANNEL_LIST_LEN,
  1205. &valid_channel_list_num);
  1206. *channel_list_num = (uint8_t)valid_channel_list_num;
  1207. mlme_err("Failed to get MLME Obj");
  1208. return QDF_STATUS_E_INVAL;
  1209. }
  1210. *channel_list_num = (uint32_t)mlme_obj->cfg.reg.valid_channel_list_num;
  1211. qdf_mem_copy(channel_list, mlme_obj->cfg.reg.valid_channel_list,
  1212. *channel_list_num);
  1213. return QDF_STATUS_SUCCESS;
  1214. }
  1215. #ifdef FEATURE_LFR_SUBNET_DETECTION
  1216. QDF_STATUS
  1217. ucfg_mlme_is_subnet_detection_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  1218. {
  1219. struct wlan_mlme_psoc_obj *mlme_obj;
  1220. mlme_obj = mlme_get_psoc_obj(psoc);
  1221. if (!mlme_obj) {
  1222. *val = cfg_default(CFG_LFR3_ENABLE_SUBNET_DETECTION);
  1223. return QDF_STATUS_E_INVAL;
  1224. }
  1225. *val = mlme_obj->cfg.lfr.enable_lfr_subnet_detection;
  1226. return QDF_STATUS_SUCCESS;
  1227. }
  1228. #endif
  1229. QDF_STATUS
  1230. ucfg_mlme_set_current_tx_power_level(struct wlan_objmgr_psoc *psoc,
  1231. uint8_t value)
  1232. {
  1233. struct wlan_mlme_psoc_obj *mlme_obj;
  1234. mlme_obj = mlme_get_psoc_obj(psoc);
  1235. if (!mlme_obj)
  1236. return QDF_STATUS_E_INVAL;
  1237. mlme_obj->cfg.power.current_tx_power_level = value;
  1238. return QDF_STATUS_SUCCESS;
  1239. }
  1240. QDF_STATUS
  1241. ucfg_mlme_get_current_tx_power_level(struct wlan_objmgr_psoc *psoc,
  1242. uint8_t *value)
  1243. {
  1244. struct wlan_mlme_psoc_obj *mlme_obj;
  1245. mlme_obj = mlme_get_psoc_obj(psoc);
  1246. if (!mlme_obj) {
  1247. *value = cfg_default(CFG_CURRENT_TX_POWER_LEVEL);
  1248. return QDF_STATUS_E_INVAL;
  1249. }
  1250. *value = mlme_obj->cfg.power.current_tx_power_level;
  1251. return QDF_STATUS_SUCCESS;
  1252. }
  1253. QDF_STATUS
  1254. ucfg_mlme_set_obss_detection_offload_enabled(struct wlan_objmgr_psoc *psoc,
  1255. uint8_t value)
  1256. {
  1257. struct wlan_mlme_psoc_obj *mlme_obj;
  1258. mlme_obj = mlme_get_psoc_obj(psoc);
  1259. if (!mlme_obj)
  1260. return QDF_STATUS_E_INVAL;
  1261. mlme_obj->cfg.obss_ht40.obss_detection_offload_enabled = value;
  1262. return QDF_STATUS_SUCCESS;
  1263. }
  1264. QDF_STATUS
  1265. ucfg_mlme_set_obss_color_collision_offload_enabled(
  1266. struct wlan_objmgr_psoc *psoc, uint8_t value)
  1267. {
  1268. struct wlan_mlme_psoc_obj *mlme_obj;
  1269. mlme_obj = mlme_get_psoc_obj(psoc);
  1270. if (!mlme_obj)
  1271. return QDF_STATUS_E_INVAL;
  1272. mlme_obj->cfg.obss_ht40.obss_color_collision_offload_enabled = value;
  1273. return QDF_STATUS_SUCCESS;
  1274. }
  1275. QDF_STATUS
  1276. ucfg_mlme_get_channel_bonding_24ghz(struct wlan_objmgr_psoc *psoc,
  1277. uint32_t *val)
  1278. {
  1279. struct wlan_mlme_psoc_obj *mlme_obj;
  1280. mlme_obj = mlme_get_psoc_obj(psoc);
  1281. if (!mlme_obj) {
  1282. *val = cfg_default(CFG_CHANNEL_BONDING_MODE_24GHZ);
  1283. return QDF_STATUS_E_INVAL;
  1284. }
  1285. *val = mlme_obj->cfg.feature_flags.channel_bonding_mode_24ghz;
  1286. return QDF_STATUS_SUCCESS;
  1287. }
  1288. QDF_STATUS
  1289. ucfg_mlme_set_channel_bonding_24ghz(struct wlan_objmgr_psoc *psoc,
  1290. uint32_t value)
  1291. {
  1292. struct wlan_mlme_psoc_obj *mlme_obj;
  1293. mlme_obj = mlme_get_psoc_obj(psoc);
  1294. if (!mlme_obj)
  1295. return QDF_STATUS_E_INVAL;
  1296. mlme_obj->cfg.feature_flags.channel_bonding_mode_24ghz = value;
  1297. return QDF_STATUS_SUCCESS;
  1298. }
  1299. QDF_STATUS
  1300. ucfg_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
  1301. uint32_t *value)
  1302. {
  1303. struct wlan_mlme_psoc_obj *mlme_obj;
  1304. mlme_obj = mlme_get_psoc_obj(psoc);
  1305. if (!mlme_obj) {
  1306. *value = cfg_default(CFG_CHANNEL_BONDING_MODE_5GHZ);
  1307. return QDF_STATUS_E_INVAL;
  1308. }
  1309. *value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz;
  1310. return QDF_STATUS_SUCCESS;
  1311. }
  1312. QDF_STATUS
  1313. ucfg_mlme_set_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
  1314. uint32_t value)
  1315. {
  1316. struct wlan_mlme_psoc_obj *mlme_obj;
  1317. mlme_obj = mlme_get_psoc_obj(psoc);
  1318. if (!mlme_obj)
  1319. return QDF_STATUS_E_INVAL;
  1320. mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz = value;
  1321. return QDF_STATUS_SUCCESS;
  1322. }