1 /* 2 * Copyright (c) 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_utils_api.h> 21 #include <qdf_module.h> 22 #include "../../core/spectral_cmn_api_i.h" 23 #include <wlan_spectral_tgt_api.h> 24 #include <linux/export.h> 25 26 QDF_STATUS 27 wlan_spectral_init(void) 28 { 29 if (wlan_objmgr_register_psoc_create_handler( 30 WLAN_UMAC_COMP_SPECTRAL, 31 wlan_spectral_psoc_obj_create_handler, 32 NULL) != 33 QDF_STATUS_SUCCESS) { 34 return QDF_STATUS_E_FAILURE; 35 } 36 if (wlan_objmgr_register_psoc_destroy_handler( 37 WLAN_UMAC_COMP_SPECTRAL, 38 wlan_spectral_psoc_obj_destroy_handler, 39 NULL) != 40 QDF_STATUS_SUCCESS) { 41 return QDF_STATUS_E_FAILURE; 42 } 43 if (wlan_objmgr_register_pdev_create_handler( 44 WLAN_UMAC_COMP_SPECTRAL, 45 wlan_spectral_pdev_obj_create_handler, 46 NULL) != 47 QDF_STATUS_SUCCESS) { 48 return QDF_STATUS_E_FAILURE; 49 } 50 if (wlan_objmgr_register_pdev_destroy_handler( 51 WLAN_UMAC_COMP_SPECTRAL, 52 wlan_spectral_pdev_obj_destroy_handler, 53 NULL) != 54 QDF_STATUS_SUCCESS) { 55 return QDF_STATUS_E_FAILURE; 56 } 57 58 return QDF_STATUS_SUCCESS; 59 } 60 61 QDF_STATUS 62 wlan_spectral_deinit(void) 63 { 64 if (wlan_objmgr_unregister_psoc_create_handler( 65 WLAN_UMAC_COMP_SPECTRAL, 66 wlan_spectral_psoc_obj_create_handler, 67 NULL) != 68 QDF_STATUS_SUCCESS) { 69 return QDF_STATUS_E_FAILURE; 70 } 71 if (wlan_objmgr_unregister_psoc_destroy_handler( 72 WLAN_UMAC_COMP_SPECTRAL, 73 wlan_spectral_psoc_obj_destroy_handler, 74 NULL) != 75 QDF_STATUS_SUCCESS) { 76 return QDF_STATUS_E_FAILURE; 77 } 78 if (wlan_objmgr_unregister_pdev_create_handler( 79 WLAN_UMAC_COMP_SPECTRAL, 80 wlan_spectral_pdev_obj_create_handler, 81 NULL) != 82 QDF_STATUS_SUCCESS) { 83 return QDF_STATUS_E_FAILURE; 84 } 85 if (wlan_objmgr_unregister_pdev_destroy_handler( 86 WLAN_UMAC_COMP_SPECTRAL, 87 wlan_spectral_pdev_obj_destroy_handler, 88 NULL) != 89 QDF_STATUS_SUCCESS) { 90 return QDF_STATUS_E_FAILURE; 91 } 92 return QDF_STATUS_SUCCESS; 93 } 94 95 QDF_STATUS 96 spectral_register_legacy_cb(struct wlan_objmgr_psoc *psoc, 97 struct spectral_legacy_cbacks *legacy_cbacks) 98 { 99 struct spectral_context *sc; 100 101 sc = spectral_get_spectral_ctx_from_psoc(psoc); 102 if (!sc) { 103 spectral_err("Invalid Context"); 104 return QDF_STATUS_E_FAILURE; 105 } 106 107 sc->legacy_cbacks.vdev_get_chan_freq = 108 legacy_cbacks->vdev_get_chan_freq; 109 sc->legacy_cbacks.vdev_get_ch_width = legacy_cbacks->vdev_get_ch_width; 110 sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz = 111 legacy_cbacks->vdev_get_sec20chan_freq_mhz; 112 113 return QDF_STATUS_SUCCESS; 114 } 115 EXPORT_SYMBOL(spectral_register_legacy_cb); 116 117 int16_t 118 spectral_vdev_get_chan_freq(struct wlan_objmgr_vdev *vdev) 119 { 120 struct spectral_context *sc; 121 122 sc = spectral_get_spectral_ctx_from_vdev(vdev); 123 if (!sc) { 124 spectral_err("spectral context is Null"); 125 return -EINVAL; 126 } 127 128 return sc->legacy_cbacks.vdev_get_chan_freq(vdev); 129 } 130 131 enum phy_ch_width 132 spectral_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev) 133 { 134 struct spectral_context *sc; 135 136 sc = spectral_get_spectral_ctx_from_vdev(vdev); 137 if (!sc) { 138 spectral_err("spectral context is Null"); 139 return CH_WIDTH_INVALID; 140 } 141 142 return sc->legacy_cbacks.vdev_get_ch_width(vdev); 143 } 144 145 int 146 spectral_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev, 147 uint16_t *sec20chan_freq) 148 { 149 struct spectral_context *sc; 150 151 sc = spectral_get_spectral_ctx_from_vdev(vdev); 152 if (!sc) { 153 spectral_err("spectral context is Null"); 154 return -EINVAL; 155 } 156 157 return sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz(vdev, 158 sec20chan_freq); 159 } 160 161 void 162 wlan_lmac_if_sptrl_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) 163 { 164 struct wlan_lmac_if_sptrl_rx_ops *sptrl_rx_ops = &rx_ops->sptrl_rx_ops; 165 166 /* Spectral rx ops */ 167 sptrl_rx_ops->sptrlro_get_target_handle = tgt_get_target_handle; 168 sptrl_rx_ops->sptrlro_vdev_get_chan_freq = spectral_vdev_get_chan_freq; 169 sptrl_rx_ops->sptrlro_vdev_get_ch_width = spectral_vdev_get_ch_width; 170 sptrl_rx_ops->sptrlro_vdev_get_sec20chan_freq_mhz = 171 spectral_vdev_get_sec20chan_freq_mhz; 172 } 173 174 void 175 wlan_register_wmi_spectral_cmd_ops(struct wlan_objmgr_pdev *pdev, 176 struct wmi_spectral_cmd_ops *cmd_ops) 177 { 178 struct spectral_context *sc; 179 180 if (!pdev) 181 spectral_err("PDEV is NULL!"); 182 183 sc = spectral_get_spectral_ctx_from_pdev(pdev); 184 if (!sc) { 185 spectral_err("spectral context is NULL!"); 186 return; 187 } 188 189 return sc->sptrlc_register_wmi_spectral_cmd_ops(pdev, cmd_ops); 190 } 191 EXPORT_SYMBOL(wlan_register_wmi_spectral_cmd_ops); 192 193 QDF_STATUS spectral_pdev_open(struct wlan_objmgr_pdev *pdev) 194 { 195 struct wlan_objmgr_psoc *psoc; 196 QDF_STATUS status = QDF_STATUS_SUCCESS; 197 198 psoc = wlan_pdev_get_psoc(pdev); 199 200 /* Enable the registartion once FW supports this */ 201 spectral_debug("Enable registration to direct dma once FW supports it"); 202 203 return status; 204 } 205