xref: /wlan-dirver/qca-wifi-host-cmn/umac/dcs/dispatcher/src/wlan_dcs_ucfg_api.c (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  * DOC: This file has the dcs dispatcher API implementation which is exposed
19  * to outside of dcs component.
20  */
21 
22 #include "wlan_dcs_ucfg_api.h"
23 #include "../../core/src/wlan_dcs.h"
24 #include "wlan_objmgr_vdev_obj.h"
25 
26 void ucfg_dcs_register_cb(
27 			struct wlan_objmgr_psoc *psoc,
28 			dcs_callback cbk,
29 			void *arg)
30 {
31 	struct dcs_psoc_priv_obj *dcs_psoc_priv;
32 
33 	dcs_psoc_priv = wlan_objmgr_psoc_get_comp_private_obj(
34 							psoc,
35 							WLAN_UMAC_COMP_DCS);
36 	if (!dcs_psoc_priv) {
37 		dcs_err("dcs psoc private object is null");
38 		return;
39 	}
40 
41 	dcs_psoc_priv->dcs_cbk.cbk = cbk;
42 	dcs_psoc_priv->dcs_cbk.arg = arg;
43 }
44 
45 void
46 ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc *psoc,
47 			  uint8_t mac_id, uint8_t vdev_id,
48 			  void (*cb)(uint8_t vdev_id,
49 				     struct wlan_host_dcs_im_user_stats *stats,
50 				     int status))
51 {
52 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
53 
54 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
55 	if (!dcs_pdev_priv) {
56 		dcs_err("dcs pdev private object is null");
57 		return;
58 	}
59 
60 	dcs_pdev_priv->requestor_vdev_id = vdev_id;
61 	dcs_pdev_priv->user_cb = cb;
62 }
63 
64 QDF_STATUS ucfg_dcs_register_awgn_cb(struct wlan_objmgr_psoc *psoc,
65 				     dcs_switch_chan_cb cb)
66 {
67 	struct dcs_psoc_priv_obj *dcs_psoc_priv;
68 
69 	dcs_psoc_priv =
70 		wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_DCS);
71 	if (!dcs_psoc_priv) {
72 		dcs_err("dcs psoc private object is null");
73 		return QDF_STATUS_E_INVAL;
74 	}
75 
76 	dcs_psoc_priv->switch_chan_cb = cb;
77 	return QDF_STATUS_SUCCESS;
78 }
79 
80 QDF_STATUS
81 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc,
82 		  uint32_t mac_id,
83 		  bool is_host_pdev_id)
84 {
85 	return wlan_dcs_cmd_send(psoc, mac_id, is_host_pdev_id);
86 }
87 
88 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc,
89 			    uint32_t mac_id,
90 			    uint8_t interference_type)
91 {
92 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
93 
94 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
95 	if (!dcs_pdev_priv) {
96 		dcs_err("dcs pdev private object is null");
97 		return;
98 	}
99 
100 	dcs_pdev_priv->dcs_host_params.dcs_enable |= interference_type;
101 }
102 
103 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc,
104 			     uint32_t mac_id,
105 			     uint8_t interference_type)
106 {
107 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
108 
109 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
110 	if (!dcs_pdev_priv) {
111 		dcs_err("dcs pdev private object is null");
112 		return;
113 	}
114 
115 	dcs_pdev_priv->dcs_host_params.dcs_enable &= (~interference_type);
116 }
117 
118 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t mac_id)
119 {
120 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
121 	uint8_t enable = 0;
122 
123 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
124 	if (!dcs_pdev_priv) {
125 		dcs_err("dcs pdev private object is null");
126 		return 0;
127 	}
128 
129 	if (dcs_pdev_priv->dcs_host_params.dcs_enable_cfg)
130 		enable = dcs_pdev_priv->dcs_host_params.dcs_enable;
131 
132 	return enable;
133 }
134 
135 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t mac_id)
136 {
137 	wlan_dcs_clear(psoc, mac_id);
138 }
139 
140 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
141 				bool dcs_algorithm_process)
142 {
143 	wlan_dcs_set_algorithm_process(psoc, mac_id, dcs_algorithm_process);
144 }
145 
146 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t mac_id)
147 {
148 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
149 	struct wlan_host_dcs_im_user_stats *user_stats;
150 
151 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
152 	if (!dcs_pdev_priv) {
153 		dcs_err("dcs pdev private object is null");
154 		return;
155 	}
156 
157 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
158 	dcs_pdev_priv->dcs_host_params.user_request_count = 0;
159 	dcs_pdev_priv->dcs_host_params.notify_user = 0;
160 	user_stats = &dcs_pdev_priv->dcs_im_stats.user_dcs_im_stats;
161 	user_stats->cycle_count = 0;
162 	user_stats->rxclr_count = 0;
163 	user_stats->rx_frame_count = 0;
164 	user_stats->my_bss_rx_cycle_count = 0;
165 	user_stats->max_rssi = 0;
166 	user_stats->min_rssi = 0;
167 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
168 }
169 
170 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
171 			       uint32_t user_request_count)
172 {
173 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
174 
175 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
176 	if (!dcs_pdev_priv) {
177 		dcs_err("dcs pdev private object is null");
178 		return;
179 	}
180 
181 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
182 	dcs_pdev_priv->dcs_host_params.user_request_count = user_request_count;
183 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
184 }
185 
186 QDF_STATUS ucfg_dcs_get_ch_util(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
187 				struct wlan_host_dcs_ch_util_stats *dcs_stats)
188 {
189 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
190 
191 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
192 	if (!dcs_pdev_priv) {
193 		dcs_err("dcs pdev private object is null");
194 		return QDF_STATUS_E_INVAL;
195 	}
196 
197 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
198 	qdf_mem_copy(dcs_stats,
199 		     &dcs_pdev_priv->dcs_im_stats.dcs_ch_util_im_stats,
200 		     sizeof(*dcs_stats));
201 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
202 
203 	return QDF_STATUS_SUCCESS;
204 }
205