1 /* 2 * Copyright (c) 2017-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: wifi_pos_api.c 20 * This file defines the APIs wifi_pos component. 21 */ 22 23 #include "wifi_pos_api.h" 24 #include "wifi_pos_utils_i.h" 25 #include "wifi_pos_main_i.h" 26 #include "os_if_wifi_pos.h" 27 #include "target_if_wifi_pos.h" 28 #include "wlan_objmgr_cmn.h" 29 #include "wlan_objmgr_global_obj.h" 30 #include "wlan_objmgr_psoc_obj.h" 31 32 QDF_STATUS wifi_pos_init(void) 33 { 34 QDF_STATUS status; 35 36 wifi_pos_lock_init(); 37 38 /* register psoc create handler functions. */ 39 status = wlan_objmgr_register_psoc_create_handler( 40 WLAN_UMAC_COMP_WIFI_POS, 41 wifi_pos_psoc_obj_created_notification, 42 NULL); 43 if (QDF_IS_STATUS_ERROR(status)) { 44 wifi_pos_err("register_psoc_create_handler failed, status: %d", 45 status); 46 return status; 47 } 48 49 /* register psoc delete handler functions. */ 50 status = wlan_objmgr_register_psoc_destroy_handler( 51 WLAN_UMAC_COMP_WIFI_POS, 52 wifi_pos_psoc_obj_destroyed_notification, 53 NULL); 54 if (QDF_IS_STATUS_ERROR(status)) { 55 wifi_pos_err("register_psoc_destroy_handler failed, status: %d", 56 status); 57 } 58 59 return status; 60 } 61 62 QDF_STATUS wifi_pos_deinit(void) 63 { 64 QDF_STATUS status; 65 66 /* deregister psoc create handler functions. */ 67 status = wlan_objmgr_unregister_psoc_create_handler( 68 WLAN_UMAC_COMP_WIFI_POS, 69 wifi_pos_psoc_obj_created_notification, 70 NULL); 71 if (QDF_IS_STATUS_ERROR(status)) { 72 wifi_pos_err("unregister_psoc_create_handler failed, status: %d", 73 status); 74 return status; 75 } 76 77 /* deregister psoc delete handler functions. */ 78 status = wlan_objmgr_unregister_psoc_destroy_handler( 79 WLAN_UMAC_COMP_WIFI_POS, 80 wifi_pos_psoc_obj_destroyed_notification, 81 NULL); 82 if (QDF_IS_STATUS_ERROR(status)) { 83 wifi_pos_err("unregister_psoc_destroy_handler failed, status: %d", 84 status); 85 } 86 87 wifi_pos_lock_deinit(); 88 89 return QDF_STATUS_SUCCESS; 90 } 91 92 QDF_STATUS wifi_pos_psoc_enable(struct wlan_objmgr_psoc *psoc) 93 { 94 QDF_STATUS status; 95 struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops; 96 97 tx_ops = wifi_pos_get_tx_ops(psoc); 98 if (!tx_ops) { 99 wifi_pos_err("tx_ops is null"); 100 return QDF_STATUS_E_NULL_VALUE; 101 } 102 103 status = tx_ops->wifi_pos_register_events(psoc); 104 105 if (QDF_IS_STATUS_ERROR(status)) 106 wifi_pos_err("target_if_wifi_pos_register_events failed"); 107 108 return status; 109 } 110 111 QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc) 112 { 113 QDF_STATUS status; 114 struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops; 115 116 tx_ops = wifi_pos_get_tx_ops(psoc); 117 if (!tx_ops) { 118 wifi_pos_err("tx_ops is null"); 119 return QDF_STATUS_E_NULL_VALUE; 120 } 121 122 status = tx_ops->wifi_pos_deregister_events(psoc); 123 124 if (QDF_IS_STATUS_ERROR(status)) 125 wifi_pos_err("target_if_wifi_pos_deregister_events failed"); 126 127 return QDF_STATUS_SUCCESS; 128 } 129 130 void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val) 131 { 132 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 133 wifi_pos_get_psoc_priv_obj(psoc); 134 135 if (!wifi_pos_psoc) { 136 wifi_pos_err("wifi_pos priv obj is null"); 137 return; 138 } 139 140 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 141 wifi_pos_psoc->oem_target_type = val; 142 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 143 } 144 145 void wifi_pos_set_oem_fw_version(struct wlan_objmgr_psoc *psoc, uint32_t val) 146 { 147 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 148 wifi_pos_get_psoc_priv_obj(psoc); 149 150 if (!wifi_pos_psoc) { 151 wifi_pos_err("wifi_pos priv obj is null"); 152 return; 153 } 154 155 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 156 wifi_pos_psoc->oem_fw_version = val; 157 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 158 } 159 160 void wifi_pos_set_drv_ver_major(struct wlan_objmgr_psoc *psoc, uint8_t val) 161 { 162 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 163 wifi_pos_get_psoc_priv_obj(psoc); 164 165 if (!wifi_pos_psoc) { 166 wifi_pos_err("wifi_pos priv obj is null"); 167 return; 168 } 169 170 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 171 wifi_pos_psoc->driver_version.major = val; 172 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 173 } 174 175 void wifi_pos_set_drv_ver_minor(struct wlan_objmgr_psoc *psoc, uint8_t val) 176 { 177 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 178 wifi_pos_get_psoc_priv_obj(psoc); 179 180 if (!wifi_pos_psoc) { 181 wifi_pos_err("wifi_pos priv obj is null"); 182 return; 183 } 184 185 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 186 wifi_pos_psoc->driver_version.minor = val; 187 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 188 } 189 190 void wifi_pos_set_drv_ver_patch(struct wlan_objmgr_psoc *psoc, uint8_t val) 191 { 192 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 193 wifi_pos_get_psoc_priv_obj(psoc); 194 195 if (!wifi_pos_psoc) { 196 wifi_pos_err("wifi_pos priv obj is null"); 197 return; 198 } 199 200 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 201 wifi_pos_psoc->driver_version.patch = val; 202 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 203 } 204 205 void wifi_pos_set_drv_ver_build(struct wlan_objmgr_psoc *psoc, uint8_t val) 206 { 207 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 208 wifi_pos_get_psoc_priv_obj(psoc); 209 210 if (!wifi_pos_psoc) { 211 wifi_pos_err("wifi_pos priv obj is null"); 212 return; 213 } 214 215 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 216 wifi_pos_psoc->driver_version.build = val; 217 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 218 } 219 220 void wifi_pos_set_dwell_time_min(struct wlan_objmgr_psoc *psoc, uint16_t val) 221 { 222 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 223 wifi_pos_get_psoc_priv_obj(psoc); 224 225 if (!wifi_pos_psoc) { 226 wifi_pos_err("wifi_pos priv obj is null"); 227 return; 228 } 229 230 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 231 wifi_pos_psoc->allowed_dwell_time_min = val; 232 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 233 } 234 void wifi_pos_set_dwell_time_max(struct wlan_objmgr_psoc *psoc, uint16_t val) 235 { 236 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 237 wifi_pos_get_psoc_priv_obj(psoc); 238 239 if (!wifi_pos_psoc) { 240 wifi_pos_err("wifi_pos priv obj is null"); 241 return; 242 } 243 244 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 245 wifi_pos_psoc->allowed_dwell_time_max = val; 246 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 247 } 248 249 void wifi_pos_set_current_dwell_time_max(struct wlan_objmgr_psoc *psoc, 250 uint16_t val) 251 { 252 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 253 wifi_pos_get_psoc_priv_obj(psoc); 254 255 if (!wifi_pos_psoc) { 256 wifi_pos_err("wifi_pos priv obj is null"); 257 return; 258 } 259 260 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 261 wifi_pos_psoc->current_dwell_time_max = val; 262 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 263 } 264 265 void wifi_pos_set_current_dwell_time_min(struct wlan_objmgr_psoc *psoc, 266 uint16_t val) 267 { 268 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 269 wifi_pos_get_psoc_priv_obj(psoc); 270 271 if (!wifi_pos_psoc) { 272 wifi_pos_err("wifi_pos priv obj is null"); 273 return; 274 } 275 276 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 277 wifi_pos_psoc->current_dwell_time_max = val; 278 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 279 } 280 281 uint32_t wifi_pos_get_app_pid(struct wlan_objmgr_psoc *psoc) 282 { 283 uint32_t app_pid; 284 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 285 wifi_pos_get_psoc_priv_obj(psoc); 286 287 if (!wifi_pos_psoc) { 288 wifi_pos_err("wifi_pos priv obj is null"); 289 return 0; 290 } 291 292 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 293 app_pid = wifi_pos_psoc->app_pid; 294 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 295 296 return app_pid; 297 298 } 299 300 bool wifi_pos_is_app_registered(struct wlan_objmgr_psoc *psoc) 301 { 302 bool is_app_registered; 303 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 304 wifi_pos_get_psoc_priv_obj(psoc); 305 306 if (!wifi_pos_psoc) { 307 wifi_pos_err("wifi_pos priv obj is null"); 308 return false; 309 } 310 311 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 312 is_app_registered = wifi_pos_psoc->is_app_registered; 313 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 314 315 return is_app_registered; 316 } 317 318 #ifdef WLAN_FEATURE_CIF_CFR 319 QDF_STATUS wifi_pos_init_cir_cfr_rings(struct wlan_objmgr_psoc *psoc, 320 void *hal_soc, uint8_t num_mac, void *buf) 321 { 322 return target_if_wifi_pos_init_cir_cfr_rings(psoc, hal_soc, 323 num_mac, buf); 324 } 325 #endif 326 327 QDF_STATUS wifi_pos_register_get_phy_mode_cb( 328 struct wlan_objmgr_psoc *psoc, 329 void (*handler)(uint8_t, uint32_t, uint32_t *)) 330 { 331 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc; 332 333 if (!psoc) { 334 wifi_pos_err("psoc is null"); 335 return QDF_STATUS_E_NULL_VALUE; 336 } 337 338 if (!handler) { 339 wifi_pos_err("Null callback"); 340 return QDF_STATUS_E_NULL_VALUE; 341 } 342 wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc); 343 if (!wifi_pos_psoc) { 344 wifi_pos_err("wifi_pos priv obj is null"); 345 return QDF_STATUS_E_NULL_VALUE; 346 } 347 348 wifi_pos_psoc->wifi_pos_get_phy_mode = handler; 349 350 return QDF_STATUS_SUCCESS; 351 } 352 353 QDF_STATUS wifi_pos_register_send_action( 354 struct wlan_objmgr_psoc *psoc, 355 void (*handler)(struct wlan_objmgr_psoc *psoc, 356 uint32_t sub_type, 357 uint8_t *buf, 358 uint32_t buf_len)) 359 { 360 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc; 361 362 if (!psoc) { 363 wifi_pos_err("psoc is null"); 364 return QDF_STATUS_E_NULL_VALUE; 365 } 366 367 if (!handler) { 368 wifi_pos_err("Null callback"); 369 return QDF_STATUS_E_NULL_VALUE; 370 } 371 wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc); 372 if (!wifi_pos_psoc) { 373 wifi_pos_err("wifi_pos priv obj is null"); 374 return QDF_STATUS_E_NULL_VALUE; 375 } 376 377 wifi_pos_psoc->wifi_pos_send_action = handler; 378 379 return QDF_STATUS_SUCCESS; 380 } 381