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