xref: /wlan-dirver/qca-wifi-host-cmn/umac/dcs/dispatcher/src/wlan_dcs_ucfg_api.c (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
1 /*
2  * Copyright (c) 2020, 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 pdev_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, pdev_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
64 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc,
65 		  uint32_t pdev_id,
66 		  bool is_host_pdev_id)
67 {
68 	return wlan_dcs_cmd_send(psoc, pdev_id, is_host_pdev_id);
69 }
70 
71 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc,
72 			    uint32_t pdev_id,
73 			    uint8_t interference_type)
74 {
75 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
76 
77 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id);
78 	if (!dcs_pdev_priv) {
79 		dcs_err("dcs pdev private object is null");
80 		return;
81 	}
82 
83 	dcs_pdev_priv->dcs_host_params.dcs_enable |= interference_type;
84 }
85 
86 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc,
87 			     uint32_t pdev_id,
88 			     uint8_t interference_type)
89 {
90 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
91 
92 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id);
93 	if (!dcs_pdev_priv) {
94 		dcs_err("dcs pdev private object is null");
95 		return;
96 	}
97 
98 	dcs_pdev_priv->dcs_host_params.dcs_enable &= (~interference_type);
99 }
100 
101 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id)
102 {
103 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
104 	uint8_t enable = 0;
105 
106 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id);
107 	if (!dcs_pdev_priv) {
108 		dcs_err("dcs pdev private object is null");
109 		return 0;
110 	}
111 
112 	if (dcs_pdev_priv->dcs_host_params.dcs_enable_cfg)
113 		enable = dcs_pdev_priv->dcs_host_params.dcs_enable;
114 
115 	return enable;
116 }
117 
118 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t pdev_id)
119 {
120 	wlan_dcs_clear(psoc, pdev_id);
121 }
122 
123 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t pdev_id,
124 				bool dcs_algorithm_process)
125 {
126 	wlan_dcs_set_algorithm_process(psoc, pdev_id, dcs_algorithm_process);
127 }
128 
129 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id)
130 {
131 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
132 	struct wlan_host_dcs_im_user_stats *user_stats;
133 
134 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id);
135 	if (!dcs_pdev_priv) {
136 		dcs_err("dcs pdev private object is null");
137 		return;
138 	}
139 
140 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
141 	dcs_pdev_priv->dcs_host_params.user_request_count = 0;
142 	dcs_pdev_priv->dcs_host_params.notify_user = 0;
143 	user_stats = &dcs_pdev_priv->dcs_im_stats.user_dcs_im_stats;
144 	user_stats->cycle_count = 0;
145 	user_stats->rxclr_count = 0;
146 	user_stats->rx_frame_count = 0;
147 	user_stats->my_bss_rx_cycle_count = 0;
148 	user_stats->max_rssi = 0;
149 	user_stats->min_rssi = 0;
150 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
151 }
152 
153 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
154 			       uint32_t user_request_count)
155 {
156 	struct dcs_pdev_priv_obj *dcs_pdev_priv;
157 
158 	dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id);
159 	if (!dcs_pdev_priv) {
160 		dcs_err("dcs pdev private object is null");
161 		return;
162 	}
163 
164 	wlan_dcs_pdev_obj_lock(dcs_pdev_priv);
165 	dcs_pdev_priv->dcs_host_params.user_request_count = user_request_count;
166 	wlan_dcs_pdev_obj_unlock(dcs_pdev_priv);
167 }
168