xref: /wlan-dirver/qca-wifi-host-cmn/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c (revision 3149adf58a329e17232a4c0e58d460d025edd55a)
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 <qdf_status.h>
20 #include <target_if_direct_buf_rx_api.h>
21 #include <wlan_objmgr_cmn.h>
22 #include <wlan_objmgr_global_obj.h>
23 #include <wlan_objmgr_psoc_obj.h>
24 #include <wlan_objmgr_cmn.h>
25 #include "target_if_direct_buf_rx_main.h"
26 
27 QDF_STATUS direct_buf_rx_init(void)
28 {
29 	QDF_STATUS status;
30 
31 	status = wlan_objmgr_register_psoc_create_handler(
32 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
33 			target_if_direct_buf_rx_psoc_create_handler,
34 			NULL);
35 
36 	if (QDF_IS_STATUS_ERROR(status)) {
37 		direct_buf_rx_err("Failed to register psoc create handler");
38 		return status;
39 	}
40 
41 	status = wlan_objmgr_register_psoc_destroy_handler(
42 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
43 			target_if_direct_buf_rx_psoc_destroy_handler,
44 			NULL);
45 
46 	if (QDF_IS_STATUS_ERROR(status)) {
47 		direct_buf_rx_err("Failed to register psoc destroy handler");
48 		goto dbr_unreg_psoc_create;
49 	}
50 
51 	status = wlan_objmgr_register_pdev_create_handler(
52 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
53 			target_if_direct_buf_rx_pdev_create_handler,
54 			NULL);
55 
56 	if (QDF_IS_STATUS_ERROR(status)) {
57 		direct_buf_rx_err("Failed to register pdev create handler");
58 		goto dbr_unreg_psoc_destroy;
59 	}
60 
61 	status = wlan_objmgr_register_pdev_destroy_handler(
62 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
63 			target_if_direct_buf_rx_pdev_destroy_handler,
64 			NULL);
65 
66 	if (QDF_IS_STATUS_ERROR(status)) {
67 		direct_buf_rx_err("Failed to register pdev destroy handler");
68 		goto dbr_unreg_pdev_create;
69 	}
70 
71 	direct_buf_rx_info("Direct Buffer RX pdev,psoc create and destroy handlers registered");
72 
73 	return QDF_STATUS_SUCCESS;
74 
75 dbr_unreg_pdev_create:
76 	status = wlan_objmgr_unregister_pdev_create_handler(
77 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
78 			target_if_direct_buf_rx_pdev_create_handler,
79 			NULL);
80 
81 dbr_unreg_psoc_destroy:
82 	status = wlan_objmgr_unregister_psoc_destroy_handler(
83 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
84 			target_if_direct_buf_rx_psoc_destroy_handler,
85 			NULL);
86 
87 dbr_unreg_psoc_create:
88 	status = wlan_objmgr_unregister_psoc_create_handler(
89 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
90 			target_if_direct_buf_rx_psoc_create_handler,
91 			NULL);
92 
93 	return QDF_STATUS_E_FAILURE;
94 }
95 qdf_export_symbol(direct_buf_rx_init);
96 
97 QDF_STATUS direct_buf_rx_deinit(void)
98 {
99 	QDF_STATUS status;
100 
101 	status = wlan_objmgr_unregister_pdev_destroy_handler(
102 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
103 			target_if_direct_buf_rx_pdev_destroy_handler,
104 			NULL);
105 
106 	if (QDF_IS_STATUS_ERROR(status))
107 		direct_buf_rx_err("Failed to unregister pdev destroy handler");
108 
109 	status = wlan_objmgr_unregister_pdev_create_handler(
110 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
111 			target_if_direct_buf_rx_pdev_create_handler,
112 			NULL);
113 
114 	if (QDF_IS_STATUS_ERROR(status))
115 		direct_buf_rx_err("Failed to unregister pdev create handler");
116 
117 	status = wlan_objmgr_unregister_psoc_destroy_handler(
118 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
119 			target_if_direct_buf_rx_psoc_destroy_handler,
120 			NULL);
121 
122 	if (QDF_IS_STATUS_ERROR(status))
123 		direct_buf_rx_err("Failed to unregister psoc destroy handler");
124 
125 	status = wlan_objmgr_unregister_psoc_create_handler(
126 			WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
127 			target_if_direct_buf_rx_psoc_create_handler,
128 			NULL);
129 
130 	if (QDF_IS_STATUS_ERROR(status))
131 		direct_buf_rx_err("Failed to unregister psoc create handler");
132 
133 	direct_buf_rx_info("Direct Buffer RX pdev,psoc create and destroy handlers unregistered");
134 
135 	return status;
136 }
137 qdf_export_symbol(direct_buf_rx_deinit);
138 
139 QDF_STATUS direct_buf_rx_target_attach(struct wlan_objmgr_psoc *psoc,
140 				void *hal_soc, qdf_device_t osdev)
141 {
142 	struct direct_buf_rx_psoc_obj *dbr_psoc_obj;
143 
144 	if (hal_soc == NULL || osdev == NULL) {
145 		direct_buf_rx_err("hal soc or osdev is null");
146 		return QDF_STATUS_E_INVAL;
147 	}
148 
149 	dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
150 				WLAN_TARGET_IF_COMP_DIRECT_BUF_RX);
151 
152 	direct_buf_rx_info("Dbr psoc obj %pK", dbr_psoc_obj);
153 
154 	if (dbr_psoc_obj == NULL) {
155 		direct_buf_rx_err("dir buf rx psoc obj is null");
156 		return QDF_STATUS_E_FAILURE;
157 	}
158 
159 	dbr_psoc_obj->hal_soc = hal_soc;
160 	dbr_psoc_obj->osdev = osdev;
161 
162 	return QDF_STATUS_SUCCESS;
163 }
164 
165 void target_if_direct_buf_rx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
166 {
167 	tx_ops->dbr_tx_ops.direct_buf_rx_module_register =
168 				target_if_direct_buf_rx_module_register;
169 	tx_ops->dbr_tx_ops.direct_buf_rx_register_events =
170 				target_if_direct_buf_rx_register_events;
171 	tx_ops->dbr_tx_ops.direct_buf_rx_unregister_events =
172 				target_if_direct_buf_rx_unregister_events;
173 }
174 qdf_export_symbol(target_if_direct_buf_rx_register_tx_ops);
175