xref: /wlan-dirver/qca-wifi-host-cmn/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c (revision 1397a33f48ea6455be40871470b286e535820eb8)
1 /*
2  * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include "target_if.h"
20 #include "wlan_lmac_if_def.h"
21 #include "target_if_direct_buf_rx_main.h"
22 #include <target_if_direct_buf_rx_api.h>
23 #include "hal_api.h"
24 #include <service_ready_util.h>
25 #include <init_deinit_lmac.h>
26 
27 /**
28  * struct module_name : Module name information structure
29  * @module_name_str : Module name subscribing to DBR
30  */
31 struct module_name {
32 	unsigned char module_name_str[QDF_MAX_NAME_SIZE];
33 };
34 
35 static const struct module_name g_dbr_module_name[DBR_MODULE_MAX] = {
36 	[DBR_MODULE_SPECTRAL] = {"SPECTRAL"},
37 };
38 
39 static uint8_t get_num_dbr_modules_per_pdev(struct wlan_objmgr_pdev *pdev)
40 {
41 	struct wlan_objmgr_psoc *psoc;
42 	struct wlan_psoc_host_dbr_ring_caps *dbr_ring_cap;
43 	uint8_t num_dbr_ring_caps, cap_idx, pdev_id, num_modules;
44 	struct target_psoc_info *tgt_psoc_info;
45 	struct wlan_psoc_host_service_ext_param *ext_svc_param;
46 
47 	psoc = wlan_pdev_get_psoc(pdev);
48 
49 	if (psoc == NULL) {
50 		direct_buf_rx_err("psoc is null");
51 		return 0;
52 	}
53 
54 	tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
55 	if (tgt_psoc_info == NULL) {
56 		direct_buf_rx_err("target_psoc_info is null");
57 		return 0;
58 	}
59 	ext_svc_param = target_psoc_get_service_ext_param(tgt_psoc_info);
60 	num_dbr_ring_caps = ext_svc_param->num_dbr_ring_caps;
61 	dbr_ring_cap = target_psoc_get_dbr_ring_caps(tgt_psoc_info);
62 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
63 	num_modules = 0;
64 
65 	for (cap_idx = 0; cap_idx < num_dbr_ring_caps; cap_idx++) {
66 		if (dbr_ring_cap[cap_idx].pdev_id == pdev_id)
67 			num_modules++;
68 	}
69 
70 	return num_modules;
71 }
72 
73 static QDF_STATUS populate_dbr_cap_mod_param(struct wlan_objmgr_pdev *pdev,
74 			struct direct_buf_rx_module_param *mod_param)
75 {
76 	struct wlan_objmgr_psoc *psoc;
77 	struct wlan_psoc_host_dbr_ring_caps *dbr_ring_cap;
78 	uint8_t cap_idx;
79 	bool cap_found = false;
80 	enum DBR_MODULE mod_id = mod_param->mod_id;
81 	uint32_t num_dbr_ring_caps, pdev_id;
82 	struct target_psoc_info *tgt_psoc_info;
83 	struct wlan_psoc_host_service_ext_param *ext_svc_param;
84 
85 	psoc = wlan_pdev_get_psoc(pdev);
86 
87 	if (psoc == NULL) {
88 		direct_buf_rx_err("psoc is null");
89 		return QDF_STATUS_E_INVAL;
90 	}
91 
92 	tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
93 	if (tgt_psoc_info == NULL) {
94 		direct_buf_rx_err("target_psoc_info is null");
95 		return QDF_STATUS_E_INVAL;
96 	}
97 
98 	ext_svc_param = target_psoc_get_service_ext_param(tgt_psoc_info);
99 	num_dbr_ring_caps = ext_svc_param->num_dbr_ring_caps;
100 	dbr_ring_cap = target_psoc_get_dbr_ring_caps(tgt_psoc_info);
101 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
102 
103 	for (cap_idx = 0; cap_idx < num_dbr_ring_caps; cap_idx++) {
104 		if (dbr_ring_cap[cap_idx].pdev_id == pdev_id) {
105 			if (dbr_ring_cap[cap_idx].mod_id == mod_id) {
106 				mod_param->dbr_ring_cap->ring_elems_min =
107 					dbr_ring_cap[cap_idx].ring_elems_min;
108 				mod_param->dbr_ring_cap->min_buf_size =
109 					dbr_ring_cap[cap_idx].min_buf_size;
110 				mod_param->dbr_ring_cap->min_buf_align =
111 					dbr_ring_cap[cap_idx].min_buf_align;
112 				cap_found = true;
113 			}
114 		}
115 	}
116 
117 	if (!cap_found) {
118 		direct_buf_rx_err("No cap found for module %d in pdev %d",
119 				  mod_id, pdev_id);
120 		return QDF_STATUS_E_FAILURE;
121 	}
122 
123 	return QDF_STATUS_SUCCESS;
124 }
125 
126 QDF_STATUS target_if_direct_buf_rx_pdev_create_handler(
127 	struct wlan_objmgr_pdev *pdev, void *data)
128 {
129 	struct direct_buf_rx_pdev_obj *dbr_pdev_obj;
130 	struct wlan_objmgr_psoc *psoc;
131 	uint8_t num_modules;
132 	QDF_STATUS status;
133 
134 	direct_buf_rx_enter();
135 
136 	if (pdev == NULL) {
137 		direct_buf_rx_err("pdev context passed is null");
138 		return QDF_STATUS_E_INVAL;
139 	}
140 
141 	psoc = wlan_pdev_get_psoc(pdev);
142 
143 	if (psoc == NULL) {
144 		direct_buf_rx_err("psoc is null");
145 		return QDF_STATUS_E_INVAL;
146 	}
147 
148 	dbr_pdev_obj = qdf_mem_malloc(sizeof(*dbr_pdev_obj));
149 
150 	if (dbr_pdev_obj == NULL) {
151 		direct_buf_rx_err("Failed to allocate dir buf rx pdev obj");
152 		return QDF_STATUS_E_NOMEM;
153 	}
154 
155 	direct_buf_rx_info("Dbr pdev obj %pK", dbr_pdev_obj);
156 
157 	status = wlan_objmgr_pdev_component_obj_attach(pdev,
158 					WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
159 					dbr_pdev_obj, QDF_STATUS_SUCCESS);
160 
161 	if (status != QDF_STATUS_SUCCESS) {
162 		direct_buf_rx_err("Failed to attach dir buf rx component %d",
163 				  status);
164 		qdf_mem_free(dbr_pdev_obj);
165 		return status;
166 	}
167 
168 	num_modules = get_num_dbr_modules_per_pdev(pdev);
169 	direct_buf_rx_info("Number of modules = %d pdev %d", num_modules,
170 			   wlan_objmgr_pdev_get_pdev_id(pdev));
171 	dbr_pdev_obj->num_modules = num_modules;
172 
173 	if (!dbr_pdev_obj->num_modules) {
174 		direct_buf_rx_info("Number of modules = %d", num_modules);
175 		return QDF_STATUS_SUCCESS;
176 	}
177 
178 	dbr_pdev_obj->dbr_mod_param = qdf_mem_malloc(num_modules *
179 				sizeof(struct direct_buf_rx_module_param));
180 
181 	if (dbr_pdev_obj->dbr_mod_param == NULL) {
182 		direct_buf_rx_err("Failed to allocate dir buf rx mod param");
183 		wlan_objmgr_pdev_component_obj_detach(pdev,
184 					WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
185 					dbr_pdev_obj);
186 		qdf_mem_free(dbr_pdev_obj);
187 		return QDF_STATUS_E_NOMEM;
188 	}
189 
190 
191 	return QDF_STATUS_SUCCESS;
192 }
193 
194 QDF_STATUS target_if_direct_buf_rx_pdev_destroy_handler(
195 	struct wlan_objmgr_pdev *pdev, void *data)
196 {
197 	struct direct_buf_rx_pdev_obj *dbr_pdev_obj;
198 	QDF_STATUS status;
199 	uint8_t num_modules, mod_idx;
200 
201 	if (pdev == NULL) {
202 		direct_buf_rx_err("pdev context passed is null");
203 		return QDF_STATUS_E_INVAL;
204 	}
205 
206 	dbr_pdev_obj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
207 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
208 
209 	if (dbr_pdev_obj == NULL) {
210 		direct_buf_rx_err("dir buf rx object is null");
211 		return QDF_STATUS_E_FAILURE;
212 	}
213 
214 	num_modules = dbr_pdev_obj->num_modules;
215 	for (mod_idx = 0; mod_idx < num_modules; mod_idx++)
216 		target_if_deinit_dbr_ring(pdev, dbr_pdev_obj, mod_idx);
217 
218 	qdf_mem_free(dbr_pdev_obj->dbr_mod_param);
219 	dbr_pdev_obj->dbr_mod_param = NULL;
220 
221 	status = wlan_objmgr_pdev_component_obj_detach(pdev,
222 					WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
223 					dbr_pdev_obj);
224 
225 	if (status != QDF_STATUS_SUCCESS) {
226 		direct_buf_rx_err("failed to detach dir buf rx component %d",
227 				  status);
228 	}
229 
230 	qdf_mem_free(dbr_pdev_obj);
231 
232 	return status;
233 }
234 
235 QDF_STATUS target_if_direct_buf_rx_psoc_create_handler(
236 	struct wlan_objmgr_psoc *psoc, void *data)
237 {
238 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
239 	QDF_STATUS status;
240 
241 	direct_buf_rx_enter();
242 
243 	if (psoc == NULL) {
244 		direct_buf_rx_err("psoc context passed is null");
245 		return QDF_STATUS_E_INVAL;
246 	}
247 
248 	dbr_psoc_obj = qdf_mem_malloc(sizeof(*dbr_psoc_obj));
249 
250 	if (!dbr_psoc_obj) {
251 		direct_buf_rx_err("failed to alloc dir buf rx psoc obj");
252 		return QDF_STATUS_E_NOMEM;
253 	}
254 
255 	direct_buf_rx_info("Dbr psoc obj %pK", dbr_psoc_obj);
256 
257 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
258 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, dbr_psoc_obj,
259 			QDF_STATUS_SUCCESS);
260 
261 	if (status != QDF_STATUS_SUCCESS) {
262 		direct_buf_rx_err("Failed to attach dir buf rx component %d",
263 				  status);
264 		goto attach_error;
265 	}
266 
267 	return status;
268 
269 attach_error:
270 	qdf_mem_free(dbr_psoc_obj);
271 
272 	return status;
273 }
274 
275 QDF_STATUS target_if_direct_buf_rx_psoc_destroy_handler(
276 	struct wlan_objmgr_psoc *psoc, void *data)
277 {
278 	QDF_STATUS status;
279 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
280 
281 	direct_buf_rx_enter();
282 
283 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
284 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
285 
286 	if (!dbr_psoc_obj) {
287 		direct_buf_rx_err("dir buf rx psoc obj is null");
288 		return QDF_STATUS_E_FAILURE;
289 	}
290 
291 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
292 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
293 				dbr_psoc_obj);
294 
295 	if (status != QDF_STATUS_SUCCESS) {
296 		direct_buf_rx_err("failed to detach dir buf rx component %d",
297 				  status);
298 	}
299 
300 	qdf_mem_free(dbr_psoc_obj);
301 
302 	return status;
303 }
304 
305 static QDF_STATUS target_if_dbr_replenish_ring(struct wlan_objmgr_pdev *pdev,
306 			struct direct_buf_rx_module_param *mod_param,
307 			void *aligned_vaddr, uint32_t cookie)
308 {
309 	uint64_t *ring_entry;
310 	uint32_t dw_lo, dw_hi = 0, map_status;
311 	void *hal_soc, *srng;
312 	qdf_dma_addr_t paddr;
313 	struct wlan_objmgr_psoc *psoc;
314 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
315 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
316 	struct direct_buf_rx_ring_cap *dbr_ring_cap;
317 	struct direct_buf_rx_buf_info *dbr_buf_pool;
318 
319 	direct_buf_rx_enter();
320 
321 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
322 	dbr_ring_cap = mod_param->dbr_ring_cap;
323 	dbr_buf_pool = mod_param->dbr_buf_pool;
324 
325 	psoc = wlan_pdev_get_psoc(pdev);
326 
327 	if (!psoc) {
328 		direct_buf_rx_err("psoc is null");
329 		return QDF_STATUS_E_FAILURE;
330 	}
331 
332 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
333 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
334 
335 	if (dbr_psoc_obj == NULL) {
336 		direct_buf_rx_err("dir buf rx psoc object is null");
337 		return QDF_STATUS_E_FAILURE;
338 	}
339 
340 	hal_soc = dbr_psoc_obj->hal_soc;
341 	srng = dbr_ring_cfg->srng;
342 	if (!aligned_vaddr) {
343 		direct_buf_rx_err("aligned vaddr is null");
344 		return QDF_STATUS_SUCCESS;
345 	}
346 
347 	map_status = qdf_mem_map_nbytes_single(dbr_psoc_obj->osdev,
348 					       aligned_vaddr,
349 					       QDF_DMA_FROM_DEVICE,
350 					       dbr_ring_cap->min_buf_size,
351 					       &paddr);
352 	if (map_status) {
353 		direct_buf_rx_err("mem map failed status = %d", map_status);
354 		return QDF_STATUS_E_FAILURE;
355 	}
356 
357 	QDF_ASSERT(!((uint64_t)paddr % dbr_ring_cap->min_buf_align));
358 	dbr_buf_pool[cookie].paddr = paddr;
359 
360 	hal_srng_access_start(hal_soc, srng);
361 	ring_entry = hal_srng_src_get_next(hal_soc, srng);
362 	QDF_ASSERT(ring_entry != NULL);
363 	dw_lo = (uint64_t)paddr & 0xFFFFFFFF;
364 	WMI_HOST_DBR_RING_ADDR_HI_SET(dw_hi, (uint64_t)paddr >> 32);
365 	WMI_HOST_DBR_DATA_ADDR_HI_HOST_DATA_SET(dw_hi, cookie);
366 	direct_buf_rx_info("Cookie = %d", cookie);
367 	direct_buf_rx_info("dw_lo = %x dw_hi = %x", dw_lo, dw_hi);
368 	*ring_entry = (uint64_t)dw_hi << 32 | dw_lo;
369 	direct_buf_rx_info("Valid ring entry");
370 	hal_srng_access_end(hal_soc, srng);
371 
372 	return QDF_STATUS_SUCCESS;
373 }
374 
375 static QDF_STATUS target_if_dbr_fill_ring(struct wlan_objmgr_pdev *pdev,
376 			  struct direct_buf_rx_module_param *mod_param)
377 {
378 	uint32_t idx;
379 	void *buf, *buf_aligned;
380 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
381 	struct direct_buf_rx_ring_cap *dbr_ring_cap;
382 	struct direct_buf_rx_buf_info *dbr_buf_pool;
383 	QDF_STATUS status;
384 
385 	direct_buf_rx_enter();
386 
387 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
388 	dbr_ring_cap = mod_param->dbr_ring_cap;
389 	dbr_buf_pool = mod_param->dbr_buf_pool;
390 
391 	for (idx = 0; idx < dbr_ring_cfg->num_ptr - 1; idx++) {
392 		buf_aligned = qdf_aligned_malloc(dbr_ring_cap->min_buf_size,
393 						 dbr_ring_cap->min_buf_align,
394 						 &buf);
395 		if (!buf_aligned) {
396 			direct_buf_rx_err(
397 					"dir buf rx ring buf_aligned alloc failed");
398 			return QDF_STATUS_E_NOMEM;
399 		}
400 		dbr_buf_pool[idx].vaddr = buf;
401 		dbr_buf_pool[idx].offset = buf_aligned - buf;
402 		dbr_buf_pool[idx].cookie = idx;
403 		status = target_if_dbr_replenish_ring(pdev, mod_param,
404 						      buf_aligned, idx);
405 		if (QDF_IS_STATUS_ERROR(status)) {
406 			direct_buf_rx_err("replenish failed with status : %d",
407 					  status);
408 			qdf_mem_free(buf);
409 			return QDF_STATUS_E_FAILURE;
410 		}
411 	}
412 
413 	return QDF_STATUS_SUCCESS;
414 }
415 
416 static QDF_STATUS target_if_dbr_init_ring(struct wlan_objmgr_pdev *pdev,
417 			struct direct_buf_rx_module_param *mod_param)
418 {
419 	void *srng;
420 	uint32_t num_entries, ring_alloc_size, max_entries, entry_size;
421 	qdf_dma_addr_t paddr;
422 	struct hal_srng_params ring_params = {0};
423 	struct wlan_objmgr_psoc *psoc;
424 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
425 	struct direct_buf_rx_ring_cap *dbr_ring_cap;
426 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
427 	QDF_STATUS status;
428 
429 	direct_buf_rx_enter();
430 
431 	psoc = wlan_pdev_get_psoc(pdev);
432 
433 	if (!psoc) {
434 		direct_buf_rx_err("psoc is null");
435 		return QDF_STATUS_E_FAILURE;
436 	}
437 
438 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
439 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
440 
441 	if (dbr_psoc_obj == NULL) {
442 		direct_buf_rx_err("dir buf rx psoc object is null");
443 		return QDF_STATUS_E_FAILURE;
444 	}
445 
446 	if (dbr_psoc_obj->hal_soc == NULL ||
447 	    dbr_psoc_obj->osdev == NULL) {
448 		direct_buf_rx_err("dir buf rx target attach failed");
449 		return QDF_STATUS_E_FAILURE;
450 	}
451 
452 	max_entries = hal_srng_max_entries(dbr_psoc_obj->hal_soc,
453 					   DIR_BUF_RX_DMA_SRC);
454 	entry_size = hal_srng_get_entrysize(dbr_psoc_obj->hal_soc,
455 					    DIR_BUF_RX_DMA_SRC);
456 	direct_buf_rx_info("Max Entries = %d", max_entries);
457 	direct_buf_rx_info("Entry Size = %d", entry_size);
458 
459 	status = populate_dbr_cap_mod_param(pdev, mod_param);
460 	if (QDF_IS_STATUS_ERROR(status)) {
461 		direct_buf_rx_err("Module cap population failed");
462 		return QDF_STATUS_E_FAILURE;
463 	}
464 
465 	dbr_ring_cap = mod_param->dbr_ring_cap;
466 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
467 	num_entries = dbr_ring_cap->ring_elems_min > max_entries ?
468 			max_entries : dbr_ring_cap->ring_elems_min;
469 	direct_buf_rx_info("Num entries = %d", num_entries);
470 	dbr_ring_cfg->num_ptr = num_entries;
471 	mod_param->dbr_buf_pool = qdf_mem_malloc(num_entries * sizeof(
472 				struct direct_buf_rx_buf_info));
473 	if (!mod_param->dbr_buf_pool) {
474 		direct_buf_rx_err("dir buf rx buf pool alloc failed");
475 		return QDF_STATUS_E_NOMEM;
476 	}
477 
478 	ring_alloc_size = (num_entries * entry_size) + DBR_RING_BASE_ALIGN - 1;
479 	dbr_ring_cfg->ring_alloc_size = ring_alloc_size;
480 	direct_buf_rx_info("dbr_psoc_obj %pK", dbr_psoc_obj);
481 	dbr_ring_cfg->base_vaddr_unaligned = qdf_mem_alloc_consistent(
482 		dbr_psoc_obj->osdev, dbr_psoc_obj->osdev->dev, ring_alloc_size,
483 		&paddr);
484 	direct_buf_rx_info("vaddr aligned allocated");
485 	dbr_ring_cfg->base_paddr_unaligned = paddr;
486 	if (!dbr_ring_cfg->base_vaddr_unaligned) {
487 		direct_buf_rx_err("dir buf rx vaddr alloc failed");
488 		qdf_mem_free(mod_param->dbr_buf_pool);
489 		return QDF_STATUS_E_NOMEM;
490 	}
491 
492 	/* Alignment is defined to 8 for now. Will be advertised by FW */
493 	dbr_ring_cfg->base_vaddr_aligned = (void *)(uintptr_t)qdf_roundup(
494 		(uint64_t)(uintptr_t)dbr_ring_cfg->base_vaddr_unaligned,
495 		DBR_RING_BASE_ALIGN);
496 	ring_params.ring_base_vaddr = dbr_ring_cfg->base_vaddr_aligned;
497 	dbr_ring_cfg->base_paddr_aligned = qdf_roundup(
498 		(uint64_t)dbr_ring_cfg->base_paddr_unaligned,
499 		DBR_RING_BASE_ALIGN);
500 	ring_params.ring_base_paddr =
501 		(qdf_dma_addr_t)dbr_ring_cfg->base_paddr_aligned;
502 	ring_params.num_entries = num_entries;
503 	srng = hal_srng_setup(dbr_psoc_obj->hal_soc, DIR_BUF_RX_DMA_SRC, 0,
504 			      wlan_objmgr_pdev_get_pdev_id(pdev), &ring_params);
505 
506 	if (!srng) {
507 		direct_buf_rx_err("srng setup failed");
508 		qdf_mem_free(mod_param->dbr_buf_pool);
509 		qdf_mem_free_consistent(dbr_psoc_obj->osdev,
510 					dbr_psoc_obj->osdev->dev,
511 					ring_alloc_size,
512 					dbr_ring_cfg->base_vaddr_unaligned,
513 			(qdf_dma_addr_t)dbr_ring_cfg->base_paddr_unaligned, 0);
514 		return QDF_STATUS_E_FAILURE;
515 	}
516 	dbr_ring_cfg->srng = srng;
517 	dbr_ring_cfg->tail_idx_addr =
518 		hal_srng_get_tp_addr(dbr_psoc_obj->hal_soc, srng);
519 	dbr_ring_cfg->head_idx_addr =
520 		hal_srng_get_hp_addr(dbr_psoc_obj->hal_soc, srng);
521 	dbr_ring_cfg->buf_size = dbr_ring_cap->min_buf_size;
522 
523 	return target_if_dbr_fill_ring(pdev, mod_param);
524 }
525 
526 static QDF_STATUS target_if_dbr_init_srng(struct wlan_objmgr_pdev *pdev,
527 			struct direct_buf_rx_module_param *mod_param)
528 {
529 	QDF_STATUS status;
530 
531 	direct_buf_rx_info("Init DBR srng");
532 
533 	if (!mod_param) {
534 		direct_buf_rx_err("dir buf rx module param is null");
535 		return QDF_STATUS_E_INVAL;
536 	}
537 
538 	mod_param->dbr_ring_cap = qdf_mem_malloc(sizeof(
539 					struct direct_buf_rx_ring_cap));
540 
541 	if (!mod_param->dbr_ring_cap) {
542 		direct_buf_rx_err("Ring cap alloc failed");
543 		return QDF_STATUS_E_NOMEM;
544 	}
545 
546 	/* Allocate memory for DBR Ring Config */
547 	mod_param->dbr_ring_cfg = qdf_mem_malloc(sizeof(
548 					struct direct_buf_rx_ring_cfg));
549 
550 	if (!mod_param->dbr_ring_cfg) {
551 		direct_buf_rx_err("Ring config alloc failed");
552 		qdf_mem_free(mod_param->dbr_ring_cap);
553 		return QDF_STATUS_E_NOMEM;
554 	}
555 
556 	status = target_if_dbr_init_ring(pdev, mod_param);
557 
558 	if (QDF_IS_STATUS_ERROR(status)) {
559 		direct_buf_rx_err("DBR ring init failed");
560 		qdf_mem_free(mod_param->dbr_ring_cfg);
561 		qdf_mem_free(mod_param->dbr_ring_cap);
562 		return QDF_STATUS_E_FAILURE;
563 	}
564 
565 	return QDF_STATUS_SUCCESS;
566 }
567 
568 static QDF_STATUS target_if_dbr_cfg_tgt(struct wlan_objmgr_pdev *pdev,
569 			struct direct_buf_rx_module_param *mod_param)
570 {
571 	QDF_STATUS status;
572 	struct wlan_objmgr_psoc *psoc;
573 	void *wmi_hdl;
574 	struct direct_buf_rx_cfg_req dbr_cfg_req = {0};
575 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
576 	struct direct_buf_rx_ring_cap *dbr_ring_cap;
577 
578 	direct_buf_rx_enter();
579 
580 	psoc = wlan_pdev_get_psoc(pdev);
581 	if (!psoc) {
582 		direct_buf_rx_err("psoc is null");
583 		return QDF_STATUS_E_FAILURE;
584 	}
585 
586 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
587 	dbr_ring_cap = mod_param->dbr_ring_cap;
588 	wmi_hdl = lmac_get_pdev_wmi_handle(pdev);
589 	if (!wmi_hdl) {
590 		direct_buf_rx_err("WMI handle null. Can't send WMI CMD");
591 		return QDF_STATUS_E_INVAL;
592 	}
593 
594 	direct_buf_rx_debug("Sending DBR Ring CFG to target");
595 	dbr_cfg_req.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
596 	/* Module ID numbering starts from 1 in FW. need to fix it */
597 	dbr_cfg_req.mod_id = mod_param->mod_id;
598 	dbr_cfg_req.base_paddr_lo = (uint64_t)dbr_ring_cfg->base_paddr_aligned
599 						& 0xFFFFFFFF;
600 	dbr_cfg_req.base_paddr_hi = (uint64_t)dbr_ring_cfg->base_paddr_aligned
601 						& 0xFFFFFFFF00000000;
602 	dbr_cfg_req.head_idx_paddr_lo = (uint64_t)dbr_ring_cfg->head_idx_addr
603 						& 0xFFFFFFFF;
604 	dbr_cfg_req.head_idx_paddr_hi = (uint64_t)dbr_ring_cfg->head_idx_addr
605 						& 0xFFFFFFFF00000000;
606 	dbr_cfg_req.tail_idx_paddr_lo = (uint64_t)dbr_ring_cfg->tail_idx_addr
607 						& 0xFFFFFFFF;
608 	dbr_cfg_req.tail_idx_paddr_hi = (uint64_t)dbr_ring_cfg->tail_idx_addr
609 						& 0xFFFFFFFF00000000;
610 	dbr_cfg_req.num_elems = dbr_ring_cap->ring_elems_min;
611 	dbr_cfg_req.buf_size = dbr_ring_cap->min_buf_size;
612 	dbr_cfg_req.num_resp_per_event = DBR_NUM_RESP_PER_EVENT;
613 	dbr_cfg_req.event_timeout_ms = DBR_EVENT_TIMEOUT_IN_MS;
614 	direct_buf_rx_info("pdev id %d mod id %d base addr lo %x\n"
615 			   "base addr hi %x head idx addr lo %x\n"
616 			   "head idx addr hi %x tail idx addr lo %x\n"
617 			   "tail idx addr hi %x num ptr %d\n"
618 			   "num resp %d event timeout %d\n",
619 			   dbr_cfg_req.pdev_id, dbr_cfg_req.mod_id,
620 			   dbr_cfg_req.base_paddr_lo, dbr_cfg_req.base_paddr_hi,
621 			   dbr_cfg_req.head_idx_paddr_lo,
622 			   dbr_cfg_req.head_idx_paddr_hi,
623 			   dbr_cfg_req.tail_idx_paddr_lo,
624 			   dbr_cfg_req.tail_idx_paddr_hi,
625 			   dbr_cfg_req.num_elems,
626 			   dbr_cfg_req.num_resp_per_event,
627 			   dbr_cfg_req.event_timeout_ms);
628 	status = wmi_unified_dbr_ring_cfg(wmi_hdl, &dbr_cfg_req);
629 
630 	return status;
631 }
632 
633 static QDF_STATUS target_if_init_dbr_ring(struct wlan_objmgr_pdev *pdev,
634 				struct direct_buf_rx_pdev_obj *dbr_pdev_obj,
635 				enum DBR_MODULE mod_id)
636 {
637 	QDF_STATUS status = QDF_STATUS_SUCCESS;
638 	struct direct_buf_rx_module_param *mod_param;
639 
640 	direct_buf_rx_info("Init DBR ring for module %d", mod_id);
641 
642 	if (!dbr_pdev_obj) {
643 		direct_buf_rx_err("dir buf rx object is null");
644 		return QDF_STATUS_E_INVAL;
645 	}
646 
647 	mod_param = &(dbr_pdev_obj->dbr_mod_param[mod_id]);
648 
649 	if (!mod_param) {
650 		direct_buf_rx_err("dir buf rx module param is null");
651 		return QDF_STATUS_E_FAILURE;
652 	}
653 
654 	direct_buf_rx_info("mod_param %pK", mod_param);
655 
656 	mod_param->mod_id = mod_id;
657 
658 	/* Initialize DMA ring now */
659 	status = target_if_dbr_init_srng(pdev, mod_param);
660 	if (QDF_IS_STATUS_ERROR(status)) {
661 		direct_buf_rx_err("DBR ring init failed %d", status);
662 		return status;
663 	}
664 
665 	/* Send CFG request command to firmware */
666 	status = target_if_dbr_cfg_tgt(pdev, mod_param);
667 	if (QDF_IS_STATUS_ERROR(status)) {
668 		direct_buf_rx_err("DBR config to target failed %d", status);
669 		goto dbr_srng_init_failed;
670 	}
671 
672 	return QDF_STATUS_SUCCESS;
673 
674 dbr_srng_init_failed:
675 	target_if_deinit_dbr_ring(pdev, dbr_pdev_obj, mod_id);
676 	return status;
677 }
678 
679 QDF_STATUS target_if_direct_buf_rx_module_register(
680 			struct wlan_objmgr_pdev *pdev, uint8_t mod_id,
681 			int (*dbr_rsp_handler)(struct wlan_objmgr_pdev *pdev,
682 				struct direct_buf_rx_data *dbr_data))
683 {
684 	QDF_STATUS status;
685 	struct direct_buf_rx_pdev_obj *dbr_pdev_obj;
686 
687 	if (pdev == NULL) {
688 		direct_buf_rx_err("pdev context passed is null");
689 		return QDF_STATUS_E_INVAL;
690 	}
691 
692 	if (dbr_rsp_handler == NULL) {
693 		direct_buf_rx_err("Response handler is null");
694 		return QDF_STATUS_E_INVAL;
695 	}
696 
697 	if (mod_id >= DBR_MODULE_MAX) {
698 		direct_buf_rx_err("Invalid module id");
699 		return QDF_STATUS_E_INVAL;
700 	}
701 
702 	dbr_pdev_obj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
703 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
704 
705 	if (dbr_pdev_obj == NULL) {
706 		direct_buf_rx_err("dir buf rx object is null");
707 		return QDF_STATUS_E_FAILURE;
708 	}
709 
710 	direct_buf_rx_info("Dbr pdev obj %pK", dbr_pdev_obj);
711 
712 	if (!dbr_pdev_obj->dbr_mod_param) {
713 		direct_buf_rx_err("dbr_pdev_obj->dbr_mod_param is NULL");
714 		return QDF_STATUS_E_FAILURE;
715 	}
716 
717 	if (mod_id >= dbr_pdev_obj->num_modules) {
718 		direct_buf_rx_err("Module %d not supported in target", mod_id);
719 		return QDF_STATUS_E_FAILURE;
720 	}
721 
722 	dbr_pdev_obj->dbr_mod_param[mod_id].dbr_rsp_handler =
723 			dbr_rsp_handler;
724 
725 	status = target_if_init_dbr_ring(pdev, dbr_pdev_obj,
726 					 (enum DBR_MODULE)mod_id);
727 
728 	return status;
729 }
730 
731 static void *target_if_dbr_vaddr_lookup(
732 			struct direct_buf_rx_module_param *mod_param,
733 			qdf_dma_addr_t paddr, uint32_t cookie)
734 {
735 	struct direct_buf_rx_buf_info *dbr_buf_pool;
736 
737 	dbr_buf_pool = mod_param->dbr_buf_pool;
738 
739 	if (dbr_buf_pool[cookie].paddr == paddr) {
740 		return dbr_buf_pool[cookie].vaddr +
741 				dbr_buf_pool[cookie].offset;
742 	}
743 
744 	direct_buf_rx_err("Incorrect paddr found on cookie slot");
745 	return NULL;
746 }
747 
748 static QDF_STATUS target_if_get_dbr_data(struct wlan_objmgr_pdev *pdev,
749 			struct direct_buf_rx_module_param *mod_param,
750 			struct direct_buf_rx_rsp *dbr_rsp,
751 			struct direct_buf_rx_data *dbr_data,
752 			uint8_t idx, uint32_t *cookie)
753 {
754 	qdf_dma_addr_t paddr = 0;
755 	uint32_t addr_hi;
756 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
757 	struct direct_buf_rx_ring_cap *dbr_ring_cap;
758 	struct wlan_objmgr_psoc *psoc;
759 
760 	psoc = wlan_pdev_get_psoc(pdev);
761 	if (!psoc) {
762 		direct_buf_rx_err("psoc is null");
763 		return QDF_STATUS_E_FAILURE;
764 	}
765 
766 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
767 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
768 
769 	if (dbr_psoc_obj == NULL) {
770 		direct_buf_rx_err("dir buf rx psoc object is null");
771 		return QDF_STATUS_E_FAILURE;
772 	}
773 
774 	dbr_ring_cap = mod_param->dbr_ring_cap;
775 	addr_hi = (uint64_t)WMI_HOST_DBR_DATA_ADDR_HI_GET(
776 				dbr_rsp->dbr_entries[idx].paddr_hi);
777 	paddr = (qdf_dma_addr_t)((uint64_t)addr_hi << 32 |
778 				  dbr_rsp->dbr_entries[idx].paddr_lo);
779 	*cookie = WMI_HOST_DBR_DATA_ADDR_HI_HOST_DATA_GET(
780 				dbr_rsp->dbr_entries[idx].paddr_hi);
781 	direct_buf_rx_info("Cookie = %d", *cookie);
782 	dbr_data->vaddr = target_if_dbr_vaddr_lookup(mod_param, paddr, *cookie);
783 	direct_buf_rx_info("Vaddr look up = %x", dbr_data->vaddr);
784 	dbr_data->dbr_len = dbr_rsp->dbr_entries[idx].len;
785 	qdf_mem_unmap_nbytes_single(dbr_psoc_obj->osdev, (qdf_dma_addr_t)paddr,
786 				    QDF_DMA_FROM_DEVICE,
787 				    dbr_ring_cap->min_buf_size);
788 
789 	return QDF_STATUS_SUCCESS;
790 }
791 
792 static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn,
793 						uint8_t *data_buf,
794 						uint32_t data_len)
795 {
796 	int ret = 0;
797 	uint8_t i = 0;
798 	QDF_STATUS status;
799 	uint32_t cookie = 0;
800 	struct direct_buf_rx_rsp dbr_rsp = {0};
801 	struct direct_buf_rx_data dbr_data = {0};
802 	struct wlan_objmgr_psoc *psoc;
803 	struct wlan_objmgr_pdev *pdev;
804 	struct direct_buf_rx_buf_info *dbr_buf_pool;
805 	struct direct_buf_rx_pdev_obj *dbr_pdev_obj;
806 	struct direct_buf_rx_module_param *mod_param;
807 	struct common_wmi_handle *wmi_handle;
808 
809 	direct_buf_rx_enter();
810 
811 	psoc = target_if_get_psoc_from_scn_hdl(scn);
812 	if (!psoc) {
813 		direct_buf_rx_err("psoc is null");
814 		return QDF_STATUS_E_FAILURE;
815 	}
816 
817 	wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc);
818 	if (!wmi_handle) {
819 		direct_buf_rx_err("WMI handle is null");
820 		return QDF_STATUS_E_FAILURE;
821 	}
822 
823 	if (wmi_extract_dbr_buf_release_fixed(
824 		wmi_handle, data_buf, &dbr_rsp) != QDF_STATUS_SUCCESS) {
825 		direct_buf_rx_err("unable to extract DBR rsp fixed param");
826 		return QDF_STATUS_E_FAILURE;
827 	}
828 
829 	direct_buf_rx_info("Num buf release entry = %d",
830 			   dbr_rsp.num_buf_release_entry);
831 
832 	pdev = wlan_objmgr_get_pdev_by_id(psoc, dbr_rsp.pdev_id,
833 					  WLAN_DIRECT_BUF_RX_ID);
834 	if (!pdev) {
835 		direct_buf_rx_err("pdev is null");
836 		wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
837 		return QDF_STATUS_E_INVAL;
838 	}
839 
840 	dbr_pdev_obj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
841 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
842 
843 	if (dbr_pdev_obj == NULL) {
844 		direct_buf_rx_err("dir buf rx object is null");
845 		wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
846 		return QDF_STATUS_E_FAILURE;
847 	}
848 
849 	mod_param = &(dbr_pdev_obj->dbr_mod_param[dbr_rsp.mod_id]);
850 
851 	if (!mod_param) {
852 		direct_buf_rx_err("dir buf rx module param is null");
853 		wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
854 		return QDF_STATUS_E_FAILURE;
855 	}
856 
857 	dbr_buf_pool = mod_param->dbr_buf_pool;
858 	dbr_rsp.dbr_entries = qdf_mem_malloc(dbr_rsp.num_buf_release_entry *
859 					sizeof(struct direct_buf_rx_entry));
860 
861 	if (dbr_rsp.num_meta_data_entry > dbr_rsp.num_buf_release_entry) {
862 		direct_buf_rx_err("More than expected number of metadata");
863 		wlan_objmgr_pdev_release_ref(pdev,
864 					     WLAN_DIRECT_BUF_RX_ID);
865 		return QDF_STATUS_E_FAILURE;
866 	}
867 
868 	for (i = 0; i < dbr_rsp.num_buf_release_entry; i++) {
869 		if (wmi_extract_dbr_buf_release_entry(
870 			wmi_handle, data_buf, i,
871 			&dbr_rsp.dbr_entries[i]) != QDF_STATUS_SUCCESS) {
872 			direct_buf_rx_err("Unable to extract DBR buf entry %d",
873 					  i+1);
874 			qdf_mem_free(dbr_rsp.dbr_entries);
875 			wlan_objmgr_pdev_release_ref(pdev,
876 						     WLAN_DIRECT_BUF_RX_ID);
877 			return QDF_STATUS_E_FAILURE;
878 		}
879 		status = target_if_get_dbr_data(pdev, mod_param, &dbr_rsp,
880 						&dbr_data, i, &cookie);
881 
882 		if (QDF_IS_STATUS_ERROR(status)) {
883 			direct_buf_rx_err("DBR data get failed");
884 			qdf_mem_free(dbr_rsp.dbr_entries);
885 			wlan_objmgr_pdev_release_ref(pdev,
886 						     WLAN_DIRECT_BUF_RX_ID);
887 			return QDF_STATUS_E_FAILURE;
888 		}
889 
890 		dbr_data.meta_data_valid = false;
891 		if (i < dbr_rsp.num_meta_data_entry) {
892 			if (wmi_extract_dbr_buf_metadata(
893 				wmi_handle, data_buf, i,
894 				&dbr_data.meta_data) == QDF_STATUS_SUCCESS)
895 				dbr_data.meta_data_valid = true;
896 		}
897 		ret = mod_param->dbr_rsp_handler(pdev, &dbr_data);
898 		status = target_if_dbr_replenish_ring(pdev, mod_param,
899 						      dbr_data.vaddr, cookie);
900 		if (QDF_IS_STATUS_ERROR(status)) {
901 			direct_buf_rx_err("dir buf rx ring replenish failed");
902 			qdf_mem_free(dbr_rsp.dbr_entries);
903 			wlan_objmgr_pdev_release_ref(pdev,
904 						     WLAN_DIRECT_BUF_RX_ID);
905 			return QDF_STATUS_E_FAILURE;
906 		}
907 	}
908 
909 	qdf_mem_free(dbr_rsp.dbr_entries);
910 	wlan_objmgr_pdev_release_ref(pdev, WLAN_DIRECT_BUF_RX_ID);
911 
912 	return ret;
913 }
914 
915 static QDF_STATUS target_if_dbr_empty_ring(struct wlan_objmgr_pdev *pdev,
916 			struct direct_buf_rx_psoc_obj *dbr_psoc_obj,
917 			struct direct_buf_rx_module_param *mod_param)
918 {
919 	uint32_t idx;
920 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
921 	struct direct_buf_rx_ring_cap *dbr_ring_cap;
922 	struct direct_buf_rx_buf_info *dbr_buf_pool;
923 
924 	direct_buf_rx_enter();
925 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
926 	dbr_ring_cap = mod_param->dbr_ring_cap;
927 	dbr_buf_pool = mod_param->dbr_buf_pool;
928 
929 	direct_buf_rx_info("dbr_ring_cfg %pK, dbr_ring_cap %pK dbr_buf_pool %pK",
930 			   dbr_ring_cfg, dbr_ring_cap, dbr_buf_pool);
931 
932 	for (idx = 0; idx < dbr_ring_cfg->num_ptr - 1; idx++) {
933 		direct_buf_rx_info("dbr buf pool unmap and free for ptr %d",
934 				   idx);
935 		qdf_mem_unmap_nbytes_single(dbr_psoc_obj->osdev,
936 			(qdf_dma_addr_t)dbr_buf_pool[idx].paddr,
937 			QDF_DMA_FROM_DEVICE,
938 			dbr_ring_cap->min_buf_size);
939 		qdf_mem_free(dbr_buf_pool[idx].vaddr);
940 	}
941 
942 	return QDF_STATUS_SUCCESS;
943 }
944 
945 static QDF_STATUS target_if_dbr_deinit_ring(struct wlan_objmgr_pdev *pdev,
946 			struct direct_buf_rx_module_param *mod_param)
947 {
948 	struct wlan_objmgr_psoc *psoc;
949 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
950 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
951 
952 	direct_buf_rx_enter();
953 	psoc = wlan_pdev_get_psoc(pdev);
954 	if (!psoc) {
955 		direct_buf_rx_err("psoc is null");
956 		return QDF_STATUS_E_FAILURE;
957 	}
958 
959 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
960 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
961 
962 	if (dbr_psoc_obj == NULL) {
963 		direct_buf_rx_err("dir buf rx psoc object is null");
964 		return QDF_STATUS_E_FAILURE;
965 	}
966 	direct_buf_rx_info("dbr_psoc_obj %pK", dbr_psoc_obj);
967 
968 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
969 	if (dbr_ring_cfg) {
970 		target_if_dbr_empty_ring(pdev, dbr_psoc_obj, mod_param);
971 		hal_srng_cleanup(dbr_psoc_obj->hal_soc, dbr_ring_cfg->srng);
972 		qdf_mem_free_consistent(dbr_psoc_obj->osdev,
973 					dbr_psoc_obj->osdev->dev,
974 					dbr_ring_cfg->ring_alloc_size,
975 					dbr_ring_cfg->base_vaddr_unaligned,
976 			(qdf_dma_addr_t)dbr_ring_cfg->base_paddr_unaligned, 0);
977 	}
978 
979 	return QDF_STATUS_SUCCESS;
980 }
981 
982 static QDF_STATUS target_if_dbr_deinit_srng(
983 			struct wlan_objmgr_pdev *pdev,
984 			struct direct_buf_rx_module_param *mod_param)
985 {
986 	struct direct_buf_rx_buf_info *dbr_buf_pool;
987 
988 	direct_buf_rx_enter();
989 	dbr_buf_pool = mod_param->dbr_buf_pool;
990 	direct_buf_rx_info("dbr buf pool %pK", dbr_buf_pool);
991 	target_if_dbr_deinit_ring(pdev, mod_param);
992 	qdf_mem_free(dbr_buf_pool);
993 	mod_param->dbr_buf_pool = NULL;
994 
995 	return QDF_STATUS_SUCCESS;
996 }
997 
998 QDF_STATUS target_if_deinit_dbr_ring(struct wlan_objmgr_pdev *pdev,
999 			struct direct_buf_rx_pdev_obj *dbr_pdev_obj,
1000 			enum DBR_MODULE mod_id)
1001 {
1002 	struct direct_buf_rx_module_param *mod_param;
1003 
1004 	direct_buf_rx_enter();
1005 	mod_param = &(dbr_pdev_obj->dbr_mod_param[mod_id]);
1006 
1007 	if (!mod_param) {
1008 		direct_buf_rx_err("dir buf rx module param is null");
1009 		return QDF_STATUS_E_FAILURE;
1010 	}
1011 	direct_buf_rx_info("mod_param %pK", mod_param);
1012 	direct_buf_rx_info("dbr_ring_cap %pK", mod_param->dbr_ring_cap);
1013 	target_if_dbr_deinit_srng(pdev, mod_param);
1014 	qdf_mem_free(mod_param->dbr_ring_cap);
1015 	mod_param->dbr_ring_cap = NULL;
1016 	qdf_mem_free(mod_param->dbr_ring_cfg);
1017 	mod_param->dbr_ring_cfg = NULL;
1018 
1019 	return QDF_STATUS_SUCCESS;
1020 }
1021 
1022 QDF_STATUS target_if_direct_buf_rx_register_events(
1023 				struct wlan_objmgr_psoc *psoc)
1024 {
1025 	int ret;
1026 
1027 	if (!psoc || !GET_WMI_HDL_FROM_PSOC(psoc)) {
1028 		direct_buf_rx_err("psoc or psoc->tgt_if_handle is null");
1029 		return QDF_STATUS_E_INVAL;
1030 	}
1031 
1032 	ret = wmi_unified_register_event_handler(
1033 			get_wmi_unified_hdl_from_psoc(psoc),
1034 			wmi_dma_buf_release_event_id,
1035 			target_if_direct_buf_rx_rsp_event_handler,
1036 			WMI_RX_UMAC_CTX);
1037 
1038 	if (ret)
1039 		direct_buf_rx_info("event handler not supported", ret);
1040 
1041 	return QDF_STATUS_SUCCESS;
1042 }
1043 
1044 QDF_STATUS target_if_direct_buf_rx_unregister_events(
1045 				struct wlan_objmgr_psoc *psoc)
1046 {
1047 	if (!psoc || !GET_WMI_HDL_FROM_PSOC(psoc)) {
1048 		direct_buf_rx_err("psoc or psoc->tgt_if_handle is null");
1049 		return QDF_STATUS_E_INVAL;
1050 	}
1051 
1052 	wmi_unified_unregister_event_handler(
1053 			get_wmi_unified_hdl_from_psoc(psoc),
1054 			wmi_dma_buf_release_event_id);
1055 
1056 	return QDF_STATUS_SUCCESS;
1057 }
1058 
1059 QDF_STATUS target_if_direct_buf_rx_print_ring_stat(
1060 				struct wlan_objmgr_pdev *pdev)
1061 {
1062 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
1063 	struct direct_buf_rx_pdev_obj *dbr_pdev_obj;
1064 	struct wlan_objmgr_psoc *psoc;
1065 	void *srng, *hal_soc;
1066 	uint32_t hp = 0, tp = 0;
1067 	struct direct_buf_rx_module_param *mod_param;
1068 	struct direct_buf_rx_ring_cfg *dbr_ring_cfg;
1069 	uint8_t num_modules, mod_idx;
1070 
1071 	if (!pdev) {
1072 		direct_buf_rx_err("pdev is null");
1073 		return QDF_STATUS_E_INVAL;
1074 	}
1075 
1076 	psoc = wlan_pdev_get_psoc(pdev);
1077 	dbr_pdev_obj = wlan_objmgr_pdev_get_comp_private_obj(pdev,
1078 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
1079 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
1080 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
1081 	hal_soc = dbr_psoc_obj->hal_soc;
1082 	num_modules = dbr_pdev_obj->num_modules;
1083 	direct_buf_rx_err("--------------------------------------------------");
1084 	direct_buf_rx_err("| Module ID |    Module    | Head Idx | Tail Idx |");
1085 	direct_buf_rx_err("--------------------------------------------------");
1086 	for (mod_idx = 0; mod_idx < num_modules; mod_idx++) {
1087 		mod_param = &dbr_pdev_obj->dbr_mod_param[mod_idx];
1088 		dbr_ring_cfg = mod_param->dbr_ring_cfg;
1089 		srng = dbr_ring_cfg->srng;
1090 		hal_get_sw_hptp(hal_soc, srng, &tp, &hp);
1091 		direct_buf_rx_err("|%11d|%14s|%10x|%10x|",
1092 				  mod_idx,
1093 				  g_dbr_module_name[mod_idx].module_name_str,
1094 				  hp, tp);
1095 	}
1096 	direct_buf_rx_err("--------------------------------------------------");
1097 
1098 	return QDF_STATUS_SUCCESS;
1099 }
1100