1 /* 2 * Copyright (c) 2011,2017-2018 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 void * 25 tgt_get_target_handle(struct wlan_objmgr_pdev *pdev) 26 { 27 struct pdev_spectral *ps; 28 29 if (!pdev) { 30 spectral_err("PDEV is NULL!"); 31 return NULL; 32 } 33 ps = wlan_objmgr_pdev_get_comp_private_obj(pdev, 34 WLAN_UMAC_COMP_SPECTRAL); 35 if (!ps) { 36 spectral_err("PDEV SPECTRAL object is NULL!"); 37 return NULL; 38 } 39 return ps->psptrl_target_handle; 40 } 41 42 int 43 tgt_spectral_control( 44 struct wlan_objmgr_pdev *pdev, 45 u_int id, 46 void *indata, 47 u_int32_t insize, void *outdata, u_int32_t *outsize) 48 { 49 struct spectral_context *sc; 50 51 if (!pdev) { 52 spectral_err("PDEV is NULL!"); 53 return -EPERM; 54 } 55 sc = spectral_get_spectral_ctx_from_pdev(pdev); 56 if (!sc) { 57 spectral_err("spectral context is NULL!"); 58 return -EPERM; 59 } 60 return spectral_control_cmn(pdev, id, indata, insize, outdata, outsize); 61 } 62 63 void * 64 tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev) 65 { 66 struct wlan_objmgr_psoc *psoc = NULL; 67 68 psoc = wlan_pdev_get_psoc(pdev); 69 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_init( 70 pdev); 71 } 72 73 void 74 tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev) 75 { 76 struct wlan_objmgr_psoc *psoc = NULL; 77 78 psoc = wlan_pdev_get_psoc(pdev); 79 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev); 80 } 81 82 int 83 tgt_set_spectral_config( 84 struct wlan_objmgr_pdev *pdev, 85 const u_int32_t threshtype, const u_int32_t value) 86 { 87 struct wlan_objmgr_psoc *psoc = NULL; 88 89 psoc = wlan_pdev_get_psoc(pdev); 90 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_spectral_config( 91 pdev, threshtype, value); 92 } 93 94 void 95 tgt_get_spectral_config( 96 struct wlan_objmgr_pdev *pdev, 97 struct spectral_config *sptrl_config) 98 { 99 struct wlan_objmgr_psoc *psoc = NULL; 100 101 psoc = wlan_pdev_get_psoc(pdev); 102 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_config( 103 pdev, 104 sptrl_config); 105 } 106 107 int 108 tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev) 109 { 110 struct wlan_objmgr_psoc *psoc = NULL; 111 112 psoc = wlan_pdev_get_psoc(pdev); 113 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_start_spectral_scan( 114 pdev); 115 } 116 117 void 118 tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev) 119 { 120 struct wlan_objmgr_psoc *psoc = NULL; 121 122 psoc = wlan_pdev_get_psoc(pdev); 123 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_stop_spectral_scan(pdev); 124 } 125 126 bool 127 tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev) 128 { 129 struct wlan_objmgr_psoc *psoc = NULL; 130 131 psoc = wlan_pdev_get_psoc(pdev); 132 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_active( 133 pdev); 134 } 135 136 bool 137 tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev) 138 { 139 struct wlan_objmgr_psoc *psoc = NULL; 140 141 psoc = wlan_pdev_get_psoc(pdev); 142 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_enabled( 143 pdev); 144 } 145 146 int 147 tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level) 148 { 149 struct wlan_objmgr_psoc *psoc = NULL; 150 151 psoc = wlan_pdev_get_psoc(pdev); 152 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_debug_level( 153 pdev, 154 debug_level); 155 } 156 157 u_int32_t 158 tgt_get_debug_level(struct wlan_objmgr_pdev *pdev) 159 { 160 struct wlan_objmgr_psoc *psoc = NULL; 161 162 psoc = wlan_pdev_get_psoc(pdev); 163 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_debug_level(pdev); 164 } 165 166 void 167 tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev, void *outdata) 168 { 169 struct wlan_objmgr_psoc *psoc = NULL; 170 171 psoc = wlan_pdev_get_psoc(pdev); 172 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_capinfo( 173 pdev, outdata); 174 } 175 176 void 177 tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev, void *outdata) 178 { 179 struct wlan_objmgr_psoc *psoc = NULL; 180 181 psoc = wlan_pdev_get_psoc(pdev); 182 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_diagstats( 183 pdev, outdata); 184 } 185 186 void 187 tgt_register_wmi_spectral_cmd_ops( 188 struct wlan_objmgr_pdev *pdev, 189 struct wmi_spectral_cmd_ops *cmd_ops) 190 { 191 struct wlan_objmgr_psoc *psoc = NULL; 192 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 193 194 psoc = wlan_pdev_get_psoc(pdev); 195 196 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 197 198 return psptrl_tx_ops->sptrlto_register_wmi_spectral_cmd_ops(pdev, 199 cmd_ops); 200 } 201 202 void 203 tgt_spectral_register_nl_cb( 204 struct wlan_objmgr_pdev *pdev, 205 struct spectral_nl_cb *nl_cb) 206 { 207 struct wlan_objmgr_psoc *psoc = NULL; 208 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 209 210 if (!pdev) { 211 spectral_err("PDEV is NULL!"); 212 return; 213 } 214 psoc = wlan_pdev_get_psoc(pdev); 215 216 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 217 218 return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev, 219 nl_cb); 220 } 221 222 bool 223 tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev) 224 { 225 struct wlan_objmgr_psoc *psoc = NULL; 226 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 227 228 psoc = wlan_pdev_get_psoc(pdev); 229 230 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 231 232 return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev); 233 } 234 235 void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev) 236 { 237 struct wlan_objmgr_psoc *psoc = NULL; 238 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 239 240 if (!pdev) { 241 spectral_err("PDEV is NULL!"); 242 return; 243 } 244 psoc = wlan_pdev_get_psoc(pdev); 245 246 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 247 248 psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev); 249 } 250 251 int 252 tgt_spectral_process_report(struct wlan_objmgr_pdev *pdev, 253 void *payload) 254 { 255 struct wlan_objmgr_psoc *psoc = NULL; 256 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 257 258 psoc = wlan_pdev_get_psoc(pdev); 259 260 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 261 262 return psptrl_tx_ops->sptrlto_process_spectral_report(pdev, payload); 263 } 264 265 uint32_t 266 tgt_spectral_get_target_type(struct wlan_objmgr_psoc *psoc) 267 { 268 uint32_t target_type = 0; 269 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops; 270 271 target_type_tx_ops = &psoc->soc_cb.tx_ops.target_tx_ops; 272 273 if (target_type_tx_ops->tgt_get_tgt_type) 274 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc); 275 276 return target_type; 277 } 278 279 #ifdef DIRECT_BUF_RX_ENABLE 280 QDF_STATUS 281 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev) 282 { 283 struct wlan_objmgr_psoc *psoc; 284 struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL; 285 286 psoc = wlan_pdev_get_psoc(pdev); 287 dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops; 288 289 if ((tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074) || 290 (tgt_spectral_get_target_type(psoc) == TARGET_TYPE_QCA8074V2)) 291 if (dbr_tx_ops->direct_buf_rx_module_register) 292 return dbr_tx_ops->direct_buf_rx_module_register 293 (pdev, 0, 294 spectral_dbr_event_handler); 295 296 return QDF_STATUS_E_FAILURE; 297 } 298 #else 299 QDF_STATUS 300 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev) 301 { 302 return QDF_STATUS_SUCCESS; 303 } 304 #endif 305