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 22 void * 23 tgt_get_target_handle(struct wlan_objmgr_pdev *pdev) 24 { 25 struct pdev_spectral *ps; 26 27 if (!pdev) { 28 spectral_err("PDEV is NULL!"); 29 return NULL; 30 } 31 ps = wlan_objmgr_pdev_get_comp_private_obj(pdev, 32 WLAN_UMAC_COMP_SPECTRAL); 33 if (!ps) { 34 spectral_err("PDEV SPECTRAL object is NULL!"); 35 return NULL; 36 } 37 return ps->psptrl_target_handle; 38 } 39 40 int 41 tgt_spectral_control( 42 struct wlan_objmgr_pdev *pdev, 43 u_int id, 44 void *indata, 45 u_int32_t insize, void *outdata, u_int32_t *outsize) 46 { 47 struct spectral_context *sc; 48 49 if (!pdev) { 50 spectral_err("PDEV is NULL!"); 51 return -EPERM; 52 } 53 sc = spectral_get_spectral_ctx_from_pdev(pdev); 54 if (!sc) { 55 spectral_err("spectral context is NULL!"); 56 return -EPERM; 57 } 58 return spectral_control_cmn(pdev, id, indata, insize, outdata, outsize); 59 } 60 61 void * 62 tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev) 63 { 64 struct wlan_objmgr_psoc *psoc = NULL; 65 66 psoc = wlan_pdev_get_psoc(pdev); 67 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_init( 68 pdev); 69 } 70 71 void 72 tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev) 73 { 74 struct wlan_objmgr_psoc *psoc = NULL; 75 76 psoc = wlan_pdev_get_psoc(pdev); 77 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev); 78 } 79 80 int 81 tgt_set_spectral_config( 82 struct wlan_objmgr_pdev *pdev, 83 const u_int32_t threshtype, const u_int32_t value) 84 { 85 struct wlan_objmgr_psoc *psoc = NULL; 86 87 psoc = wlan_pdev_get_psoc(pdev); 88 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_spectral_config( 89 pdev, threshtype, value); 90 } 91 92 void 93 tgt_get_spectral_config( 94 struct wlan_objmgr_pdev *pdev, 95 struct spectral_config *sptrl_config) 96 { 97 struct wlan_objmgr_psoc *psoc = NULL; 98 99 psoc = wlan_pdev_get_psoc(pdev); 100 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_config( 101 pdev, 102 sptrl_config); 103 } 104 105 int 106 tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev) 107 { 108 struct wlan_objmgr_psoc *psoc = NULL; 109 110 psoc = wlan_pdev_get_psoc(pdev); 111 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_start_spectral_scan( 112 pdev); 113 } 114 115 void 116 tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev) 117 { 118 struct wlan_objmgr_psoc *psoc = NULL; 119 120 psoc = wlan_pdev_get_psoc(pdev); 121 psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_stop_spectral_scan(pdev); 122 } 123 124 bool 125 tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev) 126 { 127 struct wlan_objmgr_psoc *psoc = NULL; 128 129 psoc = wlan_pdev_get_psoc(pdev); 130 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_active( 131 pdev); 132 } 133 134 bool 135 tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev) 136 { 137 struct wlan_objmgr_psoc *psoc = NULL; 138 139 psoc = wlan_pdev_get_psoc(pdev); 140 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_enabled( 141 pdev); 142 } 143 144 int 145 tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level) 146 { 147 struct wlan_objmgr_psoc *psoc = NULL; 148 149 psoc = wlan_pdev_get_psoc(pdev); 150 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_debug_level( 151 pdev, 152 debug_level); 153 } 154 155 u_int32_t 156 tgt_get_debug_level(struct wlan_objmgr_pdev *pdev) 157 { 158 struct wlan_objmgr_psoc *psoc = NULL; 159 160 psoc = wlan_pdev_get_psoc(pdev); 161 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_debug_level(pdev); 162 } 163 164 void 165 tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev, void *outdata) 166 { 167 struct wlan_objmgr_psoc *psoc = NULL; 168 169 psoc = wlan_pdev_get_psoc(pdev); 170 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_capinfo( 171 pdev, outdata); 172 } 173 174 void 175 tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev, void *outdata) 176 { 177 struct wlan_objmgr_psoc *psoc = NULL; 178 179 psoc = wlan_pdev_get_psoc(pdev); 180 return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_diagstats( 181 pdev, outdata); 182 } 183 184 void 185 tgt_register_wmi_spectral_cmd_ops( 186 struct wlan_objmgr_pdev *pdev, 187 struct wmi_spectral_cmd_ops *cmd_ops) 188 { 189 struct wlan_objmgr_psoc *psoc = NULL; 190 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 191 192 psoc = wlan_pdev_get_psoc(pdev); 193 194 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 195 196 return psptrl_tx_ops->sptrlto_register_wmi_spectral_cmd_ops(pdev, 197 cmd_ops); 198 } 199 200 void 201 tgt_spectral_register_nl_cb( 202 struct wlan_objmgr_pdev *pdev, 203 struct spectral_nl_cb *nl_cb) 204 { 205 struct wlan_objmgr_psoc *psoc = NULL; 206 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 207 208 if (!pdev) { 209 spectral_err("PDEV is NULL!"); 210 return; 211 } 212 psoc = wlan_pdev_get_psoc(pdev); 213 214 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 215 216 return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev, 217 nl_cb); 218 } 219 220 bool 221 tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev) 222 { 223 struct wlan_objmgr_psoc *psoc = NULL; 224 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 225 226 psoc = wlan_pdev_get_psoc(pdev); 227 228 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 229 230 return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev); 231 } 232 233 void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev) 234 { 235 struct wlan_objmgr_psoc *psoc = NULL; 236 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 237 238 if (!pdev) { 239 spectral_err("PDEV is NULL!"); 240 return; 241 } 242 psoc = wlan_pdev_get_psoc(pdev); 243 244 psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops; 245 246 psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev); 247 } 248