xref: /wlan-dirver/qca-wifi-host-cmn/spectral/dispatcher/src/wlan_spectral_utils_api.c (revision 3149adf58a329e17232a4c0e58d460d025edd55a)
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