1 /* 2 * Copyright (c) 2017-2018 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 = target_if_wifi_pos_register_events(psoc); 95 96 if (QDF_IS_STATUS_ERROR(status)) 97 wifi_pos_err("target_if_wifi_pos_register_events failed"); 98 99 return status; 100 } 101 102 QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc) 103 { 104 QDF_STATUS status = target_if_wifi_pos_deregister_events(psoc); 105 106 if (QDF_IS_STATUS_ERROR(status)) 107 wifi_pos_err("target_if_wifi_pos_deregister_events failed"); 108 109 return QDF_STATUS_SUCCESS; 110 } 111 112 void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val) 113 { 114 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 115 wifi_pos_get_psoc_priv_obj(psoc); 116 117 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 118 wifi_pos_psoc->oem_target_type = val; 119 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 120 } 121 122 void wifi_pos_set_oem_fw_version(struct wlan_objmgr_psoc *psoc, uint32_t val) 123 { 124 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 125 wifi_pos_get_psoc_priv_obj(psoc); 126 127 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 128 wifi_pos_psoc->oem_fw_version = val; 129 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 130 } 131 132 void wifi_pos_set_drv_ver_major(struct wlan_objmgr_psoc *psoc, uint8_t val) 133 { 134 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 135 wifi_pos_get_psoc_priv_obj(psoc); 136 137 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 138 wifi_pos_psoc->driver_version.major = val; 139 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 140 } 141 142 void wifi_pos_set_drv_ver_minor(struct wlan_objmgr_psoc *psoc, uint8_t val) 143 { 144 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 145 wifi_pos_get_psoc_priv_obj(psoc); 146 147 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 148 wifi_pos_psoc->driver_version.minor = val; 149 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 150 } 151 152 void wifi_pos_set_drv_ver_patch(struct wlan_objmgr_psoc *psoc, uint8_t val) 153 { 154 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 155 wifi_pos_get_psoc_priv_obj(psoc); 156 157 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 158 wifi_pos_psoc->driver_version.patch = val; 159 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 160 } 161 162 void wifi_pos_set_drv_ver_build(struct wlan_objmgr_psoc *psoc, uint8_t val) 163 { 164 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 165 wifi_pos_get_psoc_priv_obj(psoc); 166 167 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 168 wifi_pos_psoc->driver_version.build = val; 169 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 170 } 171 172 void wifi_pos_set_dwell_time_min(struct wlan_objmgr_psoc *psoc, uint16_t val) 173 { 174 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 175 wifi_pos_get_psoc_priv_obj(psoc); 176 177 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 178 wifi_pos_psoc->allowed_dwell_time_min = val; 179 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 180 } 181 void wifi_pos_set_dwell_time_max(struct wlan_objmgr_psoc *psoc, uint16_t val) 182 { 183 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 184 wifi_pos_get_psoc_priv_obj(psoc); 185 186 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 187 wifi_pos_psoc->allowed_dwell_time_max = val; 188 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 189 } 190 191 void wifi_pos_set_current_dwell_time_max(struct wlan_objmgr_psoc *psoc, 192 uint16_t val) 193 { 194 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 195 wifi_pos_get_psoc_priv_obj(psoc); 196 197 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 198 wifi_pos_psoc->current_dwell_time_max = val; 199 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 200 } 201 202 void wifi_pos_set_current_dwell_time_min(struct wlan_objmgr_psoc *psoc, 203 uint16_t val) 204 { 205 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 206 wifi_pos_get_psoc_priv_obj(psoc); 207 208 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 209 wifi_pos_psoc->current_dwell_time_max = val; 210 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 211 } 212 213 uint32_t wifi_pos_get_app_pid(struct wlan_objmgr_psoc *psoc) 214 { 215 uint32_t app_pid; 216 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 217 wifi_pos_get_psoc_priv_obj(psoc); 218 219 if (!wifi_pos_psoc) { 220 wifi_pos_err("wifi_pos priv obj is null"); 221 return 0; 222 } 223 224 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 225 app_pid = wifi_pos_psoc->app_pid; 226 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 227 228 return app_pid; 229 230 } 231 232 bool wifi_pos_is_app_registered(struct wlan_objmgr_psoc *psoc) 233 { 234 bool is_app_registered; 235 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc = 236 wifi_pos_get_psoc_priv_obj(psoc); 237 238 if (!wifi_pos_psoc) { 239 wifi_pos_err("wifi_pos priv obj is null"); 240 return false; 241 } 242 243 qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock); 244 is_app_registered = wifi_pos_psoc->is_app_registered; 245 qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock); 246 247 return is_app_registered; 248 } 249 250 #ifdef WLAN_FEATURE_CIF_CFR 251 QDF_STATUS wifi_pos_init_cir_cfr_rings(struct wlan_objmgr_psoc *psoc, 252 void *hal_soc, uint8_t num_mac, void *buf) 253 { 254 return target_if_wifi_pos_init_cir_cfr_rings(psoc, hal_soc, 255 num_mac, buf); 256 } 257 #endif 258 259 QDF_STATUS wifi_pos_register_get_phy_mode_cb( 260 struct wlan_objmgr_psoc *psoc, 261 void (*handler)(uint8_t, uint32_t, uint32_t *)) 262 { 263 struct wifi_pos_psoc_priv_obj *wifi_pos_psoc; 264 265 if (!psoc) { 266 wifi_pos_err("psoc is null"); 267 return QDF_STATUS_E_NULL_VALUE; 268 } 269 270 if (!handler) { 271 wifi_pos_err("Null callback"); 272 return QDF_STATUS_E_NULL_VALUE; 273 } 274 wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc); 275 if (!wifi_pos_psoc) { 276 wifi_pos_err("wifi_pos priv obj is null"); 277 return QDF_STATUS_E_NULL_VALUE; 278 } 279 280 wifi_pos_psoc->wifi_pos_get_phy_mode = handler; 281 282 return QDF_STATUS_SUCCESS; 283 } 284 285