1 /* 2 * Copyright (c) 2011,2017-2019 The Linux Foundation. All rights reserved. 3 * 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #include <wlan_spectral_tgt_api.h> 21 #include <wlan_spectral_utils_api.h> 22 #include <target_type.h> 23 24 #ifdef DIRECT_BUF_RX_ENABLE 25 #include <target_if_direct_buf_rx_api.h> 26 27 #define DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL 1 28 #define DBR_NUM_RESP_PER_EVENT_SPECTRAL 2 29 #endif 30 31 void * 32 tgt_get_target_handle(struct wlan_objmgr_pdev *pdev) 33 { 34 struct pdev_spectral *ps; 35 36 if (!pdev) { 37 spectral_err("PDEV is NULL!"); 38 return NULL; 39 } 40 ps = wlan_objmgr_pdev_get_comp_private_obj(pdev, 41 WLAN_UMAC_COMP_SPECTRAL); 42 if (!ps) { 43 spectral_err("PDEV SPECTRAL object is NULL!"); 44 return NULL; 45 } 46 return ps->psptrl_target_handle; 47 } 48 49 QDF_STATUS 50 tgt_spectral_control( 51 struct wlan_objmgr_pdev *pdev, 52 struct spectral_cp_request *sscan_req) 53 { 54 struct spectral_context *sc; 55 56 if (!pdev) { 57 spectral_err("PDEV is NULL!"); 58 return -EPERM; 59 } 60 sc = spectral_get_spectral_ctx_from_pdev(pdev); 61 if (!sc) { 62 spectral_err("spectral context is NULL!"); 63 return -EPERM; 64 } 65 return spectral_control_cmn(pdev, sscan_req); 66 } 67 68 void * 69 tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev) 70 { 71 struct wlan_objmgr_psoc *psoc = NULL; 72 73 psoc = wlan_pdev_get_psoc(pdev); 74 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_init( 75 pdev); 76 } 77 78 void 79 tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev) 80 { 81 struct wlan_objmgr_psoc *psoc = NULL; 82 83 psoc = wlan_pdev_get_psoc(pdev); 84 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev); 85 } 86 87 QDF_STATUS 88 tgt_set_spectral_config(struct wlan_objmgr_pdev *pdev, 89 const u_int32_t threshtype, const u_int32_t value, 90 const enum spectral_scan_mode smode, 91 enum spectral_cp_error_code *err) 92 { 93 struct wlan_objmgr_psoc *psoc = NULL; 94 95 psoc = wlan_pdev_get_psoc(pdev); 96 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_spectral_config( 97 pdev, threshtype, value, smode, err); 98 } 99 100 QDF_STATUS 101 tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev, 102 struct spectral_config *sptrl_config, 103 const enum spectral_scan_mode smode) 104 { 105 struct wlan_objmgr_psoc *psoc = NULL; 106 107 psoc = wlan_pdev_get_psoc(pdev); 108 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_config( 109 pdev, 110 sptrl_config, 111 smode); 112 } 113 114 QDF_STATUS 115 tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev, 116 enum spectral_scan_mode smode, 117 enum spectral_cp_error_code *err) 118 { 119 struct wlan_objmgr_psoc *psoc = NULL; 120 121 psoc = wlan_pdev_get_psoc(pdev); 122 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_start_spectral_scan( 123 pdev, smode, err); 124 } 125 126 QDF_STATUS 127 tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev, 128 enum spectral_scan_mode smode, 129 enum spectral_cp_error_code *err) 130 { 131 struct wlan_objmgr_psoc *psoc; 132 133 psoc = wlan_pdev_get_psoc(pdev); 134 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_stop_spectral_scan( 135 pdev, smode, err); 136 } 137 138 bool 139 tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev, 140 enum spectral_scan_mode smode) 141 { 142 struct wlan_objmgr_psoc *psoc = NULL; 143 144 psoc = wlan_pdev_get_psoc(pdev); 145 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_active( 146 pdev, smode); 147 } 148 149 bool 150 tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev, 151 enum spectral_scan_mode smode) 152 { 153 struct wlan_objmgr_psoc *psoc = NULL; 154 155 psoc = wlan_pdev_get_psoc(pdev); 156 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_enabled( 157 pdev, smode); 158 } 159 160 QDF_STATUS 161 tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level) 162 { 163 struct wlan_objmgr_psoc *psoc = NULL; 164 165 psoc = wlan_pdev_get_psoc(pdev); 166 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_debug_level( 167 pdev, 168 debug_level); 169 } 170 171 u_int32_t 172 tgt_get_debug_level(struct wlan_objmgr_pdev *pdev) 173 { 174 struct wlan_objmgr_psoc *psoc = NULL; 175 176 psoc = wlan_pdev_get_psoc(pdev); 177 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_debug_level(pdev); 178 } 179 180 QDF_STATUS 181 tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev, 182 struct spectral_caps *scaps) 183 { 184 struct wlan_objmgr_psoc *psoc = NULL; 185 186 psoc = wlan_pdev_get_psoc(pdev); 187 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_capinfo( 188 pdev, scaps); 189 } 190 191 QDF_STATUS 192 tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev, 193 struct spectral_diag_stats *stats) 194 { 195 struct wlan_objmgr_psoc *psoc = NULL; 196 197 psoc = wlan_pdev_get_psoc(pdev); 198 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_diagstats( 199 pdev, stats); 200 } 201 202 void 203 tgt_register_wmi_spectral_cmd_ops( 204 struct wlan_objmgr_pdev *pdev, 205 struct wmi_spectral_cmd_ops *cmd_ops) 206 { 207 struct wlan_objmgr_psoc *psoc = NULL; 208 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 209 210 psoc = wlan_pdev_get_psoc(pdev); 211 212 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 213 214 return psptrl_tx_ops->sptrlto_register_wmi_spectral_cmd_ops(pdev, 215 cmd_ops); 216 } 217 218 void 219 tgt_spectral_register_nl_cb( 220 struct wlan_objmgr_pdev *pdev, 221 struct spectral_nl_cb *nl_cb) 222 { 223 struct wlan_objmgr_psoc *psoc = NULL; 224 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 225 226 if (!pdev) { 227 spectral_err("PDEV is NULL!"); 228 return; 229 } 230 psoc = wlan_pdev_get_psoc(pdev); 231 232 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 233 234 return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev, 235 nl_cb); 236 } 237 238 bool 239 tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev) 240 { 241 struct wlan_objmgr_psoc *psoc = NULL; 242 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 243 244 psoc = wlan_pdev_get_psoc(pdev); 245 246 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 247 248 return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev); 249 } 250 251 void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev) 252 { 253 struct wlan_objmgr_psoc *psoc = NULL; 254 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 255 256 if (!pdev) { 257 spectral_err("PDEV is NULL!"); 258 return; 259 } 260 psoc = wlan_pdev_get_psoc(pdev); 261 262 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 263 264 psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev); 265 } 266 267 int 268 tgt_spectral_process_report(struct wlan_objmgr_pdev *pdev, 269 void *payload) 270 { 271 struct wlan_objmgr_psoc *psoc = NULL; 272 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 273 274 psoc = wlan_pdev_get_psoc(pdev); 275 276 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 277 278 return psptrl_tx_ops->sptrlto_process_spectral_report(pdev, payload); 279 } 280 281 uint32_t 282 tgt_spectral_get_target_type(struct wlan_objmgr_psoc *psoc) 283 { 284 uint32_t target_type = 0; 285 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops; 286 287 target_type_tx_ops = &psoc->soc_cb.tx_ops.target_tx_ops; 288 289 if (target_type_tx_ops->tgt_get_tgt_type) 290 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc); 291 292 return target_type; 293 } 294 295 #ifdef DIRECT_BUF_RX_ENABLE 296 QDF_STATUS 297 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev) 298 { 299 struct wlan_objmgr_psoc *psoc; 300 struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL; 301 struct dbr_module_config dbr_config = {0}; 302 uint32_t target_type; 303 304 psoc = wlan_pdev_get_psoc(pdev); 305 dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops; 306 dbr_config.num_resp_per_event = DBR_NUM_RESP_PER_EVENT_SPECTRAL; 307 dbr_config.event_timeout_in_ms = DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL; 308 target_type = tgt_spectral_get_target_type(psoc); 309 310 if ((target_type == TARGET_TYPE_QCA8074) || 311 (target_type == TARGET_TYPE_QCA8074V2) || 312 (target_type == TARGET_TYPE_QCA6018) || 313 (target_type == TARGET_TYPE_QCA6390)) 314 if (dbr_tx_ops->direct_buf_rx_module_register) 315 return dbr_tx_ops->direct_buf_rx_module_register 316 (pdev, 0, &dbr_config, 317 spectral_dbr_event_handler); 318 319 return QDF_STATUS_SUCCESS; 320 } 321 322 QDF_STATUS 323 tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev) 324 { 325 struct wlan_objmgr_psoc *psoc; 326 struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL; 327 328 psoc = wlan_pdev_get_psoc(pdev); 329 dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops; 330 331 if ((tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074) || 332 (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074V2) || 333 (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA6018)) 334 if (dbr_tx_ops->direct_buf_rx_module_unregister) 335 return dbr_tx_ops->direct_buf_rx_module_unregister 336 (pdev, 0); 337 338 return QDF_STATUS_E_FAILURE; 339 } 340 #else 341 QDF_STATUS 342 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev) 343 { 344 return QDF_STATUS_SUCCESS; 345 } 346 347 QDF_STATUS 348 tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev) 349 { 350 return QDF_STATUS_SUCCESS; 351 } 352 #endif 353