xref: /wlan-dirver/qca-wifi-host-cmn/umac/dcs/dispatcher/src/wlan_dcs_ucfg_api.c (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
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 
25 void ucfg_dcs_register_cb(
26 			struct wlan_objmgr_psoc *psoc,
27 			dcs_callback cbk,
28 			void *arg)
29 {
30 	struct dcs_psoc_priv_obj *dcs_psoc_priv;
31 
32 	dcs_psoc_priv = wlan_objmgr_psoc_get_comp_private_obj(
33 							psoc,
34 							WLAN_UMAC_COMP_DCS);
35 	if (!dcs_psoc_priv) {
36 		dcs_err("dcs psoc private object is null");
37 		return;
38 	}
39 
40 	dcs_psoc_priv->dcs_cbk.cbk = cbk;
41 	dcs_psoc_priv->dcs_cbk.arg = arg;
42 }
43 
44 void
45 ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc *psoc,
46 			  uint8_t mac_id, uint8_t vdev_id,
47 			  void (*cb)(uint8_t vdev_id,
48 				     struct wlan_host_dcs_im_user_stats *stats,
49 				     int status))
50 {
51 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
52 
53 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
54 	if (!dcs_pdev_priv) {
55 		dcs_err("dcs pdev private object is null");
56 		return;
57 	}
58 
59 	dcs_pdev_priv->requestor_vdev_id = vdev_id;
60 	dcs_pdev_priv->user_cb = cb;
61 }
62 
63 QDF_STATUS ucfg_dcs_register_awgn_cb(struct wlan_objmgr_psoc *psoc,
64 				     dcs_switch_chan_cb cb)
65 {
66 	struct dcs_psoc_priv_obj *dcs_psoc_priv;
67 
68 	dcs_psoc_priv =
69 		wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_DCS);
70 	if (!dcs_psoc_priv) {
71 		dcs_err("dcs psoc private object is null");
72 		return QDF_STATUS_E_INVAL;
73 	}
74 
75 	dcs_psoc_priv->switch_chan_cb = cb;
76 	return QDF_STATUS_SUCCESS;
77 }
78 
79 QDF_STATUS
80 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc,
81 		  uint32_t mac_id,
82 		  bool is_host_pdev_id)
83 {
84 	return wlan_dcs_cmd_send(psoc, mac_id, is_host_pdev_id);
85 }
86 
87 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc,
88 			    uint32_t mac_id,
89 			    uint8_t interference_type)
90 {
91 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
92 
93 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
94 	if (!dcs_pdev_priv) {
95 		dcs_err("dcs pdev private object is null");
96 		return;
97 	}
98 
99 	dcs_pdev_priv->dcs_host_params.dcs_enable |= interference_type;
100 }
101 
102 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc,
103 			     uint32_t mac_id,
104 			     uint8_t interference_type)
105 {
106 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
107 
108 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
109 	if (!dcs_pdev_priv) {
110 		dcs_err("dcs pdev private object is null");
111 		return;
112 	}
113 
114 	dcs_pdev_priv->dcs_host_params.dcs_enable &= (~interference_type);
115 }
116 
117 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t mac_id)
118 {
119 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
120 	uint8_t enable = 0;
121 
122 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
123 	if (!dcs_pdev_priv) {
124 		dcs_err("dcs pdev private object is null");
125 		return 0;
126 	}
127 
128 	if (dcs_pdev_priv->dcs_host_params.dcs_enable_cfg)
129 		enable = dcs_pdev_priv->dcs_host_params.dcs_enable;
130 
131 	return enable;
132 }
133 
134 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t mac_id)
135 {
136 	wlan_dcs_clear(psoc, mac_id);
137 }
138 
139 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t mac_id,
140 				bool dcs_algorithm_process)
141 {
142 	wlan_dcs_set_algorithm_process(psoc, mac_id, dcs_algorithm_process);
143 }
144 
145 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t mac_id)
146 {
147 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
148 	struct wlan_host_dcs_im_user_stats *user_stats;
149 
150 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
151 	if (!dcs_pdev_priv) {
152 		dcs_err("dcs pdev private object is null");
153 		return;
154 	}
155 
156 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
157 	dcs_pdev_priv->dcs_host_params.user_request_count = 0;
158 	dcs_pdev_priv->dcs_host_params.notify_user = 0;
159 	user_stats = &dcs_pdev_priv->dcs_im_stats.user_dcs_im_stats;
160 	user_stats->cycle_count = 0;
161 	user_stats->rxclr_count = 0;
162 	user_stats->rx_frame_count = 0;
163 	user_stats->my_bss_rx_cycle_count = 0;
164 	user_stats->max_rssi = 0;
165 	user_stats->min_rssi = 0;
166 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
167 }
168 
169 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t mac_id,
170 			       uint32_t user_request_count)
171 {
172 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
173 
174 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id);
175 	if (!dcs_pdev_priv) {
176 		dcs_err("dcs pdev private object is null");
177 		return;
178 	}
179 
180 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
181 	dcs_pdev_priv->dcs_host_params.user_request_count = user_request_count;
182 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
183 }
184