1 /*
2 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
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 /**
21 * DOC: init_deinit_lmac.c
22 *
23 * APIs to get/set target_if params
24 */
25 #include <qdf_status.h>
26 #include <wlan_objmgr_psoc_obj.h>
27 #include <wlan_objmgr_pdev_obj.h>
28 #include <target_if.h>
29 #include <target_type.h>
30 #include <init_deinit_lmac.h>
31 #include <qdf_module.h>
32
lmac_get_target_cap(struct wlan_objmgr_psoc * psoc)33 struct wlan_psoc_target_capability_info *lmac_get_target_cap(
34 struct wlan_objmgr_psoc *psoc)
35 {
36 struct target_psoc_info *tgt_hdl;
37
38 if (!psoc) {
39 target_if_err("psoc is null");
40 return NULL;
41 }
42
43 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
44 if (!tgt_hdl) {
45 target_if_err("target_psoc_info is null");
46 return NULL;
47 }
48
49 return target_psoc_get_target_caps(tgt_hdl);
50 }
51
lmac_get_tgt_res_cfg(struct wlan_objmgr_psoc * psoc)52 target_resource_config *lmac_get_tgt_res_cfg(struct wlan_objmgr_psoc *psoc)
53 {
54 struct target_psoc_info *tgt_hdl;
55
56 if (!psoc) {
57 target_if_err("psoc is null");
58 return NULL;
59 }
60
61 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
62 if (!tgt_hdl) {
63 target_if_err("target_psoc_info is null");
64 return NULL;
65 }
66
67 return target_psoc_get_wlan_res_cfg(tgt_hdl);
68 }
69
lmac_get_pdev_idx(struct wlan_objmgr_pdev * pdev)70 int32_t lmac_get_pdev_idx(struct wlan_objmgr_pdev *pdev)
71 {
72 if (!pdev) {
73 target_if_err("pdev is null");
74 return 0xffffffff;
75 }
76
77 return wlan_objmgr_pdev_get_pdev_id(pdev);
78 }
79
lmac_get_tgt_type(struct wlan_objmgr_psoc * psoc)80 uint32_t lmac_get_tgt_type(struct wlan_objmgr_psoc *psoc)
81 {
82 struct target_psoc_info *tgt_hdl;
83
84 if (!psoc) {
85 target_if_err("psoc is null");
86 return 0;
87 }
88
89 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
90 if (!tgt_hdl) {
91 target_if_err("target_psoc_info is null");
92 return 0;
93 }
94
95 return target_psoc_get_target_type(tgt_hdl);
96 }
97 qdf_export_symbol(lmac_get_tgt_type);
98
lmac_get_pdev_target_type(struct wlan_objmgr_pdev * pdev,uint32_t * target_type)99 QDF_STATUS lmac_get_pdev_target_type(struct wlan_objmgr_pdev *pdev,
100 uint32_t *target_type)
101 {
102 struct wlan_objmgr_psoc *psoc;
103
104 psoc = wlan_pdev_get_psoc(pdev);
105 if (!psoc) {
106 target_if_err("psoc is NULL");
107 return QDF_STATUS_E_FAILURE;
108 }
109
110 *target_type = lmac_get_tgt_type(psoc);
111 return QDF_STATUS_SUCCESS;
112 }
113 qdf_export_symbol(lmac_get_pdev_target_type);
114
lmac_get_tgt_version(struct wlan_objmgr_psoc * psoc)115 uint32_t lmac_get_tgt_version(struct wlan_objmgr_psoc *psoc)
116 {
117 struct target_psoc_info *tgt_hdl;
118
119 if (!psoc) {
120 target_if_err("psoc is null");
121 return -EINVAL;
122 }
123
124 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
125 if (!tgt_hdl) {
126 target_if_err("target_psoc_info is null");
127 return -EINVAL;
128 }
129
130 return target_psoc_get_target_ver(tgt_hdl);
131 }
132 qdf_export_symbol(lmac_get_tgt_version);
133
lmac_get_tgt_revision(struct wlan_objmgr_psoc * psoc)134 uint32_t lmac_get_tgt_revision(struct wlan_objmgr_psoc *psoc)
135 {
136 struct target_psoc_info *tgt_hdl;
137
138 if (!psoc) {
139 target_if_err("psoc is null");
140 return -EINVAL;
141 }
142
143 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
144 if (!tgt_hdl) {
145 target_if_err("target_psoc_info is null");
146 return -EINVAL;
147 }
148
149 return target_psoc_get_target_rev(tgt_hdl);
150 }
151 qdf_export_symbol(lmac_get_tgt_revision);
152
lmac_is_target_ar900b(struct wlan_objmgr_psoc * psoc)153 bool lmac_is_target_ar900b(struct wlan_objmgr_psoc *psoc)
154 {
155 struct target_psoc_info *tgt_hdl;
156 uint32_t target_type;
157
158 if (!psoc) {
159 target_if_err("psoc is null\n");
160 return false;
161 }
162
163 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
164 if (!tgt_hdl) {
165 target_if_err("target_psoc_info is null");
166 return false;
167 }
168 target_type = tgt_hdl->info.target_type;
169
170 switch (target_type) {
171 case TARGET_TYPE_AR900B:
172 case TARGET_TYPE_QCA9984:
173 case TARGET_TYPE_QCA9888:
174 return true;
175 default:
176 return false;
177 }
178 return false;
179 }
180 qdf_export_symbol(lmac_is_target_ar900b);
181
lmac_get_wmi_hdl(struct wlan_objmgr_psoc * psoc)182 struct wmi_unified *lmac_get_wmi_hdl(struct wlan_objmgr_psoc *psoc)
183 {
184 struct target_psoc_info *tgt_hdl;
185
186 if (!psoc) {
187 target_if_err("psoc is null");
188 return NULL;
189 }
190
191 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
192 if (!tgt_hdl) {
193 target_if_err("target_psoc_info is null");
194 return NULL;
195 }
196
197 return target_psoc_get_wmi_hdl(tgt_hdl);
198 }
199 qdf_export_symbol(lmac_get_wmi_hdl);
200
lmac_get_wmi_unified_hdl(struct wlan_objmgr_psoc * psoc)201 wmi_unified_t lmac_get_wmi_unified_hdl(struct wlan_objmgr_psoc *psoc)
202 {
203 return (wmi_unified_t)lmac_get_wmi_hdl(psoc);
204 }
205 qdf_export_symbol(lmac_get_wmi_unified_hdl);
206
lmac_get_htc_hdl(struct wlan_objmgr_psoc * psoc)207 HTC_HANDLE lmac_get_htc_hdl(struct wlan_objmgr_psoc *psoc)
208 {
209 struct target_psoc_info *tgt_hdl;
210
211 if (!psoc) {
212 target_if_err("psoc is null");
213 return NULL;
214 }
215
216 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
217 if (!tgt_hdl) {
218 target_if_err("target_psoc_info is null");
219 return NULL;
220 }
221
222 return target_psoc_get_htc_hdl(tgt_hdl);
223 }
224 qdf_export_symbol(lmac_get_htc_hdl);
225
lmac_set_htc_hdl(struct wlan_objmgr_psoc * psoc,HTC_HANDLE htc_hdl)226 void lmac_set_htc_hdl(struct wlan_objmgr_psoc *psoc,
227 HTC_HANDLE htc_hdl)
228 {
229 struct target_psoc_info *tgt_hdl;
230
231 if (!psoc) {
232 target_if_err("psoc is null");
233 return;
234 }
235 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
236 if (!tgt_hdl) {
237 target_if_err("target_psoc_info is null");
238 return;
239 }
240
241 target_psoc_set_htc_hdl(tgt_hdl, htc_hdl);
242 }
243
lmac_get_hif_hdl(struct wlan_objmgr_psoc * psoc)244 struct hif_opaque_softc *lmac_get_hif_hdl(struct wlan_objmgr_psoc *psoc)
245 {
246 struct target_psoc_info *tgt_hdl;
247
248 if (!psoc) {
249 target_if_err("psoc is null");
250 return NULL;
251 }
252
253 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
254 if (!tgt_hdl) {
255 target_if_err("target_psoc_info is null");
256 return NULL;
257 }
258
259 return target_psoc_get_hif_hdl(tgt_hdl);
260 }
261 qdf_export_symbol(lmac_get_hif_hdl);
262
lmac_get_ol_hif_hdl(struct wlan_objmgr_psoc * psoc)263 struct hif_opaque_softc *lmac_get_ol_hif_hdl(struct wlan_objmgr_psoc *psoc)
264 {
265 return (struct hif_opaque_softc *)lmac_get_hif_hdl(psoc);
266 }
267 qdf_export_symbol(lmac_get_ol_hif_hdl);
268
lmac_get_pdev_wmi_handle(struct wlan_objmgr_pdev * pdev)269 struct wmi_unified *lmac_get_pdev_wmi_handle(
270 struct wlan_objmgr_pdev *pdev)
271 {
272 struct target_pdev_info *tgt_hdl;
273
274 if (!pdev) {
275 target_if_err("pdev is null");
276 return NULL;
277 }
278
279 tgt_hdl = wlan_pdev_get_tgt_if_handle(pdev);
280 if (!tgt_hdl) {
281 target_if_err("target_pdev_info is null");
282 return NULL;
283 }
284
285 return target_pdev_get_wmi_handle(tgt_hdl);
286 }
287 qdf_export_symbol(lmac_get_pdev_wmi_handle);
288
289 wmi_unified_t
lmac_get_pdev_wmi_unified_handle(struct wlan_objmgr_pdev * pdev)290 lmac_get_pdev_wmi_unified_handle(struct wlan_objmgr_pdev *pdev)
291 {
292 return (wmi_unified_t)lmac_get_pdev_wmi_handle(pdev);
293 }
294
lmac_get_num_radios(struct wlan_objmgr_psoc * psoc)295 uint32_t lmac_get_num_radios(struct wlan_objmgr_psoc *psoc)
296 {
297 struct target_psoc_info *tgt_hdl;
298
299 if (!psoc) {
300 target_if_err("psoc is null");
301 return 0;
302 }
303 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
304 if (!tgt_hdl) {
305 target_if_err("target_psoc_info is null");
306 return 0;
307 }
308
309 return target_psoc_get_num_radios(tgt_hdl);
310 }
311 qdf_export_symbol(lmac_get_num_radios);
312
lmac_get_psoc_feature_ptr(struct wlan_objmgr_psoc * psoc)313 void *lmac_get_psoc_feature_ptr(struct wlan_objmgr_psoc *psoc)
314 {
315 struct target_psoc_info *tgt_hdl;
316
317 if (!psoc) {
318 target_if_err("psoc is null");
319 return NULL;
320 }
321 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
322 if (!tgt_hdl) {
323 target_if_err("target_psoc_info is null");
324 return NULL;
325 }
326
327 return target_psoc_get_feature_ptr(tgt_hdl);
328 }
329 qdf_export_symbol(lmac_get_psoc_feature_ptr);
330
lmac_get_pdev_feature_ptr(struct wlan_objmgr_pdev * pdev)331 void *lmac_get_pdev_feature_ptr(struct wlan_objmgr_pdev *pdev)
332 {
333 struct target_pdev_info *tgt_hdl;
334
335 if (!pdev) {
336 target_if_err("pdev is null");
337 return NULL;
338 }
339 tgt_hdl = wlan_pdev_get_tgt_if_handle(pdev);
340 if (!tgt_hdl) {
341 target_if_err("target_pdev_info is null");
342 return NULL;
343 }
344
345 return target_pdev_get_feature_ptr(tgt_hdl);
346 }
347 qdf_export_symbol(lmac_get_pdev_feature_ptr);
348
lmac_get_preferred_hw_mode(struct wlan_objmgr_psoc * psoc)349 enum wmi_host_hw_mode_config_type lmac_get_preferred_hw_mode(
350 struct wlan_objmgr_psoc *psoc)
351 {
352 struct target_psoc_info *tgt_hdl;
353
354 if (!psoc) {
355 target_if_err("psoc is null");
356 return WMI_HOST_HW_MODE_MAX;
357 }
358 tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
359 if (!tgt_hdl) {
360 target_if_err("target_psoc_info is null");
361 return WMI_HOST_HW_MODE_MAX;
362 }
363
364 return target_psoc_get_preferred_hw_mode(tgt_hdl);
365 }
366
367 qdf_export_symbol(lmac_get_preferred_hw_mode);
368