xref: /wlan-driver/qcacld-3.0/os_if/son/src/os_if_son.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name 
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /**
19*5113495bSYour Name  * DOC: os_if_son.c
20*5113495bSYour Name  *
21*5113495bSYour Name  * WLAN Host Device Driver file for son (Self Organizing Network)
22*5113495bSYour Name  * support.
23*5113495bSYour Name  *
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include <os_if_son.h>
27*5113495bSYour Name #include <qdf_trace.h>
28*5113495bSYour Name #include <qdf_module.h>
29*5113495bSYour Name #include <wlan_cfg80211.h>
30*5113495bSYour Name #include <son_ucfg_api.h>
31*5113495bSYour Name #include <wlan_dfs_ucfg_api.h>
32*5113495bSYour Name #include <wlan_reg_ucfg_api.h>
33*5113495bSYour Name #include <wlan_vdev_mgr_ucfg_api.h>
34*5113495bSYour Name #include <wlan_mlme_ucfg_api.h>
35*5113495bSYour Name #include <wlan_reg_services_api.h>
36*5113495bSYour Name #include <wlan_scan_ucfg_api.h>
37*5113495bSYour Name #include <wlan_dcs_ucfg_api.h>
38*5113495bSYour Name 
39*5113495bSYour Name static struct son_callbacks g_son_os_if_cb;
40*5113495bSYour Name static struct wlan_os_if_son_ops g_son_os_if_txrx_ops;
41*5113495bSYour Name static void (*os_if_son_ops_cb)(struct wlan_os_if_son_ops *son_ops);
42*5113495bSYour Name 
os_if_son_register_hdd_callbacks(struct wlan_objmgr_psoc * psoc,struct son_callbacks * cb_obj)43*5113495bSYour Name void os_if_son_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
44*5113495bSYour Name 				      struct son_callbacks *cb_obj)
45*5113495bSYour Name {
46*5113495bSYour Name 	g_son_os_if_cb = *cb_obj;
47*5113495bSYour Name }
48*5113495bSYour Name 
os_if_son_get_freq(struct wlan_objmgr_vdev * vdev)49*5113495bSYour Name qdf_freq_t os_if_son_get_freq(struct wlan_objmgr_vdev *vdev)
50*5113495bSYour Name {
51*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
52*5113495bSYour Name 	qdf_freq_t freq;
53*5113495bSYour Name 
54*5113495bSYour Name 	if (!vdev) {
55*5113495bSYour Name 		osif_err("null vdev");
56*5113495bSYour Name 		return 0;
57*5113495bSYour Name 	}
58*5113495bSYour Name 
59*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
60*5113495bSYour Name 	if (!pdev) {
61*5113495bSYour Name 		osif_err("null pdev");
62*5113495bSYour Name 		return 0;
63*5113495bSYour Name 	}
64*5113495bSYour Name 
65*5113495bSYour Name 	freq = ucfg_son_get_operation_chan_freq_vdev_id(pdev,
66*5113495bSYour Name 							wlan_vdev_get_id(vdev));
67*5113495bSYour Name 	osif_debug("vdev %d get freq %d", wlan_vdev_get_id(vdev), freq);
68*5113495bSYour Name 
69*5113495bSYour Name 	return freq;
70*5113495bSYour Name }
71*5113495bSYour Name qdf_export_symbol(os_if_son_get_freq);
72*5113495bSYour Name 
os_if_son_is_acs_in_progress(struct wlan_objmgr_vdev * vdev)73*5113495bSYour Name uint32_t os_if_son_is_acs_in_progress(struct wlan_objmgr_vdev *vdev)
74*5113495bSYour Name {
75*5113495bSYour Name 	uint32_t acs_in_progress;
76*5113495bSYour Name 
77*5113495bSYour Name 	if (!vdev) {
78*5113495bSYour Name 		osif_err("null vdev");
79*5113495bSYour Name 		return 0;
80*5113495bSYour Name 	}
81*5113495bSYour Name 
82*5113495bSYour Name 	acs_in_progress = g_son_os_if_cb.os_if_is_acs_in_progress(vdev);
83*5113495bSYour Name 	osif_debug("vdev %d acs_in_progress %d",
84*5113495bSYour Name 		   wlan_vdev_get_id(vdev), acs_in_progress);
85*5113495bSYour Name 
86*5113495bSYour Name 	return acs_in_progress;
87*5113495bSYour Name }
88*5113495bSYour Name qdf_export_symbol(os_if_son_is_acs_in_progress);
89*5113495bSYour Name 
os_if_son_is_cac_in_progress(struct wlan_objmgr_vdev * vdev)90*5113495bSYour Name uint32_t os_if_son_is_cac_in_progress(struct wlan_objmgr_vdev *vdev)
91*5113495bSYour Name {
92*5113495bSYour Name 	uint32_t cac_in_progress;
93*5113495bSYour Name 
94*5113495bSYour Name 	if (!vdev) {
95*5113495bSYour Name 		osif_err("null vdev");
96*5113495bSYour Name 		return 0;
97*5113495bSYour Name 	}
98*5113495bSYour Name 
99*5113495bSYour Name 	cac_in_progress = ucfg_son_is_cac_in_progress(vdev);
100*5113495bSYour Name 	osif_debug("vdev %d cac_in_progress %d",
101*5113495bSYour Name 		   wlan_vdev_get_id(vdev), cac_in_progress);
102*5113495bSYour Name 
103*5113495bSYour Name 	return cac_in_progress;
104*5113495bSYour Name }
105*5113495bSYour Name qdf_export_symbol(os_if_son_is_cac_in_progress);
106*5113495bSYour Name 
os_if_son_set_chan_ext_offset(struct wlan_objmgr_vdev * vdev,enum sec20_chan_offset son_chan_ext_offset)107*5113495bSYour Name int os_if_son_set_chan_ext_offset(struct wlan_objmgr_vdev *vdev,
108*5113495bSYour Name 				  enum sec20_chan_offset son_chan_ext_offset)
109*5113495bSYour Name {
110*5113495bSYour Name 	int ret;
111*5113495bSYour Name 
112*5113495bSYour Name 	if (!vdev) {
113*5113495bSYour Name 		osif_err("null vdev");
114*5113495bSYour Name 		return 0;
115*5113495bSYour Name 	}
116*5113495bSYour Name 
117*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_chan_ext_offset(vdev,
118*5113495bSYour Name 						       son_chan_ext_offset);
119*5113495bSYour Name 	osif_debug("vdev %d set_chan_ext_offset %d, ret %d",
120*5113495bSYour Name 		   wlan_vdev_get_id(vdev), son_chan_ext_offset, ret);
121*5113495bSYour Name 
122*5113495bSYour Name 	return ret;
123*5113495bSYour Name }
124*5113495bSYour Name qdf_export_symbol(os_if_son_set_chan_ext_offset);
125*5113495bSYour Name 
os_if_son_get_chan_ext_offset(struct wlan_objmgr_vdev * vdev)126*5113495bSYour Name enum sec20_chan_offset os_if_son_get_chan_ext_offset(
127*5113495bSYour Name 						struct wlan_objmgr_vdev *vdev)
128*5113495bSYour Name {
129*5113495bSYour Name 	enum sec20_chan_offset chan_ext_offset;
130*5113495bSYour Name 
131*5113495bSYour Name 	if (!vdev) {
132*5113495bSYour Name 		osif_err("null vdev");
133*5113495bSYour Name 		return 0;
134*5113495bSYour Name 	}
135*5113495bSYour Name 
136*5113495bSYour Name 	chan_ext_offset = g_son_os_if_cb.os_if_get_chan_ext_offset(vdev);
137*5113495bSYour Name 	osif_debug("vdev %d chan_ext_offset %d",
138*5113495bSYour Name 		   wlan_vdev_get_id(vdev), chan_ext_offset);
139*5113495bSYour Name 
140*5113495bSYour Name 	return chan_ext_offset;
141*5113495bSYour Name }
142*5113495bSYour Name qdf_export_symbol(os_if_son_get_chan_ext_offset);
143*5113495bSYour Name 
os_if_son_set_bandwidth(struct wlan_objmgr_vdev * vdev,uint32_t son_bandwidth)144*5113495bSYour Name int os_if_son_set_bandwidth(struct wlan_objmgr_vdev *vdev,
145*5113495bSYour Name 			    uint32_t son_bandwidth)
146*5113495bSYour Name {
147*5113495bSYour Name 	int ret;
148*5113495bSYour Name 
149*5113495bSYour Name 	if (!vdev) {
150*5113495bSYour Name 		osif_err("null vdev");
151*5113495bSYour Name 		return -EINVAL;
152*5113495bSYour Name 	}
153*5113495bSYour Name 
154*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_bandwidth(vdev, son_bandwidth);
155*5113495bSYour Name 	osif_debug("vdev %d son_bandwidth %d ret %d",
156*5113495bSYour Name 		   wlan_vdev_get_id(vdev), son_bandwidth, ret);
157*5113495bSYour Name 
158*5113495bSYour Name 	return ret;
159*5113495bSYour Name }
160*5113495bSYour Name qdf_export_symbol(os_if_son_set_bandwidth);
161*5113495bSYour Name 
os_if_son_get_bandwidth(struct wlan_objmgr_vdev * vdev)162*5113495bSYour Name uint32_t os_if_son_get_bandwidth(struct wlan_objmgr_vdev *vdev)
163*5113495bSYour Name {
164*5113495bSYour Name 	uint32_t bandwidth;
165*5113495bSYour Name 
166*5113495bSYour Name 	if (!vdev) {
167*5113495bSYour Name 		osif_err("null vdev");
168*5113495bSYour Name 		return NONHT;
169*5113495bSYour Name 	}
170*5113495bSYour Name 
171*5113495bSYour Name 	bandwidth = g_son_os_if_cb.os_if_get_bandwidth(vdev);
172*5113495bSYour Name 	osif_debug("vdev %d son_bandwidth %d",
173*5113495bSYour Name 		   wlan_vdev_get_id(vdev), bandwidth);
174*5113495bSYour Name 
175*5113495bSYour Name 	return bandwidth;
176*5113495bSYour Name }
177*5113495bSYour Name qdf_export_symbol(os_if_son_get_bandwidth);
178*5113495bSYour Name 
os_if_band_bitmap_to_son_band_info(uint32_t reg_wifi_band_bitmap)179*5113495bSYour Name static uint32_t os_if_band_bitmap_to_son_band_info(
180*5113495bSYour Name 					uint32_t reg_wifi_band_bitmap)
181*5113495bSYour Name {
182*5113495bSYour Name 	uint32_t son_band_info = FULL_BAND_RADIO;
183*5113495bSYour Name 
184*5113495bSYour Name 	if (!(reg_wifi_band_bitmap & BIT(REG_BAND_5G)) &&
185*5113495bSYour Name 	    !(reg_wifi_band_bitmap & BIT(REG_BAND_6G)))
186*5113495bSYour Name 		return NON_5G_RADIO;
187*5113495bSYour Name 	if (reg_wifi_band_bitmap & BIT(REG_BAND_6G) &&
188*5113495bSYour Name 	    !(reg_wifi_band_bitmap & BIT(REG_BAND_2G)) &&
189*5113495bSYour Name 	    !(reg_wifi_band_bitmap & BIT(REG_BAND_5G)))
190*5113495bSYour Name 		return BAND_6G_RADIO;
191*5113495bSYour Name 
192*5113495bSYour Name 	return son_band_info;
193*5113495bSYour Name }
194*5113495bSYour Name 
os_if_son_get_band_info(struct wlan_objmgr_vdev * vdev)195*5113495bSYour Name uint32_t os_if_son_get_band_info(struct wlan_objmgr_vdev *vdev)
196*5113495bSYour Name {
197*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
198*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
199*5113495bSYour Name 	uint32_t reg_wifi_band_bitmap;
200*5113495bSYour Name 	uint32_t band_info;
201*5113495bSYour Name 
202*5113495bSYour Name 	if (!vdev) {
203*5113495bSYour Name 		osif_err("null vdev");
204*5113495bSYour Name 		return NO_BAND_INFORMATION_AVAILABLE;
205*5113495bSYour Name 	}
206*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
207*5113495bSYour Name 	if (!pdev) {
208*5113495bSYour Name 		osif_err("null pdev");
209*5113495bSYour Name 		return NO_BAND_INFORMATION_AVAILABLE;
210*5113495bSYour Name 	}
211*5113495bSYour Name 
212*5113495bSYour Name 	status = ucfg_reg_get_band(pdev, &reg_wifi_band_bitmap);
213*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(status)) {
214*5113495bSYour Name 		osif_err("failed to get band");
215*5113495bSYour Name 		return NO_BAND_INFORMATION_AVAILABLE;
216*5113495bSYour Name 	}
217*5113495bSYour Name 
218*5113495bSYour Name 	band_info = os_if_band_bitmap_to_son_band_info(reg_wifi_band_bitmap);
219*5113495bSYour Name 	osif_debug("vdev %d band_info %d",
220*5113495bSYour Name 		   wlan_vdev_get_id(vdev), band_info);
221*5113495bSYour Name 
222*5113495bSYour Name 	return band_info;
223*5113495bSYour Name }
224*5113495bSYour Name qdf_export_symbol(os_if_son_get_band_info);
225*5113495bSYour Name 
226*5113495bSYour Name #define BW_WITHIN(min, bw, max) ((min) <= (bw) && (bw) <= (max))
227*5113495bSYour Name /**
228*5113495bSYour Name  * os_if_son_fill_chan_info() - fill chan info
229*5113495bSYour Name  * @chan_info: chan info to fill
230*5113495bSYour Name  * @chan_num: chan number
231*5113495bSYour Name  * @primary_freq: chan frequency
232*5113495bSYour Name  * @ch_num_seg1: channel number for segment 1
233*5113495bSYour Name  * @ch_num_seg2: channel number for segment 2
234*5113495bSYour Name  *
235*5113495bSYour Name  * Return: void
236*5113495bSYour Name  */
os_if_son_fill_chan_info(struct ieee80211_channel_info * chan_info,uint8_t chan_num,qdf_freq_t primary_freq,uint8_t ch_num_seg1,uint8_t ch_num_seg2)237*5113495bSYour Name static void os_if_son_fill_chan_info(struct ieee80211_channel_info *chan_info,
238*5113495bSYour Name 				     uint8_t chan_num, qdf_freq_t primary_freq,
239*5113495bSYour Name 				     uint8_t ch_num_seg1, uint8_t ch_num_seg2)
240*5113495bSYour Name {
241*5113495bSYour Name 	chan_info->ieee = chan_num;
242*5113495bSYour Name 	chan_info->freq = primary_freq;
243*5113495bSYour Name 	chan_info->vhtop_ch_num_seg1 = ch_num_seg1;
244*5113495bSYour Name 	chan_info->vhtop_ch_num_seg2 = ch_num_seg2;
245*5113495bSYour Name }
246*5113495bSYour Name 
247*5113495bSYour Name /**
248*5113495bSYour Name  * os_if_son_update_chan_info() - update chan info
249*5113495bSYour Name  * @pdev: pdev
250*5113495bSYour Name  * @flag_160: flag indicating the API to fill the center frequencies of 160MHz.
251*5113495bSYour Name  * @cur_chan_list: pointer to regulatory_channel
252*5113495bSYour Name  * @chan_info: chan info to fill
253*5113495bSYour Name  * @half_and_quarter_rate_flags: half and quarter rate flags
254*5113495bSYour Name  *
255*5113495bSYour Name  * Return: void
256*5113495bSYour Name  */
os_if_son_update_chan_info(struct wlan_objmgr_pdev * pdev,bool flag_160,struct regulatory_channel * cur_chan_list,struct ieee80211_channel_info * chan_info,uint64_t half_and_quarter_rate_flags)257*5113495bSYour Name static void os_if_son_update_chan_info(
258*5113495bSYour Name 			struct wlan_objmgr_pdev *pdev, bool flag_160,
259*5113495bSYour Name 			struct regulatory_channel *cur_chan_list,
260*5113495bSYour Name 			struct ieee80211_channel_info *chan_info,
261*5113495bSYour Name 			uint64_t half_and_quarter_rate_flags)
262*5113495bSYour Name {
263*5113495bSYour Name 	qdf_freq_t primary_freq = cur_chan_list->center_freq;
264*5113495bSYour Name 	struct ch_params chan_params = {0};
265*5113495bSYour Name 
266*5113495bSYour Name 	if (!chan_info) {
267*5113495bSYour Name 		osif_err("null chan info");
268*5113495bSYour Name 		return;
269*5113495bSYour Name 	}
270*5113495bSYour Name 	if (cur_chan_list->chan_flags & REGULATORY_CHAN_NO_OFDM)
271*5113495bSYour Name 		chan_info->flags |=
272*5113495bSYour Name 			VENDOR_CHAN_FLAG2(QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_B);
273*5113495bSYour Name 	else
274*5113495bSYour Name 		chan_info->flags |= ucfg_son_get_chan_flag(pdev, primary_freq,
275*5113495bSYour Name 							   flag_160,
276*5113495bSYour Name 							   &chan_params);
277*5113495bSYour Name 	if (cur_chan_list->chan_flags & REGULATORY_CHAN_RADAR) {
278*5113495bSYour Name 		chan_info->flags_ext |=
279*5113495bSYour Name 			QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_EXT_DFS;
280*5113495bSYour Name 		chan_info->flags_ext |=
281*5113495bSYour Name 			QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_EXT_DISALLOW_ADHOC;
282*5113495bSYour Name 		chan_info->flags |= QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_PASSIVE;
283*5113495bSYour Name 	} else if (cur_chan_list->chan_flags & REGULATORY_CHAN_NO_IR) {
284*5113495bSYour Name 		/* For 2Ghz passive channels. */
285*5113495bSYour Name 		chan_info->flags |= QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_PASSIVE;
286*5113495bSYour Name 	}
287*5113495bSYour Name 
288*5113495bSYour Name 	if (WLAN_REG_IS_6GHZ_PSC_CHAN_FREQ(primary_freq))
289*5113495bSYour Name 		chan_info->flags_ext |=
290*5113495bSYour Name 			QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_EXT_PSC;
291*5113495bSYour Name 
292*5113495bSYour Name 	os_if_son_fill_chan_info(chan_info, cur_chan_list->chan_num,
293*5113495bSYour Name 				 primary_freq,
294*5113495bSYour Name 				 chan_params.center_freq_seg0,
295*5113495bSYour Name 				 chan_params.center_freq_seg1);
296*5113495bSYour Name }
297*5113495bSYour Name 
os_if_son_get_chan_list(struct wlan_objmgr_vdev * vdev,struct ieee80211_ath_channel * chan_list,struct ieee80211_channel_info * chan_info,uint8_t * nchans,bool flag_160,bool flag_6ghz)298*5113495bSYour Name int os_if_son_get_chan_list(struct wlan_objmgr_vdev *vdev,
299*5113495bSYour Name 			    struct ieee80211_ath_channel *chan_list,
300*5113495bSYour Name 			    struct ieee80211_channel_info *chan_info,
301*5113495bSYour Name 			    uint8_t *nchans, bool flag_160, bool flag_6ghz)
302*5113495bSYour Name {
303*5113495bSYour Name 	struct regulatory_channel *cur_chan_list;
304*5113495bSYour Name 	int i;
305*5113495bSYour Name 	uint32_t phybitmap;
306*5113495bSYour Name 	uint32_t reg_wifi_band_bitmap;
307*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
308*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
309*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
310*5113495bSYour Name 	struct regulatory_channel *chan;
311*5113495bSYour Name 
312*5113495bSYour Name 	if (!vdev) {
313*5113495bSYour Name 		osif_err("null vdev");
314*5113495bSYour Name 		return -EINVAL;
315*5113495bSYour Name 	}
316*5113495bSYour Name 
317*5113495bSYour Name 	if (!chan_info) {
318*5113495bSYour Name 		osif_err("null chan info");
319*5113495bSYour Name 		return -EINVAL;
320*5113495bSYour Name 	}
321*5113495bSYour Name 
322*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
323*5113495bSYour Name 	if (!pdev) {
324*5113495bSYour Name 		osif_err("null pdev");
325*5113495bSYour Name 		return -EINVAL;
326*5113495bSYour Name 	}
327*5113495bSYour Name 
328*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
329*5113495bSYour Name 	if (!psoc) {
330*5113495bSYour Name 		osif_err("null psoc");
331*5113495bSYour Name 		return -EINVAL;
332*5113495bSYour Name 	}
333*5113495bSYour Name 
334*5113495bSYour Name 	status = ucfg_reg_get_band(pdev, &reg_wifi_band_bitmap);
335*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(status)) {
336*5113495bSYour Name 		osif_err("failed to get band");
337*5113495bSYour Name 		return -EINVAL;
338*5113495bSYour Name 	}
339*5113495bSYour Name 
340*5113495bSYour Name 	cur_chan_list = qdf_mem_malloc(NUM_CHANNELS *
341*5113495bSYour Name 			sizeof(struct regulatory_channel));
342*5113495bSYour Name 	if (!cur_chan_list) {
343*5113495bSYour Name 		osif_err("cur_chan_list allocation fails");
344*5113495bSYour Name 		return -EINVAL;
345*5113495bSYour Name 	}
346*5113495bSYour Name 
347*5113495bSYour Name 	if (wlan_reg_get_current_chan_list(
348*5113495bSYour Name 	    pdev, cur_chan_list) != QDF_STATUS_SUCCESS) {
349*5113495bSYour Name 		qdf_mem_free(cur_chan_list);
350*5113495bSYour Name 		osif_err("fail to get current chan list");
351*5113495bSYour Name 		return -EINVAL;
352*5113495bSYour Name 	}
353*5113495bSYour Name 
354*5113495bSYour Name 	ucfg_reg_get_band(pdev, &phybitmap);
355*5113495bSYour Name 
356*5113495bSYour Name 	for (i = 0; i < NUM_CHANNELS; i++) {
357*5113495bSYour Name 		uint64_t band_flags;
358*5113495bSYour Name 		qdf_freq_t primary_freq = cur_chan_list[i].center_freq;
359*5113495bSYour Name 		uint64_t half_and_quarter_rate_flags = 0;
360*5113495bSYour Name 
361*5113495bSYour Name 		chan = &cur_chan_list[i];
362*5113495bSYour Name 		if ((chan->chan_flags & REGULATORY_CHAN_DISABLED) &&
363*5113495bSYour Name 		    chan->state == CHANNEL_STATE_DISABLE &&
364*5113495bSYour Name 		    !chan->nol_chan && !chan->nol_history)
365*5113495bSYour Name 			continue;
366*5113495bSYour Name 		if (WLAN_REG_IS_6GHZ_CHAN_FREQ(primary_freq)) {
367*5113495bSYour Name 			if (!flag_6ghz ||
368*5113495bSYour Name 			    !(reg_wifi_band_bitmap & BIT(REG_BAND_6G)))
369*5113495bSYour Name 				continue;
370*5113495bSYour Name 			band_flags = VENDOR_CHAN_FLAG2(
371*5113495bSYour Name 				QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_6GHZ);
372*5113495bSYour Name 		} else if (WLAN_REG_IS_24GHZ_CH_FREQ(primary_freq)) {
373*5113495bSYour Name 			if (!(reg_wifi_band_bitmap & BIT(REG_BAND_2G)))
374*5113495bSYour Name 				continue;
375*5113495bSYour Name 			band_flags = QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_2GHZ;
376*5113495bSYour Name 		} else if (WLAN_REG_IS_5GHZ_CH_FREQ(primary_freq)) {
377*5113495bSYour Name 			if (!(reg_wifi_band_bitmap & BIT(REG_BAND_5G)))
378*5113495bSYour Name 				continue;
379*5113495bSYour Name 			band_flags = QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_5GHZ;
380*5113495bSYour Name 		} else if (WLAN_REG_IS_49GHZ_FREQ(primary_freq)) {
381*5113495bSYour Name 			if (!(reg_wifi_band_bitmap & BIT(REG_BAND_5G)))
382*5113495bSYour Name 				continue;
383*5113495bSYour Name 			band_flags = QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_5GHZ;
384*5113495bSYour Name 			/**
385*5113495bSYour Name 			 * If 4.9G Half and Quarter rates are supported
386*5113495bSYour Name 			 * by the channel, update them as separate entries
387*5113495bSYour Name 			 * to the list
388*5113495bSYour Name 			 */
389*5113495bSYour Name 			if (BW_WITHIN(chan->min_bw, BW_10_MHZ, chan->max_bw)) {
390*5113495bSYour Name 				os_if_son_fill_chan_info(&chan_info[*nchans],
391*5113495bSYour Name 							 chan->chan_num,
392*5113495bSYour Name 							 primary_freq, 0, 0);
393*5113495bSYour Name 				chan_info[*nchans].flags |=
394*5113495bSYour Name 					QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_HALF;
395*5113495bSYour Name 				chan_info[*nchans].flags |=
396*5113495bSYour Name 					VENDOR_CHAN_FLAG2(
397*5113495bSYour Name 					QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_A);
398*5113495bSYour Name 				half_and_quarter_rate_flags =
399*5113495bSYour Name 					chan_info[*nchans].flags;
400*5113495bSYour Name 				if (++(*nchans) >= IEEE80211_CHAN_MAX)
401*5113495bSYour Name 					break;
402*5113495bSYour Name 			}
403*5113495bSYour Name 			if (BW_WITHIN(chan->min_bw, BW_5_MHZ, chan->max_bw)) {
404*5113495bSYour Name 				os_if_son_fill_chan_info(&chan_info[*nchans],
405*5113495bSYour Name 							 chan->chan_num,
406*5113495bSYour Name 							 primary_freq, 0, 0);
407*5113495bSYour Name 				chan_info[*nchans].flags |=
408*5113495bSYour Name 				    QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_QUARTER;
409*5113495bSYour Name 				chan_info[*nchans].flags |=
410*5113495bSYour Name 					VENDOR_CHAN_FLAG2(
411*5113495bSYour Name 					QCA_WLAN_VENDOR_CHANNEL_PROP_FLAG_A);
412*5113495bSYour Name 				half_and_quarter_rate_flags =
413*5113495bSYour Name 					chan_info[*nchans].flags;
414*5113495bSYour Name 				if (++(*nchans) >= IEEE80211_CHAN_MAX)
415*5113495bSYour Name 					break;
416*5113495bSYour Name 			}
417*5113495bSYour Name 		} else {
418*5113495bSYour Name 			continue;
419*5113495bSYour Name 		}
420*5113495bSYour Name 
421*5113495bSYour Name 		os_if_son_update_chan_info(pdev, flag_160, chan,
422*5113495bSYour Name 					   &chan_info[*nchans],
423*5113495bSYour Name 					   half_and_quarter_rate_flags);
424*5113495bSYour Name 
425*5113495bSYour Name 		if (++(*nchans) >= IEEE80211_CHAN_MAX)
426*5113495bSYour Name 			break;
427*5113495bSYour Name 	}
428*5113495bSYour Name 
429*5113495bSYour Name 	qdf_mem_free(cur_chan_list);
430*5113495bSYour Name 	osif_debug("vdev %d channel_info exit", wlan_vdev_get_id(vdev));
431*5113495bSYour Name 
432*5113495bSYour Name 	return 0;
433*5113495bSYour Name }
434*5113495bSYour Name qdf_export_symbol(os_if_son_get_chan_list);
435*5113495bSYour Name 
os_if_son_get_sta_count(struct wlan_objmgr_vdev * vdev)436*5113495bSYour Name uint32_t os_if_son_get_sta_count(struct wlan_objmgr_vdev *vdev)
437*5113495bSYour Name {
438*5113495bSYour Name 	uint32_t sta_count;
439*5113495bSYour Name 
440*5113495bSYour Name 	if (!vdev) {
441*5113495bSYour Name 		osif_err("null vdev");
442*5113495bSYour Name 		return 0;
443*5113495bSYour Name 	}
444*5113495bSYour Name 
445*5113495bSYour Name 	sta_count = ucfg_son_get_sta_count(vdev);
446*5113495bSYour Name 	osif_debug("vdev %d sta count %d", wlan_vdev_get_id(vdev), sta_count);
447*5113495bSYour Name 
448*5113495bSYour Name 	return sta_count;
449*5113495bSYour Name }
450*5113495bSYour Name qdf_export_symbol(os_if_son_get_sta_count);
451*5113495bSYour Name 
os_if_son_get_bssid(struct wlan_objmgr_vdev * vdev,uint8_t bssid[QDF_MAC_ADDR_SIZE])452*5113495bSYour Name int os_if_son_get_bssid(struct wlan_objmgr_vdev *vdev,
453*5113495bSYour Name 			uint8_t bssid[QDF_MAC_ADDR_SIZE])
454*5113495bSYour Name {
455*5113495bSYour Name 	if (!vdev) {
456*5113495bSYour Name 		osif_err("null vdev");
457*5113495bSYour Name 		return -EINVAL;
458*5113495bSYour Name 	}
459*5113495bSYour Name 
460*5113495bSYour Name 	ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid);
461*5113495bSYour Name 	osif_debug("vdev %d bssid " QDF_MAC_ADDR_FMT,
462*5113495bSYour Name 		   wlan_vdev_get_id(vdev), QDF_MAC_ADDR_REF(bssid));
463*5113495bSYour Name 
464*5113495bSYour Name 	return 0;
465*5113495bSYour Name }
466*5113495bSYour Name qdf_export_symbol(os_if_son_get_bssid);
467*5113495bSYour Name 
os_if_son_get_ssid(struct wlan_objmgr_vdev * vdev,char ssid[WLAN_SSID_MAX_LEN+1],uint8_t * ssid_len)468*5113495bSYour Name int os_if_son_get_ssid(struct wlan_objmgr_vdev *vdev,
469*5113495bSYour Name 		       char ssid[WLAN_SSID_MAX_LEN + 1],
470*5113495bSYour Name 		       uint8_t *ssid_len)
471*5113495bSYour Name {
472*5113495bSYour Name 	if (!vdev) {
473*5113495bSYour Name 		osif_err("null vdev");
474*5113495bSYour Name 		return -EINVAL;
475*5113495bSYour Name 	}
476*5113495bSYour Name 
477*5113495bSYour Name 	ucfg_wlan_vdev_mgr_get_param_ssid(vdev, ssid, ssid_len);
478*5113495bSYour Name 	osif_debug("vdev %d ssid " QDF_SSID_FMT,
479*5113495bSYour Name 		   wlan_vdev_get_id(vdev),
480*5113495bSYour Name 		   QDF_SSID_REF(*ssid_len, ssid));
481*5113495bSYour Name 
482*5113495bSYour Name 	return 0;
483*5113495bSYour Name }
484*5113495bSYour Name qdf_export_symbol(os_if_son_get_ssid);
485*5113495bSYour Name 
os_if_son_set_chan(struct wlan_objmgr_vdev * vdev,int chan,enum wlan_band_id son_band)486*5113495bSYour Name int os_if_son_set_chan(struct wlan_objmgr_vdev *vdev,
487*5113495bSYour Name 		       int chan, enum wlan_band_id son_band)
488*5113495bSYour Name {
489*5113495bSYour Name 	int ret;
490*5113495bSYour Name 
491*5113495bSYour Name 	if (!vdev) {
492*5113495bSYour Name 		osif_err("null vdev");
493*5113495bSYour Name 		return -EINVAL;
494*5113495bSYour Name 	}
495*5113495bSYour Name 
496*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_chan(vdev, chan, son_band);
497*5113495bSYour Name 	osif_debug("vdev %d chan %d son_band %d", wlan_vdev_get_id(vdev),
498*5113495bSYour Name 		   chan, son_band);
499*5113495bSYour Name 
500*5113495bSYour Name 	return ret;
501*5113495bSYour Name }
502*5113495bSYour Name qdf_export_symbol(os_if_son_set_chan);
503*5113495bSYour Name 
os_if_son_set_cac_timeout(struct wlan_objmgr_vdev * vdev,int cac_timeout)504*5113495bSYour Name int os_if_son_set_cac_timeout(struct wlan_objmgr_vdev *vdev,
505*5113495bSYour Name 			      int cac_timeout)
506*5113495bSYour Name {
507*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
508*5113495bSYour Name 	int status;
509*5113495bSYour Name 
510*5113495bSYour Name 	if (!vdev) {
511*5113495bSYour Name 		osif_err("null vdev");
512*5113495bSYour Name 		return -EINVAL;
513*5113495bSYour Name 	}
514*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
515*5113495bSYour Name 	if (!pdev) {
516*5113495bSYour Name 		osif_err("null pdev");
517*5113495bSYour Name 		return -EINVAL;
518*5113495bSYour Name 	}
519*5113495bSYour Name 
520*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ucfg_dfs_override_cac_timeout(
521*5113495bSYour Name 		pdev, cac_timeout, &status))) {
522*5113495bSYour Name 		osif_err("cac timeout override fails");
523*5113495bSYour Name 		return -EINVAL;
524*5113495bSYour Name 	}
525*5113495bSYour Name 	osif_debug("vdev %d cac_timeout %d status %d",
526*5113495bSYour Name 		   wlan_vdev_get_id(vdev), cac_timeout, status);
527*5113495bSYour Name 
528*5113495bSYour Name 	return status;
529*5113495bSYour Name }
530*5113495bSYour Name qdf_export_symbol(os_if_son_set_cac_timeout);
531*5113495bSYour Name 
os_if_son_get_cac_timeout(struct wlan_objmgr_vdev * vdev,int * cac_timeout)532*5113495bSYour Name int os_if_son_get_cac_timeout(struct wlan_objmgr_vdev *vdev,
533*5113495bSYour Name 			      int *cac_timeout)
534*5113495bSYour Name {
535*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
536*5113495bSYour Name 	int status;
537*5113495bSYour Name 
538*5113495bSYour Name 	if (!vdev) {
539*5113495bSYour Name 		osif_err("null vdev");
540*5113495bSYour Name 		return -EINVAL;
541*5113495bSYour Name 	}
542*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
543*5113495bSYour Name 	if (!pdev) {
544*5113495bSYour Name 		osif_err("null pdev");
545*5113495bSYour Name 		return -EINVAL;
546*5113495bSYour Name 	}
547*5113495bSYour Name 
548*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ucfg_dfs_get_override_cac_timeout(
549*5113495bSYour Name 		pdev, cac_timeout, &status))) {
550*5113495bSYour Name 		osif_err("fails to get cac timeout");
551*5113495bSYour Name 		return -EINVAL;
552*5113495bSYour Name 	}
553*5113495bSYour Name 	osif_debug("vdev %d cac_timeout %d status %d",
554*5113495bSYour Name 		   wlan_vdev_get_id(vdev), *cac_timeout, status);
555*5113495bSYour Name 
556*5113495bSYour Name 	return status;
557*5113495bSYour Name }
558*5113495bSYour Name qdf_export_symbol(os_if_son_get_cac_timeout);
559*5113495bSYour Name 
os_if_son_set_country_code(struct wlan_objmgr_vdev * vdev,char * country_code)560*5113495bSYour Name int os_if_son_set_country_code(struct wlan_objmgr_vdev *vdev,
561*5113495bSYour Name 			       char *country_code)
562*5113495bSYour Name {
563*5113495bSYour Name 	int ret;
564*5113495bSYour Name 
565*5113495bSYour Name 	if (!vdev) {
566*5113495bSYour Name 		osif_err("null vdev");
567*5113495bSYour Name 		return -EINVAL;
568*5113495bSYour Name 	}
569*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_country_code(vdev, country_code);
570*5113495bSYour Name 	osif_debug("vdev %d country_code %s ret %d",
571*5113495bSYour Name 		   wlan_vdev_get_id(vdev), country_code, ret);
572*5113495bSYour Name 
573*5113495bSYour Name 	return ret;
574*5113495bSYour Name }
575*5113495bSYour Name qdf_export_symbol(os_if_son_set_country_code);
576*5113495bSYour Name 
os_if_son_get_country_code(struct wlan_objmgr_vdev * vdev,char * country_code)577*5113495bSYour Name int os_if_son_get_country_code(struct wlan_objmgr_vdev *vdev,
578*5113495bSYour Name 			       char *country_code)
579*5113495bSYour Name {
580*5113495bSYour Name 	QDF_STATUS status;
581*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
582*5113495bSYour Name 
583*5113495bSYour Name 	if (!vdev) {
584*5113495bSYour Name 		osif_err("null vdev");
585*5113495bSYour Name 		return -EINVAL;
586*5113495bSYour Name 	}
587*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
588*5113495bSYour Name 	if (!psoc) {
589*5113495bSYour Name 		osif_err("null psoc");
590*5113495bSYour Name 		return -EINVAL;
591*5113495bSYour Name 	}
592*5113495bSYour Name 	status = ucfg_reg_get_current_country(psoc, country_code);
593*5113495bSYour Name 	osif_debug("vdev %d country_code %s status %d",
594*5113495bSYour Name 		   wlan_vdev_get_id(vdev), country_code, status);
595*5113495bSYour Name 
596*5113495bSYour Name 	return qdf_status_to_os_return(status);
597*5113495bSYour Name }
598*5113495bSYour Name qdf_export_symbol(os_if_son_get_country_code);
599*5113495bSYour Name 
os_if_son_set_candidate_freq(struct wlan_objmgr_vdev * vdev,qdf_freq_t freq)600*5113495bSYour Name int os_if_son_set_candidate_freq(struct wlan_objmgr_vdev *vdev,
601*5113495bSYour Name 				 qdf_freq_t freq)
602*5113495bSYour Name {
603*5113495bSYour Name 	int ret;
604*5113495bSYour Name 
605*5113495bSYour Name 	if (!vdev) {
606*5113495bSYour Name 		osif_err("null vdev");
607*5113495bSYour Name 		return -EINVAL;
608*5113495bSYour Name 	}
609*5113495bSYour Name 
610*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_candidate_freq(vdev, freq);
611*5113495bSYour Name 	osif_debug("vdev %d set_candidate_freq %d ret %d",
612*5113495bSYour Name 		   wlan_vdev_get_id(vdev), freq, ret);
613*5113495bSYour Name 
614*5113495bSYour Name 	return ret;
615*5113495bSYour Name }
616*5113495bSYour Name qdf_export_symbol(os_if_son_set_candidate_freq);
617*5113495bSYour Name 
os_if_son_get_candidate_freq(struct wlan_objmgr_vdev * vdev)618*5113495bSYour Name qdf_freq_t os_if_son_get_candidate_freq(struct wlan_objmgr_vdev *vdev)
619*5113495bSYour Name {
620*5113495bSYour Name 	qdf_freq_t freq;
621*5113495bSYour Name 
622*5113495bSYour Name 	if (!vdev) {
623*5113495bSYour Name 		osif_err("null vdev");
624*5113495bSYour Name 		return 0;
625*5113495bSYour Name 	}
626*5113495bSYour Name 
627*5113495bSYour Name 	freq = g_son_os_if_cb.os_if_get_candidate_freq(vdev);
628*5113495bSYour Name 	osif_debug("vdev %d candidate_freq %d",
629*5113495bSYour Name 		   wlan_vdev_get_id(vdev), freq);
630*5113495bSYour Name 
631*5113495bSYour Name 	return freq;
632*5113495bSYour Name }
633*5113495bSYour Name qdf_export_symbol(os_if_son_get_candidate_freq);
634*5113495bSYour Name 
os_if_son_set_acl_policy(struct wlan_objmgr_vdev * vdev,ieee80211_acl_cmd son_acl_policy)635*5113495bSYour Name QDF_STATUS os_if_son_set_acl_policy(struct wlan_objmgr_vdev *vdev,
636*5113495bSYour Name 				    ieee80211_acl_cmd son_acl_policy)
637*5113495bSYour Name {
638*5113495bSYour Name 	QDF_STATUS ret;
639*5113495bSYour Name 
640*5113495bSYour Name 	if (!vdev) {
641*5113495bSYour Name 		osif_err("null vdev");
642*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
643*5113495bSYour Name 	}
644*5113495bSYour Name 
645*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_acl_policy(vdev, son_acl_policy);
646*5113495bSYour Name 	osif_debug("set acl policy %d status %d", son_acl_policy, ret);
647*5113495bSYour Name 
648*5113495bSYour Name 	return ret;
649*5113495bSYour Name }
650*5113495bSYour Name qdf_export_symbol(os_if_son_set_acl_policy);
651*5113495bSYour Name 
os_if_son_get_acl_policy(struct wlan_objmgr_vdev * vdev)652*5113495bSYour Name ieee80211_acl_cmd os_if_son_get_acl_policy(struct wlan_objmgr_vdev *vdev)
653*5113495bSYour Name {
654*5113495bSYour Name 	ieee80211_acl_cmd son_acl_policy;
655*5113495bSYour Name 
656*5113495bSYour Name 	if (!vdev) {
657*5113495bSYour Name 		osif_err("null vdev");
658*5113495bSYour Name 		return IEEE80211_MACCMD_DETACH;
659*5113495bSYour Name 	}
660*5113495bSYour Name 	son_acl_policy = g_son_os_if_cb.os_if_get_acl_policy(vdev);
661*5113495bSYour Name 	osif_debug("get acl policy %d", son_acl_policy);
662*5113495bSYour Name 
663*5113495bSYour Name 	return son_acl_policy;
664*5113495bSYour Name }
665*5113495bSYour Name qdf_export_symbol(os_if_son_get_acl_policy);
666*5113495bSYour Name 
os_if_son_add_acl_mac(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * acl_mac)667*5113495bSYour Name int os_if_son_add_acl_mac(struct wlan_objmgr_vdev *vdev,
668*5113495bSYour Name 			  struct qdf_mac_addr *acl_mac)
669*5113495bSYour Name {
670*5113495bSYour Name 	int ret;
671*5113495bSYour Name 
672*5113495bSYour Name 	if (!vdev) {
673*5113495bSYour Name 		osif_err("null vdev");
674*5113495bSYour Name 		return -EINVAL;
675*5113495bSYour Name 	}
676*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_add_acl_mac(vdev, acl_mac);
677*5113495bSYour Name 	osif_debug("add_acl_mac " QDF_MAC_ADDR_FMT " ret %d",
678*5113495bSYour Name 		   QDF_MAC_ADDR_REF(acl_mac->bytes), ret);
679*5113495bSYour Name 
680*5113495bSYour Name 	return ret;
681*5113495bSYour Name }
682*5113495bSYour Name qdf_export_symbol(os_if_son_add_acl_mac);
683*5113495bSYour Name 
os_if_son_del_acl_mac(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * acl_mac)684*5113495bSYour Name int os_if_son_del_acl_mac(struct wlan_objmgr_vdev *vdev,
685*5113495bSYour Name 			  struct qdf_mac_addr *acl_mac)
686*5113495bSYour Name {
687*5113495bSYour Name 	int ret;
688*5113495bSYour Name 
689*5113495bSYour Name 	if (!vdev) {
690*5113495bSYour Name 		osif_err("null vdev");
691*5113495bSYour Name 		return -EINVAL;
692*5113495bSYour Name 	}
693*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_del_acl_mac(vdev, acl_mac);
694*5113495bSYour Name 	osif_debug("del_acl_mac " QDF_MAC_ADDR_FMT " ret %d",
695*5113495bSYour Name 		   QDF_MAC_ADDR_REF(acl_mac->bytes), ret);
696*5113495bSYour Name 
697*5113495bSYour Name 	return ret;
698*5113495bSYour Name }
699*5113495bSYour Name qdf_export_symbol(os_if_son_del_acl_mac);
700*5113495bSYour Name 
os_if_son_kickout_mac(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mac)701*5113495bSYour Name int os_if_son_kickout_mac(struct wlan_objmgr_vdev *vdev,
702*5113495bSYour Name 			  struct qdf_mac_addr *mac)
703*5113495bSYour Name {
704*5113495bSYour Name 	int ret;
705*5113495bSYour Name 
706*5113495bSYour Name 	if (!vdev) {
707*5113495bSYour Name 		osif_err("null vdev");
708*5113495bSYour Name 		return -EINVAL;
709*5113495bSYour Name 	}
710*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_kickout_mac(vdev, mac);
711*5113495bSYour Name 	osif_debug("kickout mac " QDF_MAC_ADDR_FMT " ret %d",
712*5113495bSYour Name 		   QDF_MAC_ADDR_REF(mac->bytes), ret);
713*5113495bSYour Name 
714*5113495bSYour Name 	return ret;
715*5113495bSYour Name }
716*5113495bSYour Name qdf_export_symbol(os_if_son_kickout_mac);
717*5113495bSYour Name 
os_if_son_get_chan_util(struct wlan_objmgr_vdev * vdev)718*5113495bSYour Name uint8_t os_if_son_get_chan_util(struct wlan_objmgr_vdev *vdev)
719*5113495bSYour Name {
720*5113495bSYour Name 	struct wlan_host_dcs_ch_util_stats dcs_son_stats = {};
721*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
722*5113495bSYour Name 	uint8_t mac_id;
723*5113495bSYour Name 	QDF_STATUS status;
724*5113495bSYour Name 
725*5113495bSYour Name 	if (!vdev) {
726*5113495bSYour Name 		osif_err("null vdev");
727*5113495bSYour Name 		return 0;
728*5113495bSYour Name 	}
729*5113495bSYour Name 
730*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
731*5113495bSYour Name 	if (!psoc) {
732*5113495bSYour Name 		osif_err("null psoc");
733*5113495bSYour Name 		return 0;
734*5113495bSYour Name 	}
735*5113495bSYour Name 	status = policy_mgr_get_mac_id_by_session_id(psoc,
736*5113495bSYour Name 						     wlan_vdev_get_id(vdev),
737*5113495bSYour Name 						     &mac_id);
738*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
739*5113495bSYour Name 		osif_err("Failed to get mac_id");
740*5113495bSYour Name 		return 0;
741*5113495bSYour Name 	}
742*5113495bSYour Name 
743*5113495bSYour Name 	ucfg_dcs_get_ch_util(psoc, mac_id, &dcs_son_stats);
744*5113495bSYour Name 	osif_debug("get_chan_util %d", dcs_son_stats.total_cu);
745*5113495bSYour Name 
746*5113495bSYour Name 	return dcs_son_stats.total_cu;
747*5113495bSYour Name }
748*5113495bSYour Name qdf_export_symbol(os_if_son_get_chan_util);
749*5113495bSYour Name 
os_if_son_get_phy_stats(struct wlan_objmgr_vdev * vdev,struct ol_ath_radiostats * phy_stats)750*5113495bSYour Name void os_if_son_get_phy_stats(struct wlan_objmgr_vdev *vdev,
751*5113495bSYour Name 			     struct ol_ath_radiostats *phy_stats)
752*5113495bSYour Name {
753*5113495bSYour Name 	struct wlan_host_dcs_ch_util_stats dcs_son_stats = {};
754*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
755*5113495bSYour Name 	uint8_t mac_id;
756*5113495bSYour Name 	QDF_STATUS status;
757*5113495bSYour Name 
758*5113495bSYour Name 	if (!vdev) {
759*5113495bSYour Name 		osif_err("null vdev");
760*5113495bSYour Name 		return;
761*5113495bSYour Name 	}
762*5113495bSYour Name 
763*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
764*5113495bSYour Name 	if (!psoc) {
765*5113495bSYour Name 		osif_err("null psoc");
766*5113495bSYour Name 		return;
767*5113495bSYour Name 	}
768*5113495bSYour Name 	status = policy_mgr_get_mac_id_by_session_id(psoc,
769*5113495bSYour Name 						     wlan_vdev_get_id(vdev),
770*5113495bSYour Name 						     &mac_id);
771*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
772*5113495bSYour Name 		osif_err("Failed to get mac_id");
773*5113495bSYour Name 		return;
774*5113495bSYour Name 	}
775*5113495bSYour Name 
776*5113495bSYour Name 	ucfg_dcs_get_ch_util(psoc, mac_id, &dcs_son_stats);
777*5113495bSYour Name 
778*5113495bSYour Name 	phy_stats->ap_rx_util = dcs_son_stats.rx_cu;
779*5113495bSYour Name 	phy_stats->ap_tx_util = dcs_son_stats.tx_cu;
780*5113495bSYour Name 	phy_stats->obss_rx_util = dcs_son_stats.obss_rx_cu;
781*5113495bSYour Name 	if (dcs_son_stats.total_cu < 100)
782*5113495bSYour Name 		phy_stats->free_medium = 100 - dcs_son_stats.total_cu;
783*5113495bSYour Name 	else
784*5113495bSYour Name 		phy_stats->free_medium = 0;
785*5113495bSYour Name 	phy_stats->chan_nf = dcs_son_stats.chan_nf;
786*5113495bSYour Name 	osif_debug("rx_util %d tx_util %d obss_rx_util %d free_medium %d noise floor %d",
787*5113495bSYour Name 		   phy_stats->ap_rx_util, phy_stats->ap_tx_util,
788*5113495bSYour Name 		   phy_stats->obss_rx_util, phy_stats->free_medium,
789*5113495bSYour Name 		   phy_stats->chan_nf);
790*5113495bSYour Name }
791*5113495bSYour Name qdf_export_symbol(os_if_son_get_phy_stats);
792*5113495bSYour Name 
os_if_son_cbs_init(void)793*5113495bSYour Name int os_if_son_cbs_init(void)
794*5113495bSYour Name {
795*5113495bSYour Name 	int ret;
796*5113495bSYour Name 
797*5113495bSYour Name 	ret = ucfg_son_cbs_init();
798*5113495bSYour Name 
799*5113495bSYour Name 	return ret;
800*5113495bSYour Name }
801*5113495bSYour Name 
802*5113495bSYour Name qdf_export_symbol(os_if_son_cbs_init);
803*5113495bSYour Name 
os_if_son_cbs_deinit(void)804*5113495bSYour Name int os_if_son_cbs_deinit(void)
805*5113495bSYour Name {
806*5113495bSYour Name 	int ret;
807*5113495bSYour Name 
808*5113495bSYour Name 	ret = ucfg_son_cbs_deinit();
809*5113495bSYour Name 
810*5113495bSYour Name 	return ret;
811*5113495bSYour Name }
812*5113495bSYour Name 
813*5113495bSYour Name qdf_export_symbol(os_if_son_cbs_deinit);
814*5113495bSYour Name 
os_if_son_set_cbs(struct wlan_objmgr_vdev * vdev,bool enable)815*5113495bSYour Name int os_if_son_set_cbs(struct wlan_objmgr_vdev *vdev,
816*5113495bSYour Name 		      bool enable)
817*5113495bSYour Name {
818*5113495bSYour Name 	int ret;
819*5113495bSYour Name 
820*5113495bSYour Name 	ret = ucfg_son_set_cbs(vdev, enable);
821*5113495bSYour Name 
822*5113495bSYour Name 	return ret;
823*5113495bSYour Name }
824*5113495bSYour Name 
825*5113495bSYour Name qdf_export_symbol(os_if_son_set_cbs);
826*5113495bSYour Name 
os_if_son_set_cbs_wait_time(struct wlan_objmgr_vdev * vdev,uint32_t val)827*5113495bSYour Name int os_if_son_set_cbs_wait_time(struct wlan_objmgr_vdev *vdev,
828*5113495bSYour Name 				uint32_t val)
829*5113495bSYour Name {
830*5113495bSYour Name 	int ret;
831*5113495bSYour Name 
832*5113495bSYour Name 	ret = ucfg_son_set_cbs_wait_time(vdev, val);
833*5113495bSYour Name 
834*5113495bSYour Name 	return ret;
835*5113495bSYour Name }
836*5113495bSYour Name 
837*5113495bSYour Name qdf_export_symbol(os_if_son_set_cbs_wait_time);
838*5113495bSYour Name 
os_if_son_set_cbs_dwell_split_time(struct wlan_objmgr_vdev * vdev,uint32_t val)839*5113495bSYour Name int os_if_son_set_cbs_dwell_split_time(struct wlan_objmgr_vdev *vdev,
840*5113495bSYour Name 				       uint32_t val)
841*5113495bSYour Name {
842*5113495bSYour Name 	int ret;
843*5113495bSYour Name 
844*5113495bSYour Name 	ret = ucfg_son_set_cbs_dwell_split_time(vdev, val);
845*5113495bSYour Name 
846*5113495bSYour Name 	return ret;
847*5113495bSYour Name }
848*5113495bSYour Name 
849*5113495bSYour Name qdf_export_symbol(os_if_son_set_cbs_dwell_split_time);
850*5113495bSYour Name 
os_if_son_set_phymode(struct wlan_objmgr_vdev * vdev,enum ieee80211_phymode mode)851*5113495bSYour Name int os_if_son_set_phymode(struct wlan_objmgr_vdev *vdev,
852*5113495bSYour Name 			  enum ieee80211_phymode mode)
853*5113495bSYour Name {
854*5113495bSYour Name 	int ret;
855*5113495bSYour Name 
856*5113495bSYour Name 	if (!vdev) {
857*5113495bSYour Name 		osif_err("null vdev");
858*5113495bSYour Name 		return 0;
859*5113495bSYour Name 	}
860*5113495bSYour Name 
861*5113495bSYour Name 	ret = g_son_os_if_cb.os_if_set_phymode(vdev, mode);
862*5113495bSYour Name 	osif_debug("vdev %d phymode %d ret %d",
863*5113495bSYour Name 		   wlan_vdev_get_id(vdev), mode, ret);
864*5113495bSYour Name 
865*5113495bSYour Name 	return ret;
866*5113495bSYour Name }
867*5113495bSYour Name qdf_export_symbol(os_if_son_set_phymode);
868*5113495bSYour Name 
os_if_son_get_phymode(struct wlan_objmgr_vdev * vdev)869*5113495bSYour Name enum ieee80211_phymode os_if_son_get_phymode(struct wlan_objmgr_vdev *vdev)
870*5113495bSYour Name {
871*5113495bSYour Name 	enum ieee80211_phymode phymode;
872*5113495bSYour Name 
873*5113495bSYour Name 	if (!vdev) {
874*5113495bSYour Name 		osif_err("null vdev");
875*5113495bSYour Name 		return 0;
876*5113495bSYour Name 	}
877*5113495bSYour Name 
878*5113495bSYour Name 	phymode = g_son_os_if_cb.os_if_get_phymode(vdev);
879*5113495bSYour Name 	osif_debug("vdev %d phymode %d",
880*5113495bSYour Name 		   wlan_vdev_get_id(vdev), phymode);
881*5113495bSYour Name 
882*5113495bSYour Name 	return phymode;
883*5113495bSYour Name }
884*5113495bSYour Name qdf_export_symbol(os_if_son_get_phymode);
885*5113495bSYour Name 
os_if_son_get_apcap(struct wlan_objmgr_vdev * vdev,wlan_ap_cap * apcap)886*5113495bSYour Name static QDF_STATUS os_if_son_get_apcap(struct wlan_objmgr_vdev *vdev,
887*5113495bSYour Name 				      wlan_ap_cap *apcap)
888*5113495bSYour Name {
889*5113495bSYour Name 	uint32_t num_rx_streams = 0;
890*5113495bSYour Name 	uint32_t num_tx_streams = 0;
891*5113495bSYour Name 	uint32_t  value;
892*5113495bSYour Name 	struct mlme_ht_capabilities_info ht_cap_info;
893*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
894*5113495bSYour Name 	tDot11fIEhe_cap he_cap = {0};
895*5113495bSYour Name 	bool enabled;
896*5113495bSYour Name 	QDF_STATUS status;
897*5113495bSYour Name 	int32_t vht_caps = 0;
898*5113495bSYour Name 
899*5113495bSYour Name 	/* Number of supported tx and rx streams */
900*5113495bSYour Name 	status = ucfg_son_vdev_get_supported_txrx_streams(vdev, &num_tx_streams,
901*5113495bSYour Name 							  &num_rx_streams);
902*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
903*5113495bSYour Name 		osif_err("Could not get txrx streams");
904*5113495bSYour Name 		return status;
905*5113495bSYour Name 	}
906*5113495bSYour Name 
907*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
908*5113495bSYour Name 	if (!psoc) {
909*5113495bSYour Name 		osif_err("null psoc");
910*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
911*5113495bSYour Name 	}
912*5113495bSYour Name 
913*5113495bSYour Name 	/* Fetch HT CAP */
914*5113495bSYour Name 	status = ucfg_mlme_get_ht_cap_info(psoc, &ht_cap_info);
915*5113495bSYour Name 	if (status == QDF_STATUS_SUCCESS) {
916*5113495bSYour Name 		apcap->wlan_ap_ht_capabilities_valid = true;
917*5113495bSYour Name 		qdf_mem_copy(&apcap->htcap.htcap, &ht_cap_info,
918*5113495bSYour Name 			     sizeof(struct mlme_ht_capabilities_info));
919*5113495bSYour Name 		apcap->htcap.max_tx_nss = num_tx_streams;
920*5113495bSYour Name 		apcap->htcap.max_rx_nss = num_rx_streams;
921*5113495bSYour Name 	}
922*5113495bSYour Name 
923*5113495bSYour Name 	/* Fetch VHT CAP */
924*5113495bSYour Name 	status = ucfg_mlme_get_vht_enable2x2(psoc, &enabled);
925*5113495bSYour Name 	if (enabled) {
926*5113495bSYour Name 		apcap->wlan_ap_vht_capabilities_valid = 1;
927*5113495bSYour Name 		ucfg_mlme_cfg_get_vht_tx_mcs_map(psoc, &value);
928*5113495bSYour Name 		apcap->vhtcap.supp_tx_mcs = value;
929*5113495bSYour Name 		ucfg_mlme_cfg_get_vht_rx_mcs_map(psoc, &value);
930*5113495bSYour Name 		apcap->vhtcap.supp_rx_mcs = value;
931*5113495bSYour Name 		apcap->vhtcap.max_tx_nss = num_tx_streams;
932*5113495bSYour Name 		apcap->vhtcap.max_rx_nss = num_rx_streams;
933*5113495bSYour Name 		if (ucfg_son_get_vht_cap(psoc, &vht_caps) == QDF_STATUS_SUCCESS)
934*5113495bSYour Name 			apcap->vhtcap.vhtcap = vht_caps;
935*5113495bSYour Name 	}
936*5113495bSYour Name 
937*5113495bSYour Name 	/* Fetch HE CAP */
938*5113495bSYour Name 	ucfg_mlme_cfg_get_he_caps(psoc, &he_cap);
939*5113495bSYour Name 	if (he_cap.present) {
940*5113495bSYour Name 		apcap->wlan_ap_he_capabilities_valid = 1;
941*5113495bSYour Name 		apcap->hecap.num_mcs_entries = MAP_MAX_HE_MCS;
942*5113495bSYour Name 		apcap->hecap.max_tx_nss = num_tx_streams;
943*5113495bSYour Name 		apcap->hecap.max_rx_nss = num_rx_streams;
944*5113495bSYour Name 		apcap->hecap.he_su_ppdu_1x_ltf_800ns_gi =
945*5113495bSYour Name 					he_cap.he_1x_ltf_800_gi_ppdu;
946*5113495bSYour Name 		apcap->hecap.he_ndp_4x_ltf_3200ns_gi =
947*5113495bSYour Name 					he_cap.he_4x_ltf_3200_gi_ndp;
948*5113495bSYour Name 		apcap->hecap.he_su_bfer = he_cap.su_beamformer;
949*5113495bSYour Name 		apcap->hecap.he_su_bfee = he_cap.su_beamformee;
950*5113495bSYour Name 		apcap->hecap.he_mu_bfer = he_cap.mu_beamformer;
951*5113495bSYour Name 		apcap->hecap.supported_he_mcs[0] = he_cap.rx_he_mcs_map_lt_80;
952*5113495bSYour Name 		apcap->hecap.supported_he_mcs[1] = he_cap.tx_he_mcs_map_lt_80;
953*5113495bSYour Name 		apcap->hecap.supported_he_mcs[2] =
954*5113495bSYour Name 					he_cap.rx_he_mcs_map_160[0][0] |
955*5113495bSYour Name 					(he_cap.rx_he_mcs_map_160[0][1] << 8);
956*5113495bSYour Name 		apcap->hecap.supported_he_mcs[3] =
957*5113495bSYour Name 					he_cap.tx_he_mcs_map_160[0][0] |
958*5113495bSYour Name 					(he_cap.tx_he_mcs_map_160[0][1] << 8);
959*5113495bSYour Name 		apcap->hecap.supported_he_mcs[4] =
960*5113495bSYour Name 					he_cap.rx_he_mcs_map_80_80[0][0] |
961*5113495bSYour Name 					(he_cap.rx_he_mcs_map_80_80[0][1] << 8);
962*5113495bSYour Name 		apcap->hecap.supported_he_mcs[5] =
963*5113495bSYour Name 					he_cap.tx_he_mcs_map_80_80[0][0] |
964*5113495bSYour Name 					(he_cap.tx_he_mcs_map_80_80[0][1] << 8);
965*5113495bSYour Name 		apcap->hecap.he_ul_mumimo = QDF_GET_BITS(he_cap.ul_mu, 0, 1);
966*5113495bSYour Name 		apcap->hecap.he_ul_muofdma = QDF_GET_BITS(he_cap.ul_mu, 1, 1);
967*5113495bSYour Name 		apcap->hecap.he_dl_muofdma = he_cap.dl_mu_mimo_part_bw;
968*5113495bSYour Name 	}
969*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
970*5113495bSYour Name }
971*5113495bSYour Name 
os_if_son_vdev_ops(struct wlan_objmgr_vdev * vdev,enum wlan_mlme_vdev_param type,void * data,void * ret)972*5113495bSYour Name QDF_STATUS os_if_son_vdev_ops(struct wlan_objmgr_vdev *vdev,
973*5113495bSYour Name 			      enum wlan_mlme_vdev_param type,
974*5113495bSYour Name 			      void *data, void *ret)
975*5113495bSYour Name {
976*5113495bSYour Name 	union wlan_mlme_vdev_data *in = (union wlan_mlme_vdev_data *)data;
977*5113495bSYour Name 	union wlan_mlme_vdev_data *out = (union wlan_mlme_vdev_data *)ret;
978*5113495bSYour Name 
979*5113495bSYour Name 	if (!vdev)
980*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
981*5113495bSYour Name 	switch (type) {
982*5113495bSYour Name 	case VDEV_SET_IE:
983*5113495bSYour Name 		break;
984*5113495bSYour Name 	case VDEV_CLR_IE:
985*5113495bSYour Name 		break;
986*5113495bSYour Name 	case VDEV_SET_ACL:
987*5113495bSYour Name 		break;
988*5113495bSYour Name 	case VDEV_CLR_ACL:
989*5113495bSYour Name 		break;
990*5113495bSYour Name 	case VDEV_SET_ACL_TIMER:
991*5113495bSYour Name 		break;
992*5113495bSYour Name 	case VDEV_SET_PEER_ACT_STATS:
993*5113495bSYour Name 		break;
994*5113495bSYour Name 	case VDEV_SET_SEC_STA_WDS:
995*5113495bSYour Name 		break;
996*5113495bSYour Name 	case VDEV_SET_MEC:
997*5113495bSYour Name 		break;
998*5113495bSYour Name 	case VDEV_SET_MBO_IE_BSTM:
999*5113495bSYour Name 		break;
1000*5113495bSYour Name 	case VDEV_SET_WPS_ACL_ENABLE:
1001*5113495bSYour Name 		break;
1002*5113495bSYour Name 	case VDEV_SET_WNM_BSS_PREF:
1003*5113495bSYour Name 		break;
1004*5113495bSYour Name 	case VDEV_GET_NSS:
1005*5113495bSYour Name 		break;
1006*5113495bSYour Name 	case VDEV_GET_CHAN:
1007*5113495bSYour Name 		if (!out)
1008*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1009*5113495bSYour Name 		qdf_mem_copy(&out->chan,
1010*5113495bSYour Name 			     wlan_vdev_get_active_channel(vdev),
1011*5113495bSYour Name 			     sizeof(out->chan));
1012*5113495bSYour Name 		break;
1013*5113495bSYour Name 	case VDEV_GET_CHAN_WIDTH:
1014*5113495bSYour Name 		break;
1015*5113495bSYour Name 	case VDEV_GET_CHAN_UTIL:
1016*5113495bSYour Name 		if (!out)
1017*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1018*5113495bSYour Name 		out->chan_util = os_if_son_get_chan_util(vdev);
1019*5113495bSYour Name 		break;
1020*5113495bSYour Name 	case VDEV_GET_APCAP:
1021*5113495bSYour Name 		if (!out)
1022*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1023*5113495bSYour Name 		return os_if_son_get_apcap(vdev, &out->apcap);
1024*5113495bSYour Name 		break;
1025*5113495bSYour Name 	case VDEV_GET_CONNECT_N_TX:
1026*5113495bSYour Name 		break;
1027*5113495bSYour Name 	case VDEV_GET_SSID:
1028*5113495bSYour Name 		break;
1029*5113495bSYour Name 	case VDEV_GET_MAX_PHYRATE:
1030*5113495bSYour Name 		break;
1031*5113495bSYour Name 	case VDEV_GET_ACL:
1032*5113495bSYour Name 		break;
1033*5113495bSYour Name 	case VDEV_GET_ACL_RSSI_THRESHOLDS:
1034*5113495bSYour Name 		break;
1035*5113495bSYour Name 	case VDEV_GET_NODE_CAP:
1036*5113495bSYour Name 		if (!out || !in)
1037*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1038*5113495bSYour Name 		os_if_son_get_node_datarate_info(vdev, in->mac, &out->nodeinfo);
1039*5113495bSYour Name 		break;
1040*5113495bSYour Name 	case VDEV_GET_WDS:
1041*5113495bSYour Name 		break;
1042*5113495bSYour Name 	default:
1043*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1044*5113495bSYour Name 	}
1045*5113495bSYour Name 
1046*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1047*5113495bSYour Name }
1048*5113495bSYour Name 
1049*5113495bSYour Name qdf_export_symbol(os_if_son_vdev_ops);
1050*5113495bSYour Name 
os_if_son_get_peer_capability(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,wlan_peer_cap * peer_cap)1051*5113495bSYour Name static QDF_STATUS os_if_son_get_peer_capability(struct wlan_objmgr_vdev *vdev,
1052*5113495bSYour Name 						struct wlan_objmgr_peer *peer,
1053*5113495bSYour Name 						wlan_peer_cap *peer_cap)
1054*5113495bSYour Name {
1055*5113495bSYour Name 	if (g_son_os_if_cb.os_if_get_peer_capability)
1056*5113495bSYour Name 		return g_son_os_if_cb.os_if_get_peer_capability(vdev, peer,
1057*5113495bSYour Name 								peer_cap);
1058*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
1059*5113495bSYour Name }
1060*5113495bSYour Name 
os_if_son_peer_ops(struct wlan_objmgr_peer * peer,enum wlan_mlme_peer_param type,union wlan_mlme_peer_data * in,union wlan_mlme_peer_data * out)1061*5113495bSYour Name QDF_STATUS os_if_son_peer_ops(struct wlan_objmgr_peer *peer,
1062*5113495bSYour Name 			      enum wlan_mlme_peer_param type,
1063*5113495bSYour Name 			      union wlan_mlme_peer_data *in,
1064*5113495bSYour Name 			      union wlan_mlme_peer_data *out)
1065*5113495bSYour Name {
1066*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
1067*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
1068*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1069*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1070*5113495bSYour Name 	struct qdf_mac_addr mac;
1071*5113495bSYour Name 	int ret_val;
1072*5113495bSYour Name 	static uint32_t peer_ext_stats_count;
1073*5113495bSYour Name 
1074*5113495bSYour Name 	if (!peer) {
1075*5113495bSYour Name 		osif_err("null peer");
1076*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1077*5113495bSYour Name 	}
1078*5113495bSYour Name 
1079*5113495bSYour Name 	vdev = wlan_peer_get_vdev(peer);
1080*5113495bSYour Name 	if (!vdev) {
1081*5113495bSYour Name 		osif_err("null vdev");
1082*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1083*5113495bSYour Name 	}
1084*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
1085*5113495bSYour Name 	if (!pdev) {
1086*5113495bSYour Name 		osif_err("null pdev");
1087*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1088*5113495bSYour Name 	}
1089*5113495bSYour Name 
1090*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1091*5113495bSYour Name 	if (!psoc) {
1092*5113495bSYour Name 		osif_err("null psoc");
1093*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1094*5113495bSYour Name 	}
1095*5113495bSYour Name 	osif_debug("type %d", type);
1096*5113495bSYour Name 	/* All PEER MLME operations exported to SON component */
1097*5113495bSYour Name 	switch (type) {
1098*5113495bSYour Name 	/* SET/CLR API start */
1099*5113495bSYour Name 	case PEER_SET_KICKOUT:
1100*5113495bSYour Name 		qdf_mem_copy(&mac.bytes, peer->macaddr, QDF_MAC_ADDR_SIZE);
1101*5113495bSYour Name 		ret_val =
1102*5113495bSYour Name 		    g_son_os_if_cb.os_if_kickout_mac(vdev, &mac);
1103*5113495bSYour Name 		if (ret_val) {
1104*5113495bSYour Name 			osif_err("Failed to kickout peer " QDF_MAC_ADDR_FMT,
1105*5113495bSYour Name 				 QDF_MAC_ADDR_REF(peer->macaddr));
1106*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1107*5113495bSYour Name 		}
1108*5113495bSYour Name 		break;
1109*5113495bSYour Name 	case PEER_SET_KICKOUT_ALLOW:
1110*5113495bSYour Name 		if (!in) {
1111*5113495bSYour Name 			osif_err("invalid input parameter");
1112*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1113*5113495bSYour Name 		}
1114*5113495bSYour Name 		status = ucfg_son_set_peer_kickout_allow(vdev, peer,
1115*5113495bSYour Name 							 in->enable);
1116*5113495bSYour Name 		osif_debug("kickout allow %d, status %d", in->enable, status);
1117*5113495bSYour Name 		break;
1118*5113495bSYour Name 	case PEER_SET_EXT_STATS:
1119*5113495bSYour Name 		if (!in)
1120*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1121*5113495bSYour Name 		ret_val = wlan_peer_mlme_flag_get(peer, WLAN_PEER_F_EXT_STATS);
1122*5113495bSYour Name 		osif_debug("Enable: %d peer_ext_stats_count: %u ret_val: %d",
1123*5113495bSYour Name 			   in->enable, peer_ext_stats_count, ret_val);
1124*5113495bSYour Name 		if ((!!ret_val) != in->enable) {
1125*5113495bSYour Name 			status =
1126*5113495bSYour Name 			     wlan_son_peer_ext_stat_enable(pdev, peer->macaddr,
1127*5113495bSYour Name 							   vdev,
1128*5113495bSYour Name 							   peer_ext_stats_count,
1129*5113495bSYour Name 							   in->enable);
1130*5113495bSYour Name 			osif_debug("status: %u", status);
1131*5113495bSYour Name 			if (status == QDF_STATUS_SUCCESS) {
1132*5113495bSYour Name 				peer_ext_stats_count++;
1133*5113495bSYour Name 				wlan_peer_mlme_flag_set(peer,
1134*5113495bSYour Name 							WLAN_PEER_F_EXT_STATS);
1135*5113495bSYour Name 			} else {
1136*5113495bSYour Name 				if (peer_ext_stats_count)
1137*5113495bSYour Name 					peer_ext_stats_count--;
1138*5113495bSYour Name 				wlan_peer_mlme_flag_clear
1139*5113495bSYour Name 						(peer, WLAN_PEER_F_EXT_STATS);
1140*5113495bSYour Name 			}
1141*5113495bSYour Name 		}
1142*5113495bSYour Name 		break;
1143*5113495bSYour Name 	case PEER_REQ_INST_STAT:
1144*5113495bSYour Name 		status = wlan_son_peer_req_inst_stats(pdev, peer->macaddr,
1145*5113495bSYour Name 						      vdev);
1146*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS)
1147*5113495bSYour Name 			osif_err("Type: %d is failed", type);
1148*5113495bSYour Name 		break;
1149*5113495bSYour Name 	case PEER_GET_CAPABILITY:
1150*5113495bSYour Name 		if (!out)
1151*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1152*5113495bSYour Name 		status = os_if_son_get_peer_capability(vdev, peer,
1153*5113495bSYour Name 						       &out->peercap);
1154*5113495bSYour Name 		break;
1155*5113495bSYour Name 	case PEER_GET_MAX_MCS:
1156*5113495bSYour Name 		if (!out)
1157*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1158*5113495bSYour Name 		out->mcs = os_if_son_get_peer_max_mcs_idx(vdev, peer);
1159*5113495bSYour Name 		break;
1160*5113495bSYour Name 	default:
1161*5113495bSYour Name 		osif_err("invalid type: %d", type);
1162*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
1163*5113495bSYour Name 	}
1164*5113495bSYour Name 
1165*5113495bSYour Name 	return status;
1166*5113495bSYour Name }
1167*5113495bSYour Name 
1168*5113495bSYour Name qdf_export_symbol(os_if_son_peer_ops);
1169*5113495bSYour Name 
os_if_son_scan_db_iterate(struct wlan_objmgr_pdev * pdev,scan_iterator_func handler,void * arg)1170*5113495bSYour Name QDF_STATUS os_if_son_scan_db_iterate(struct wlan_objmgr_pdev *pdev,
1171*5113495bSYour Name 				     scan_iterator_func handler, void *arg)
1172*5113495bSYour Name {
1173*5113495bSYour Name 	return ucfg_scan_db_iterate(pdev, handler, arg);
1174*5113495bSYour Name }
1175*5113495bSYour Name 
1176*5113495bSYour Name qdf_export_symbol(os_if_son_scan_db_iterate);
1177*5113495bSYour Name 
os_if_son_acl_is_probe_wh_set(struct wlan_objmgr_vdev * vdev,const uint8_t * mac_addr,uint8_t probe_rssi)1178*5113495bSYour Name bool os_if_son_acl_is_probe_wh_set(struct wlan_objmgr_vdev *vdev,
1179*5113495bSYour Name 				   const uint8_t *mac_addr,
1180*5113495bSYour Name 				   uint8_t probe_rssi)
1181*5113495bSYour Name {
1182*5113495bSYour Name 	return false;
1183*5113495bSYour Name }
1184*5113495bSYour Name 
1185*5113495bSYour Name qdf_export_symbol(os_if_son_acl_is_probe_wh_set);
1186*5113495bSYour Name 
os_if_son_set_chwidth(struct wlan_objmgr_vdev * vdev,enum ieee80211_cwm_width son_chwidth)1187*5113495bSYour Name int os_if_son_set_chwidth(struct wlan_objmgr_vdev *vdev,
1188*5113495bSYour Name 			  enum ieee80211_cwm_width son_chwidth)
1189*5113495bSYour Name {
1190*5113495bSYour Name 	if (!vdev) {
1191*5113495bSYour Name 		osif_err("null vdev");
1192*5113495bSYour Name 		return -EINVAL;
1193*5113495bSYour Name 	}
1194*5113495bSYour Name 
1195*5113495bSYour Name 	return g_son_os_if_cb.os_if_set_chwidth(vdev, son_chwidth);
1196*5113495bSYour Name }
1197*5113495bSYour Name qdf_export_symbol(os_if_son_set_chwidth);
1198*5113495bSYour Name 
os_if_son_get_chwidth(struct wlan_objmgr_vdev * vdev)1199*5113495bSYour Name enum ieee80211_cwm_width os_if_son_get_chwidth(struct wlan_objmgr_vdev *vdev)
1200*5113495bSYour Name {
1201*5113495bSYour Name 	if (!vdev) {
1202*5113495bSYour Name 		osif_err("null vdev");
1203*5113495bSYour Name 		return 0;
1204*5113495bSYour Name 	}
1205*5113495bSYour Name 
1206*5113495bSYour Name 	return g_son_os_if_cb.os_if_get_chwidth(vdev);
1207*5113495bSYour Name }
1208*5113495bSYour Name qdf_export_symbol(os_if_son_get_chwidth);
1209*5113495bSYour Name 
os_if_son_get_rx_streams(struct wlan_objmgr_vdev * vdev)1210*5113495bSYour Name u_int8_t os_if_son_get_rx_streams(struct wlan_objmgr_vdev *vdev)
1211*5113495bSYour Name {
1212*5113495bSYour Name 	if (!vdev) {
1213*5113495bSYour Name 		osif_err("null vdev");
1214*5113495bSYour Name 		return 0;
1215*5113495bSYour Name 	}
1216*5113495bSYour Name 
1217*5113495bSYour Name 	return g_son_os_if_cb.os_if_get_rx_nss(vdev);
1218*5113495bSYour Name }
1219*5113495bSYour Name qdf_export_symbol(os_if_son_get_rx_streams);
1220*5113495bSYour Name 
os_if_son_cfg80211_reply(qdf_nbuf_t sk_buf)1221*5113495bSYour Name QDF_STATUS os_if_son_cfg80211_reply(qdf_nbuf_t sk_buf)
1222*5113495bSYour Name {
1223*5113495bSYour Name 	return wlan_cfg80211_qal_devcfg_send_response(sk_buf);
1224*5113495bSYour Name }
1225*5113495bSYour Name 
1226*5113495bSYour Name qdf_export_symbol(os_if_son_cfg80211_reply);
1227*5113495bSYour Name 
os_if_son_vdev_is_wds(struct wlan_objmgr_vdev * vdev)1228*5113495bSYour Name bool os_if_son_vdev_is_wds(struct wlan_objmgr_vdev *vdev)
1229*5113495bSYour Name {
1230*5113495bSYour Name 	return true;
1231*5113495bSYour Name }
1232*5113495bSYour Name 
1233*5113495bSYour Name qdf_export_symbol(os_if_son_vdev_is_wds);
1234*5113495bSYour Name 
os_if_son_get_sta_space(struct wlan_objmgr_vdev * vdev)1235*5113495bSYour Name uint32_t os_if_son_get_sta_space(struct wlan_objmgr_vdev *vdev)
1236*5113495bSYour Name {
1237*5113495bSYour Name 	uint32_t sta_space;
1238*5113495bSYour Name 
1239*5113495bSYour Name 	if (!vdev) {
1240*5113495bSYour Name 		osif_err("null vdev");
1241*5113495bSYour Name 		return 0;
1242*5113495bSYour Name 	}
1243*5113495bSYour Name 
1244*5113495bSYour Name 	sta_space = g_son_os_if_cb.os_if_get_sta_space(vdev);
1245*5113495bSYour Name 	osif_debug("need space %u", sta_space);
1246*5113495bSYour Name 
1247*5113495bSYour Name 	return sta_space;
1248*5113495bSYour Name }
1249*5113495bSYour Name 
1250*5113495bSYour Name qdf_export_symbol(os_if_son_get_sta_space);
1251*5113495bSYour Name 
os_if_son_get_sta_list(struct wlan_objmgr_vdev * vdev,struct ieee80211req_sta_info * si,uint32_t * space)1252*5113495bSYour Name void os_if_son_get_sta_list(struct wlan_objmgr_vdev *vdev,
1253*5113495bSYour Name 			    struct ieee80211req_sta_info *si, uint32_t *space)
1254*5113495bSYour Name {
1255*5113495bSYour Name 	if (!vdev) {
1256*5113495bSYour Name 		osif_err("null vdev");
1257*5113495bSYour Name 		return;
1258*5113495bSYour Name 	}
1259*5113495bSYour Name 
1260*5113495bSYour Name 	if (!si) {
1261*5113495bSYour Name 		osif_err("null si");
1262*5113495bSYour Name 		return;
1263*5113495bSYour Name 	}
1264*5113495bSYour Name 	if (!space || *space == 0) {
1265*5113495bSYour Name 		osif_err("invalid input space");
1266*5113495bSYour Name 		return;
1267*5113495bSYour Name 	}
1268*5113495bSYour Name 
1269*5113495bSYour Name 	g_son_os_if_cb.os_if_get_sta_list(vdev, si, space);
1270*5113495bSYour Name 
1271*5113495bSYour Name 	osif_debug("left space %u", *space);
1272*5113495bSYour Name }
1273*5113495bSYour Name 
1274*5113495bSYour Name qdf_export_symbol(os_if_son_get_sta_list);
1275*5113495bSYour Name 
os_if_son_deauth_peer_sta(struct wlan_objmgr_vdev * vdev,uint8_t * peer_mac,bool ignore_frame)1276*5113495bSYour Name void os_if_son_deauth_peer_sta(struct wlan_objmgr_vdev *vdev,
1277*5113495bSYour Name 			       uint8_t *peer_mac,
1278*5113495bSYour Name 			       bool ignore_frame)
1279*5113495bSYour Name {
1280*5113495bSYour Name 	if (!vdev || !peer_mac) {
1281*5113495bSYour Name 		osif_err("null vdev / peer_mac");
1282*5113495bSYour Name 		return;
1283*5113495bSYour Name 	}
1284*5113495bSYour Name 	if (g_son_os_if_cb.os_if_deauth_sta)
1285*5113495bSYour Name 		g_son_os_if_cb.os_if_deauth_sta(vdev, peer_mac, ignore_frame);
1286*5113495bSYour Name }
1287*5113495bSYour Name 
1288*5113495bSYour Name qdf_export_symbol(os_if_son_deauth_peer_sta);
1289*5113495bSYour Name 
os_if_son_modify_acl(struct wlan_objmgr_vdev * vdev,uint8_t * peer_mac,bool allow_auth)1290*5113495bSYour Name void os_if_son_modify_acl(struct wlan_objmgr_vdev *vdev,
1291*5113495bSYour Name 			  uint8_t *peer_mac,
1292*5113495bSYour Name 			  bool allow_auth)
1293*5113495bSYour Name {
1294*5113495bSYour Name 	if (!vdev || !peer_mac) {
1295*5113495bSYour Name 		osif_err("null vdev / peer_mac");
1296*5113495bSYour Name 		return;
1297*5113495bSYour Name 	}
1298*5113495bSYour Name 	if (g_son_os_if_cb.os_if_modify_acl)
1299*5113495bSYour Name 		g_son_os_if_cb.os_if_modify_acl(vdev, peer_mac, allow_auth);
1300*5113495bSYour Name }
1301*5113495bSYour Name 
1302*5113495bSYour Name qdf_export_symbol(os_if_son_modify_acl);
1303*5113495bSYour Name 
1304*5113495bSYour Name static
os_if_son_reg_get_ap_hw_cap(struct wlan_objmgr_pdev * pdev,struct wlan_radio_basic_capabilities * hwcap,bool skip_6ghz)1305*5113495bSYour Name int os_if_son_reg_get_ap_hw_cap(struct wlan_objmgr_pdev *pdev,
1306*5113495bSYour Name 				struct wlan_radio_basic_capabilities *hwcap,
1307*5113495bSYour Name 				bool skip_6ghz)
1308*5113495bSYour Name {
1309*5113495bSYour Name 	QDF_STATUS status;
1310*5113495bSYour Name 	uint8_t idx;
1311*5113495bSYour Name 	uint8_t max_supp_op_class = REG_MAX_SUPP_OPER_CLASSES;
1312*5113495bSYour Name 	uint8_t n_opclasses = 0;
1313*5113495bSYour Name 	/* nsoc = Number of supported operating classes */
1314*5113495bSYour Name 	uint8_t nsoc = 0;
1315*5113495bSYour Name 	struct regdmn_ap_cap_opclass_t *reg_ap_cap;
1316*5113495bSYour Name 
1317*5113495bSYour Name 	if (!pdev || !hwcap)
1318*5113495bSYour Name 		return nsoc;
1319*5113495bSYour Name 
1320*5113495bSYour Name 	reg_ap_cap = qdf_mem_malloc(max_supp_op_class * sizeof(*reg_ap_cap));
1321*5113495bSYour Name 	if (!reg_ap_cap) {
1322*5113495bSYour Name 		osif_err("Memory allocation failure");
1323*5113495bSYour Name 		return nsoc;
1324*5113495bSYour Name 	}
1325*5113495bSYour Name 	status = wlan_reg_get_opclass_details(pdev, reg_ap_cap, &n_opclasses,
1326*5113495bSYour Name 					      max_supp_op_class, true,
1327*5113495bSYour Name 					      REG_CURRENT_PWR_MODE);
1328*5113495bSYour Name 	if (status == QDF_STATUS_E_FAILURE) {
1329*5113495bSYour Name 		osif_err("Failed to get SAP regulatory capabilities");
1330*5113495bSYour Name 		goto end_reg_get_ap_hw_cap;
1331*5113495bSYour Name 	}
1332*5113495bSYour Name 	osif_debug("n_opclasses: %u", n_opclasses);
1333*5113495bSYour Name 
1334*5113495bSYour Name 	for (idx = 0; reg_ap_cap[idx].op_class && idx < n_opclasses; idx++) {
1335*5113495bSYour Name 		osif_debug("idx: %d op_class: %u ch_width: %d  max_tx_pwr_dbm: %u",
1336*5113495bSYour Name 			   idx, reg_ap_cap[idx].op_class,
1337*5113495bSYour Name 			   reg_ap_cap[idx].ch_width,
1338*5113495bSYour Name 			   reg_ap_cap[idx].max_tx_pwr_dbm);
1339*5113495bSYour Name 		if (reg_ap_cap[idx].ch_width == BW_160_MHZ)
1340*5113495bSYour Name 			continue;
1341*5113495bSYour Name 		if (skip_6ghz &&
1342*5113495bSYour Name 		    wlan_reg_is_6ghz_op_class(pdev, reg_ap_cap[idx].op_class)) {
1343*5113495bSYour Name 			osif_debug("ignore 6 GHz op_class: %d to son",
1344*5113495bSYour Name 				   reg_ap_cap[idx].op_class);
1345*5113495bSYour Name 			continue;
1346*5113495bSYour Name 		}
1347*5113495bSYour Name 		hwcap->opclasses[nsoc].opclass = reg_ap_cap[idx].op_class;
1348*5113495bSYour Name 		hwcap->opclasses[nsoc].max_tx_pwr_dbm =
1349*5113495bSYour Name 					reg_ap_cap[idx].max_tx_pwr_dbm;
1350*5113495bSYour Name 		hwcap->opclasses[nsoc].num_non_oper_chan =
1351*5113495bSYour Name 					reg_ap_cap[idx].num_non_supported_chan;
1352*5113495bSYour Name 		qdf_mem_copy(hwcap->opclasses[nsoc].non_oper_chan_num,
1353*5113495bSYour Name 			     reg_ap_cap[idx].non_sup_chan_list,
1354*5113495bSYour Name 			     reg_ap_cap[idx].num_non_supported_chan);
1355*5113495bSYour Name 		hwcap->wlan_radio_basic_capabilities_valid = 1;
1356*5113495bSYour Name 		nsoc++;
1357*5113495bSYour Name 	}
1358*5113495bSYour Name 	hwcap->num_supp_op_classes = nsoc;
1359*5113495bSYour Name 
1360*5113495bSYour Name end_reg_get_ap_hw_cap:
1361*5113495bSYour Name 
1362*5113495bSYour Name 	qdf_mem_free(reg_ap_cap);
1363*5113495bSYour Name 	return nsoc;
1364*5113495bSYour Name }
1365*5113495bSYour Name 
os_if_son_reg_get_op_channels(struct wlan_objmgr_pdev * pdev,struct wlan_op_chan * op_chan,bool dfs_required)1366*5113495bSYour Name static void os_if_son_reg_get_op_channels(struct wlan_objmgr_pdev *pdev,
1367*5113495bSYour Name 					  struct wlan_op_chan *op_chan,
1368*5113495bSYour Name 					  bool dfs_required)
1369*5113495bSYour Name {
1370*5113495bSYour Name 	QDF_STATUS status;
1371*5113495bSYour Name 	uint8_t idx;
1372*5113495bSYour Name 	uint8_t max_supp_op_class = REG_MAX_SUPP_OPER_CLASSES;
1373*5113495bSYour Name 	uint8_t n_opclasses = 0;
1374*5113495bSYour Name 	/* nsoc = Number of supported operating classes */
1375*5113495bSYour Name 	uint8_t nsoc = 0;
1376*5113495bSYour Name 	struct regdmn_ap_cap_opclass_t *reg_ap_cap;
1377*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1378*5113495bSYour Name 
1379*5113495bSYour Name 	if (!pdev || !op_chan) {
1380*5113495bSYour Name 		osif_err("invalid input parameters");
1381*5113495bSYour Name 		return;
1382*5113495bSYour Name 	}
1383*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1384*5113495bSYour Name 	if (!psoc) {
1385*5113495bSYour Name 		osif_err("NULL psoc");
1386*5113495bSYour Name 		return;
1387*5113495bSYour Name 	}
1388*5113495bSYour Name 
1389*5113495bSYour Name 	reg_ap_cap = qdf_mem_malloc(max_supp_op_class * sizeof(*reg_ap_cap));
1390*5113495bSYour Name 	if (!reg_ap_cap) {
1391*5113495bSYour Name 		osif_err("Memory allocation failure");
1392*5113495bSYour Name 		return;
1393*5113495bSYour Name 	}
1394*5113495bSYour Name 	status = wlan_reg_get_opclass_details(pdev, reg_ap_cap, &n_opclasses,
1395*5113495bSYour Name 					      max_supp_op_class, true,
1396*5113495bSYour Name 					      REG_CURRENT_PWR_MODE);
1397*5113495bSYour Name 	if (status == QDF_STATUS_E_FAILURE) {
1398*5113495bSYour Name 		osif_err("Failed to get SAP regulatory capabilities");
1399*5113495bSYour Name 		goto end_reg_get_op_channels;
1400*5113495bSYour Name 	}
1401*5113495bSYour Name 	osif_debug("n_opclasses: %u op_chan->opclass: %u",
1402*5113495bSYour Name 		   n_opclasses, op_chan->opclass);
1403*5113495bSYour Name 	for (idx = 0; reg_ap_cap[idx].op_class && idx < n_opclasses; idx++) {
1404*5113495bSYour Name 		if ((reg_ap_cap[idx].ch_width == BW_160_MHZ) ||
1405*5113495bSYour Name 		    (op_chan->opclass != reg_ap_cap[idx].op_class))
1406*5113495bSYour Name 			continue;
1407*5113495bSYour Name 		osif_debug("idx: %d op_class: %u ch_width: %d  max_tx_pwr_dbm: %u",
1408*5113495bSYour Name 			   idx, reg_ap_cap[idx].op_class,
1409*5113495bSYour Name 			   reg_ap_cap[idx].ch_width,
1410*5113495bSYour Name 			   reg_ap_cap[idx].max_tx_pwr_dbm);
1411*5113495bSYour Name 		if (reg_ap_cap[idx].op_class == op_chan->opclass) {
1412*5113495bSYour Name 			switch (reg_ap_cap[idx].ch_width) {
1413*5113495bSYour Name 			case BW_20_MHZ:
1414*5113495bSYour Name 			case BW_25_MHZ:
1415*5113495bSYour Name 				op_chan->ch_width = CH_WIDTH_20MHZ;
1416*5113495bSYour Name 				break;
1417*5113495bSYour Name 			case BW_40_MHZ:
1418*5113495bSYour Name 				op_chan->ch_width = CH_WIDTH_40MHZ;
1419*5113495bSYour Name 				break;
1420*5113495bSYour Name 			case BW_80_MHZ:
1421*5113495bSYour Name 				if (reg_ap_cap[idx].behav_limit == BIT(BEHAV_BW80_PLUS) &&
1422*5113495bSYour Name 				    ucfg_mlme_get_restricted_80p80_bw_supp(psoc))
1423*5113495bSYour Name 					op_chan->ch_width = CH_WIDTH_80P80MHZ;
1424*5113495bSYour Name 				else
1425*5113495bSYour Name 					op_chan->ch_width = CH_WIDTH_80MHZ;
1426*5113495bSYour Name 				break;
1427*5113495bSYour Name 			case BW_160_MHZ:
1428*5113495bSYour Name 				op_chan->ch_width  = CH_WIDTH_160MHZ;
1429*5113495bSYour Name 				break;
1430*5113495bSYour Name 			default:
1431*5113495bSYour Name 				op_chan->ch_width = INVALID_WIDTH;
1432*5113495bSYour Name 				break;
1433*5113495bSYour Name 			}
1434*5113495bSYour Name 			op_chan->num_oper_chan =
1435*5113495bSYour Name 					reg_ap_cap[idx].num_supported_chan;
1436*5113495bSYour Name 			qdf_mem_copy(op_chan->oper_chan_num,
1437*5113495bSYour Name 				     reg_ap_cap[idx].sup_chan_list,
1438*5113495bSYour Name 				     reg_ap_cap[idx].num_supported_chan);
1439*5113495bSYour Name 		}
1440*5113495bSYour Name 	}
1441*5113495bSYour Name 	osif_debug("num of supported channel: %u",
1442*5113495bSYour Name 		   op_chan->num_oper_chan);
1443*5113495bSYour Name 	/*
1444*5113495bSYour Name 	 * TBD: DFS channel support needs to be added
1445*5113495bSYour Name 	 * Variable nsoc will be update whenever we add DFS
1446*5113495bSYour Name 	 * channel support for Easymesh.
1447*5113495bSYour Name 	 */
1448*5113495bSYour Name 	op_chan->num_supp_op_classes = nsoc;
1449*5113495bSYour Name 
1450*5113495bSYour Name end_reg_get_op_channels:
1451*5113495bSYour Name 
1452*5113495bSYour Name 	qdf_mem_free(reg_ap_cap);
1453*5113495bSYour Name }
1454*5113495bSYour Name 
1455*5113495bSYour Name /* size of sec chan offset element */
1456*5113495bSYour Name #define IEEE80211_SEC_CHAN_OFFSET_BYTES             3
1457*5113495bSYour Name /* no secondary channel */
1458*5113495bSYour Name #define IEEE80211_SEC_CHAN_OFFSET_SCN               0
1459*5113495bSYour Name /* secondary channel above */
1460*5113495bSYour Name #define IEEE80211_SEC_CHAN_OFFSET_SCA               1
1461*5113495bSYour Name /* secondary channel below */
1462*5113495bSYour Name #define IEEE80211_SEC_CHAN_OFFSET_SCB               3
1463*5113495bSYour Name 
os_if_son_reg_get_opclass_details(struct wlan_objmgr_pdev * pdev,struct wlan_op_class * op_class)1464*5113495bSYour Name static void os_if_son_reg_get_opclass_details(struct wlan_objmgr_pdev *pdev,
1465*5113495bSYour Name 					      struct wlan_op_class *op_class)
1466*5113495bSYour Name {
1467*5113495bSYour Name 	QDF_STATUS status;
1468*5113495bSYour Name 	uint8_t i;
1469*5113495bSYour Name 	uint8_t idx;
1470*5113495bSYour Name 	uint8_t n_opclasses = 0;
1471*5113495bSYour Name 	uint8_t chan_idx;
1472*5113495bSYour Name 	uint8_t max_supp_op_class = REG_MAX_SUPP_OPER_CLASSES;
1473*5113495bSYour Name 	struct regdmn_ap_cap_opclass_t *reg_ap_cap =
1474*5113495bSYour Name 			qdf_mem_malloc(max_supp_op_class * sizeof(*reg_ap_cap));
1475*5113495bSYour Name 
1476*5113495bSYour Name 	if (!reg_ap_cap) {
1477*5113495bSYour Name 		osif_err("Memory allocation failure");
1478*5113495bSYour Name 		return;
1479*5113495bSYour Name 	}
1480*5113495bSYour Name 	status = wlan_reg_get_opclass_details(pdev, reg_ap_cap, &n_opclasses,
1481*5113495bSYour Name 					      max_supp_op_class, true,
1482*5113495bSYour Name 					      REG_CURRENT_PWR_MODE);
1483*5113495bSYour Name 	if (status == QDF_STATUS_E_FAILURE) {
1484*5113495bSYour Name 		osif_err("Failed to get SAP regulatory capabilities");
1485*5113495bSYour Name 		goto end_reg_get_opclass_details;
1486*5113495bSYour Name 	}
1487*5113495bSYour Name 	osif_debug("n_opclasses: %u", n_opclasses);
1488*5113495bSYour Name 
1489*5113495bSYour Name 	for (idx = 0; reg_ap_cap[idx].op_class && idx < n_opclasses; idx++) {
1490*5113495bSYour Name 		osif_debug("idx: %d op_class: %u ch_width: %d",
1491*5113495bSYour Name 			   idx, reg_ap_cap[idx].op_class,
1492*5113495bSYour Name 			   reg_ap_cap[idx].ch_width);
1493*5113495bSYour Name 		if ((op_class->opclass != reg_ap_cap[idx].op_class) ||
1494*5113495bSYour Name 		    (reg_ap_cap[idx].ch_width == BW_160_MHZ))
1495*5113495bSYour Name 			continue;
1496*5113495bSYour Name 		switch (reg_ap_cap[idx].ch_width) {
1497*5113495bSYour Name 		case BW_20_MHZ:
1498*5113495bSYour Name 		case BW_25_MHZ:
1499*5113495bSYour Name 			op_class->ch_width = CH_WIDTH_20MHZ;
1500*5113495bSYour Name 			break;
1501*5113495bSYour Name 		case BW_40_MHZ:
1502*5113495bSYour Name 			op_class->ch_width = CH_WIDTH_40MHZ;
1503*5113495bSYour Name 			break;
1504*5113495bSYour Name 		case BW_80_MHZ:
1505*5113495bSYour Name 			if (reg_ap_cap[idx].behav_limit == BIT(BEHAV_BW80_PLUS))
1506*5113495bSYour Name 				op_class->ch_width = CH_WIDTH_80P80MHZ;
1507*5113495bSYour Name 			else
1508*5113495bSYour Name 				op_class->ch_width = CH_WIDTH_80MHZ;
1509*5113495bSYour Name 			break;
1510*5113495bSYour Name 		case BW_160_MHZ:
1511*5113495bSYour Name 			op_class->ch_width  = CH_WIDTH_160MHZ;
1512*5113495bSYour Name 			break;
1513*5113495bSYour Name 		default:
1514*5113495bSYour Name 			op_class->ch_width = CH_WIDTH_INVALID;
1515*5113495bSYour Name 			break;
1516*5113495bSYour Name 		}
1517*5113495bSYour Name 		switch (reg_ap_cap[idx].behav_limit) {
1518*5113495bSYour Name 		case BIT(BEHAV_NONE):
1519*5113495bSYour Name 			op_class->sc_loc = IEEE80211_SEC_CHAN_OFFSET_SCN;
1520*5113495bSYour Name 			break;
1521*5113495bSYour Name 		case BIT(BEHAV_BW40_LOW_PRIMARY):
1522*5113495bSYour Name 			op_class->sc_loc = IEEE80211_SEC_CHAN_OFFSET_SCA;
1523*5113495bSYour Name 			break;
1524*5113495bSYour Name 		case BIT(BEHAV_BW40_HIGH_PRIMARY):
1525*5113495bSYour Name 			op_class->sc_loc = IEEE80211_SEC_CHAN_OFFSET_SCB;
1526*5113495bSYour Name 			break;
1527*5113495bSYour Name 		case BIT(BEHAV_BW80_PLUS):
1528*5113495bSYour Name 			op_class->sc_loc = IEEE80211_SEC_CHAN_OFFSET_SCN;
1529*5113495bSYour Name 			break;
1530*5113495bSYour Name 		default:
1531*5113495bSYour Name 			op_class->sc_loc = IEEE80211_SEC_CHAN_OFFSET_SCN;
1532*5113495bSYour Name 			break;
1533*5113495bSYour Name 		}
1534*5113495bSYour Name 		osif_debug("num_supported_chan: %u num_non_supported_chan: %u",
1535*5113495bSYour Name 			   reg_ap_cap[idx].num_supported_chan,
1536*5113495bSYour Name 			   reg_ap_cap[idx].num_non_supported_chan);
1537*5113495bSYour Name 		i = 0;
1538*5113495bSYour Name 		chan_idx = 0;
1539*5113495bSYour Name 		while ((i < reg_ap_cap[idx].num_supported_chan) &&
1540*5113495bSYour Name 		       (chan_idx < MAX_CHANNELS_PER_OP_CLASS))
1541*5113495bSYour Name 			op_class->channels[chan_idx++] =
1542*5113495bSYour Name 				reg_ap_cap[idx].sup_chan_list[i++];
1543*5113495bSYour Name 		i = 0;
1544*5113495bSYour Name 		while ((i < reg_ap_cap[idx].num_non_supported_chan) &&
1545*5113495bSYour Name 		       (chan_idx < MAX_CHANNELS_PER_OP_CLASS))
1546*5113495bSYour Name 			op_class->channels[chan_idx++] =
1547*5113495bSYour Name 				reg_ap_cap[idx].non_sup_chan_list[i++];
1548*5113495bSYour Name 
1549*5113495bSYour Name 		 op_class->num_chan = chan_idx;
1550*5113495bSYour Name 	}
1551*5113495bSYour Name 
1552*5113495bSYour Name end_reg_get_opclass_details:
1553*5113495bSYour Name 
1554*5113495bSYour Name 	qdf_mem_free(reg_ap_cap);
1555*5113495bSYour Name }
1556*5113495bSYour Name 
os_if_son_pdev_ops(struct wlan_objmgr_pdev * pdev,enum wlan_mlme_pdev_param type,void * data,void * ret)1557*5113495bSYour Name QDF_STATUS os_if_son_pdev_ops(struct wlan_objmgr_pdev *pdev,
1558*5113495bSYour Name 			      enum wlan_mlme_pdev_param type,
1559*5113495bSYour Name 			      void *data, void *ret)
1560*5113495bSYour Name {
1561*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1562*5113495bSYour Name 	union wlan_mlme_pdev_data *in = (union wlan_mlme_pdev_data *)data;
1563*5113495bSYour Name 	union wlan_mlme_pdev_data *out = (union wlan_mlme_pdev_data *)ret;
1564*5113495bSYour Name 	wlan_esp_data *esp_info;
1565*5113495bSYour Name 
1566*5113495bSYour Name 	if (!out)
1567*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1568*5113495bSYour Name 
1569*5113495bSYour Name 	osif_debug("Type: %d", type);
1570*5113495bSYour Name 	switch (type) {
1571*5113495bSYour Name 	case PDEV_GET_ESP_INFO:
1572*5113495bSYour Name 		esp_info = &out->esp_info;
1573*5113495bSYour Name 		/* BA Window Size of 16 */
1574*5113495bSYour Name 		esp_info->per_ac[WME_AC_BE].ba_window_size = ba_window_size_16;
1575*5113495bSYour Name 		esp_info->per_ac[WME_AC_BE].est_air_time_fraction = 0;
1576*5113495bSYour Name 		/* Default : 250us PPDU Duration in native format */
1577*5113495bSYour Name 		esp_info->per_ac[WME_AC_BE].data_ppdu_dur_target =
1578*5113495bSYour Name 			MAP_DEFAULT_PPDU_DURATION * MAP_PPDU_DURATION_UNITS;
1579*5113495bSYour Name 		break;
1580*5113495bSYour Name 	case PDEV_GET_CAPABILITY:
1581*5113495bSYour Name 		os_if_son_reg_get_ap_hw_cap(pdev, &out->cap, in->skip_6ghz);
1582*5113495bSYour Name 		break;
1583*5113495bSYour Name 	case PDEV_GET_OPERABLE_CHAN:
1584*5113495bSYour Name 		memcpy(&out->op_chan, &in->op_chan,
1585*5113495bSYour Name 		       sizeof(struct wlan_op_chan));
1586*5113495bSYour Name 		os_if_son_reg_get_op_channels(pdev, &out->op_chan,
1587*5113495bSYour Name 					      in->op_chan.dfs_required);
1588*5113495bSYour Name 		break;
1589*5113495bSYour Name 	case PDEV_GET_OPERABLE_CLASS:
1590*5113495bSYour Name 		memcpy(&out->op_class, &in->op_class,
1591*5113495bSYour Name 		       sizeof(struct wlan_op_class));
1592*5113495bSYour Name 		os_if_son_reg_get_opclass_details(pdev, &out->op_class);
1593*5113495bSYour Name 		break;
1594*5113495bSYour Name 	default:
1595*5113495bSYour Name 		break;
1596*5113495bSYour Name 	}
1597*5113495bSYour Name 
1598*5113495bSYour Name 	return status;
1599*5113495bSYour Name }
1600*5113495bSYour Name 
1601*5113495bSYour Name qdf_export_symbol(os_if_son_pdev_ops);
1602*5113495bSYour Name 
os_if_son_deliver_ald_event(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer,enum ieee80211_event_type event,void * event_data)1603*5113495bSYour Name int os_if_son_deliver_ald_event(struct wlan_objmgr_vdev *vdev,
1604*5113495bSYour Name 				struct wlan_objmgr_peer *peer,
1605*5113495bSYour Name 				enum ieee80211_event_type event,
1606*5113495bSYour Name 				void *event_data)
1607*5113495bSYour Name {
1608*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1609*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
1610*5113495bSYour Name 	int ret;
1611*5113495bSYour Name 
1612*5113495bSYour Name 	if (!vdev) {
1613*5113495bSYour Name 		osif_err("null vdev");
1614*5113495bSYour Name 		return -EINVAL;
1615*5113495bSYour Name 	}
1616*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
1617*5113495bSYour Name 	if (!psoc) {
1618*5113495bSYour Name 		osif_err("null posc");
1619*5113495bSYour Name 		return -EINVAL;
1620*5113495bSYour Name 	}
1621*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
1622*5113495bSYour Name 	if (rx_ops && rx_ops->son_rx_ops.deliver_event)
1623*5113495bSYour Name 		ret = rx_ops->son_rx_ops.deliver_event(vdev, peer, event,
1624*5113495bSYour Name 						       event_data);
1625*5113495bSYour Name 	else
1626*5113495bSYour Name 		ret = -EINVAL;
1627*5113495bSYour Name 
1628*5113495bSYour Name 	return ret;
1629*5113495bSYour Name }
1630*5113495bSYour Name 
1631*5113495bSYour Name qdf_export_symbol(os_if_son_deliver_ald_event);
1632*5113495bSYour Name 
1633*5113495bSYour Name struct wlan_objmgr_vdev *
os_if_son_get_vdev_by_netdev(struct net_device * dev)1634*5113495bSYour Name os_if_son_get_vdev_by_netdev(struct net_device *dev)
1635*5113495bSYour Name {
1636*5113495bSYour Name 	return g_son_os_if_cb.os_if_get_vdev_by_netdev(dev);
1637*5113495bSYour Name }
1638*5113495bSYour Name 
1639*5113495bSYour Name qdf_export_symbol(os_if_son_get_vdev_by_netdev);
1640*5113495bSYour Name 
os_if_son_trigger_objmgr_object_creation(enum wlan_umac_comp_id id)1641*5113495bSYour Name QDF_STATUS os_if_son_trigger_objmgr_object_creation(enum wlan_umac_comp_id id)
1642*5113495bSYour Name {
1643*5113495bSYour Name 	return g_son_os_if_cb.os_if_trigger_objmgr_object_creation(id);
1644*5113495bSYour Name }
1645*5113495bSYour Name 
1646*5113495bSYour Name qdf_export_symbol(os_if_son_trigger_objmgr_object_creation);
1647*5113495bSYour Name 
os_if_son_trigger_objmgr_object_deletion(enum wlan_umac_comp_id id)1648*5113495bSYour Name QDF_STATUS os_if_son_trigger_objmgr_object_deletion(enum wlan_umac_comp_id id)
1649*5113495bSYour Name {
1650*5113495bSYour Name 	return g_son_os_if_cb.os_if_trigger_objmgr_object_deletion(id);
1651*5113495bSYour Name }
1652*5113495bSYour Name 
1653*5113495bSYour Name qdf_export_symbol(os_if_son_trigger_objmgr_object_deletion);
1654*5113495bSYour Name 
os_if_son_start_acs(struct wlan_objmgr_vdev * vdev,uint8_t enable)1655*5113495bSYour Name int os_if_son_start_acs(struct wlan_objmgr_vdev *vdev, uint8_t enable)
1656*5113495bSYour Name {
1657*5113495bSYour Name 	if (!vdev) {
1658*5113495bSYour Name 		osif_err("null vdev");
1659*5113495bSYour Name 		return 0;
1660*5113495bSYour Name 	}
1661*5113495bSYour Name 
1662*5113495bSYour Name 	return g_son_os_if_cb.os_if_start_acs(vdev, enable);
1663*5113495bSYour Name }
1664*5113495bSYour Name 
1665*5113495bSYour Name qdf_export_symbol(os_if_son_start_acs);
1666*5113495bSYour Name 
os_if_son_set_acs_chan(struct wlan_objmgr_vdev * vdev,struct ieee80211req_athdbg * req)1667*5113495bSYour Name int os_if_son_set_acs_chan(struct wlan_objmgr_vdev *vdev,
1668*5113495bSYour Name 			   struct ieee80211req_athdbg *req)
1669*5113495bSYour Name {
1670*5113495bSYour Name 	if (!vdev) {
1671*5113495bSYour Name 		osif_err("null vdev");
1672*5113495bSYour Name 		return 0;
1673*5113495bSYour Name 	}
1674*5113495bSYour Name 
1675*5113495bSYour Name 	return g_son_os_if_cb.os_if_set_acs_channels(vdev, req);
1676*5113495bSYour Name }
1677*5113495bSYour Name 
1678*5113495bSYour Name qdf_export_symbol(os_if_son_set_acs_chan);
1679*5113495bSYour Name 
os_if_son_get_acs_report(struct wlan_objmgr_vdev * vdev,struct ieee80211_acs_dbg * acs_r)1680*5113495bSYour Name int os_if_son_get_acs_report(struct wlan_objmgr_vdev *vdev,
1681*5113495bSYour Name 			     struct ieee80211_acs_dbg *acs_r)
1682*5113495bSYour Name {
1683*5113495bSYour Name 	if (!vdev) {
1684*5113495bSYour Name 		osif_err("null vdev");
1685*5113495bSYour Name 		return 0;
1686*5113495bSYour Name 	}
1687*5113495bSYour Name 
1688*5113495bSYour Name 	return g_son_os_if_cb.os_if_get_acs_report(vdev, acs_r);
1689*5113495bSYour Name }
1690*5113495bSYour Name 
1691*5113495bSYour Name qdf_export_symbol(os_if_son_get_acs_report);
1692*5113495bSYour Name 
1693*5113495bSYour Name void
wlan_os_if_son_ops_register_cb(void (* handler)(struct wlan_os_if_son_ops *))1694*5113495bSYour Name wlan_os_if_son_ops_register_cb(void (*handler)(struct wlan_os_if_son_ops *))
1695*5113495bSYour Name {
1696*5113495bSYour Name 	os_if_son_ops_cb = handler;
1697*5113495bSYour Name }
1698*5113495bSYour Name 
1699*5113495bSYour Name qdf_export_symbol(wlan_os_if_son_ops_register_cb);
1700*5113495bSYour Name 
wlan_son_register_os_if_ops(struct wlan_os_if_son_ops * son_ops)1701*5113495bSYour Name static void wlan_son_register_os_if_ops(struct wlan_os_if_son_ops *son_ops)
1702*5113495bSYour Name {
1703*5113495bSYour Name 	if (os_if_son_ops_cb)
1704*5113495bSYour Name 		os_if_son_ops_cb(son_ops);
1705*5113495bSYour Name 	else
1706*5113495bSYour Name 		osif_err("\n***** OS_IF: SON MODULE NOT LOADED *****\n");
1707*5113495bSYour Name }
1708*5113495bSYour Name 
os_if_son_register_lmac_if_ops(struct wlan_objmgr_psoc * psoc)1709*5113495bSYour Name void os_if_son_register_lmac_if_ops(struct wlan_objmgr_psoc *psoc)
1710*5113495bSYour Name {
1711*5113495bSYour Name 	struct wlan_lmac_if_rx_ops *rx_ops;
1712*5113495bSYour Name 
1713*5113495bSYour Name 	if (!psoc) {
1714*5113495bSYour Name 		osif_err("psoc is NULL");
1715*5113495bSYour Name 		return;
1716*5113495bSYour Name 	}
1717*5113495bSYour Name 
1718*5113495bSYour Name 	rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
1719*5113495bSYour Name 	if (!rx_ops) {
1720*5113495bSYour Name 		osif_err("rx_ops is null");
1721*5113495bSYour Name 		return;
1722*5113495bSYour Name 	}
1723*5113495bSYour Name 
1724*5113495bSYour Name 	wlan_lmac_if_son_mod_register_rx_ops(rx_ops);
1725*5113495bSYour Name }
1726*5113495bSYour Name 
1727*5113495bSYour Name qdf_export_symbol(os_if_son_register_lmac_if_ops);
1728*5113495bSYour Name 
os_if_son_register_osif_ops(void)1729*5113495bSYour Name void os_if_son_register_osif_ops(void)
1730*5113495bSYour Name {
1731*5113495bSYour Name 	wlan_son_register_os_if_ops(&g_son_os_if_txrx_ops);
1732*5113495bSYour Name }
1733*5113495bSYour Name 
1734*5113495bSYour Name qdf_export_symbol(os_if_son_register_osif_ops);
1735*5113495bSYour Name 
os_if_son_parse_generic_nl_cmd(struct wiphy * wiphy,struct wireless_dev * wdev,struct nlattr ** tb,enum os_if_son_vendor_cmd_type type)1736*5113495bSYour Name int os_if_son_parse_generic_nl_cmd(struct wiphy *wiphy,
1737*5113495bSYour Name 				   struct wireless_dev *wdev,
1738*5113495bSYour Name 				   struct nlattr **tb,
1739*5113495bSYour Name 				   enum os_if_son_vendor_cmd_type type)
1740*5113495bSYour Name {
1741*5113495bSYour Name 	struct os_if_son_rx_ops *rx_ops = &g_son_os_if_txrx_ops.son_osif_rx_ops;
1742*5113495bSYour Name 	struct wlan_cfg8011_genric_params param = {};
1743*5113495bSYour Name 
1744*5113495bSYour Name 	if (!rx_ops->parse_generic_nl_cmd)
1745*5113495bSYour Name 		return -EINVAL;
1746*5113495bSYour Name 
1747*5113495bSYour Name 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND])
1748*5113495bSYour Name 		param.command = nla_get_u32(tb
1749*5113495bSYour Name 				[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND]);
1750*5113495bSYour Name 
1751*5113495bSYour Name 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_VALUE])
1752*5113495bSYour Name 		param.value = nla_get_u32(tb
1753*5113495bSYour Name 				[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_VALUE]);
1754*5113495bSYour Name 
1755*5113495bSYour Name 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA]) {
1756*5113495bSYour Name 		param.data = nla_data(tb
1757*5113495bSYour Name 				[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA]);
1758*5113495bSYour Name 		param.data_len = nla_len(tb
1759*5113495bSYour Name 				[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA]);
1760*5113495bSYour Name 	}
1761*5113495bSYour Name 
1762*5113495bSYour Name 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_LENGTH])
1763*5113495bSYour Name 		param.length = nla_get_u32(tb
1764*5113495bSYour Name 				[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_LENGTH]);
1765*5113495bSYour Name 
1766*5113495bSYour Name 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_FLAGS])
1767*5113495bSYour Name 		param.flags = nla_get_u32(tb
1768*5113495bSYour Name 				[QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_FLAGS]);
1769*5113495bSYour Name 
1770*5113495bSYour Name 	return rx_ops->parse_generic_nl_cmd(wiphy, wdev, &param, type);
1771*5113495bSYour Name }
1772*5113495bSYour Name 
os_if_son_get_node_datarate_info(struct wlan_objmgr_vdev * vdev,uint8_t * mac_addr,wlan_node_info * node_info)1773*5113495bSYour Name QDF_STATUS os_if_son_get_node_datarate_info(struct wlan_objmgr_vdev *vdev,
1774*5113495bSYour Name 					    uint8_t *mac_addr,
1775*5113495bSYour Name 					    wlan_node_info *node_info)
1776*5113495bSYour Name {
1777*5113495bSYour Name 	int8_t max_tx_power;
1778*5113495bSYour Name 	int8_t min_tx_power;
1779*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1780*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1781*5113495bSYour Name 
1782*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
1783*5113495bSYour Name 	if (!psoc) {
1784*5113495bSYour Name 		osif_err("null posc");
1785*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1786*5113495bSYour Name 	}
1787*5113495bSYour Name 
1788*5113495bSYour Name 	if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), mac_addr) ==
1789*5113495bSYour Name 							   QDF_STATUS_SUCCESS) {
1790*5113495bSYour Name 		node_info->max_chwidth = os_if_son_get_chwidth(vdev);
1791*5113495bSYour Name 		node_info->phymode = os_if_son_get_phymode(vdev);
1792*5113495bSYour Name 		node_info->num_streams = os_if_son_get_rx_streams(vdev);
1793*5113495bSYour Name 		ucfg_son_get_min_and_max_power(psoc, &max_tx_power,
1794*5113495bSYour Name 					       &min_tx_power);
1795*5113495bSYour Name 		node_info->max_txpower = max_tx_power;
1796*5113495bSYour Name 		node_info->max_MCS = ucfg_mlme_get_vdev_max_mcs_idx(vdev);
1797*5113495bSYour Name 		if (node_info->max_MCS == INVALID_MCS_NSS_INDEX) {
1798*5113495bSYour Name 			osif_err("invalid mcs index");
1799*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1800*5113495bSYour Name 		}
1801*5113495bSYour Name 		osif_debug("node info: max_chwidth: %u, phymode: %u, num_streams: %d, max_mcs: %d, max_txpower: %d",
1802*5113495bSYour Name 			   node_info->max_chwidth, node_info->phymode,
1803*5113495bSYour Name 			   node_info->num_streams, node_info->max_MCS,
1804*5113495bSYour Name 			   node_info->max_txpower);
1805*5113495bSYour Name 	} else {
1806*5113495bSYour Name 		if (!g_son_os_if_cb.os_if_get_node_info) {
1807*5113495bSYour Name 			osif_err("Callback not registered");
1808*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
1809*5113495bSYour Name 		}
1810*5113495bSYour Name 		status = g_son_os_if_cb.os_if_get_node_info(vdev, mac_addr,
1811*5113495bSYour Name 							    node_info);
1812*5113495bSYour Name 	}
1813*5113495bSYour Name 	return status;
1814*5113495bSYour Name }
1815*5113495bSYour Name 
1816*5113495bSYour Name qdf_export_symbol(os_if_son_get_node_datarate_info);
1817*5113495bSYour Name 
os_if_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer)1818*5113495bSYour Name uint32_t os_if_son_get_peer_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
1819*5113495bSYour Name 					struct wlan_objmgr_peer *peer)
1820*5113495bSYour Name {
1821*5113495bSYour Name 	if (g_son_os_if_cb.os_if_get_peer_max_mcs_idx)
1822*5113495bSYour Name 		return g_son_os_if_cb.os_if_get_peer_max_mcs_idx(vdev, peer);
1823*5113495bSYour Name 
1824*5113495bSYour Name 	return 0;
1825*5113495bSYour Name }
1826*5113495bSYour Name 
os_if_son_get_sta_stats(struct wlan_objmgr_vdev * vdev,uint8_t * mac_addr,struct ieee80211_nodestats * stats)1827*5113495bSYour Name int os_if_son_get_sta_stats(struct wlan_objmgr_vdev *vdev, uint8_t *mac_addr,
1828*5113495bSYour Name 			    struct ieee80211_nodestats *stats)
1829*5113495bSYour Name {
1830*5113495bSYour Name 	if (g_son_os_if_cb.os_if_get_sta_stats)
1831*5113495bSYour Name 		return g_son_os_if_cb.os_if_get_sta_stats(vdev, mac_addr,
1832*5113495bSYour Name 							  stats);
1833*5113495bSYour Name 
1834*5113495bSYour Name 	return 0;
1835*5113495bSYour Name }
1836*5113495bSYour Name qdf_export_symbol(os_if_son_get_sta_stats);
1837