xref: /wlan-driver/qca-wifi-host-cmn/target_if/cfr/src/target_if_cfr_adrastea.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2023 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: target_if_cfr_adrastea.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * Target interface of CFR for Adrastea implementation
24*5113495bSYour Name  *
25*5113495bSYour Name  */
26*5113495bSYour Name 
27*5113495bSYour Name #include <cdp_txrx_ctrl.h>
28*5113495bSYour Name #include <qdf_nbuf.h>
29*5113495bSYour Name #include "target_if_cfr.h"
30*5113495bSYour Name #include "init_deinit_lmac.h"
31*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
32*5113495bSYour Name #include "wlan_cfr_utils_api.h"
33*5113495bSYour Name #include "target_if_cfr_adrastea.h"
34*5113495bSYour Name #include "cfg_ucfg_api.h"
35*5113495bSYour Name #include "cfr_cfg.h"
36*5113495bSYour Name #include <target_if.h>
37*5113495bSYour Name 
38*5113495bSYour Name #ifdef WLAN_CFR_ADRASTEA
cfr_adrastea_init_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)39*5113495bSYour Name QDF_STATUS cfr_adrastea_init_pdev(struct wlan_objmgr_psoc *psoc,
40*5113495bSYour Name 				  struct wlan_objmgr_pdev *pdev)
41*5113495bSYour Name {
42*5113495bSYour Name 	struct pdev_cfr *cfr_pdev;
43*5113495bSYour Name 	struct psoc_cfr *cfr_psoc;
44*5113495bSYour Name 	struct wmi_unified *wmi_handle = NULL;
45*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
46*5113495bSYour Name 	struct tgt_info *info;
47*5113495bSYour Name 	bool cfr_capable;
48*5113495bSYour Name 	int num_mem_chunks, idx;
49*5113495bSYour Name 	u32 *read_index;
50*5113495bSYour Name 
51*5113495bSYour Name 	if (!psoc || !pdev) {
52*5113495bSYour Name 		cfr_err("null pdev or psoc");
53*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
54*5113495bSYour Name 	}
55*5113495bSYour Name 
56*5113495bSYour Name 	cfr_pdev = wlan_objmgr_pdev_get_comp_private_obj(
57*5113495bSYour Name 					pdev, WLAN_UMAC_COMP_CFR);
58*5113495bSYour Name 	if (!cfr_pdev) {
59*5113495bSYour Name 		cfr_err("null pdev cfr");
60*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
61*5113495bSYour Name 	}
62*5113495bSYour Name 
63*5113495bSYour Name 	cfr_psoc = wlan_objmgr_psoc_get_comp_private_obj(
64*5113495bSYour Name 					psoc, WLAN_UMAC_COMP_CFR);
65*5113495bSYour Name 
66*5113495bSYour Name 	if (!cfr_psoc) {
67*5113495bSYour Name 		cfr_err("null psoc cfr");
68*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
69*5113495bSYour Name 	}
70*5113495bSYour Name 
71*5113495bSYour Name 	if (wlan_cfr_is_feature_disabled(pdev)) {
72*5113495bSYour Name 		cfr_pdev->is_cfr_capable = 0;
73*5113495bSYour Name 		cfr_psoc->is_cfr_capable = 0;
74*5113495bSYour Name 		cfr_info("cfr disabled");
75*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
76*5113495bSYour Name 	}
77*5113495bSYour Name 
78*5113495bSYour Name 	wmi_handle = lmac_get_pdev_wmi_handle(pdev);
79*5113495bSYour Name 	if (!wmi_handle) {
80*5113495bSYour Name 		cfr_err("null wmi handle");
81*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
82*5113495bSYour Name 	}
83*5113495bSYour Name 
84*5113495bSYour Name 	cfr_capable = wmi_service_enabled(wmi_handle,
85*5113495bSYour Name 					  wmi_service_cfr_capture_support);
86*5113495bSYour Name 	cfr_pdev->is_cfr_capable = cfr_capable;
87*5113495bSYour Name 	cfr_psoc->is_cfr_capable = cfr_capable;
88*5113495bSYour Name 	cfr_pdev->chip_type = CFR_CAPTURE_RADIO_ADRASTEA;
89*5113495bSYour Name 	cfr_pdev->cfr_max_sta_count = MAX_CFR_ENABLED_CLIENTS;
90*5113495bSYour Name 	cfr_pdev->subbuf_size = STREAMFS_MAX_SUBBUF_ADRASTEA;
91*5113495bSYour Name 	cfr_pdev->num_subbufs = STREAMFS_NUM_BUF_SUBBUF_ADRASTEA;
92*5113495bSYour Name 	cfr_pdev->pdev_obj = pdev;
93*5113495bSYour Name 	cfr_psoc->psoc_obj = psoc;
94*5113495bSYour Name 
95*5113495bSYour Name 	if (!cfr_capable) {
96*5113495bSYour Name 		cfr_err("FW doesn't support CFR");
97*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
98*5113495bSYour Name 	}
99*5113495bSYour Name 
100*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
101*5113495bSYour Name 
102*5113495bSYour Name 	info = &(tgt_hdl->info);
103*5113495bSYour Name 	num_mem_chunks = info->num_mem_chunks;
104*5113495bSYour Name 
105*5113495bSYour Name 	/*
106*5113495bSYour Name 	 * Copy the host mem chunk info allocated during init
107*5113495bSYour Name 	 * for CFR capture in cfr pdev
108*5113495bSYour Name 	 */
109*5113495bSYour Name 	for (idx = 0; idx < num_mem_chunks; idx++) {
110*5113495bSYour Name 		if (info->mem_chunks[idx].req_id ==
111*5113495bSYour Name 					CFR_CAPTURE_HOST_MEM_REQ_ID) {
112*5113495bSYour Name 			cfr_pdev->cfr_mem_chunk.vaddr =
113*5113495bSYour Name 						info->mem_chunks[idx].vaddr;
114*5113495bSYour Name 			cfr_pdev->cfr_mem_chunk.paddr =
115*5113495bSYour Name 						info->mem_chunks[idx].paddr;
116*5113495bSYour Name 			cfr_pdev->cfr_mem_chunk.req_id =
117*5113495bSYour Name 						info->mem_chunks[idx].req_id;
118*5113495bSYour Name 			cfr_pdev->cfr_mem_chunk.len = info->mem_chunks[idx].len;
119*5113495bSYour Name 
120*5113495bSYour Name 			/* Initialize the read index with default value */
121*5113495bSYour Name 			read_index = (u32 *)info->mem_chunks[idx].vaddr;
122*5113495bSYour Name 			(*read_index) = CFR_HOST_MEM_READ_INDEX_DEFAULT;
123*5113495bSYour Name 			break;
124*5113495bSYour Name 		}
125*5113495bSYour Name 	}
126*5113495bSYour Name 
127*5113495bSYour Name 	if (idx == num_mem_chunks) {
128*5113495bSYour Name 		cfr_err("Host mem chunks for CFR req id not allocated\n");
129*5113495bSYour Name 		cfr_pdev->is_cfr_capable = 0;
130*5113495bSYour Name 		cfr_psoc->is_cfr_capable = 0;
131*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
132*5113495bSYour Name 	}
133*5113495bSYour Name 
134*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
135*5113495bSYour Name }
136*5113495bSYour Name 
cfr_adrastea_deinit_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)137*5113495bSYour Name QDF_STATUS cfr_adrastea_deinit_pdev(struct wlan_objmgr_psoc *psoc,
138*5113495bSYour Name 				    struct wlan_objmgr_pdev *pdev)
139*5113495bSYour Name {
140*5113495bSYour Name 	struct pdev_cfr *pcfr;
141*5113495bSYour Name 
142*5113495bSYour Name 	if (!psoc || !pdev) {
143*5113495bSYour Name 		cfr_err("null pdev or psoc");
144*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
145*5113495bSYour Name 	}
146*5113495bSYour Name 
147*5113495bSYour Name 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(
148*5113495bSYour Name 					pdev, WLAN_UMAC_COMP_CFR);
149*5113495bSYour Name 	if (!pcfr) {
150*5113495bSYour Name 		cfr_err("null pdev cfr");
151*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
152*5113495bSYour Name 	}
153*5113495bSYour Name 
154*5113495bSYour Name 	if (!pcfr->is_cfr_capable) {
155*5113495bSYour Name 		cfr_info("cfr disabled or FW not support");
156*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
157*5113495bSYour Name 	}
158*5113495bSYour Name 
159*5113495bSYour Name 	qdf_mem_zero(&pcfr->cfr_mem_chunk,
160*5113495bSYour Name 		     sizeof(struct cfr_wmi_host_mem_chunk));
161*5113495bSYour Name 
162*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
163*5113495bSYour Name }
164*5113495bSYour Name #endif
165