1 /* 2 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 #include <wlan_twt_ext_type.h> 19 #include <wlan_twt_api.h> 20 #include <cfg_ucfg_api.h> 21 #include <cfg_twt.h> 22 #include "wlan_twt_cfg.h" 23 #include "twt/core/src/wlan_twt_priv.h" 24 wlan_twt_cfg_init(struct wlan_objmgr_psoc * psoc)25 QDF_STATUS wlan_twt_cfg_init(struct wlan_objmgr_psoc *psoc) 26 { 27 struct twt_psoc_priv_obj *twt_psoc; 28 psoc_twt_ext_cfg_params_t *twt_cfg; 29 uint32_t bcast_conf; 30 uint32_t rtwt_conf; 31 32 if (!psoc) { 33 twt_err("null psoc"); 34 return QDF_STATUS_E_FAILURE; 35 } 36 37 twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 38 WLAN_UMAC_COMP_TWT); 39 if (!twt_psoc) { 40 twt_err("null twt psoc priv obj"); 41 return QDF_STATUS_E_FAILURE; 42 } 43 44 twt_cfg = &twt_psoc->cfg_params; 45 bcast_conf = cfg_get(psoc, CFG_BCAST_TWT_REQ_RESP); 46 rtwt_conf = cfg_get(psoc, CFG_RTWT_REQ_RESP); 47 48 49 twt_cfg->enable_twt = cfg_get(psoc, CFG_ENABLE_TWT); 50 twt_cfg->twt_requestor = cfg_get(psoc, CFG_TWT_REQUESTOR); 51 twt_cfg->twt_responder = cfg_get(psoc, CFG_TWT_RESPONDER); 52 twt_cfg->twt_congestion_timeout = 53 cfg_get(psoc, CFG_TWT_CONGESTION_TIMEOUT); 54 twt_cfg->bcast_requestor_enabled = CFG_TWT_GET_BCAST_REQ(bcast_conf); 55 twt_cfg->bcast_responder_enabled = CFG_TWT_GET_BCAST_RES(bcast_conf); 56 twt_cfg->enable_twt_24ghz = cfg_get(psoc, CFG_ENABLE_TWT_24GHZ); 57 twt_cfg->flex_twt_sched = cfg_default(CFG_HE_FLEX_TWT_SCHED); 58 twt_cfg->is_twt_enabled_in_11n = cfg_get(psoc, CFG_TWT_ENABLE_IN_11N); 59 twt_cfg->req_flag = false; 60 twt_cfg->res_flag = false; 61 twt_cfg->rtwt_requestor_enabled = CFG_GET_RTWT_REQ(rtwt_conf); 62 twt_cfg->rtwt_responder_enabled = CFG_GET_RTWT_RES(rtwt_conf); 63 64 twt_debug("req: %d resp: %d", twt_cfg->twt_requestor, 65 twt_cfg->twt_responder); 66 67 return QDF_STATUS_SUCCESS; 68 } 69 wlan_twt_cfg_deinit(struct wlan_objmgr_psoc * psoc)70 QDF_STATUS wlan_twt_cfg_deinit(struct wlan_objmgr_psoc *psoc) 71 { 72 struct twt_psoc_priv_obj *twt_psoc; 73 74 if (!psoc) { 75 twt_err("null psoc"); 76 return QDF_STATUS_E_FAILURE; 77 } 78 79 twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 80 WLAN_UMAC_COMP_TWT); 81 if (!twt_psoc) { 82 twt_err("null twt psoc priv obj"); 83 return QDF_STATUS_E_FAILURE; 84 } 85 86 qdf_mem_zero(&twt_psoc->cfg_params, sizeof(twt_psoc->cfg_params)); 87 88 return QDF_STATUS_SUCCESS; 89 } 90 wlan_twt_cfg_update(struct wlan_objmgr_psoc * psoc)91 QDF_STATUS wlan_twt_cfg_update(struct wlan_objmgr_psoc *psoc) 92 { 93 struct twt_psoc_priv_obj *twt_psoc; 94 psoc_twt_ext_cfg_params_t *twt_cfg; 95 struct twt_tgt_caps *tgt_caps; 96 bool enable_twt; 97 98 if (!psoc) { 99 twt_err("null psoc"); 100 return QDF_STATUS_E_FAILURE; 101 } 102 103 twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 104 WLAN_UMAC_COMP_TWT); 105 if (!twt_psoc) { 106 twt_err("null twt psoc priv obj"); 107 return QDF_STATUS_E_FAILURE; 108 } 109 110 twt_cfg = &twt_psoc->cfg_params; 111 tgt_caps = &twt_psoc->twt_caps; 112 enable_twt = twt_cfg->enable_twt; 113 114 twt_cfg->twt_requestor = QDF_MIN(tgt_caps->twt_requestor, 115 (enable_twt && twt_cfg->twt_requestor)); 116 twt_cfg->twt_responder = QDF_MIN(tgt_caps->twt_responder, 117 (enable_twt && twt_cfg->twt_responder)); 118 twt_cfg->bcast_requestor_enabled = 119 QDF_MIN((tgt_caps->twt_bcast_req_support || 120 tgt_caps->legacy_bcast_twt_support), 121 (enable_twt && 122 twt_cfg->bcast_requestor_enabled)); 123 twt_cfg->bcast_responder_enabled = 124 QDF_MIN((tgt_caps->twt_bcast_res_support || 125 tgt_caps->legacy_bcast_twt_support), 126 (enable_twt && 127 twt_cfg->bcast_responder_enabled)); 128 twt_debug("req: %d resp: %d bcast_req: %d bcast_resp: %d", 129 twt_cfg->twt_requestor, twt_cfg->twt_responder, 130 twt_cfg->bcast_requestor_enabled, 131 twt_cfg->bcast_responder_enabled); 132 return QDF_STATUS_SUCCESS; 133 } 134 135 QDF_STATUS wlan_twt_cfg_get_requestor(struct wlan_objmgr_psoc * psoc,bool * val)136 wlan_twt_cfg_get_requestor(struct wlan_objmgr_psoc *psoc, bool *val) 137 { 138 struct twt_psoc_priv_obj *twt_psoc_obj; 139 140 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 141 if (!twt_psoc_obj) { 142 *val = cfg_default(CFG_TWT_REQUESTOR); 143 return QDF_STATUS_E_INVAL; 144 } 145 146 *val = twt_psoc_obj->cfg_params.twt_requestor; 147 148 return QDF_STATUS_SUCCESS; 149 } 150 151 QDF_STATUS wlan_twt_cfg_get_responder(struct wlan_objmgr_psoc * psoc,bool * val)152 wlan_twt_cfg_get_responder(struct wlan_objmgr_psoc *psoc, bool *val) 153 { 154 struct twt_psoc_priv_obj *twt_psoc_obj; 155 156 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 157 if (!twt_psoc_obj) { 158 *val = cfg_default(CFG_TWT_RESPONDER); 159 return QDF_STATUS_E_INVAL; 160 } 161 162 *val = twt_psoc_obj->cfg_params.twt_responder; 163 164 return QDF_STATUS_SUCCESS; 165 } 166 167 QDF_STATUS wlan_twt_cfg_set_responder(struct wlan_objmgr_psoc * psoc,bool val)168 wlan_twt_cfg_set_responder(struct wlan_objmgr_psoc *psoc, bool val) 169 { 170 struct twt_psoc_priv_obj *twt_psoc_obj; 171 172 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 173 if (!twt_psoc_obj) 174 return QDF_STATUS_E_INVAL; 175 176 twt_psoc_obj->cfg_params.twt_responder = val; 177 178 return QDF_STATUS_SUCCESS; 179 } 180 wlan_twt_cfg_is_twt_enabled(struct wlan_objmgr_psoc * psoc)181 bool wlan_twt_cfg_is_twt_enabled(struct wlan_objmgr_psoc *psoc) 182 { 183 struct twt_psoc_priv_obj *twt_psoc_obj; 184 185 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 186 if (!twt_psoc_obj) 187 return false; 188 189 return twt_psoc_obj->cfg_params.enable_twt; 190 } 191 192 QDF_STATUS wlan_twt_cfg_get_congestion_timeout(struct wlan_objmgr_psoc * psoc,uint32_t * val)193 wlan_twt_cfg_get_congestion_timeout(struct wlan_objmgr_psoc *psoc, 194 uint32_t *val) 195 { 196 struct twt_psoc_priv_obj *twt_psoc_obj; 197 198 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 199 if (!twt_psoc_obj) { 200 *val = cfg_default(CFG_TWT_CONGESTION_TIMEOUT); 201 return QDF_STATUS_E_INVAL; 202 } 203 204 *val = twt_psoc_obj->cfg_params.twt_congestion_timeout; 205 206 return QDF_STATUS_SUCCESS; 207 } 208 209 QDF_STATUS wlan_twt_cfg_set_congestion_timeout(struct wlan_objmgr_psoc * psoc,uint32_t val)210 wlan_twt_cfg_set_congestion_timeout(struct wlan_objmgr_psoc *psoc, uint32_t val) 211 { 212 struct twt_psoc_priv_obj *twt_psoc_obj; 213 214 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 215 if (!twt_psoc_obj) 216 return QDF_STATUS_E_INVAL; 217 218 twt_psoc_obj->cfg_params.twt_congestion_timeout = val; 219 220 return QDF_STATUS_SUCCESS; 221 } 222 223 QDF_STATUS wlan_twt_cfg_get_requestor_flag(struct wlan_objmgr_psoc * psoc,bool * val)224 wlan_twt_cfg_get_requestor_flag(struct wlan_objmgr_psoc *psoc, bool *val) 225 { 226 struct twt_psoc_priv_obj *twt_psoc_obj; 227 228 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 229 if (!twt_psoc_obj) { 230 *val = false; 231 return QDF_STATUS_E_INVAL; 232 } 233 234 *val = twt_psoc_obj->cfg_params.req_flag; 235 236 return QDF_STATUS_SUCCESS; 237 } 238 239 QDF_STATUS wlan_twt_cfg_set_requestor_flag(struct wlan_objmgr_psoc * psoc,bool val)240 wlan_twt_cfg_set_requestor_flag(struct wlan_objmgr_psoc *psoc, bool val) 241 { 242 struct twt_psoc_priv_obj *twt_psoc_obj; 243 244 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 245 if (!twt_psoc_obj) 246 return QDF_STATUS_E_INVAL; 247 248 twt_psoc_obj->cfg_params.req_flag = val; 249 250 return QDF_STATUS_SUCCESS; 251 } 252 253 QDF_STATUS wlan_twt_cfg_get_responder_flag(struct wlan_objmgr_psoc * psoc,bool * val)254 wlan_twt_cfg_get_responder_flag(struct wlan_objmgr_psoc *psoc, bool *val) 255 { 256 struct twt_psoc_priv_obj *twt_psoc_obj; 257 258 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 259 if (!twt_psoc_obj) 260 return QDF_STATUS_E_INVAL; 261 262 *val = twt_psoc_obj->cfg_params.res_flag; 263 264 return QDF_STATUS_SUCCESS; 265 } 266 267 QDF_STATUS wlan_twt_cfg_set_responder_flag(struct wlan_objmgr_psoc * psoc,bool val)268 wlan_twt_cfg_set_responder_flag(struct wlan_objmgr_psoc *psoc, bool val) 269 { 270 struct twt_psoc_priv_obj *twt_psoc_obj; 271 272 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 273 if (!twt_psoc_obj) 274 return QDF_STATUS_E_INVAL; 275 276 twt_psoc_obj->cfg_params.res_flag = val; 277 278 return QDF_STATUS_SUCCESS; 279 } 280 281 QDF_STATUS wlan_twt_cfg_get_flex_sched(struct wlan_objmgr_psoc * psoc,bool * val)282 wlan_twt_cfg_get_flex_sched(struct wlan_objmgr_psoc *psoc, bool *val) 283 { 284 struct twt_psoc_priv_obj *twt_psoc_obj; 285 286 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 287 if (!twt_psoc_obj) { 288 *val = cfg_default(CFG_HE_FLEX_TWT_SCHED); 289 return QDF_STATUS_E_INVAL; 290 } 291 292 *val = twt_psoc_obj->cfg_params.flex_twt_sched; 293 294 return QDF_STATUS_SUCCESS; 295 } 296 297 QDF_STATUS wlan_twt_cfg_get_24ghz_enabled(struct wlan_objmgr_psoc * psoc,bool * val)298 wlan_twt_cfg_get_24ghz_enabled(struct wlan_objmgr_psoc *psoc, bool *val) 299 { 300 struct twt_psoc_priv_obj *twt_psoc_obj; 301 302 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 303 if (!twt_psoc_obj) { 304 *val = cfg_default(CFG_ENABLE_TWT_24GHZ); 305 return QDF_STATUS_E_INVAL; 306 } 307 308 *val = twt_psoc_obj->cfg_params.enable_twt_24ghz; 309 310 return QDF_STATUS_SUCCESS; 311 } 312 313 QDF_STATUS wlan_twt_cfg_get_bcast_requestor(struct wlan_objmgr_psoc * psoc,bool * val)314 wlan_twt_cfg_get_bcast_requestor(struct wlan_objmgr_psoc *psoc, bool *val) 315 { 316 struct twt_psoc_priv_obj *twt_psoc_obj; 317 318 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 319 if (!twt_psoc_obj) { 320 uint32_t b_req_res; 321 322 b_req_res = cfg_default(CFG_BCAST_TWT_REQ_RESP); 323 *val = CFG_TWT_GET_BCAST_REQ(b_req_res); 324 return QDF_STATUS_E_INVAL; 325 } 326 327 *val = twt_psoc_obj->cfg_params.bcast_requestor_enabled; 328 329 return QDF_STATUS_SUCCESS; 330 } 331 332 QDF_STATUS wlan_twt_cfg_get_bcast_responder(struct wlan_objmgr_psoc * psoc,bool * val)333 wlan_twt_cfg_get_bcast_responder(struct wlan_objmgr_psoc *psoc, bool *val) 334 { 335 struct twt_psoc_priv_obj *twt_psoc_obj; 336 337 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 338 if (!twt_psoc_obj) { 339 uint32_t b_req_res; 340 341 b_req_res = cfg_default(CFG_BCAST_TWT_REQ_RESP); 342 *val = CFG_TWT_GET_BCAST_RES(b_req_res); 343 return QDF_STATUS_E_INVAL; 344 } 345 346 *val = twt_psoc_obj->cfg_params.bcast_responder_enabled; 347 348 return QDF_STATUS_SUCCESS; 349 } 350 351 QDF_STATUS wlan_twt_cfg_get_rtwt_requestor(struct wlan_objmgr_psoc * psoc,bool * val)352 wlan_twt_cfg_get_rtwt_requestor(struct wlan_objmgr_psoc *psoc, bool *val) 353 { 354 struct twt_psoc_priv_obj *twt_psoc_obj; 355 356 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 357 if (!twt_psoc_obj) { 358 uint32_t rtwt_req_res; 359 360 rtwt_req_res = cfg_default(CFG_RTWT_REQ_RESP); 361 *val = CFG_GET_RTWT_REQ(rtwt_req_res); 362 return QDF_STATUS_E_INVAL; 363 } 364 365 *val = twt_psoc_obj->cfg_params.rtwt_requestor_enabled; 366 367 return QDF_STATUS_SUCCESS; 368 } 369 370 QDF_STATUS wlan_twt_cfg_get_rtwt_responder(struct wlan_objmgr_psoc * psoc,bool * val)371 wlan_twt_cfg_get_rtwt_responder(struct wlan_objmgr_psoc *psoc, bool *val) 372 { 373 struct twt_psoc_priv_obj *twt_psoc_obj; 374 375 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 376 if (!twt_psoc_obj) { 377 uint32_t rtwt_req_res; 378 379 rtwt_req_res = cfg_default(CFG_RTWT_REQ_RESP); 380 *val = CFG_GET_RTWT_RES(rtwt_req_res); 381 return QDF_STATUS_E_INVAL; 382 } 383 384 *val = twt_psoc_obj->cfg_params.rtwt_responder_enabled; 385 386 return QDF_STATUS_SUCCESS; 387 } 388 389 QDF_STATUS wlan_twt_cfg_get_support_in_11n_mode(struct wlan_objmgr_psoc * psoc,bool * val)390 wlan_twt_cfg_get_support_in_11n_mode(struct wlan_objmgr_psoc *psoc, 391 bool *val) 392 { 393 struct twt_psoc_priv_obj *twt_psoc_obj; 394 psoc_twt_ext_cfg_params_t *twt_cfg; 395 struct twt_tgt_caps *tgt_caps; 396 bool enable_twt; 397 398 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 399 if (!twt_psoc_obj) { 400 *val = cfg_default(CFG_TWT_ENABLE_IN_11N); 401 return QDF_STATUS_E_INVAL; 402 } 403 404 *val = twt_psoc_obj->cfg_params.is_twt_enabled_in_11n; 405 twt_cfg = &twt_psoc_obj->cfg_params; 406 tgt_caps = &twt_psoc_obj->twt_caps; 407 enable_twt = twt_cfg->enable_twt; 408 409 *val = QDF_MIN(tgt_caps->twt_requestor, 410 (enable_twt && twt_cfg->twt_requestor && *val)); 411 412 return QDF_STATUS_SUCCESS; 413 } 414 415 QDF_STATUS wlan_twt_get_restricted_support(struct wlan_objmgr_psoc * psoc,bool * val)416 wlan_twt_get_restricted_support(struct wlan_objmgr_psoc *psoc, bool *val) 417 { 418 struct twt_psoc_priv_obj *twt_psoc_obj; 419 psoc_twt_ext_cfg_params_t *twt_cfg; 420 struct twt_tgt_caps *tgt_caps; 421 bool enable_twt; 422 423 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 424 if (!twt_psoc_obj) { 425 *val = cfg_default(CFG_RTWT_REQ_RESP); 426 return QDF_STATUS_E_INVAL; 427 } 428 429 twt_cfg = &twt_psoc_obj->cfg_params; 430 tgt_caps = &twt_psoc_obj->twt_caps; 431 enable_twt = twt_cfg->enable_twt; 432 433 *val = QDF_MIN(tgt_caps->twt_bcast_req_support && 434 tgt_caps->restricted_twt_support, 435 twt_cfg->bcast_requestor_enabled && 436 twt_cfg->rtwt_requestor_enabled && 437 enable_twt); 438 439 return QDF_STATUS_SUCCESS; 440 } 441 442 bool wlan_twt_get_pmo_allowed(struct wlan_objmgr_psoc * psoc)443 wlan_twt_get_pmo_allowed(struct wlan_objmgr_psoc *psoc) 444 { 445 struct twt_psoc_priv_obj *twt_psoc_obj; 446 447 twt_psoc_obj = wlan_twt_psoc_get_comp_private_obj(psoc); 448 449 if (!twt_psoc_obj || twt_psoc_obj->twt_pmo_disabled) 450 return false; 451 452 return true; 453 } 454