xref: /wlan-driver/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2011-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
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: wlan_hdd_wext.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * Linux Wireless Extensions Implementation
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include <linux/version.h>
27*5113495bSYour Name #include <linux/module.h>
28*5113495bSYour Name #include <linux/kernel.h>
29*5113495bSYour Name #include <linux/init.h>
30*5113495bSYour Name #include <linux/wireless.h>
31*5113495bSYour Name #include <mac_trace.h>
32*5113495bSYour Name #include "osif_sync.h"
33*5113495bSYour Name #include <wlan_hdd_includes.h>
34*5113495bSYour Name #include <cds_api.h>
35*5113495bSYour Name #include "scheduler_api.h"
36*5113495bSYour Name #include <net/arp.h>
37*5113495bSYour Name #include <cdp_txrx_cmn.h>
38*5113495bSYour Name #include <cdp_txrx_stats.h>
39*5113495bSYour Name #include "sir_params.h"
40*5113495bSYour Name #include "csr_api.h"
41*5113495bSYour Name #include "csr_inside_api.h"
42*5113495bSYour Name #include "sme_rrm_internal.h"
43*5113495bSYour Name #include <ani_global.h>
44*5113495bSYour Name #include "dot11f.h"
45*5113495bSYour Name #include <wlan_hdd_wowl.h>
46*5113495bSYour Name #include <wlan_hdd_cfg.h>
47*5113495bSYour Name #include <wlan_hdd_wmm.h>
48*5113495bSYour Name #include "utils_api.h"
49*5113495bSYour Name #include "wlan_hdd_p2p.h"
50*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
51*5113495bSYour Name #include "wlan_hdd_tdls.h"
52*5113495bSYour Name #endif
53*5113495bSYour Name 
54*5113495bSYour Name #include "cds_ieee80211_common.h"
55*5113495bSYour Name #include "ol_if_athvar.h"
56*5113495bSYour Name #include "dbglog_host.h"
57*5113495bSYour Name #include "wma.h"
58*5113495bSYour Name 
59*5113495bSYour Name #include <ol_defines.h>
60*5113495bSYour Name 
61*5113495bSYour Name #include "wlan_hdd_power.h"
62*5113495bSYour Name #include "qwlan_version.h"
63*5113495bSYour Name #include "wlan_hdd_host_offload.h"
64*5113495bSYour Name 
65*5113495bSYour Name #include <linux/wireless.h>
66*5113495bSYour Name #include <net/cfg80211.h>
67*5113495bSYour Name 
68*5113495bSYour Name #include "wlan_hdd_misc.h"
69*5113495bSYour Name 
70*5113495bSYour Name #include "qc_sap_ioctl.h"
71*5113495bSYour Name #include "sme_api.h"
72*5113495bSYour Name #include "wma_types.h"
73*5113495bSYour Name #include "wlan_hdd_assoc.h"
74*5113495bSYour Name #include "wlan_hdd_ioctl.h"
75*5113495bSYour Name #include "wlan_hdd_scan.h"
76*5113495bSYour Name #include "sme_power_save_api.h"
77*5113495bSYour Name #include "wlan_policy_mgr_api.h"
78*5113495bSYour Name #include "wlan_hdd_fips.h"
79*5113495bSYour Name #include "wlan_hdd_tsf.h"
80*5113495bSYour Name #include "wlan_hdd_ocb.h"
81*5113495bSYour Name #include "wlan_hdd_napi.h"
82*5113495bSYour Name #include "cdp_txrx_flow_ctrl_legacy.h"
83*5113495bSYour Name #include "wlan_hdd_nan_datapath.h"
84*5113495bSYour Name #include "wlan_hdd_stats.h"
85*5113495bSYour Name #ifdef WLAN_SUSPEND_RESUME_TEST
86*5113495bSYour Name #include "wlan_hdd_driver_ops.h"
87*5113495bSYour Name #include "hif.h"
88*5113495bSYour Name #endif
89*5113495bSYour Name #include "pld_common.h"
90*5113495bSYour Name #include "cds_utils.h"
91*5113495bSYour Name #include "wlan_osif_request_manager.h"
92*5113495bSYour Name #include "os_if_wifi_pos.h"
93*5113495bSYour Name #include <cdp_txrx_stats.h>
94*5113495bSYour Name #include <cds_api.h>
95*5113495bSYour Name #include "wlan_dsc_test.h"
96*5113495bSYour Name #include <wlan_osif_priv.h>
97*5113495bSYour Name #include "wlan_hdd_regulatory.h"
98*5113495bSYour Name #include "wlan_reg_ucfg_api.h"
99*5113495bSYour Name #include "wlan_hdd_packet_filter_api.h"
100*5113495bSYour Name #include "wlan_cp_stats_mc_ucfg_api.h"
101*5113495bSYour Name #include "wlan_mlme_ucfg_api.h"
102*5113495bSYour Name #include "cfg_mlme_sta.h"
103*5113495bSYour Name #include "wlan_mlme_public_struct.h"
104*5113495bSYour Name #include "cfg_ucfg_api.h"
105*5113495bSYour Name #include "wlan_policy_mgr_ucfg.h"
106*5113495bSYour Name #include "wlan_mlme_public_struct.h"
107*5113495bSYour Name #include "cfg_ucfg_api.h"
108*5113495bSYour Name #include "cfg_mlme_threshold.h"
109*5113495bSYour Name #include "wlan_pmo_cfg.h"
110*5113495bSYour Name #include "wlan_pmo_ucfg_api.h"
111*5113495bSYour Name #include "wlan_dp_rx_thread.h"
112*5113495bSYour Name #include "wlan_fwol_ucfg_api.h"
113*5113495bSYour Name #include "wlan_hdd_unit_test.h"
114*5113495bSYour Name #include "wlan_hdd_thermal.h"
115*5113495bSYour Name #include "wlan_cm_roam_ucfg_api.h"
116*5113495bSYour Name #include "wlan_hdd_object_manager.h"
117*5113495bSYour Name #include "wlan_dp_ucfg_api.h"
118*5113495bSYour Name 
119*5113495bSYour Name /* Private ioctls and their sub-ioctls */
120*5113495bSYour Name #define WLAN_PRIV_SET_INT_GET_NONE    (SIOCIWFIRSTPRIV + 0)
121*5113495bSYour Name #define WE_SET_11D_STATE     1
122*5113495bSYour Name #define WE_WOWL              2
123*5113495bSYour Name #define WE_SET_POWER         3
124*5113495bSYour Name /*
125*5113495bSYour Name  * <ioctl>
126*5113495bSYour Name  * setMaxAssoc - Sets the maximum number of associated stations
127*5113495bSYour Name  *
128*5113495bSYour Name  * @INPUT: 1 to 32
129*5113495bSYour Name  *
130*5113495bSYour Name  * @OUTPUT: None
131*5113495bSYour Name  *
132*5113495bSYour Name  * This IOTCL sets the maximum number of associated stations
133*5113495bSYour Name  *
134*5113495bSYour Name  * @E.g: iwpriv wlan0 setMaxAssoc <value>
135*5113495bSYour Name  *
136*5113495bSYour Name  * Supported Feature: STA
137*5113495bSYour Name  *
138*5113495bSYour Name  * Usage: Internal/External
139*5113495bSYour Name  *
140*5113495bSYour Name  * </ioctl>
141*5113495bSYour Name  */
142*5113495bSYour Name #define WE_SET_MAX_ASSOC     4
143*5113495bSYour Name /*
144*5113495bSYour Name  * <ioctl>
145*5113495bSYour Name  * scan_disable - Disable scan
146*5113495bSYour Name  *
147*5113495bSYour Name  * @INPUT: set_value
148*5113495bSYour Name  *
149*5113495bSYour Name  * @OUTPUT: None
150*5113495bSYour Name  *
151*5113495bSYour Name  * This IOCTL is used to set disable scan
152*5113495bSYour Name  *
153*5113495bSYour Name  * @E.g: iwpriv wlan0 scan_disable 1
154*5113495bSYour Name  *
155*5113495bSYour Name  * Supported Feature: Scan
156*5113495bSYour Name  *
157*5113495bSYour Name  * Usage: Internal/External
158*5113495bSYour Name  *
159*5113495bSYour Name  * </ioctl>
160*5113495bSYour Name  */
161*5113495bSYour Name #define WE_SET_SCAN_DISABLE  5
162*5113495bSYour Name /*
163*5113495bSYour Name  * <ioctl>
164*5113495bSYour Name  * inactivityTO - sets the timeout value for inactivity data while
165*5113495bSYour Name  * in power save mode
166*5113495bSYour Name  *
167*5113495bSYour Name  * @INPUT: int1…..int255
168*5113495bSYour Name  *
169*5113495bSYour Name  * @OUTPUT: None
170*5113495bSYour Name  *
171*5113495bSYour Name  * This IOCTL set the timeout value for inactivity data in power save mode
172*5113495bSYour Name  *
173*5113495bSYour Name  * @E.g: iwpriv wlan0 inactivityTO 20
174*5113495bSYour Name  *
175*5113495bSYour Name  * Supported Feature: STA
176*5113495bSYour Name  *
177*5113495bSYour Name  * Usage: Internal/External
178*5113495bSYour Name  *
179*5113495bSYour Name  * </ioctl>
180*5113495bSYour Name  */
181*5113495bSYour Name #define WE_SET_DATA_INACTIVITY_TO  6
182*5113495bSYour Name /*
183*5113495bSYour Name  * <ioctl>
184*5113495bSYour Name  * setMaxTxPower - Dynamically sets the maximum transmission power
185*5113495bSYour Name  *
186*5113495bSYour Name  * @INPUT: Transmission power in dBm
187*5113495bSYour Name  *
188*5113495bSYour Name  * @OUTPUT: None
189*5113495bSYour Name  *
190*5113495bSYour Name  * This IOCTL dynamically sets the maximum transmission power
191*5113495bSYour Name  * This setting does not persist over reboots
192*5113495bSYour Name  *
193*5113495bSYour Name  * @E.g: iwpriv wlan0 setMaxTxPower <value in db)
194*5113495bSYour Name  *
195*5113495bSYour Name  * Supported Feature: STA
196*5113495bSYour Name  *
197*5113495bSYour Name  * Usage: Internal/External
198*5113495bSYour Name  *
199*5113495bSYour Name  * </ioctl>
200*5113495bSYour Name  */
201*5113495bSYour Name #define WE_SET_MAX_TX_POWER  7
202*5113495bSYour Name 
203*5113495bSYour Name #ifdef HASTINGS_BT_WAR
204*5113495bSYour Name /* Temporary WAR for Hastings 1.1 only */
205*5113495bSYour Name #define WE_SET_HASTINGS_BT_WAR 8
206*5113495bSYour Name #endif
207*5113495bSYour Name 
208*5113495bSYour Name #define WE_SET_TM_LEVEL      9
209*5113495bSYour Name 
210*5113495bSYour Name /*
211*5113495bSYour Name  * <ioctl>
212*5113495bSYour Name  * setphymode - Set the phymode dynamically
213*5113495bSYour Name  *
214*5113495bSYour Name  * @INPUT: 0 IEEE80211_MODE_AUTO to 22 IEEE80211_MODE_11AGN
215*5113495bSYour Name  *
216*5113495bSYour Name  * @OUTPUT: None
217*5113495bSYour Name  *
218*5113495bSYour Name  * This IOCTL sets the phymode dynamically
219*5113495bSYour Name  *
220*5113495bSYour Name  * @E.g: iwpriv wlan0 setphymode 10
221*5113495bSYour Name  *
222*5113495bSYour Name  * Supported Feature: STA
223*5113495bSYour Name  *
224*5113495bSYour Name  * Usage: Internal/External
225*5113495bSYour Name  *
226*5113495bSYour Name  * </ioctl>
227*5113495bSYour Name  */
228*5113495bSYour Name #define WE_SET_PHYMODE       10
229*5113495bSYour Name /*
230*5113495bSYour Name  * <ioctl>
231*5113495bSYour Name  * nss - Set the number of spatial streams
232*5113495bSYour Name  *
233*5113495bSYour Name  * @INPUT: int1…..int3
234*5113495bSYour Name  *
235*5113495bSYour Name  * @OUTPUT: None
236*5113495bSYour Name  *
237*5113495bSYour Name  * This IOCTL sets the number of spatial streams. Supported values are 1 and 2
238*5113495bSYour Name  *
239*5113495bSYour Name  * @E.g: iwpriv wlan0 nss 2
240*5113495bSYour Name  *
241*5113495bSYour Name  * Supported Feature: STA
242*5113495bSYour Name  *
243*5113495bSYour Name  * Usage: Internal/External
244*5113495bSYour Name  *
245*5113495bSYour Name  * </ioctl>
246*5113495bSYour Name  */
247*5113495bSYour Name #define WE_SET_NSS           11
248*5113495bSYour Name /*
249*5113495bSYour Name  * <ioctl>
250*5113495bSYour Name  * ldpc - Enables or disables LDPC
251*5113495bSYour Name  *
252*5113495bSYour Name  * @INPUT: 0 – Disable, 1 - Enable
253*5113495bSYour Name  *
254*5113495bSYour Name  * @OUTPUT: None
255*5113495bSYour Name  *
256*5113495bSYour Name  * This IOCTL enables or disables LDPC
257*5113495bSYour Name  *
258*5113495bSYour Name  * @E.g: iwpriv wlan0 ldpc 1
259*5113495bSYour Name  *
260*5113495bSYour Name  * Supported Feature: STA
261*5113495bSYour Name  *
262*5113495bSYour Name  * Usage: Internal/External
263*5113495bSYour Name  *
264*5113495bSYour Name  * </ioctl>
265*5113495bSYour Name  */
266*5113495bSYour Name #define WE_SET_LDPC          12
267*5113495bSYour Name /*
268*5113495bSYour Name  * <ioctl>
269*5113495bSYour Name  * tx_stbc - Enables or disables tx_stbc
270*5113495bSYour Name  *
271*5113495bSYour Name  * @INPUT: Int 0 – Disable, 1 - Enable
272*5113495bSYour Name  *
273*5113495bSYour Name  * @OUTPUT: None
274*5113495bSYour Name  *
275*5113495bSYour Name  * This IOTCL used to enables or disables tx_stbc
276*5113495bSYour Name  *
277*5113495bSYour Name  * @E.g: iwpriv wlan0 tx_stbc <value>
278*5113495bSYour Name  *
279*5113495bSYour Name  * Supported Feature: STA
280*5113495bSYour Name  *
281*5113495bSYour Name  * Usage: Internal/External
282*5113495bSYour Name  *
283*5113495bSYour Name  * </ioctl>
284*5113495bSYour Name  */
285*5113495bSYour Name #define WE_SET_TX_STBC       13
286*5113495bSYour Name /*
287*5113495bSYour Name  * <ioctl>
288*5113495bSYour Name  * rx_stbc - Set the rx_stbc parameter
289*5113495bSYour Name  *
290*5113495bSYour Name  * @INPUT: Int 0 – Disable, 1 - Enable
291*5113495bSYour Name  *
292*5113495bSYour Name  * @OUTPUT: None
293*5113495bSYour Name  *
294*5113495bSYour Name  * This IOTCL used to set rx_stbc parameter
295*5113495bSYour Name  *
296*5113495bSYour Name  * @E.g: iwpriv wlan0 rx_stbc <value>
297*5113495bSYour Name  *
298*5113495bSYour Name  * Supported Feature: STA
299*5113495bSYour Name  *
300*5113495bSYour Name  * Usage: Internal/External
301*5113495bSYour Name  *
302*5113495bSYour Name  * </ioctl>
303*5113495bSYour Name  */
304*5113495bSYour Name #define WE_SET_RX_STBC       14
305*5113495bSYour Name /*
306*5113495bSYour Name  * <ioctl>
307*5113495bSYour Name  * shortgi  - Sets the short-guard interval
308*5113495bSYour Name  *
309*5113495bSYour Name  * @INPUT: Fixed Rate: 0 - 400ns, 1 - 800ns, 2 - 1600ns, 3 - 3200us
310*5113495bSYour Name  * Auto Rate: 8 - 400ns, 9 - 800ns, 10 - 1600ns, 11 - 3200us
311*5113495bSYour Name  *
312*5113495bSYour Name  * @OUTPUT: None
313*5113495bSYour Name  *
314*5113495bSYour Name  * This IOCTL sets the short-guard interval.
315*5113495bSYour Name  *
316*5113495bSYour Name  * @E.g: iwpriv wlan0 shortgi <value>
317*5113495bSYour Name  *
318*5113495bSYour Name  * Supported Feature: STA
319*5113495bSYour Name  *
320*5113495bSYour Name  * Usage: Internal/External
321*5113495bSYour Name  *
322*5113495bSYour Name  * </ioctl>
323*5113495bSYour Name  */
324*5113495bSYour Name #define WE_SET_SHORT_GI      15
325*5113495bSYour Name /*
326*5113495bSYour Name  * <ioctl>
327*5113495bSYour Name  * enablertscts - enables or disables rts/cts.
328*5113495bSYour Name  *
329*5113495bSYour Name  * @INPUT: 1-Enable , 0-Disable
330*5113495bSYour Name  *
331*5113495bSYour Name  * @OUTPUT: None
332*5113495bSYour Name  *
333*5113495bSYour Name  * This IOCTL enables or disables rts/cts.
334*5113495bSYour Name  *
335*5113495bSYour Name  * @E.g: iwpriv wlan0 enablertscts <value>
336*5113495bSYour Name  *
337*5113495bSYour Name  * Supported Feature: STA
338*5113495bSYour Name  *
339*5113495bSYour Name  * Usage: Internal/External
340*5113495bSYour Name  *
341*5113495bSYour Name  * </ioctl>
342*5113495bSYour Name  */
343*5113495bSYour Name #define WE_SET_RTSCTS        16
344*5113495bSYour Name /*
345*5113495bSYour Name  * <ioctl>
346*5113495bSYour Name  * chwidth - Set the channel bandwidth
347*5113495bSYour Name  *
348*5113495bSYour Name  * @INPUT: 0-20mhz to 3-160mhz
349*5113495bSYour Name  *
350*5113495bSYour Name  * @OUTPUT: None
351*5113495bSYour Name  *
352*5113495bSYour Name  * This IOTCL used to set the channel bandwidth
353*5113495bSYour Name  *
354*5113495bSYour Name  * @E.g: iwpriv wlan0 chwidth 1
355*5113495bSYour Name  *
356*5113495bSYour Name  * Supported Feature: STA
357*5113495bSYour Name  *
358*5113495bSYour Name  * Usage: Internal/External
359*5113495bSYour Name  *
360*5113495bSYour Name  * </ioctl>
361*5113495bSYour Name  */
362*5113495bSYour Name #define WE_SET_CHWIDTH       17
363*5113495bSYour Name #define WE_SET_ANI_EN_DIS    18
364*5113495bSYour Name #define WE_SET_ANI_POLL_PERIOD    19
365*5113495bSYour Name #define WE_SET_ANI_LISTEN_PERIOD  20
366*5113495bSYour Name #define WE_SET_ANI_OFDM_LEVEL     21
367*5113495bSYour Name #define WE_SET_ANI_CCK_LEVEL      22
368*5113495bSYour Name /*
369*5113495bSYour Name  * <ioctl>
370*5113495bSYour Name  * cwmenable - Enables or disables the dynamic channel bandwidth
371*5113495bSYour Name  *
372*5113495bSYour Name  * @INPUT: 0-Disable, 1-Enable
373*5113495bSYour Name  *
374*5113495bSYour Name  * @OUTPUT: None
375*5113495bSYour Name  *
376*5113495bSYour Name  * This IOTCL used to enables or disables the dynamic channel bandwidth
377*5113495bSYour Name  *
378*5113495bSYour Name  * @E.g: iwpriv wlan0 cwmenable <value>
379*5113495bSYour Name  *
380*5113495bSYour Name  * Supported Feature: STA
381*5113495bSYour Name  *
382*5113495bSYour Name  * Usage: Internal/External
383*5113495bSYour Name  *
384*5113495bSYour Name  * </ioctl>
385*5113495bSYour Name  */
386*5113495bSYour Name #define WE_SET_DYNAMIC_BW         23
387*5113495bSYour Name /*
388*5113495bSYour Name  * <ioctl>
389*5113495bSYour Name  * txchainmask - This IOCTL sets the current Tx chain mask
390*5113495bSYour Name  *
391*5113495bSYour Name  * @INPUT: Mask Value
392*5113495bSYour Name  *
393*5113495bSYour Name  * @OUTPUT: None
394*5113495bSYour Name  *
395*5113495bSYour Name  * This IOCTL sets the current Tx chain mask
396*5113495bSYour Name  *
397*5113495bSYour Name  * @E.g: iwpriv wlan0 txchainmask 1
398*5113495bSYour Name  *
399*5113495bSYour Name  * Supported Feature: STA
400*5113495bSYour Name  *
401*5113495bSYour Name  * Usage: Internal/External
402*5113495bSYour Name  *
403*5113495bSYour Name  * </ioctl>
404*5113495bSYour Name  */
405*5113495bSYour Name #define WE_SET_TX_CHAINMASK  24
406*5113495bSYour Name /*
407*5113495bSYour Name  * <ioctl>
408*5113495bSYour Name  * rxchainmask - Sets the current Rx chain mask
409*5113495bSYour Name  *
410*5113495bSYour Name  * @INPUT: Mask Value
411*5113495bSYour Name  *
412*5113495bSYour Name  * @OUTPUT: None
413*5113495bSYour Name  *
414*5113495bSYour Name  * This IOCTL sets the current Rx chain mask. This command is the
415*5113495bSYour Name  * equivalent to setting in gSetRxChainmask1x1 in WCNSS_qcom_cfg.ini.
416*5113495bSYour Name  *
417*5113495bSYour Name  * @E.g: iwpriv wlan0 rxchainmask <value>
418*5113495bSYour Name  *
419*5113495bSYour Name  * Supported Feature: STA
420*5113495bSYour Name  *
421*5113495bSYour Name  * Usage: Internal/External
422*5113495bSYour Name  *
423*5113495bSYour Name  * </ioctl>
424*5113495bSYour Name  */
425*5113495bSYour Name #define WE_SET_RX_CHAINMASK  25
426*5113495bSYour Name /*
427*5113495bSYour Name  * <ioctl>
428*5113495bSYour Name  * set11NRates - Fixes the Tx data rate of the 11N mode.
429*5113495bSYour Name  *
430*5113495bSYour Name  * @INPUT: 0x1b to 0x8f
431*5113495bSYour Name  *
432*5113495bSYour Name  * @OUTPUT: None
433*5113495bSYour Name  *
434*5113495bSYour Name  * This IOCTL fixes the Tx data rate of the 11N mode.
435*5113495bSYour Name  *
436*5113495bSYour Name  * @E.g: iwpriv wlan0 set11NRates 0x85
437*5113495bSYour Name  *
438*5113495bSYour Name  * Supported Feature: STA
439*5113495bSYour Name  *
440*5113495bSYour Name  * Usage: Internal/External
441*5113495bSYour Name  *
442*5113495bSYour Name  * </ioctl>
443*5113495bSYour Name  */
444*5113495bSYour Name #define WE_SET_11N_RATE      26
445*5113495bSYour Name /*
446*5113495bSYour Name  * <ioctl>
447*5113495bSYour Name  * ampdu  - Set the the maximum subframe of ampdu
448*5113495bSYour Name  *
449*5113495bSYour Name  * @INPUT: int 1 to int 63
450*5113495bSYour Name  *
451*5113495bSYour Name  * @OUTPUT: None
452*5113495bSYour Name  *
453*5113495bSYour Name  * This IOCTL sets the maximum subframe of ampdu.
454*5113495bSYour Name  *
455*5113495bSYour Name  * @E.g: iwpriv wlan0 ampdu 9
456*5113495bSYour Name  *
457*5113495bSYour Name  * Supported Feature: STA
458*5113495bSYour Name  *
459*5113495bSYour Name  * Usage: Internal/External
460*5113495bSYour Name  *
461*5113495bSYour Name  * </ioctl>
462*5113495bSYour Name  */
463*5113495bSYour Name #define WE_SET_AMPDU         27
464*5113495bSYour Name /*
465*5113495bSYour Name  * <ioctl>
466*5113495bSYour Name  * amsdu - Sets the maximum subframe of amsdu.
467*5113495bSYour Name  *
468*5113495bSYour Name  * @INPUT: int 1 to int 31
469*5113495bSYour Name  *
470*5113495bSYour Name  * @OUTPUT: None
471*5113495bSYour Name  *
472*5113495bSYour Name  * This IOCTL sets the maximum subframe of amsdu.
473*5113495bSYour Name  *
474*5113495bSYour Name  * @E.g: iwpriv wlan0 amsdu 9
475*5113495bSYour Name  *
476*5113495bSYour Name  * Supported Feature: STA
477*5113495bSYour Name  *
478*5113495bSYour Name  * Usage: Internal/External
479*5113495bSYour Name  *
480*5113495bSYour Name  * </ioctl>
481*5113495bSYour Name  */
482*5113495bSYour Name #define WE_SET_AMSDU         28
483*5113495bSYour Name /*
484*5113495bSYour Name  * <ioctl>
485*5113495bSYour Name  * txpow2g - current 2 GHz Tx power setting
486*5113495bSYour Name  *
487*5113495bSYour Name  * @INPUT: Tx power in dBm
488*5113495bSYour Name  *
489*5113495bSYour Name  * @OUTPUT: None
490*5113495bSYour Name  *
491*5113495bSYour Name  * This IOTCL  used to set 2 ghz tx power
492*5113495bSYour Name  *
493*5113495bSYour Name  * @E.g: iwpriv wlan0 txpow2g
494*5113495bSYour Name  *
495*5113495bSYour Name  * Supported Feature: STA
496*5113495bSYour Name  *
497*5113495bSYour Name  * Usage: Internal/External
498*5113495bSYour Name  *
499*5113495bSYour Name  * </ioctl>
500*5113495bSYour Name  */
501*5113495bSYour Name #define WE_SET_TXPOW_2G      29
502*5113495bSYour Name /*
503*5113495bSYour Name  * <ioctl>
504*5113495bSYour Name  * txpow5g - Current 5 GHz tx power setting
505*5113495bSYour Name  *
506*5113495bSYour Name  * @INPUT: Tx power in dBm
507*5113495bSYour Name  *
508*5113495bSYour Name  * @OUTPUT: None
509*5113495bSYour Name  *
510*5113495bSYour Name  * This IOTCL used to set the 5 ghz txpower
511*5113495bSYour Name  *
512*5113495bSYour Name  * @E.g: iwpriv wlan0 txpow5g
513*5113495bSYour Name  *
514*5113495bSYour Name  * Supported Feature: STA
515*5113495bSYour Name  *
516*5113495bSYour Name  * Usage: Internal/External
517*5113495bSYour Name  *
518*5113495bSYour Name  * </ioctl>
519*5113495bSYour Name  */
520*5113495bSYour Name #define WE_SET_TXPOW_5G      30
521*5113495bSYour Name /* Private ioctl for firmware debug log */
522*5113495bSYour Name #define WE_DBGLOG_LOG_LEVEL             31
523*5113495bSYour Name #define WE_DBGLOG_VAP_ENABLE            32
524*5113495bSYour Name #define WE_DBGLOG_VAP_DISABLE           33
525*5113495bSYour Name #define WE_DBGLOG_MODULE_ENABLE         34
526*5113495bSYour Name #define WE_DBGLOG_MODULE_DISABLE        35
527*5113495bSYour Name #define WE_DBGLOG_MOD_LOG_LEVEL         36
528*5113495bSYour Name #define WE_DBGLOG_TYPE                  37
529*5113495bSYour Name #define WE_SET_TXRX_FWSTATS             38
530*5113495bSYour Name /*
531*5113495bSYour Name  * <ioctl>
532*5113495bSYour Name  * set11ACRates  - Fixes the Tx data rate of 11AC
533*5113495bSYour Name  *
534*5113495bSYour Name  * @INPUT: 0x1 to 0x9
535*5113495bSYour Name  *
536*5113495bSYour Name  * @OUTPUT: None
537*5113495bSYour Name  *
538*5113495bSYour Name  * This IOCTL fixes the Tx data rate of 11AC.
539*5113495bSYour Name  *
540*5113495bSYour Name  * @E.g: iwpriv wlan0 set11ACRates 0x9
541*5113495bSYour Name  *
542*5113495bSYour Name  * Supported Feature: STA
543*5113495bSYour Name  *
544*5113495bSYour Name  * Usage: Internal/External
545*5113495bSYour Name  *
546*5113495bSYour Name  * </ioctl>
547*5113495bSYour Name  */
548*5113495bSYour Name #define WE_SET_VHT_RATE                 39
549*5113495bSYour Name #define WE_DBGLOG_REPORT_ENABLE         40
550*5113495bSYour Name #define WE_TXRX_FWSTATS_RESET           41
551*5113495bSYour Name /*
552*5113495bSYour Name  * <ioctl>
553*5113495bSYour Name  * setTxMaxPower2G - Set the maximum transmit power for the 2.4-GHz band
554*5113495bSYour Name  *
555*5113495bSYour Name  * @INPUT: Transmission power in dBm
556*5113495bSYour Name  *
557*5113495bSYour Name  * @OUTPUT: None
558*5113495bSYour Name  *
559*5113495bSYour Name  * This IOCTL sets the maximum transmit power for the 2.4-GHz band
560*5113495bSYour Name  * This setting does not persist over reboots
561*5113495bSYour Name  *
562*5113495bSYour Name  * @E.g: iwpriv wlan0 setTxMaxPower2G 10
563*5113495bSYour Name  *
564*5113495bSYour Name  * Supported Feature: STA
565*5113495bSYour Name  *
566*5113495bSYour Name  * Usage: Internal/External
567*5113495bSYour Name  *
568*5113495bSYour Name  * </ioctl>
569*5113495bSYour Name  */
570*5113495bSYour Name #define WE_SET_MAX_TX_POWER_2_4   42
571*5113495bSYour Name /*
572*5113495bSYour Name  * <ioctl>
573*5113495bSYour Name  * setTxMaxPower5G - Set the maximum transmit power for the 5-GHz band
574*5113495bSYour Name  *
575*5113495bSYour Name  * @INPUT: Transmission power in dBm
576*5113495bSYour Name  *
577*5113495bSYour Name  * @OUTPUT: None
578*5113495bSYour Name  *
579*5113495bSYour Name  * This IOCTL sets the maximum transmit power for the 5-GHz band
580*5113495bSYour Name  * This setting does not persist over reboots
581*5113495bSYour Name  *
582*5113495bSYour Name  * @E.g: iwpriv wlan0 setTxMaxPower5G 10
583*5113495bSYour Name  *
584*5113495bSYour Name  * Supported Feature: STA
585*5113495bSYour Name  *
586*5113495bSYour Name  * Usage: Internal/External
587*5113495bSYour Name  *
588*5113495bSYour Name  * </ioctl>
589*5113495bSYour Name  */
590*5113495bSYour Name #define WE_SET_MAX_TX_POWER_5_0   43
591*5113495bSYour Name #define WE_SET_PKTLOG                   44
592*5113495bSYour Name /* Private ioctl for packet power save */
593*5113495bSYour Name #define  WE_PPS_PAID_MATCH              45
594*5113495bSYour Name #define  WE_PPS_GID_MATCH               46
595*5113495bSYour Name #define  WE_PPS_EARLY_TIM_CLEAR         47
596*5113495bSYour Name #define  WE_PPS_EARLY_DTIM_CLEAR        48
597*5113495bSYour Name #define  WE_PPS_EOF_PAD_DELIM           49
598*5113495bSYour Name #define  WE_PPS_MACADDR_MISMATCH        50
599*5113495bSYour Name #define  WE_PPS_DELIM_CRC_FAIL          51
600*5113495bSYour Name #define  WE_PPS_GID_NSTS_ZERO           52
601*5113495bSYour Name /*
602*5113495bSYour Name  * <ioctl>
603*5113495bSYour Name  * rssi_chk - Check the rssi
604*5113495bSYour Name  *
605*5113495bSYour Name  * @INPUT: One argument as input
606*5113495bSYour Name  *
607*5113495bSYour Name  * @OUTPUT: rssi
608*5113495bSYour Name  *  wlan0	rssi_chk:56
609*5113495bSYour Name  *
610*5113495bSYour Name  * This IOTCL used to check rssi
611*5113495bSYour Name  *
612*5113495bSYour Name  * @E.g: iwpriv wlan0 rssi_chk <value>
613*5113495bSYour Name  *
614*5113495bSYour Name  * Supported Feature: STA
615*5113495bSYour Name  *
616*5113495bSYour Name  * Usage: Internal/External
617*5113495bSYour Name  *
618*5113495bSYour Name  * </ioctl>
619*5113495bSYour Name  */
620*5113495bSYour Name #define  WE_PPS_RSSI_CHECK              53
621*5113495bSYour Name /*
622*5113495bSYour Name  * <ioctl>
623*5113495bSYour Name  * htsmps - Sets the htsmps
624*5113495bSYour Name  *
625*5113495bSYour Name  * @INPUT: Atleast one int argument
626*5113495bSYour Name  *
627*5113495bSYour Name  * @OUTPUT: None
628*5113495bSYour Name  *
629*5113495bSYour Name  * This IOTCL used to set htsmps
630*5113495bSYour Name  *
631*5113495bSYour Name  * @E.g: iwpriv wlan0 htsmps <value>
632*5113495bSYour Name  *
633*5113495bSYour Name  * Supported Feature: STA
634*5113495bSYour Name  *
635*5113495bSYour Name  * Usage: Internal/External
636*5113495bSYour Name  *
637*5113495bSYour Name  * </ioctl>
638*5113495bSYour Name  */
639*5113495bSYour Name #define WE_SET_HTSMPS                   55
640*5113495bSYour Name /* Private ioctl for QPower */
641*5113495bSYour Name #define WE_SET_QPOWER_MAX_PSPOLL_COUNT            56
642*5113495bSYour Name #define WE_SET_QPOWER_MAX_TX_BEFORE_WAKE          57
643*5113495bSYour Name #define WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL   58
644*5113495bSYour Name #define WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 59
645*5113495bSYour Name /* GTX Commands */
646*5113495bSYour Name /*
647*5113495bSYour Name  * <ioctl>
648*5113495bSYour Name  * gtxHTMcs - Set the tx HTM value
649*5113495bSYour Name  *
650*5113495bSYour Name  * @INPUT: Atleast one int orgument
651*5113495bSYour Name  *
652*5113495bSYour Name  * @OUTPUT: None
653*5113495bSYour Name  *
654*5113495bSYour Name  * This IOTCL sets htm tx value
655*5113495bSYour Name  *
656*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxHTMcs <value>
657*5113495bSYour Name  *
658*5113495bSYour Name  * Supported Feature: STA
659*5113495bSYour Name  *
660*5113495bSYour Name  * Usage: Internal/External
661*5113495bSYour Name  *
662*5113495bSYour Name  * </ioctl>
663*5113495bSYour Name  */
664*5113495bSYour Name #define WE_SET_GTX_HT_MCS               62
665*5113495bSYour Name /*
666*5113495bSYour Name  * <ioctl>
667*5113495bSYour Name  * gtxVHTMcs - Set gtxVHTMcs value
668*5113495bSYour Name  *
669*5113495bSYour Name  * @INPUT: Atleast one int argument
670*5113495bSYour Name  *
671*5113495bSYour Name  * @OUTPUT: None
672*5113495bSYour Name  *
673*5113495bSYour Name  * This IOTCL used to set gtxVHTMcs value
674*5113495bSYour Name  *
675*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxVHTMcs <value>
676*5113495bSYour Name  *
677*5113495bSYour Name  * Supported Feature: STA
678*5113495bSYour Name  *
679*5113495bSYour Name  * Usage: Internal/External
680*5113495bSYour Name  *
681*5113495bSYour Name  * </ioctl>
682*5113495bSYour Name  */
683*5113495bSYour Name #define WE_SET_GTX_VHT_MCS              63
684*5113495bSYour Name /*
685*5113495bSYour Name  * <ioctl>
686*5113495bSYour Name  * gtxUsrCfg - Host request for GTX mask
687*5113495bSYour Name  *
688*5113495bSYour Name  * @INPUT: Atleast one int orgument
689*5113495bSYour Name  *
690*5113495bSYour Name  * @OUTPUT: None
691*5113495bSYour Name  *
692*5113495bSYour Name  * This IOTCL used send the host request for GTX mask
693*5113495bSYour Name  *
694*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxUsrCfg <value>
695*5113495bSYour Name  *
696*5113495bSYour Name  * Supported Feature: STA
697*5113495bSYour Name  *
698*5113495bSYour Name  * Usage: Internal/External
699*5113495bSYour Name  *
700*5113495bSYour Name  * </ioctl>
701*5113495bSYour Name  */
702*5113495bSYour Name #define WE_SET_GTX_USRCFG               64
703*5113495bSYour Name /*
704*5113495bSYour Name  * <ioctl>
705*5113495bSYour Name  * gtxThre - Set the tx threshold
706*5113495bSYour Name  *
707*5113495bSYour Name  * @INPUT: Atleast one int argument
708*5113495bSYour Name  *
709*5113495bSYour Name  * @OUTPUT: None
710*5113495bSYour Name  *
711*5113495bSYour Name  * This IOTCL used to set tx threshold
712*5113495bSYour Name  *
713*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxThre <value>
714*5113495bSYour Name  *
715*5113495bSYour Name  * Supported Feature: STA
716*5113495bSYour Name  *
717*5113495bSYour Name  * Usage: Internal/External
718*5113495bSYour Name  *
719*5113495bSYour Name  * </ioctl>
720*5113495bSYour Name  */
721*5113495bSYour Name #define WE_SET_GTX_THRE                 65
722*5113495bSYour Name /*
723*5113495bSYour Name  * <ioctl>
724*5113495bSYour Name  * gtxMargin  - Set the gtxMargin
725*5113495bSYour Name  *
726*5113495bSYour Name  * @INPUT: 1 to 32
727*5113495bSYour Name  *
728*5113495bSYour Name  * @OUTPUT: None
729*5113495bSYour Name  *
730*5113495bSYour Name  * This IOTCL use dto set gtxMargin
731*5113495bSYour Name  *
732*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxMargini <value>
733*5113495bSYour Name  *
734*5113495bSYour Name  * Supported Feature: STA
735*5113495bSYour Name  *
736*5113495bSYour Name  * Usage: Internal/External
737*5113495bSYour Name  *
738*5113495bSYour Name  * </ioctl>
739*5113495bSYour Name  */
740*5113495bSYour Name #define WE_SET_GTX_MARGIN               66
741*5113495bSYour Name /*
742*5113495bSYour Name  * <ioctl>
743*5113495bSYour Name  * gtxStep - Set the gtxStep
744*5113495bSYour Name  *
745*5113495bSYour Name  * @INPUT: None
746*5113495bSYour Name  *
747*5113495bSYour Name  * @OUTPUT: None
748*5113495bSYour Name  *
749*5113495bSYour Name  * This IOTCL used to sets gtxStep
750*5113495bSYour Name  *
751*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxStep <value>
752*5113495bSYour Name  *
753*5113495bSYour Name  * Supported Feature: STA
754*5113495bSYour Name  *
755*5113495bSYour Name  * Usage: Internal/External
756*5113495bSYour Name  *
757*5113495bSYour Name  * </ioctl>
758*5113495bSYour Name  */
759*5113495bSYour Name #define WE_SET_GTX_STEP                 67
760*5113495bSYour Name /*
761*5113495bSYour Name  * <ioctl>
762*5113495bSYour Name  * gtxMinTpc - Sets the gtxMinTpc
763*5113495bSYour Name  *
764*5113495bSYour Name  * @INPUT: Atleast one int argument
765*5113495bSYour Name  *
766*5113495bSYour Name  * @OUTPUT: None
767*5113495bSYour Name  *
768*5113495bSYour Name  * This IOTCL sets the tx MinTpc
769*5113495bSYour Name  *
770*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxMinTpc <value>
771*5113495bSYour Name  *
772*5113495bSYour Name  * Supported Feature: STA
773*5113495bSYour Name  *
774*5113495bSYour Name  * Usage: Internal/External
775*5113495bSYour Name  *
776*5113495bSYour Name  * </ioctl>
777*5113495bSYour Name  */
778*5113495bSYour Name #define WE_SET_GTX_MINTPC               68
779*5113495bSYour Name /*
780*5113495bSYour Name  * <ioctl>
781*5113495bSYour Name  * gtxBWMask - Sets the BW mask (20/40/80/160 Mhz)
782*5113495bSYour Name  *
783*5113495bSYour Name  * @INPUT: Mask value
784*5113495bSYour Name  *
785*5113495bSYour Name  * @OUTPUT: None
786*5113495bSYour Name  *
787*5113495bSYour Name  * This IOTCL used to set gtxBWMask
788*5113495bSYour Name  *
789*5113495bSYour Name  * @E.g: iwpriv wlan0 gtxBWMask <value>
790*5113495bSYour Name  *
791*5113495bSYour Name  * Supported Feature: STA
792*5113495bSYour Name  *
793*5113495bSYour Name  * Usage: Internal/External
794*5113495bSYour Name  *
795*5113495bSYour Name  * </ioctl>
796*5113495bSYour Name  */
797*5113495bSYour Name 
798*5113495bSYour Name #define WE_SET_GTX_BWMASK               69
799*5113495bSYour Name /*
800*5113495bSYour Name  * <ioctl>
801*5113495bSYour Name  * setMccLatency - Sets the MCC latency value during STA-P2P concurrency
802*5113495bSYour Name  *
803*5113495bSYour Name  * @INPUT: set_value
804*5113495bSYour Name  *
805*5113495bSYour Name  * @OUTPUT: None
806*5113495bSYour Name  *
807*5113495bSYour Name  * This IOCTL is used to set the MCC latency value in milliseconds
808*5113495bSYour Name  * during STA-P2P concurrency.
809*5113495bSYour Name  *
810*5113495bSYour Name  * If 0ms latency is provided, then FW will set to a default.
811*5113495bSYour Name  * Otherwise, latency must be at least 30ms.
812*5113495bSYour Name  *
813*5113495bSYour Name  * @E.g: iwpriv wlan0 setMccLatency 40
814*5113495bSYour Name  *
815*5113495bSYour Name  *
816*5113495bSYour Name  * Supported Feature: Concurrency
817*5113495bSYour Name  *
818*5113495bSYour Name  * Usage: Internal/External
819*5113495bSYour Name  *
820*5113495bSYour Name  * </ioctl>
821*5113495bSYour Name  */
822*5113495bSYour Name #define WE_MCC_CONFIG_LATENCY           70
823*5113495bSYour Name 
824*5113495bSYour Name /*
825*5113495bSYour Name  * <ioctl>
826*5113495bSYour Name  * setMccQuota- Set the quota for P2P cases
827*5113495bSYour Name  *
828*5113495bSYour Name  * @INPUT: set_value [0,100]
829*5113495bSYour Name  *
830*5113495bSYour Name  * @OUTPUT: None
831*5113495bSYour Name  *
832*5113495bSYour Name  * This IOCTL is used to set the quota in milliseconds for P2P_GO/STA.
833*5113495bSYour Name  *
834*5113495bSYour Name  * Currently used to set time quota for 2 MCC vdevs/adapters using
835*5113495bSYour Name  * (operating channel, quota) for each mode.
836*5113495bSYour Name  * The info is provided run time using iwpriv command:
837*5113495bSYour Name  * iwpriv <wlan0 | p2p0> setMccQuota <quota in ms>.
838*5113495bSYour Name  * Note: the quota provided in command is for the same mode in cmd.
839*5113495bSYour Name  * HDD checks if MCC mode is active, gets the second mode and its
840*5113495bSYour Name  * operating chan.
841*5113495bSYour Name  * Quota for the 2nd role is calculated as 100 - quota of first mode.
842*5113495bSYour Name  *
843*5113495bSYour Name  * @E.g: iwpriv wlan0 setMccQuota 50
844*5113495bSYour Name  *       iwpriv p2p0 setMccQuota 50
845*5113495bSYour Name  *
846*5113495bSYour Name  * Supported Feature: Concurrency
847*5113495bSYour Name  *
848*5113495bSYour Name  * Usage: Internal/External
849*5113495bSYour Name  *
850*5113495bSYour Name  * </ioctl>
851*5113495bSYour Name  */
852*5113495bSYour Name #define WE_MCC_CONFIG_QUOTA             71
853*5113495bSYour Name /* Private IOCTL for debug connection issues */
854*5113495bSYour Name #define WE_SET_DEBUG_LOG                72
855*5113495bSYour Name #ifdef WE_SET_TX_POWER
856*5113495bSYour Name #undef WE_SET_TX_POWER
857*5113495bSYour Name #endif
858*5113495bSYour Name 
859*5113495bSYour Name /*
860*5113495bSYour Name  * <ioctl>
861*5113495bSYour Name  * setTxPower - Set the current transmit power
862*5113495bSYour Name  *
863*5113495bSYour Name  * @INPUT: Transmission power in dBm
864*5113495bSYour Name  *
865*5113495bSYour Name  * @OUTPUT: None
866*5113495bSYour Name  *
867*5113495bSYour Name  * This IOCTL sets the current transmit power.
868*5113495bSYour Name  * This setting does not persist over reboots.
869*5113495bSYour Name  *
870*5113495bSYour Name  * @E.g: iwpriv wlan0 setTxPower 10
871*5113495bSYour Name  *
872*5113495bSYour Name  * Supported Feature: STA
873*5113495bSYour Name  *
874*5113495bSYour Name  * Usage: Internal/External
875*5113495bSYour Name  *
876*5113495bSYour Name  * </ioctl>
877*5113495bSYour Name  */
878*5113495bSYour Name #define WE_SET_TX_POWER                 74
879*5113495bSYour Name /* Private ioctl for earlyrx power save feature */
880*5113495bSYour Name #define WE_SET_EARLY_RX_ADJUST_ENABLE         75
881*5113495bSYour Name #define WE_SET_EARLY_RX_TGT_BMISS_NUM         76
882*5113495bSYour Name #define WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE    77
883*5113495bSYour Name #define WE_SET_EARLY_RX_SLOP_STEP             78
884*5113495bSYour Name #define WE_SET_EARLY_RX_INIT_SLOP             79
885*5113495bSYour Name #define WE_SET_EARLY_RX_ADJUST_PAUSE          80
886*5113495bSYour Name /*
887*5113495bSYour Name  * <ioctl>
888*5113495bSYour Name  * setMcRate  - Set the data rate for multicast data
889*5113495bSYour Name  *
890*5113495bSYour Name  * @INPUT: 1 to 32
891*5113495bSYour Name  *
892*5113495bSYour Name  * @OUTPUT: None
893*5113495bSYour Name  *
894*5113495bSYour Name  * This IOCTL sets the data rate for multicast data. Note that this command
895*5113495bSYour Name  * is allowed only in STA or QCMobileAP mode
896*5113495bSYour Name  *
897*5113495bSYour Name  * @E.g: iwpriv wlan0 setMcRate <value>
898*5113495bSYour Name  *
899*5113495bSYour Name  * Supported Feature: STA
900*5113495bSYour Name  *
901*5113495bSYour Name  * Usage: Internal/External
902*5113495bSYour Name  *
903*5113495bSYour Name  * </ioctl>
904*5113495bSYour Name  */
905*5113495bSYour Name #define WE_SET_MC_RATE                        81
906*5113495bSYour Name #define WE_SET_EARLY_RX_DRIFT_SAMPLE          82
907*5113495bSYour Name /* Private ioctl for packet power save */
908*5113495bSYour Name /*
909*5113495bSYour Name  * <ioctl>
910*5113495bSYour Name  * 5g_ebt - Sets the 5g_ebt
911*5113495bSYour Name  *
912*5113495bSYour Name  * @INPUT: <value>
913*5113495bSYour Name  *
914*5113495bSYour Name  * @OUTPUT: None
915*5113495bSYour Name  *
916*5113495bSYour Name  * This IOTCL used to set 5g_ebt
917*5113495bSYour Name  *
918*5113495bSYour Name  * @E.g: iwpriv wlan0 5g_ebt <value>
919*5113495bSYour Name  *
920*5113495bSYour Name  * Supported Feature: STA
921*5113495bSYour Name  *
922*5113495bSYour Name  * Usage: Internal/External
923*5113495bSYour Name  *
924*5113495bSYour Name  * </ioctl>
925*5113495bSYour Name  */
926*5113495bSYour Name #define WE_PPS_5G_EBT                         83
927*5113495bSYour Name /*
928*5113495bSYour Name  * <ioctl>
929*5113495bSYour Name  * cts_cbw  - Set CTS channel BW for dynamic BW adjustment
930*5113495bSYour Name  *
931*5113495bSYour Name  * @INPUT: 20 t0 160
932*5113495bSYour Name  *
933*5113495bSYour Name  * @OUTPUT: None
934*5113495bSYour Name  *
935*5113495bSYour Name  * This IOTCL used to set CTS channel BW for dynamic BW adjustment
936*5113495bSYour Name  *
937*5113495bSYour Name  * @E.g: iwpriv wlan0 cts_cbw <value>
938*5113495bSYour Name  *
939*5113495bSYour Name  * Supported Feature: STA
940*5113495bSYour Name  *
941*5113495bSYour Name  * Usage: Internal/External
942*5113495bSYour Name  *
943*5113495bSYour Name  * </ioctl>
944*5113495bSYour Name  */
945*5113495bSYour Name #define WE_SET_CTS_CBW                        84
946*5113495bSYour Name #define WE_DUMP_STATS                         85
947*5113495bSYour Name #define WE_CLEAR_STATS                        86
948*5113495bSYour Name /* Private sub ioctl for starting/stopping the profiling */
949*5113495bSYour Name #define WE_START_FW_PROFILE                      87
950*5113495bSYour Name 
951*5113495bSYour Name /*
952*5113495bSYour Name  * <ioctl>
953*5113495bSYour Name  * setChanChange - Initiate channel change
954*5113495bSYour Name  *
955*5113495bSYour Name  * @INPUT: channel number to switch to.
956*5113495bSYour Name  *
957*5113495bSYour Name  * @OUTPUT: None
958*5113495bSYour Name  *
959*5113495bSYour Name  * This IOCTL is used to initiate a channel change.
960*5113495bSYour Name  * If called on STA/CLI interface it will send the
961*5113495bSYour Name  * ECSA action frame to the connected SAP/GO asking to
962*5113495bSYour Name  * initiate the ECSA, if supported.
963*5113495bSYour Name  * If called on SAP/GO interface it will initiate
964*5113495bSYour Name  * ECSA and ask connected peers to move to new channel.
965*5113495bSYour Name  *
966*5113495bSYour Name  * @E.g: iwpriv wlan0 setChanChange <channel>
967*5113495bSYour Name  * iwpriv wlan0 setChanChange 1
968*5113495bSYour Name  *
969*5113495bSYour Name  * Supported Feature: ECSA
970*5113495bSYour Name  *
971*5113495bSYour Name  * Usage: Internal/External
972*5113495bSYour Name  *
973*5113495bSYour Name  * </ioctl>
974*5113495bSYour Name  */
975*5113495bSYour Name #define WE_SET_CHANNEL                        88
976*5113495bSYour Name #define WE_SET_CONC_SYSTEM_PREF               89
977*5113495bSYour Name 
978*5113495bSYour Name /*
979*5113495bSYour Name  * <ioctl>
980*5113495bSYour Name  * set_11ax_rate - set 11ax rates to FW
981*5113495bSYour Name  *
982*5113495bSYour Name  * @INPUT: rate code
983*5113495bSYour Name  *
984*5113495bSYour Name  * @OUTPUT: None
985*5113495bSYour Name  *
986*5113495bSYour Name  * This IOCTL fixes the Tx data rate of 11AX.
987*5113495bSYour Name  *
988*5113495bSYour Name  * @E.g: iwpriv wlan0 set_11ax_rate <rate code>
989*5113495bSYour Name  *
990*5113495bSYour Name  * Supported Feature: STA/SAP
991*5113495bSYour Name  *
992*5113495bSYour Name  * Usage: Internal
993*5113495bSYour Name  *
994*5113495bSYour Name  * </ioctl>
995*5113495bSYour Name  */
996*5113495bSYour Name #define WE_SET_11AX_RATE                      91
997*5113495bSYour Name 
998*5113495bSYour Name /*
999*5113495bSYour Name  * <ioctl>
1000*5113495bSYour Name  * enable_dcm - enable Dual Carrier Modulation(DCM)
1001*5113495bSYour Name  *
1002*5113495bSYour Name  * @INPUT: 0/1
1003*5113495bSYour Name  *
1004*5113495bSYour Name  * @OUTPUT: None
1005*5113495bSYour Name  *
1006*5113495bSYour Name  * This IOCTL enables/disables DCM.
1007*5113495bSYour Name  *
1008*5113495bSYour Name  * @E.g: iwpriv wlan0 enable_dcm <0/1>
1009*5113495bSYour Name  *
1010*5113495bSYour Name  * Supported Feature: STA/SAP
1011*5113495bSYour Name  *
1012*5113495bSYour Name  * Usage: Internal
1013*5113495bSYour Name  *
1014*5113495bSYour Name  * </ioctl>
1015*5113495bSYour Name  */
1016*5113495bSYour Name #define WE_SET_DCM                            92
1017*5113495bSYour Name 
1018*5113495bSYour Name /*
1019*5113495bSYour Name  * <ioctl>
1020*5113495bSYour Name  * range_ext - enable Range extension
1021*5113495bSYour Name  *
1022*5113495bSYour Name  * @INPUT: 0/1
1023*5113495bSYour Name  *
1024*5113495bSYour Name  * @OUTPUT: None
1025*5113495bSYour Name  *
1026*5113495bSYour Name  * This IOCTL enables/disables Range extension.
1027*5113495bSYour Name  *
1028*5113495bSYour Name  * @E.g: iwpriv wlan0 range_ext <1/0>
1029*5113495bSYour Name  *
1030*5113495bSYour Name  * Supported Feature: STA/SAP
1031*5113495bSYour Name  *
1032*5113495bSYour Name  * Usage: Internal
1033*5113495bSYour Name  *
1034*5113495bSYour Name  * </ioctl>
1035*5113495bSYour Name  */
1036*5113495bSYour Name #define WE_SET_RANGE_EXT                      93
1037*5113495bSYour Name 
1038*5113495bSYour Name /*
1039*5113495bSYour Name  * <ioctl>
1040*5113495bSYour Name  * wow_ito - sets the timeout value for inactivity data while
1041*5113495bSYour Name  * in power save mode during wow
1042*5113495bSYour Name  *
1043*5113495bSYour Name  * @INPUT: int
1044*5113495bSYour Name  *
1045*5113495bSYour Name  * @OUTPUT: None
1046*5113495bSYour Name  *
1047*5113495bSYour Name  * This IOCTL set the timeout value for inactivity data in power save mode
1048*5113495bSYour Name  *
1049*5113495bSYour Name  * @E.g: iwpriv wlan0 wow_ito 20
1050*5113495bSYour Name  *
1051*5113495bSYour Name  * Supported Feature: STA
1052*5113495bSYour Name  *
1053*5113495bSYour Name  * Usage: External
1054*5113495bSYour Name  *
1055*5113495bSYour Name  * </ioctl>
1056*5113495bSYour Name  */
1057*5113495bSYour Name #define WE_SET_WOW_DATA_INACTIVITY_TO    94
1058*5113495bSYour Name 
1059*5113495bSYour Name /*
1060*5113495bSYour Name  * <ioctl>
1061*5113495bSYour Name  * pdev_reset - reset the pdev
1062*5113495bSYour Name  *
1063*5113495bSYour Name  * @INPUT: Reset command to initiate:
1064*5113495bSYour Name  *    TX_FLUSH = 1
1065*5113495bSYour Name  *    WARM_RESET = 2
1066*5113495bSYour Name  *    COLD_RESET = 3
1067*5113495bSYour Name  *    WARM_RESET_RESTORE_CAL = 4
1068*5113495bSYour Name  *    COLD_RESET_RESTORE_CAL = 5
1069*5113495bSYour Name  *
1070*5113495bSYour Name  * @OUTPUT: None
1071*5113495bSYour Name  *
1072*5113495bSYour Name  * This IOCTL is used to reset the pdev. The primary use is
1073*5113495bSYour Name  * for internal testing. It is not expected that this will
1074*5113495bSYour Name  * be used on a production device.
1075*5113495bSYour Name  *
1076*5113495bSYour Name  * @E.g: iwpriv wlan0 pdev_reset <command>
1077*5113495bSYour Name  * iwpriv wlan0 pdev_reset 1
1078*5113495bSYour Name  *
1079*5113495bSYour Name  * Supported Feature: None
1080*5113495bSYour Name  *
1081*5113495bSYour Name  * Usage: Internal
1082*5113495bSYour Name  *
1083*5113495bSYour Name  * </ioctl>
1084*5113495bSYour Name  */
1085*5113495bSYour Name #define WE_SET_PDEV_RESET    95
1086*5113495bSYour Name 
1087*5113495bSYour Name /*
1088*5113495bSYour Name  * setModDTIM - Change Modulated DTIM
1089*5113495bSYour Name  *
1090*5113495bSYour Name  * @INPUT: set_value.
1091*5113495bSYour Name  *
1092*5113495bSYour Name  * @OUTPUT: None
1093*5113495bSYour Name  *
1094*5113495bSYour Name  * This IOCTL is used to change modulated DTIM
1095*5113495bSYour Name  * value without WIFI OFF/ON.
1096*5113495bSYour Name  *
1097*5113495bSYour Name  * @E.g: iwpriv wlan0 setModDTIM <value>
1098*5113495bSYour Name  * iwpriv wlan0 setModDTIM 2
1099*5113495bSYour Name  *
1100*5113495bSYour Name  * Supported Feature: N/A
1101*5113495bSYour Name  *
1102*5113495bSYour Name  * Usage: Internal/External
1103*5113495bSYour Name  *
1104*5113495bSYour Name  * </ioctl>
1105*5113495bSYour Name  */
1106*5113495bSYour Name #define WE_SET_MODULATED_DTIM                   96
1107*5113495bSYour Name 
1108*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
1109*5113495bSYour Name #define WE_MOTION_DET_START_STOP                97
1110*5113495bSYour Name #define WE_MOTION_DET_BASE_LINE_START_STOP      98
1111*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
1112*5113495bSYour Name 
1113*5113495bSYour Name /*
1114*5113495bSYour Name  * set_btc_mode Set BTCoexMode
1115*5113495bSYour Name  *
1116*5113495bSYour Name  * @INPUT: set_value.
1117*5113495bSYour Name  *
1118*5113495bSYour Name  * @OUTPUT: None
1119*5113495bSYour Name  *
1120*5113495bSYour Name  * This IOCTL is used to set the BT COex operating mode
1121*5113495bSYour Name  * Allowed values are 0(TDD), 1(FDD), 2(Hybrid)
1122*5113495bSYour Name  *
1123*5113495bSYour Name  * @E.g: iwpriv wlan0 set_btc_mode  <value>
1124*5113495bSYour Name  * iwpriv wlan0 set_btc_mode 2
1125*5113495bSYour Name  *
1126*5113495bSYour Name  * Supported Feature: N/A
1127*5113495bSYour Name  *
1128*5113495bSYour Name  * Usage: Internal/External
1129*5113495bSYour Name  *
1130*5113495bSYour Name  * </ioctl>
1131*5113495bSYour Name  */
1132*5113495bSYour Name #define WE_SET_BTCOEX_MODE	99
1133*5113495bSYour Name 
1134*5113495bSYour Name /*
1135*5113495bSYour Name  * set_btc_rssi- Set WLAN low RSSI threshold for BTCOex
1136*5113495bSYour Name  *
1137*5113495bSYour Name  * @INPUT: set_value.
1138*5113495bSYour Name  *
1139*5113495bSYour Name  * @OUTPUT: None
1140*5113495bSYour Name  *
1141*5113495bSYour Name  * This IOCTL is used to modify the threshold at which
1142*5113495bSYour Name  * the COex mode changes from TDD to Hybrid mode
1143*5113495bSYour Name  * Allowed values are from -100 to 0
1144*5113495bSYour Name  *
1145*5113495bSYour Name  * @E.g: iwpriv wlan0 set_btc_rssi <value>
1146*5113495bSYour Name  * iwpriv wlan0 set_btc_rssi -70
1147*5113495bSYour Name  *
1148*5113495bSYour Name  * Supported Feature: N/A
1149*5113495bSYour Name  *
1150*5113495bSYour Name  * Usage: Internal/External
1151*5113495bSYour Name  *
1152*5113495bSYour Name  * </ioctl>
1153*5113495bSYour Name  */
1154*5113495bSYour Name #define WE_SET_BTCOEX_RSSI_THRESHOLD	100
1155*5113495bSYour Name 
1156*5113495bSYour Name /* Private ioctls and their sub-ioctls */
1157*5113495bSYour Name #define WLAN_PRIV_SET_NONE_GET_INT    (SIOCIWFIRSTPRIV + 1)
1158*5113495bSYour Name #define WE_GET_11D_STATE     1
1159*5113495bSYour Name #define WE_GET_WLAN_DBG      4
1160*5113495bSYour Name #define WE_GET_MAX_ASSOC     6
1161*5113495bSYour Name /* 7 is unused */
1162*5113495bSYour Name #define WE_GET_SAP_AUTO_CHANNEL_SELECTION 8
1163*5113495bSYour Name 
1164*5113495bSYour Name /*
1165*5113495bSYour Name  * <ioctl>
1166*5113495bSYour Name  * getconcurrency - Get concurrency mode
1167*5113495bSYour Name  *
1168*5113495bSYour Name  * @INPUT: None
1169*5113495bSYour Name  *
1170*5113495bSYour Name  * @OUTPUT: It shows concurrency value
1171*5113495bSYour Name  * Bit 0:STA   1:SAP     2:P2P_Client  3:P2P_GO
1172*5113495bSYour Name  *     4:FTM   5:IBSS    6:Monitor     7:P2P_Device
1173*5113495bSYour Name  *     8:OCB   9:EPPING  10:QVIT       11:NDI
1174*5113495bSYour Name  *
1175*5113495bSYour Name  * This IOCTL is used to retrieve concurrency mode.
1176*5113495bSYour Name  *
1177*5113495bSYour Name  * @E.g: iwpriv wlan0 getconcurrency
1178*5113495bSYour Name  * wlan0     getconcurrency:5
1179*5113495bSYour Name  * Above value shows STA+P2P_Client
1180*5113495bSYour Name  *
1181*5113495bSYour Name  * Supported Feature: Concurrency
1182*5113495bSYour Name  *
1183*5113495bSYour Name  * Usage: Internal/External
1184*5113495bSYour Name  *
1185*5113495bSYour Name  * </ioctl>
1186*5113495bSYour Name  */
1187*5113495bSYour Name #define WE_GET_CONCURRENCY_MODE 9
1188*5113495bSYour Name /*
1189*5113495bSYour Name  * <ioctl>
1190*5113495bSYour Name  * get_nss - Get the number of spatial STBC streams (NSS)
1191*5113495bSYour Name  *
1192*5113495bSYour Name  * @INPUT: None
1193*5113495bSYour Name  *
1194*5113495bSYour Name  * @OUTPUT: NSS
1195*5113495bSYour Name  *  wlan0     get_nss:2
1196*5113495bSYour Name  *
1197*5113495bSYour Name  * This IOTCL used to get the number of spatial STBC streams
1198*5113495bSYour Name  *
1199*5113495bSYour Name  * @E.g: iwpriv wlan0 get_nss
1200*5113495bSYour Name  *
1201*5113495bSYour Name  * Supported Feature: STA
1202*5113495bSYour Name  *
1203*5113495bSYour Name  * Usage: Internal/External
1204*5113495bSYour Name  *
1205*5113495bSYour Name  * </ioctl>
1206*5113495bSYour Name  */
1207*5113495bSYour Name #define WE_GET_NSS           11
1208*5113495bSYour Name /*
1209*5113495bSYour Name  * <ioctl>
1210*5113495bSYour Name  * get_ldpc - This IOCTL gets the low density parity check (LDPC)
1211*5113495bSYour Name  *
1212*5113495bSYour Name  * @INPUT: None
1213*5113495bSYour Name  *
1214*5113495bSYour Name  * @OUTPUT: ldpc
1215*5113495bSYour Name  *  wlan0     get_ldpc:1
1216*5113495bSYour Name  *
1217*5113495bSYour Name  * This IOTCL used to gets the low density parity check (LDPC)
1218*5113495bSYour Name  *
1219*5113495bSYour Name  * @E.g: iwpriv wlan0 get_ldpc
1220*5113495bSYour Name  *
1221*5113495bSYour Name  * Supported Feature: STA
1222*5113495bSYour Name  *
1223*5113495bSYour Name  * Usage: Internal/External
1224*5113495bSYour Name  *
1225*5113495bSYour Name  * </ioctl>
1226*5113495bSYour Name  */
1227*5113495bSYour Name #define WE_GET_LDPC          12
1228*5113495bSYour Name /*
1229*5113495bSYour Name  * <ioctl>
1230*5113495bSYour Name  * get_tx_stbc - Get the value of the current Tx space time block code (STBC)
1231*5113495bSYour Name  *
1232*5113495bSYour Name  * @INPUT: None
1233*5113495bSYour Name  *
1234*5113495bSYour Name  * @OUTPUT: TXSTBC
1235*5113495bSYour Name  *  wlan0     get_tx_stbc:1
1236*5113495bSYour Name  *
1237*5113495bSYour Name  * This IOTCL get the value of the current Tx space time block code (STBC)
1238*5113495bSYour Name  *
1239*5113495bSYour Name  * @E.g: iwpriv wlan0 get_tx_stbc
1240*5113495bSYour Name  *
1241*5113495bSYour Name  * Supported Feature: STA
1242*5113495bSYour Name  *
1243*5113495bSYour Name  * Usage: Internal/External
1244*5113495bSYour Name  *
1245*5113495bSYour Name  * </ioctl>
1246*5113495bSYour Name  */
1247*5113495bSYour Name #define WE_GET_TX_STBC       13
1248*5113495bSYour Name /*
1249*5113495bSYour Name  * <ioctl>
1250*5113495bSYour Name  * get_rx_stbc - Gets the value of the current Rx STBC
1251*5113495bSYour Name  *
1252*5113495bSYour Name  * @INPUT: None
1253*5113495bSYour Name  *
1254*5113495bSYour Name  * @OUTPUT: Rx STBC
1255*5113495bSYour Name  *  wlan0     get_rx_stbc:1
1256*5113495bSYour Name  *
1257*5113495bSYour Name  * This IOTCL used to get the value of the current Rx STBC
1258*5113495bSYour Name  *
1259*5113495bSYour Name  * @E.g: iwpriv wlan0 get_rx_stbc
1260*5113495bSYour Name  *
1261*5113495bSYour Name  * Supported Feature: STA
1262*5113495bSYour Name  *
1263*5113495bSYour Name  * Usage: Internal/External
1264*5113495bSYour Name  *
1265*5113495bSYour Name  * </ioctl>
1266*5113495bSYour Name  */
1267*5113495bSYour Name #define WE_GET_RX_STBC       14
1268*5113495bSYour Name /*
1269*5113495bSYour Name  * <ioctl>
1270*5113495bSYour Name  * get_shortgi - Get the value of the current short GI setting
1271*5113495bSYour Name  *
1272*5113495bSYour Name  * @INPUT: None
1273*5113495bSYour Name  *
1274*5113495bSYour Name  * @OUTPUT: Enable/disable of shortgi
1275*5113495bSYour Name  *  wlan0     get_shortgi:1
1276*5113495bSYour Name  *
1277*5113495bSYour Name  * This IOCTL gets the value of the current short GI setting
1278*5113495bSYour Name  *
1279*5113495bSYour Name  * @E.g: iwpriv wlan0 get_shortgi
1280*5113495bSYour Name  *
1281*5113495bSYour Name  * Supported Feature: STA
1282*5113495bSYour Name  *
1283*5113495bSYour Name  * Usage: Internal/External
1284*5113495bSYour Name  *
1285*5113495bSYour Name  * </ioctl>
1286*5113495bSYour Name  */
1287*5113495bSYour Name #define WE_GET_SHORT_GI      15
1288*5113495bSYour Name /*
1289*5113495bSYour Name  * <ioctl>
1290*5113495bSYour Name  * get_rtscts - Get the value of the current RTS/CTS setting.
1291*5113495bSYour Name  *
1292*5113495bSYour Name  * @INPUT: None
1293*5113495bSYour Name  *
1294*5113495bSYour Name  * @OUTPUT: Enable/disable of RTS/CTS
1295*5113495bSYour Name  *  wlan0     get_rtscts:33
1296*5113495bSYour Name  *
1297*5113495bSYour Name  * This IOTCL get the value of the current RTS/CTS setting.
1298*5113495bSYour Name  *
1299*5113495bSYour Name  * @E.g: iwpriv wlan0 get_rtscts
1300*5113495bSYour Name  *
1301*5113495bSYour Name  * Supported Feature: STA
1302*5113495bSYour Name  *
1303*5113495bSYour Name  * Usage: Internal/External
1304*5113495bSYour Name  *
1305*5113495bSYour Name  * </ioctl>
1306*5113495bSYour Name  */
1307*5113495bSYour Name #define WE_GET_RTSCTS        16
1308*5113495bSYour Name /*
1309*5113495bSYour Name  * <ioctl>
1310*5113495bSYour Name  * get_chwidth - Get the current channel width setting
1311*5113495bSYour Name  *
1312*5113495bSYour Name  * @INPUT: None
1313*5113495bSYour Name  *
1314*5113495bSYour Name  * @OUTPUT: channel width
1315*5113495bSYour Name  *  wlan0     get_chwidth:0
1316*5113495bSYour Name  *
1317*5113495bSYour Name  * This IOTCL get the current channel width setting.
1318*5113495bSYour Name  *
1319*5113495bSYour Name  * @E.g: iwpriv wlan0 get_chwidth
1320*5113495bSYour Name  *
1321*5113495bSYour Name  * Supported Feature: STA
1322*5113495bSYour Name  *
1323*5113495bSYour Name  * Usage: Internal/External
1324*5113495bSYour Name  *
1325*5113495bSYour Name  * </ioctl>
1326*5113495bSYour Name  */
1327*5113495bSYour Name #define WE_GET_CHWIDTH       17
1328*5113495bSYour Name /*
1329*5113495bSYour Name  * <ioctl>
1330*5113495bSYour Name  * get_anienable - Get the anienable
1331*5113495bSYour Name  *
1332*5113495bSYour Name  * @INPUT: None
1333*5113495bSYour Name  *
1334*5113495bSYour Name  * @OUTPUT:
1335*5113495bSYour Name  *  wlan0     get_anienable:0
1336*5113495bSYour Name  *
1337*5113495bSYour Name  * This IOTCL get the anienable
1338*5113495bSYour Name  *
1339*5113495bSYour Name  * @E.g: iwpriv wlan0 get_anienable
1340*5113495bSYour Name  *
1341*5113495bSYour Name  * Supported Feature: STA
1342*5113495bSYour Name  *
1343*5113495bSYour Name  * Usage: Internal/External
1344*5113495bSYour Name  *
1345*5113495bSYour Name  * </ioctl>
1346*5113495bSYour Name  */
1347*5113495bSYour Name #define WE_GET_ANI_EN_DIS    18
1348*5113495bSYour Name /*
1349*5113495bSYour Name  * <ioctl>
1350*5113495bSYour Name  * get_aniplen  - Get the aniplen
1351*5113495bSYour Name  *
1352*5113495bSYour Name  * @INPUT: None
1353*5113495bSYour Name  *
1354*5113495bSYour Name  * @OUTPUT:
1355*5113495bSYour Name  *  wlan0     get_aniplen:0
1356*5113495bSYour Name  *
1357*5113495bSYour Name  * This IOTCL get the aniplen
1358*5113495bSYour Name  *
1359*5113495bSYour Name  * @E.g: iwpriv wlan0 get_aniplen
1360*5113495bSYour Name  *
1361*5113495bSYour Name  * Supported Feature: STA
1362*5113495bSYour Name  *
1363*5113495bSYour Name  * Usage: Internal/External
1364*5113495bSYour Name  *
1365*5113495bSYour Name  * </ioctl>
1366*5113495bSYour Name  */
1367*5113495bSYour Name #define WE_GET_ANI_POLL_PERIOD    19
1368*5113495bSYour Name /*
1369*5113495bSYour Name  * <ioctl>
1370*5113495bSYour Name  * get_anilislen- Get the anilislen
1371*5113495bSYour Name  *
1372*5113495bSYour Name  * @INPUT: None
1373*5113495bSYour Name  *
1374*5113495bSYour Name  * @OUTPUT:
1375*5113495bSYour Name  *  wlan0     get_anilislen:0
1376*5113495bSYour Name  *
1377*5113495bSYour Name  * This IOTCL used to get anilislen
1378*5113495bSYour Name  *
1379*5113495bSYour Name  * @E.g: iwpriv wlan0 get_anilislen
1380*5113495bSYour Name  *
1381*5113495bSYour Name  * Supported Feature: STA
1382*5113495bSYour Name  *
1383*5113495bSYour Name  * Usage: Internal/External
1384*5113495bSYour Name  *
1385*5113495bSYour Name  * </ioctl>
1386*5113495bSYour Name  */
1387*5113495bSYour Name #define WE_GET_ANI_LISTEN_PERIOD  20
1388*5113495bSYour Name /*
1389*5113495bSYour Name  * <ioctl>
1390*5113495bSYour Name  * get_aniofdmlvl - Get the OFDM level
1391*5113495bSYour Name  *
1392*5113495bSYour Name  * @INPUT: None
1393*5113495bSYour Name  *
1394*5113495bSYour Name  * @OUTPUT: OFDM
1395*5113495bSYour Name  *  wlan0     get_aniofdmlvl:0
1396*5113495bSYour Name  *
1397*5113495bSYour Name  * This IOTCL used to get ofdm level
1398*5113495bSYour Name  *
1399*5113495bSYour Name  * @E.g: iwpriv wlan0 get_aniofdmlvl
1400*5113495bSYour Name  *
1401*5113495bSYour Name  * Supported Feature: STA
1402*5113495bSYour Name  *
1403*5113495bSYour Name  * Usage: Internal/External
1404*5113495bSYour Name  *
1405*5113495bSYour Name  * </ioctl>
1406*5113495bSYour Name  */
1407*5113495bSYour Name #define WE_GET_ANI_OFDM_LEVEL     21
1408*5113495bSYour Name /*
1409*5113495bSYour Name  * <ioctl>
1410*5113495bSYour Name  * get_aniccklvl - Get the cck level
1411*5113495bSYour Name  *
1412*5113495bSYour Name  * @INPUT: None
1413*5113495bSYour Name  *
1414*5113495bSYour Name  * @OUTPUT:
1415*5113495bSYour Name  *  wlan0     get_aniccklvl:0
1416*5113495bSYour Name  *
1417*5113495bSYour Name  * This IOTCL used to get cck level
1418*5113495bSYour Name  *
1419*5113495bSYour Name  * @E.g: iwpriv wlan0 get_aniccklvl
1420*5113495bSYour Name  *
1421*5113495bSYour Name  * Supported Feature: STA
1422*5113495bSYour Name  *
1423*5113495bSYour Name  * Usage: Internal/External
1424*5113495bSYour Name  *
1425*5113495bSYour Name  * </ioctl>
1426*5113495bSYour Name  */
1427*5113495bSYour Name #define WE_GET_ANI_CCK_LEVEL      22
1428*5113495bSYour Name /*
1429*5113495bSYour Name  * <ioctl>
1430*5113495bSYour Name  * get_cwmenable - Get the value of the dynamic channel bandwidth setting
1431*5113495bSYour Name  *
1432*5113495bSYour Name  * @INPUT: None
1433*5113495bSYour Name  *
1434*5113495bSYour Name  * @OUTPUT: Enable/disable dynamic channel bandwidth
1435*5113495bSYour Name  *  wlan0     get_cwmenable:0
1436*5113495bSYour Name  *
1437*5113495bSYour Name  * This IOTCL get the value of the dynamic channel bandwidth setting
1438*5113495bSYour Name  *
1439*5113495bSYour Name  * @E.g: iwpriv wlan0 get_cwmenable
1440*5113495bSYour Name  *
1441*5113495bSYour Name  * Supported Feature: STA
1442*5113495bSYour Name  *
1443*5113495bSYour Name  * Usage: Internal/External
1444*5113495bSYour Name  *
1445*5113495bSYour Name  * </ioctl>
1446*5113495bSYour Name  */
1447*5113495bSYour Name #define WE_GET_DYNAMIC_BW         23
1448*5113495bSYour Name /*
1449*5113495bSYour Name  * <ioctl>
1450*5113495bSYour Name  * get_txchainmask - Get the txchainmask that was set
1451*5113495bSYour Name  *
1452*5113495bSYour Name  * @INPUT: None
1453*5113495bSYour Name  *
1454*5113495bSYour Name  * @OUTPUT: txchainmask
1455*5113495bSYour Name  *  wlan0     get_txchainmask:1
1456*5113495bSYour Name  *
1457*5113495bSYour Name  * This IOCTL gets the txchainmask that was set
1458*5113495bSYour Name  * This command is useful if it was previously set
1459*5113495bSYour Name  *
1460*5113495bSYour Name  * @E.g: iwpriv wlan0 get_txchainmask
1461*5113495bSYour Name  *
1462*5113495bSYour Name  * Supported Feature: STA
1463*5113495bSYour Name  *
1464*5113495bSYour Name  * Usage: Internal/External
1465*5113495bSYour Name  *
1466*5113495bSYour Name  * </ioctl>
1467*5113495bSYour Name  */
1468*5113495bSYour Name #define WE_GET_TX_CHAINMASK  24
1469*5113495bSYour Name /*
1470*5113495bSYour Name  * <ioctl>
1471*5113495bSYour Name  * get_rxchainmask - Get the rxchainmask that was set
1472*5113495bSYour Name  *
1473*5113495bSYour Name  * @INPUT: None
1474*5113495bSYour Name  *
1475*5113495bSYour Name  * @OUTPUT: rxchainmask
1476*5113495bSYour Name  *  wlan0     get_rxchainmask:1
1477*5113495bSYour Name  *
1478*5113495bSYour Name  * This IOCTL gets the rxchainmask that was set
1479*5113495bSYour Name  * This command is useful only if it was previously set.
1480*5113495bSYour Name  *
1481*5113495bSYour Name  * @E.g: iwpriv wlan0 get_rxchainmask
1482*5113495bSYour Name  *
1483*5113495bSYour Name  * Supported Feature: STA
1484*5113495bSYour Name  *
1485*5113495bSYour Name  * Usage: Internal/External
1486*5113495bSYour Name  *
1487*5113495bSYour Name  * </ioctl>
1488*5113495bSYour Name  */
1489*5113495bSYour Name #define WE_GET_RX_CHAINMASK  25
1490*5113495bSYour Name /*
1491*5113495bSYour Name  * <ioctl>
1492*5113495bSYour Name  * get_11nrate - Get the fixed Tx data rate
1493*5113495bSYour Name  *
1494*5113495bSYour Name  * @INPUT: None
1495*5113495bSYour Name  *
1496*5113495bSYour Name  * @OUTPUT: Using this command does not return the same value as set
1497*5113495bSYour Name  *  wlan0     get_11nrate:0
1498*5113495bSYour Name  *
1499*5113495bSYour Name  * This IOCTL gets the fixed Tx data rate
1500*5113495bSYour Name  * This command is useful only if setting the fixed Tx rate.
1501*5113495bSYour Name  *
1502*5113495bSYour Name  * @E.g: iwpriv wlan0 get_11nrate
1503*5113495bSYour Name  *
1504*5113495bSYour Name  * Supported Feature: STA
1505*5113495bSYour Name  *
1506*5113495bSYour Name  * Usage: Internal/External
1507*5113495bSYour Name  *
1508*5113495bSYour Name  * </ioctl>
1509*5113495bSYour Name  */
1510*5113495bSYour Name #define WE_GET_11N_RATE      26
1511*5113495bSYour Name /*
1512*5113495bSYour Name  * <ioctl>
1513*5113495bSYour Name  * get_ampdu - Get the maximum subframe of ampdu
1514*5113495bSYour Name  *
1515*5113495bSYour Name  * @INPUT: None
1516*5113495bSYour Name  *
1517*5113495bSYour Name  * @OUTPUT: Maximum subframe of ampdu
1518*5113495bSYour Name  *  wlan0     get_ampdu:1
1519*5113495bSYour Name  *
1520*5113495bSYour Name  * This IOCTL gets the maximum subframe of ampdu
1521*5113495bSYour Name  * This command is useful only if setting ampdu.
1522*5113495bSYour Name  *
1523*5113495bSYour Name  * @E.g: iwpriv wlan0 get_ampdu
1524*5113495bSYour Name  *
1525*5113495bSYour Name  * Supported Feature: STA
1526*5113495bSYour Name  *
1527*5113495bSYour Name  * Usage: Internal/External
1528*5113495bSYour Name  *
1529*5113495bSYour Name  * </ioctl>
1530*5113495bSYour Name  */
1531*5113495bSYour Name #define WE_GET_AMPDU         27
1532*5113495bSYour Name /*
1533*5113495bSYour Name  * <ioctl>
1534*5113495bSYour Name  * get_amsdu - Get the maximum subframe of amsdu
1535*5113495bSYour Name  *
1536*5113495bSYour Name  * @INPUT: None
1537*5113495bSYour Name  *
1538*5113495bSYour Name  * @OUTPUT: Maximum subframe of amsdu
1539*5113495bSYour Name  *  wlan0     get_amsdu:1
1540*5113495bSYour Name  *
1541*5113495bSYour Name  * This IOCTL gets the maximum subframe of amsdu.
1542*5113495bSYour Name  * This command is useful only if setting amsdu
1543*5113495bSYour Name  *
1544*5113495bSYour Name  * @E.g: iwpriv wlan0 get_amsdu
1545*5113495bSYour Name  *
1546*5113495bSYour Name  * Supported Feature: STA
1547*5113495bSYour Name  *
1548*5113495bSYour Name  * Usage: Internal/External
1549*5113495bSYour Name  *
1550*5113495bSYour Name  * </ioctl>
1551*5113495bSYour Name  */
1552*5113495bSYour Name #define WE_GET_AMSDU         28
1553*5113495bSYour Name /*
1554*5113495bSYour Name  * <ioctl>
1555*5113495bSYour Name  * get_txpow2g - Get the current 2 GHz Tx power setting
1556*5113495bSYour Name  *
1557*5113495bSYour Name  * @INPUT: None
1558*5113495bSYour Name  *
1559*5113495bSYour Name  * @OUTPUT: Tx Power in dbm
1560*5113495bSYour Name  * wlan0     get_txpow2g:0
1561*5113495bSYour Name  *
1562*5113495bSYour Name  * This IOCTL gets the current 2 GHz Tx power setting
1563*5113495bSYour Name  * This command is useful if setting Tx power
1564*5113495bSYour Name  *
1565*5113495bSYour Name  * @E.g: iwpriv wlan0 get_txpow2g
1566*5113495bSYour Name  *
1567*5113495bSYour Name  * Supported Feature: STA
1568*5113495bSYour Name  *
1569*5113495bSYour Name  * Usage: Internal/External
1570*5113495bSYour Name  *
1571*5113495bSYour Name  * </ioctl>
1572*5113495bSYour Name  */
1573*5113495bSYour Name #define WE_GET_TXPOW_2G      29
1574*5113495bSYour Name /*
1575*5113495bSYour Name  * <ioctl>
1576*5113495bSYour Name  * get_txpow5g - Get the current 5 GHz Tx power setting
1577*5113495bSYour Name  *
1578*5113495bSYour Name  * @INPUT: None
1579*5113495bSYour Name  *
1580*5113495bSYour Name  * @OUTPUT: Tx Power in dbm
1581*5113495bSYour Name  * wlan0     get_txpow5g:0
1582*5113495bSYour Name  *
1583*5113495bSYour Name  * This IOCTL gets the current 5 GHz Tx power setting
1584*5113495bSYour Name  * This command is useful if setting Tx power
1585*5113495bSYour Name  *
1586*5113495bSYour Name  * @E.g: iwpriv wlan0 get_txpow5g
1587*5113495bSYour Name  *
1588*5113495bSYour Name  * Supported Feature: STA
1589*5113495bSYour Name  *
1590*5113495bSYour Name  * Usage: Internal/External
1591*5113495bSYour Name  *
1592*5113495bSYour Name  * </ioctl>
1593*5113495bSYour Name  */
1594*5113495bSYour Name #define WE_GET_TXPOW_5G      30
1595*5113495bSYour Name /* 31 is unused */
1596*5113495bSYour Name #define WE_GET_PPS_PAID_MATCH           32
1597*5113495bSYour Name #define WE_GET_PPS_GID_MATCH            33
1598*5113495bSYour Name #define WE_GET_PPS_EARLY_TIM_CLEAR      34
1599*5113495bSYour Name #define WE_GET_PPS_EARLY_DTIM_CLEAR     35
1600*5113495bSYour Name #define WE_GET_PPS_EOF_PAD_DELIM        36
1601*5113495bSYour Name #define WE_GET_PPS_MACADDR_MISMATCH     37
1602*5113495bSYour Name #define WE_GET_PPS_DELIM_CRC_FAIL       38
1603*5113495bSYour Name #define WE_GET_PPS_GID_NSTS_ZERO        39
1604*5113495bSYour Name #define WE_GET_PPS_RSSI_CHECK           40
1605*5113495bSYour Name /* Private ioctl for QPower */
1606*5113495bSYour Name #define WE_GET_QPOWER_MAX_PSPOLL_COUNT            41
1607*5113495bSYour Name #define WE_GET_QPOWER_MAX_TX_BEFORE_WAKE          42
1608*5113495bSYour Name #define WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL   43
1609*5113495bSYour Name #define WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 44
1610*5113495bSYour Name /* GTX Commands */
1611*5113495bSYour Name /*
1612*5113495bSYour Name  * <ioctl>
1613*5113495bSYour Name  * get_gtxHTMcs - Get the tx HTM
1614*5113495bSYour Name  *
1615*5113495bSYour Name  * @INPUT: None
1616*5113495bSYour Name  *
1617*5113495bSYour Name  * @OUTPUT: HTM
1618*5113495bSYour Name  *  wlan0     get_gtxHTMcs:32896
1619*5113495bSYour Name  *
1620*5113495bSYour Name  * This IOTCL used to get HTM
1621*5113495bSYour Name  *
1622*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxHTMcs
1623*5113495bSYour Name  *
1624*5113495bSYour Name  * Supported Feature: STA
1625*5113495bSYour Name  *
1626*5113495bSYour Name  * Usage: Internal/External
1627*5113495bSYour Name  *
1628*5113495bSYour Name  * </ioctl>
1629*5113495bSYour Name  */
1630*5113495bSYour Name #define WE_GET_GTX_HT_MCS               47
1631*5113495bSYour Name /*
1632*5113495bSYour Name  * <ioctl>
1633*5113495bSYour Name  * get_gtxVHTMcs - Get the VHTM
1634*5113495bSYour Name  *
1635*5113495bSYour Name  * @INPUT: None
1636*5113495bSYour Name  *
1637*5113495bSYour Name  * @OUTPUT: VHTM
1638*5113495bSYour Name  *  wlan0     get_gtxVHTMcs:524800
1639*5113495bSYour Name  *
1640*5113495bSYour Name  * This IOTCL used to get the VHTM
1641*5113495bSYour Name  *
1642*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxVHTMcs
1643*5113495bSYour Name  *
1644*5113495bSYour Name  * Supported Feature: STA
1645*5113495bSYour Name  *
1646*5113495bSYour Name  * Usage: Internal/External
1647*5113495bSYour Name  *
1648*5113495bSYour Name  * </ioctl>
1649*5113495bSYour Name  */
1650*5113495bSYour Name #define WE_GET_GTX_VHT_MCS              48
1651*5113495bSYour Name /*
1652*5113495bSYour Name  * <ioctl>
1653*5113495bSYour Name  * get_gtxUsrCfg - Get the tx cfg
1654*5113495bSYour Name  *
1655*5113495bSYour Name  * @INPUT: None
1656*5113495bSYour Name  *
1657*5113495bSYour Name  * @OUTPUT: TXCFG
1658*5113495bSYour Name  *  wlan0     get_gtxUsrCfg:32
1659*5113495bSYour Name  *
1660*5113495bSYour Name  * This IOTCL used to get the tx cfg
1661*5113495bSYour Name  *
1662*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxUsrCfg
1663*5113495bSYour Name  *
1664*5113495bSYour Name  * Supported Feature: STA
1665*5113495bSYour Name  *
1666*5113495bSYour Name  * Usage: Internal/External
1667*5113495bSYour Name  *
1668*5113495bSYour Name  * </ioctl>
1669*5113495bSYour Name  */
1670*5113495bSYour Name #define WE_GET_GTX_USRCFG               49
1671*5113495bSYour Name /*
1672*5113495bSYour Name  * <ioctl>
1673*5113495bSYour Name  * get_gtxThre - Get the tx threshold
1674*5113495bSYour Name  *
1675*5113495bSYour Name  * @INPUT: None
1676*5113495bSYour Name  *
1677*5113495bSYour Name  * @OUTPUT: Threshold
1678*5113495bSYour Name  *  wlan0     get_gtxThre:3
1679*5113495bSYour Name  *
1680*5113495bSYour Name  * This IOCTL is used to get tx threshold
1681*5113495bSYour Name  *
1682*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxThre
1683*5113495bSYour Name  *
1684*5113495bSYour Name  * Supported Feature: STA
1685*5113495bSYour Name  *
1686*5113495bSYour Name  * Usage: Internal/External
1687*5113495bSYour Name  *
1688*5113495bSYour Name  * </ioctl>
1689*5113495bSYour Name  */
1690*5113495bSYour Name #define WE_GET_GTX_THRE                 50
1691*5113495bSYour Name /*
1692*5113495bSYour Name  * <ioctl>
1693*5113495bSYour Name  * get_gtxMargin - Get the tx margin
1694*5113495bSYour Name  *
1695*5113495bSYour Name  * @INPUT: None
1696*5113495bSYour Name  *
1697*5113495bSYour Name  * @OUTPUT: GTXMARGIN
1698*5113495bSYour Name  *  wlan0     get_gtxMargin:2
1699*5113495bSYour Name  *
1700*5113495bSYour Name  * This IOCTL is used to set tx margin
1701*5113495bSYour Name  *
1702*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxMargin
1703*5113495bSYour Name  *
1704*5113495bSYour Name  * Supported Feature: STA
1705*5113495bSYour Name  *
1706*5113495bSYour Name  * Usage: Internal/External
1707*5113495bSYour Name  *
1708*5113495bSYour Name  * </ioctl>
1709*5113495bSYour Name  */
1710*5113495bSYour Name #define WE_GET_GTX_MARGIN               51
1711*5113495bSYour Name /*
1712*5113495bSYour Name  * <ioctl>
1713*5113495bSYour Name  * get_gtxStep - Get the tx step
1714*5113495bSYour Name  *
1715*5113495bSYour Name  * @INPUT: None
1716*5113495bSYour Name  *
1717*5113495bSYour Name  * @OUTPUT: GTXSTEP
1718*5113495bSYour Name  * wlan0     get_gtxStep:0
1719*5113495bSYour Name  *
1720*5113495bSYour Name  * This IOCTL is used to get the gtx step
1721*5113495bSYour Name  *
1722*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxStep
1723*5113495bSYour Name  *
1724*5113495bSYour Name  * Supported Feature: STA
1725*5113495bSYour Name  *
1726*5113495bSYour Name  * Usage: Internal/External
1727*5113495bSYour Name  *
1728*5113495bSYour Name  * </ioctl>
1729*5113495bSYour Name  */
1730*5113495bSYour Name #define WE_GET_GTX_STEP                 52
1731*5113495bSYour Name /*
1732*5113495bSYour Name  * <ioctl>
1733*5113495bSYour Name  * get_gtxMinTpc - Get the tx miminum tpc
1734*5113495bSYour Name  *
1735*5113495bSYour Name  * @INPUT: None
1736*5113495bSYour Name  *
1737*5113495bSYour Name  * @OUTPUT: TPC
1738*5113495bSYour Name  * wlan0     get_gtxMinTpc:0
1739*5113495bSYour Name  *
1740*5113495bSYour Name  * This IOCTL is used to get tx miminum tpc
1741*5113495bSYour Name  *
1742*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxMinTpc
1743*5113495bSYour Name  *
1744*5113495bSYour Name  * Supported Feature: STA
1745*5113495bSYour Name  *
1746*5113495bSYour Name  * Usage: Internal/External
1747*5113495bSYour Name  *
1748*5113495bSYour Name  * </ioctl>
1749*5113495bSYour Name  */
1750*5113495bSYour Name #define WE_GET_GTX_MINTPC               53
1751*5113495bSYour Name /*
1752*5113495bSYour Name  * <ioctl>
1753*5113495bSYour Name  * get_gtxBWMask - Get the tx BW MASK
1754*5113495bSYour Name  *
1755*5113495bSYour Name  * @INPUT: None
1756*5113495bSYour Name  *
1757*5113495bSYour Name  * @OUTPUT: MASK
1758*5113495bSYour Name  * wlan0     get_gtxBWMask:15
1759*5113495bSYour Name  *
1760*5113495bSYour Name  * This IOCTL is used get gtx bw mask
1761*5113495bSYour Name  *
1762*5113495bSYour Name  * @E.g: iwpriv wlan0 get_gtxBWMask
1763*5113495bSYour Name  *
1764*5113495bSYour Name  * Supported Feature: STA
1765*5113495bSYour Name  *
1766*5113495bSYour Name  * Usage: Internal/External
1767*5113495bSYour Name  *
1768*5113495bSYour Name  * </ioctl>
1769*5113495bSYour Name  */
1770*5113495bSYour Name #define WE_GET_GTX_BWMASK               54
1771*5113495bSYour Name #define WE_GET_TEMPERATURE              56
1772*5113495bSYour Name #define WE_CAP_TSF                      58
1773*5113495bSYour Name #define WE_GET_ROAM_SYNCH_DELAY         59
1774*5113495bSYour Name 
1775*5113495bSYour Name /*
1776*5113495bSYour Name  * <ioctl>
1777*5113495bSYour Name  * get_dcm - Get dcm enablement value
1778*5113495bSYour Name  *
1779*5113495bSYour Name  * @INPUT: None
1780*5113495bSYour Name  *
1781*5113495bSYour Name  * @OUTPUT: 0/1
1782*5113495bSYour Name  * wlan0     get_dcm
1783*5113495bSYour Name  *
1784*5113495bSYour Name  * This IOCTL is used get dcm value
1785*5113495bSYour Name  *
1786*5113495bSYour Name  * Supported Feature: STA/SAP
1787*5113495bSYour Name  *
1788*5113495bSYour Name  * Usage: Internal
1789*5113495bSYour Name  *
1790*5113495bSYour Name  * </ioctl>
1791*5113495bSYour Name  */
1792*5113495bSYour Name #define WE_GET_DCM                      60
1793*5113495bSYour Name 
1794*5113495bSYour Name /*
1795*5113495bSYour Name  * <ioctl>
1796*5113495bSYour Name  * get_dcm - Get range extension enablement value
1797*5113495bSYour Name  *
1798*5113495bSYour Name  * @INPUT: None
1799*5113495bSYour Name  *
1800*5113495bSYour Name  * @OUTPUT: 0/1
1801*5113495bSYour Name  * wlan0     get_range_ext
1802*5113495bSYour Name  *
1803*5113495bSYour Name  * This IOCTL is used get range_extension value
1804*5113495bSYour Name  *
1805*5113495bSYour Name  * Supported Feature: STA/SAP
1806*5113495bSYour Name  *
1807*5113495bSYour Name  * Usage: Internal
1808*5113495bSYour Name  *
1809*5113495bSYour Name  * </ioctl>
1810*5113495bSYour Name  */
1811*5113495bSYour Name #define WE_GET_RANGE_EXT                61
1812*5113495bSYour Name 
1813*5113495bSYour Name /* Private ioctls and their sub-ioctls */
1814*5113495bSYour Name #define WLAN_PRIV_SET_INT_GET_INT     (SIOCIWFIRSTPRIV + 2)
1815*5113495bSYour Name 
1816*5113495bSYour Name /* Private ioctls and their sub-ioctls */
1817*5113495bSYour Name #define WLAN_PRIV_SET_CHAR_GET_NONE   (SIOCIWFIRSTPRIV + 3)
1818*5113495bSYour Name #define WE_WOWL_ADD_PTRN     1
1819*5113495bSYour Name #define WE_WOWL_DEL_PTRN     2
1820*5113495bSYour Name /*
1821*5113495bSYour Name  * <ioctl>
1822*5113495bSYour Name  * neighbor - Send neighbor report request
1823*5113495bSYour Name  *
1824*5113495bSYour Name  * @INPUT: string
1825*5113495bSYour Name  *
1826*5113495bSYour Name  * @OUTPUT: None
1827*5113495bSYour Name  *
1828*5113495bSYour Name  * This IOCTL create a Neighbor report request and send it to peer
1829*5113495bSYour Name  *
1830*5113495bSYour Name  * @E.g: iwpriv wlan0 neighbor "SSID"
1831*5113495bSYour Name  *
1832*5113495bSYour Name  * Supported Feature: 11k
1833*5113495bSYour Name  *
1834*5113495bSYour Name  * Usage: Internal/External
1835*5113495bSYour Name  *
1836*5113495bSYour Name  * </ioctl>
1837*5113495bSYour Name  */
1838*5113495bSYour Name #define WE_NEIGHBOR_REPORT_REQUEST 3
1839*5113495bSYour Name /*
1840*5113495bSYour Name  * <ioctl>
1841*5113495bSYour Name  * set_ap_wps_ie - Set the P2P IE of the probe response
1842*5113495bSYour Name  *
1843*5113495bSYour Name  * @INPUT: string
1844*5113495bSYour Name  *
1845*5113495bSYour Name  * @OUTPUT: None
1846*5113495bSYour Name  *
1847*5113495bSYour Name  * This IOCTL sets the P2P IE of the probe response
1848*5113495bSYour Name  *
1849*5113495bSYour Name  * @E.g: iwpriv wlan0 set_ap_wps_ie abcd
1850*5113495bSYour Name  *
1851*5113495bSYour Name  * Supported Feature: STA
1852*5113495bSYour Name  *
1853*5113495bSYour Name  * Usage: Internal/External
1854*5113495bSYour Name  *
1855*5113495bSYour Name  * </ioctl>
1856*5113495bSYour Name  */
1857*5113495bSYour Name #define WE_SET_AP_WPS_IE     4
1858*5113495bSYour Name 
1859*5113495bSYour Name /* 5 is unused */
1860*5113495bSYour Name 
1861*5113495bSYour Name /*
1862*5113495bSYour Name  * <ioctl>
1863*5113495bSYour Name  * unit_test - execute component-level unit tests
1864*5113495bSYour Name  *
1865*5113495bSYour Name  * @INPUT: string - the name of the component to test.
1866*5113495bSYour Name  *	All tests are executed if unspecified
1867*5113495bSYour Name  * @OUTPUT: None
1868*5113495bSYour Name  *
1869*5113495bSYour Name  * Usage: Internal only
1870*5113495bSYour Name  * </ioctl>
1871*5113495bSYour Name  */
1872*5113495bSYour Name #define WE_UNIT_TEST         6
1873*5113495bSYour Name 
1874*5113495bSYour Name /* Private ioctls and their sub-ioctls */
1875*5113495bSYour Name #define WLAN_PRIV_SET_THREE_INT_GET_NONE   (SIOCIWFIRSTPRIV + 4)
1876*5113495bSYour Name #define WE_SET_WLAN_DBG      1
1877*5113495bSYour Name #define WE_SET_DP_TRACE      2
1878*5113495bSYour Name #define WE_SET_FW_TEST       4
1879*5113495bSYour Name 
1880*5113495bSYour Name /* Private ioctls and their sub-ioctls */
1881*5113495bSYour Name #define WLAN_PRIV_GET_CHAR_SET_NONE   (SIOCIWFIRSTPRIV + 5)
1882*5113495bSYour Name #define WE_WLAN_VERSION      1
1883*5113495bSYour Name #define WE_GET_STATS         2
1884*5113495bSYour Name /*
1885*5113495bSYour Name  * <ioctl>
1886*5113495bSYour Name  * getConfig - gets the values of all configurations listed in WCNSS
1887*5113495bSYour Name  *
1888*5113495bSYour Name  * @INPUT: None
1889*5113495bSYour Name  *
1890*5113495bSYour Name  * @OUTPUT: Current configuration to the sys log
1891*5113495bSYour Name  *  wlan0	getConfig: WLAN configuration written to system log
1892*5113495bSYour Name  *
1893*5113495bSYour Name  * This IOCTL gets the values of all configurations listed in WCNSS
1894*5113495bSYour Name  *
1895*5113495bSYour Name  * @E.g: iwpriv wlan0 getConfig
1896*5113495bSYour Name  *
1897*5113495bSYour Name  * Supported Feature: STA
1898*5113495bSYour Name  *
1899*5113495bSYour Name  * Usage: Internal/External
1900*5113495bSYour Name  *
1901*5113495bSYour Name  * </ioctl>
1902*5113495bSYour Name  */
1903*5113495bSYour Name #define WE_GET_CFG           3
1904*5113495bSYour Name #define WE_GET_WMM_STATUS    4
1905*5113495bSYour Name /*
1906*5113495bSYour Name  * <ioctl>
1907*5113495bSYour Name  * getChannelList - Get the available channel list while in QCMobileAP
1908*5113495bSYour Name  *
1909*5113495bSYour Name  * @INPUT: None
1910*5113495bSYour Name  *
1911*5113495bSYour Name  * @OUTPUT: Channel list
1912*5113495bSYour Name  * wlan0     getChannelList:36 US 1..165
1913*5113495bSYour Name  *
1914*5113495bSYour Name  * This IOCTL gets the available channel list while in QCMobileAP
1915*5113495bSYour Name  *
1916*5113495bSYour Name  * @E.g: iwpriv wlan0 getChannelList
1917*5113495bSYour Name  *
1918*5113495bSYour Name  * Supported Feature: STA
1919*5113495bSYour Name  *
1920*5113495bSYour Name  * Usage: Internal/External
1921*5113495bSYour Name  *
1922*5113495bSYour Name  * </ioctl>
1923*5113495bSYour Name  */
1924*5113495bSYour Name #define WE_GET_CHANNEL_LIST  5
1925*5113495bSYour Name /*
1926*5113495bSYour Name  * <ioctl>
1927*5113495bSYour Name  * getRSSI - Get the Received Signal Strength Indicator
1928*5113495bSYour Name  *
1929*5113495bSYour Name  * @INPUT: None
1930*5113495bSYour Name  *
1931*5113495bSYour Name  * @OUTPUT: RSSI
1932*5113495bSYour Name  * wlan0     getRSSI:rsssi=-32
1933*5113495bSYour Name  *
1934*5113495bSYour Name  * This IOCTL gets the Received Signal Strength Indicator (RSSI)
1935*5113495bSYour Name  *
1936*5113495bSYour Name  * @E.g: iwpriv wlan0 getRSSI
1937*5113495bSYour Name  *
1938*5113495bSYour Name  * Supported Feature: STA
1939*5113495bSYour Name  *
1940*5113495bSYour Name  * Usage: Internal/External
1941*5113495bSYour Name  *
1942*5113495bSYour Name  * </ioctl>
1943*5113495bSYour Name  */
1944*5113495bSYour Name #define WE_GET_RSSI          6
1945*5113495bSYour Name 
1946*5113495bSYour Name /*
1947*5113495bSYour Name  * <ioctl>
1948*5113495bSYour Name  * getSuspendStats - Get suspend/resume stats
1949*5113495bSYour Name  *
1950*5113495bSYour Name  * @INPUT: None
1951*5113495bSYour Name  *
1952*5113495bSYour Name  * @OUTPUT: character string containing formatted suspend/resume stats
1953*5113495bSYour Name  *
1954*5113495bSYour Name  * This ioctl is used to get suspend/resume stats formatted for display.
1955*5113495bSYour Name  * Currently it includes suspend/resume counts, wow wake up reasons, and
1956*5113495bSYour Name  * suspend fail reasons.
1957*5113495bSYour Name  *
1958*5113495bSYour Name  * @E.g: iwpriv wlan0 getSuspendStats
1959*5113495bSYour Name  * iwpriv wlan0 getSuspendStats
1960*5113495bSYour Name  *
1961*5113495bSYour Name  * Supported Feature: suspend/resume
1962*5113495bSYour Name  *
1963*5113495bSYour Name  * Usage: Internal
1964*5113495bSYour Name  *
1965*5113495bSYour Name  * </ioctl>
1966*5113495bSYour Name  */
1967*5113495bSYour Name #define WE_GET_SUSPEND_RESUME_STATS 7
1968*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
1969*5113495bSYour Name /*
1970*5113495bSYour Name  * <ioctl>
1971*5113495bSYour Name  * getTdlsPeers - Get all TDLS peers.
1972*5113495bSYour Name  *
1973*5113495bSYour Name  * @INPUT: None
1974*5113495bSYour Name  *
1975*5113495bSYour Name  * @OUTPUT: Returns the MAC address of all the TDLS peers
1976*5113495bSYour Name  * wlan0     getTdlsPeers:
1977*5113495bSYour Name  * MAC               Id cap up RSSI
1978*5113495bSYour Name  * ---------------------------------
1979*5113495bSYour Name  * 00:0a:f5:0e:bd:18  2   Y  Y  -44
1980*5113495bSYour Name  * 00:0a:f5:bf:0e:12  0   N  N    0
1981*5113495bSYour Name  *
1982*5113495bSYour Name  * This IOCTL is used to get all TDLS peers.
1983*5113495bSYour Name  *
1984*5113495bSYour Name  * @E.g: iwpriv wlan0 getTdlsPeers
1985*5113495bSYour Name  *
1986*5113495bSYour Name  * Supported Feature: TDLS
1987*5113495bSYour Name  *
1988*5113495bSYour Name  * Usage: Internal/External
1989*5113495bSYour Name  *
1990*5113495bSYour Name  * </ioctl>
1991*5113495bSYour Name  */
1992*5113495bSYour Name #define WE_GET_TDLS_PEERS    8
1993*5113495bSYour Name #endif
1994*5113495bSYour Name /*
1995*5113495bSYour Name  * <ioctl>
1996*5113495bSYour Name  * getPMFInfo - get the PMF info of the connected session
1997*5113495bSYour Name  *
1998*5113495bSYour Name  * @INPUT: None
1999*5113495bSYour Name  *
2000*5113495bSYour Name  * @OUTPUT:
2001*5113495bSYour Name  *  wlan0     getPMFInfo:
2002*5113495bSYour Name  *  BSSID E4:F4:C6:0A:E0:36, Is PMF Assoc? 0
2003*5113495bSYour Name  *  Number of Unprotected Disassocs 0
2004*5113495bSYour Name  *  Number of Unprotected Deauths 0
2005*5113495bSYour Name  *
2006*5113495bSYour Name  * This IOCTL is used to get the PMF stats/status of the current
2007*5113495bSYour Name  * connection.
2008*5113495bSYour Name  *
2009*5113495bSYour Name  * @e.g:iwpriv wlan0 getPMFInfo
2010*5113495bSYour Name  *
2011*5113495bSYour Name  * Supported Feature: PMF
2012*5113495bSYour Name  *
2013*5113495bSYour Name  * Usage: Internal/External
2014*5113495bSYour Name  *
2015*5113495bSYour Name  * </ioctl>
2016*5113495bSYour Name  */
2017*5113495bSYour Name #define WE_GET_11W_INFO      9
2018*5113495bSYour Name #define WE_GET_STATES        10
2019*5113495bSYour Name /*
2020*5113495bSYour Name  * <ioctl>
2021*5113495bSYour Name  * getphymode - Get the current phymode.
2022*5113495bSYour Name  *
2023*5113495bSYour Name  * @INPUT: None
2024*5113495bSYour Name  *
2025*5113495bSYour Name  * @OUTPUT: In phymode
2026*5113495bSYour Name  *  wlan0     getphymode:AUTO MODE
2027*5113495bSYour Name  *
2028*5113495bSYour Name  * This IOCTL used to gets the current phymode.
2029*5113495bSYour Name  *
2030*5113495bSYour Name  * @E.g: iwpriv wlan0 getphymode
2031*5113495bSYour Name  *
2032*5113495bSYour Name  * Supported Feature: STA
2033*5113495bSYour Name  *
2034*5113495bSYour Name  * Usage: Internal/External
2035*5113495bSYour Name  *
2036*5113495bSYour Name  * </ioctl>
2037*5113495bSYour Name  */
2038*5113495bSYour Name #define WE_GET_PHYMODE       12
2039*5113495bSYour Name 
2040*5113495bSYour Name /*
2041*5113495bSYour Name  * <ioctl>
2042*5113495bSYour Name  * getOemDataCap - Get the oem data caps.
2043*5113495bSYour Name  *
2044*5113495bSYour Name  * @INPUT: None
2045*5113495bSYour Name  *
2046*5113495bSYour Name  * @OUTPUT: oem data capability
2047*5113495bSYour Name  *
2048*5113495bSYour Name  * This IOCTL used to gets the current oem data cap.
2049*5113495bSYour Name  *
2050*5113495bSYour Name  * @E.g: iwpriv wlan0 getOemDataCap
2051*5113495bSYour Name  *
2052*5113495bSYour Name  * Usage: Internal/External
2053*5113495bSYour Name  *
2054*5113495bSYour Name  * </ioctl>
2055*5113495bSYour Name  */
2056*5113495bSYour Name #define WE_GET_OEM_DATA_CAP  13
2057*5113495bSYour Name 
2058*5113495bSYour Name /*
2059*5113495bSYour Name  * <ioctl>
2060*5113495bSYour Name  * getSNR - Enable SNR Monitoring
2061*5113495bSYour Name  *
2062*5113495bSYour Name  * @INPUT: None
2063*5113495bSYour Name  *
2064*5113495bSYour Name  * @OUTPUT: Signal strength/ratio
2065*5113495bSYour Name  *  wlan0     getSNR:1
2066*5113495bSYour Name  *
2067*5113495bSYour Name  * This IOCTL is used to get ibss sta info
2068*5113495bSYour Name  *
2069*5113495bSYour Name  * @E.g: iwpriv wlan0 getSNR
2070*5113495bSYour Name  *
2071*5113495bSYour Name  * Supported Feature: STA
2072*5113495bSYour Name  *
2073*5113495bSYour Name  * Usage: Internal/External
2074*5113495bSYour Name  *
2075*5113495bSYour Name  * </ioctl>
2076*5113495bSYour Name  */
2077*5113495bSYour Name 
2078*5113495bSYour Name #define WE_GET_SNR           14
2079*5113495bSYour Name #define WE_LIST_FW_PROFILE      15
2080*5113495bSYour Name 
2081*5113495bSYour Name /*
2082*5113495bSYour Name  * <ioctl>
2083*5113495bSYour Name  *
2084*5113495bSYour Name  * get_ba_timeout - to get timeout for each AC
2085*5113495bSYour Name  *
2086*5113495bSYour Name  * @INPUT: None
2087*5113495bSYour Name  *
2088*5113495bSYour Name  * @OUTPUT: displays timeout value for each access class
2089*5113495bSYour Name  *
2090*5113495bSYour Name  * @E.g.: iwpriv wlan0 get_ba_timeout
2091*5113495bSYour Name  *
2092*5113495bSYour Name  * Usage: Internal
2093*5113495bSYour Name  *
2094*5113495bSYour Name  * </ioctl>
2095*5113495bSYour Name  */
2096*5113495bSYour Name #define WE_GET_BA_AGEING_TIMEOUT 16
2097*5113495bSYour Name 
2098*5113495bSYour Name /*
2099*5113495bSYour Name  * <ioctl>
2100*5113495bSYour Name  *
2101*5113495bSYour Name  * sta_cxn_info - STA connection information
2102*5113495bSYour Name  *
2103*5113495bSYour Name  * @INPUT: none
2104*5113495bSYour Name  *
2105*5113495bSYour Name  * @OUTPUT: STA's connection information
2106*5113495bSYour Name  *
2107*5113495bSYour Name  * This IOCTL is used to get connection's information.
2108*5113495bSYour Name  *
2109*5113495bSYour Name  * @E.g: iwpriv wlan0 get_cxn_info
2110*5113495bSYour Name  *
2111*5113495bSYour Name  * Usage: Internal
2112*5113495bSYour Name  *
2113*5113495bSYour Name  * </ioctl>
2114*5113495bSYour Name  */
2115*5113495bSYour Name #define WE_GET_STA_CXN_INFO 17
2116*5113495bSYour Name 
2117*5113495bSYour Name /* Private ioctls and their sub-ioctls */
2118*5113495bSYour Name #define WLAN_PRIV_SET_NONE_GET_NONE   (SIOCIWFIRSTPRIV + 6)
2119*5113495bSYour Name 
2120*5113495bSYour Name /*
2121*5113495bSYour Name  * <ioctl>
2122*5113495bSYour Name  * reassoc - Trigger STA re-association to the connected AP
2123*5113495bSYour Name  *
2124*5113495bSYour Name  * @INPUT: None
2125*5113495bSYour Name  *
2126*5113495bSYour Name  * @OUTPUT: None
2127*5113495bSYour Name  *
2128*5113495bSYour Name  * This IOCTL is used to trigger STA reassociation to the connected AP.
2129*5113495bSYour Name  *
2130*5113495bSYour Name  * @E.g: iwpriv wlan0 reassoc
2131*5113495bSYour Name  *
2132*5113495bSYour Name  * Supported Feature: Roaming
2133*5113495bSYour Name  *
2134*5113495bSYour Name  * Usage: Internal
2135*5113495bSYour Name  *
2136*5113495bSYour Name  * </ioctl>
2137*5113495bSYour Name  */
2138*5113495bSYour Name #define WE_SET_REASSOC_TRIGGER     8
2139*5113495bSYour Name 
2140*5113495bSYour Name /* Sub ioctls 11 to 16 are not used */
2141*5113495bSYour Name #define WE_GET_FW_PROFILE_DATA     18
2142*5113495bSYour Name /*
2143*5113495bSYour Name  * <ioctl>
2144*5113495bSYour Name  * stop_obss_scan - Stop obss scan
2145*5113495bSYour Name  *
2146*5113495bSYour Name  * @INPUT: None
2147*5113495bSYour Name  *
2148*5113495bSYour Name  * @OUTPUT: None
2149*5113495bSYour Name  *
2150*5113495bSYour Name  * This IOCTL is used to stop obss scan
2151*5113495bSYour Name  *
2152*5113495bSYour Name  * @E.g: iwpriv wlan0 stop_obss_scan
2153*5113495bSYour Name  *
2154*5113495bSYour Name  * Supported Feature: Scan
2155*5113495bSYour Name  *
2156*5113495bSYour Name  * Usage: Internal/External
2157*5113495bSYour Name  *
2158*5113495bSYour Name  * </ioctl>
2159*5113495bSYour Name  */
2160*5113495bSYour Name #define WE_STOP_OBSS_SCAN          19
2161*5113495bSYour Name 
2162*5113495bSYour Name /* Private ioctls and their sub-ioctls */
2163*5113495bSYour Name #define WLAN_PRIV_SET_VAR_INT_GET_NONE   (SIOCIWFIRSTPRIV + 7)
2164*5113495bSYour Name 
2165*5113495bSYour Name #define WE_P2P_NOA_CMD       2
2166*5113495bSYour Name /* subcommands 3 is unused */
2167*5113495bSYour Name 
2168*5113495bSYour Name #define WE_MAC_PWR_DEBUG_CMD 4
2169*5113495bSYour Name 
2170*5113495bSYour Name /* subcommand 5 is unused */
2171*5113495bSYour Name /* subcommand 6 is unused */
2172*5113495bSYour Name 
2173*5113495bSYour Name #define WE_UNIT_TEST_CMD   7
2174*5113495bSYour Name 
2175*5113495bSYour Name #define WE_MTRACE_DUMP_CMD    8
2176*5113495bSYour Name #define WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD    9
2177*5113495bSYour Name 
2178*5113495bSYour Name 
2179*5113495bSYour Name #ifdef WLAN_FEATURE_GPIO_LED_FLASHING
2180*5113495bSYour Name #define WE_LED_FLASHING_PARAM    10
2181*5113495bSYour Name #endif
2182*5113495bSYour Name 
2183*5113495bSYour Name 
2184*5113495bSYour Name /*
2185*5113495bSYour Name  * Sequence Numbers 11-14, 16, 17-20 are not in use.
2186*5113495bSYour Name  */
2187*5113495bSYour Name 
2188*5113495bSYour Name /*
2189*5113495bSYour Name  * <ioctl>
2190*5113495bSYour Name  * pm_cinfo - Shows the concurrent connection list.
2191*5113495bSYour Name  *
2192*5113495bSYour Name  * @INPUT: None
2193*5113495bSYour Name  *
2194*5113495bSYour Name  * @OUTPUT: None
2195*5113495bSYour Name  *
2196*5113495bSYour Name  * This IOCTL is used to show the concurrent connection list.
2197*5113495bSYour Name  *
2198*5113495bSYour Name  * @E.g: iwpriv wlan0 pm_cinfo
2199*5113495bSYour Name  *
2200*5113495bSYour Name  * Supported Feature: DBS
2201*5113495bSYour Name  *
2202*5113495bSYour Name  * Usage: Internal/External
2203*5113495bSYour Name  *
2204*5113495bSYour Name  * </ioctl>
2205*5113495bSYour Name  */
2206*5113495bSYour Name #define WE_POLICY_MANAGER_CINFO_CMD    15
2207*5113495bSYour Name 
2208*5113495bSYour Name /*
2209*5113495bSYour Name  * <ioctl>
2210*5113495bSYour Name  * ch_avoid - unit test SAP channel avoidance
2211*5113495bSYour Name  *
2212*5113495bSYour Name  * @INPUT: chan avoid ranges
2213*5113495bSYour Name  *
2214*5113495bSYour Name  * @OUTPUT: none
2215*5113495bSYour Name  *
2216*5113495bSYour Name  * This IOCTL is used to fake a channel avoidance event.
2217*5113495bSYour Name  * To test SAP/GO chan switch during chan avoid event process.
2218*5113495bSYour Name  *
2219*5113495bSYour Name  * @E.g: iwpriv wlan0 ch_avoid 2452 2462
2220*5113495bSYour Name  *
2221*5113495bSYour Name  * Supported Feature: SAP chan avoidance.
2222*5113495bSYour Name  *
2223*5113495bSYour Name  * Usage: Internal
2224*5113495bSYour Name  *
2225*5113495bSYour Name  * </ioctl>
2226*5113495bSYour Name  */
2227*5113495bSYour Name #define WE_SET_CHAN_AVOID 21
2228*5113495bSYour Name 
2229*5113495bSYour Name /*
2230*5113495bSYour Name  * <ioctl>
2231*5113495bSYour Name  * set_scan_cfg - Set dual MAC scan config parameters.
2232*5113495bSYour Name  *
2233*5113495bSYour Name  * @INPUT: dbs, dbs_plus_agile_scan, single_mac_scan_with_dbs
2234*5113495bSYour Name  * @dbs: Value of DBS bit
2235*5113495bSYour Name  * @dbs_plus_agile_scan: Value of DBS plus agile scan bit
2236*5113495bSYour Name  * @single_mac_scan_with_dbs: Value of Single MAC scan with DBS
2237*5113495bSYour Name  *
2238*5113495bSYour Name  * @OUTPUT: None
2239*5113495bSYour Name  *
2240*5113495bSYour Name  * This IOCTL is used to set the dual MAC scan config.
2241*5113495bSYour Name  *
2242*5113495bSYour Name  * @E.g: iwpriv wlan0 set_scan_cfg dbs dbs_plus_agile_scan
2243*5113495bSYour Name  *                    single_mac_scan_with_dbs
2244*5113495bSYour Name  * iwpriv wlan0 set_scan_cfg 1 0 1
2245*5113495bSYour Name  *
2246*5113495bSYour Name  * Supported Feature: DBS
2247*5113495bSYour Name  *
2248*5113495bSYour Name  * Usage: Internal/External
2249*5113495bSYour Name  *
2250*5113495bSYour Name  * </ioctl>
2251*5113495bSYour Name  */
2252*5113495bSYour Name #define WE_SET_DUAL_MAC_SCAN_CONFIG    21
2253*5113495bSYour Name 
2254*5113495bSYour Name /*
2255*5113495bSYour Name  * <ioctl>
2256*5113495bSYour Name  * set_fw_mode_cfg - Sets the dual mac FW mode config
2257*5113495bSYour Name  *
2258*5113495bSYour Name  * @INPUT: dbs, dfs
2259*5113495bSYour Name  * @dbs: DBS bit
2260*5113495bSYour Name  * @dfs: Agile DFS bit
2261*5113495bSYour Name  *
2262*5113495bSYour Name  * @OUTPUT: None
2263*5113495bSYour Name  *
2264*5113495bSYour Name  * This IOCTL is used to set the dual mac FW mode config.
2265*5113495bSYour Name  *
2266*5113495bSYour Name  * @E.g: iwpriv wlan0 set_fw_mode_cfg dbs dfs
2267*5113495bSYour Name  * iwpriv wlan0 set_fw_mode_cfg 1 1
2268*5113495bSYour Name  *
2269*5113495bSYour Name  * Supported Feature: DBS
2270*5113495bSYour Name  *
2271*5113495bSYour Name  * Usage: Internal/External
2272*5113495bSYour Name  *
2273*5113495bSYour Name  * </ioctl>
2274*5113495bSYour Name  */
2275*5113495bSYour Name #define WE_SET_DUAL_MAC_FW_MODE_CONFIG 22
2276*5113495bSYour Name #define WE_SET_MON_MODE_CHAN 23
2277*5113495bSYour Name /*
2278*5113495bSYour Name  * <ioctl>
2279*5113495bSYour Name  * txrx_stats - TXRX statistics query
2280*5113495bSYour Name  *
2281*5113495bSYour Name  * @INPUT: query category, mac id (default mac id is 0)
2282*5113495bSYour Name  *
2283*5113495bSYour Name  * @OUTPUT: TXRX statistics result
2284*5113495bSYour Name  *
2285*5113495bSYour Name  * This IOCTL is used to get TXRX statistics counters.
2286*5113495bSYour Name  *
2287*5113495bSYour Name  * @E.g: iwpriv wlan0 txrx_stats 21 0
2288*5113495bSYour Name  * iwpriv wlan0 txrx_stats 21 1
2289*5113495bSYour Name  *
2290*5113495bSYour Name  * Usage: Internal
2291*5113495bSYour Name  *
2292*5113495bSYour Name  * </ioctl>
2293*5113495bSYour Name  */
2294*5113495bSYour Name #define WE_SET_TXRX_STATS    24
2295*5113495bSYour Name 
2296*5113495bSYour Name 
2297*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
2298*5113495bSYour Name #undef  MAX_VAR_ARGS
2299*5113495bSYour Name #define MAX_VAR_ARGS         11
2300*5113495bSYour Name #else
2301*5113495bSYour Name #undef  MAX_VAR_ARGS
2302*5113495bSYour Name #define MAX_VAR_ARGS         9
2303*5113495bSYour Name #endif
2304*5113495bSYour Name 
2305*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
2306*5113495bSYour Name #undef  MAX_VAR_ARGS
2307*5113495bSYour Name #define MAX_VAR_ARGS                              15
2308*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
2309*5113495bSYour Name #define WE_MOTION_DET_CONFIG_PARAM                25
2310*5113495bSYour Name #define WE_MOTION_DET_BASE_LINE_CONFIG_PARAM      26
2311*5113495bSYour Name 
2312*5113495bSYour Name #define WE_SET_THERMAL_THROTTLE_CFG               27
2313*5113495bSYour Name /*
2314*5113495bSYour Name  * <ioctl>
2315*5113495bSYour Name  * fips_test - Perform a FIPS test
2316*5113495bSYour Name  *
2317*5113495bSYour Name  * @INPUT: Binary representation of the following packed structure
2318*5113495bSYour Name  *
2319*5113495bSYour Name  * @OUTPUT: Binary representation of the following packed structure
2320*5113495bSYour Name  *
2321*5113495bSYour Name  * This IOCTL is used to perform FIPS certification testing
2322*5113495bSYour Name  *
2323*5113495bSYour Name  * @E.g: iwpriv wlan0 fips_test <test vector>
2324*5113495bSYour Name  *
2325*5113495bSYour Name  * iwpriv wlan0 fips_test <tbd>
2326*5113495bSYour Name  *
2327*5113495bSYour Name  * Supported Feature: FIPS
2328*5113495bSYour Name  *
2329*5113495bSYour Name  * Usage: Internal
2330*5113495bSYour Name  *
2331*5113495bSYour Name  * </ioctl>
2332*5113495bSYour Name  */
2333*5113495bSYour Name #define WLAN_PRIV_FIPS_TEST (SIOCIWFIRSTPRIV +  8)
2334*5113495bSYour Name 
2335*5113495bSYour Name /* Private ioctls (with no sub-ioctls) */
2336*5113495bSYour Name /* note that they must be odd so that they have "get" semantics */
2337*5113495bSYour Name /*
2338*5113495bSYour Name  * <ioctl>
2339*5113495bSYour Name  * addTspec - Add TSPEC for each AC
2340*5113495bSYour Name  *
2341*5113495bSYour Name  * @INPUT: 19 TSPEC params
2342*5113495bSYour Name  *     @[arg0]: handle
2343*5113495bSYour Name  *     @[arg1]: tid
2344*5113495bSYour Name  *     @[arg2]: dir
2345*5113495bSYour Name  *     @[arg3]: psb
2346*5113495bSYour Name  *     @[arg4]: up
2347*5113495bSYour Name  *     @[arg5]: nomMsduSize
2348*5113495bSYour Name  *     @[arg6]: maxMsduSize
2349*5113495bSYour Name  *     @[arg7]: minDataRate
2350*5113495bSYour Name  *     @[arg8]: meanDataRate
2351*5113495bSYour Name  *     @[arg9]: peakDataRate
2352*5113495bSYour Name  *     @[arg10]: maxBurstSize
2353*5113495bSYour Name  *     @[arg11]: minPhyRate
2354*5113495bSYour Name  *     @[arg12]: sba
2355*5113495bSYour Name  *     @[arg13]: minServiceIntv
2356*5113495bSYour Name  *     @[arg14]: suspendIntv
2357*5113495bSYour Name  *     @[arg15]: burstSizeDefn
2358*5113495bSYour Name  *     @[arg16]: ackPolicy
2359*5113495bSYour Name  *     @[arg17]: inactivityPeriod
2360*5113495bSYour Name  *     @[arg18]: maxServiceIntv
2361*5113495bSYour Name  *
2362*5113495bSYour Name  * @OUTPUT: Success/Failure
2363*5113495bSYour Name  *
2364*5113495bSYour Name  * This IOCTL is used to add TSPEC for each AC.
2365*5113495bSYour Name  *
2366*5113495bSYour Name  * @E.g: iwpriv wlan0 addTspec <handle> <tid> <dir> <psb> <up> <nomMsduSize>
2367*5113495bSYour Name  *                             <maxMsduSize> <minDataRate> <meanDataRate>
2368*5113495bSYour Name  *                             <peakDataRate> <maxBurstSize> <minPhyRate>
2369*5113495bSYour Name  *                             <sba> <minServiceIntv> <suspendIntv>
2370*5113495bSYour Name  *                             <burstSizeDefn> <ackPolicy> <inactivityPeriod>
2371*5113495bSYour Name  *                             <maxServiceIntv>
2372*5113495bSYour Name  * iwpriv wlan0 addTspec 7001 6 2 1 6 0x80D0 0x80D0 0x14500 0x14500 0x14500
2373*5113495bSYour Name  *                      0 0x5B8D80 0x2001 20 2000 0 0 0 2000
2374*5113495bSYour Name  * wlan0     addTspec:3
2375*5113495bSYour Name  *
2376*5113495bSYour Name  * Supported Feature: WMM
2377*5113495bSYour Name  *
2378*5113495bSYour Name  * Usage: Internal/External
2379*5113495bSYour Name  *
2380*5113495bSYour Name  * </ioctl>
2381*5113495bSYour Name  */
2382*5113495bSYour Name #define WLAN_PRIV_ADD_TSPEC (SIOCIWFIRSTPRIV +  9)
2383*5113495bSYour Name /*
2384*5113495bSYour Name  * <ioctl>
2385*5113495bSYour Name  * delTspec - Delete TSPEC entry for each AC
2386*5113495bSYour Name  *
2387*5113495bSYour Name  * @INPUT: 1 TSPEC param
2388*5113495bSYour Name  *     @[arg0]: handle
2389*5113495bSYour Name  *
2390*5113495bSYour Name  * @OUTPUT: Success/Failure
2391*5113495bSYour Name  *
2392*5113495bSYour Name  * This IOCTL is used to delete TSPEC entry for each AC.
2393*5113495bSYour Name  *
2394*5113495bSYour Name  * @E.g: iwpriv wlan0 delTspec <handle>
2395*5113495bSYour Name  * iwpriv wlan0 delTspec 7001
2396*5113495bSYour Name  * wlan0     delTspec:16
2397*5113495bSYour Name  *
2398*5113495bSYour Name  * Supported Feature: WMM
2399*5113495bSYour Name  *
2400*5113495bSYour Name  * Usage: Internal/External
2401*5113495bSYour Name  *
2402*5113495bSYour Name  * </ioctl>
2403*5113495bSYour Name  */
2404*5113495bSYour Name #define WLAN_PRIV_DEL_TSPEC (SIOCIWFIRSTPRIV + 11)
2405*5113495bSYour Name /*
2406*5113495bSYour Name  * <ioctl>
2407*5113495bSYour Name  * getTspec - Get TSPEC entry for each AC
2408*5113495bSYour Name  *
2409*5113495bSYour Name  * @INPUT: 1 TSPEC param
2410*5113495bSYour Name  *     @[arg0]: handle
2411*5113495bSYour Name  *
2412*5113495bSYour Name  * @OUTPUT: Success/Failure
2413*5113495bSYour Name  *
2414*5113495bSYour Name  * This IOCTL is used to get TSPEC entry for each AC.
2415*5113495bSYour Name  *
2416*5113495bSYour Name  * @E.g: iwpriv wlan0 getTspec <handle>
2417*5113495bSYour Name  * iwpriv wlan0 getTspec 7001
2418*5113495bSYour Name  * wlan0     delTspec:18
2419*5113495bSYour Name  *
2420*5113495bSYour Name  * Supported Feature: WMM
2421*5113495bSYour Name  *
2422*5113495bSYour Name  * Usage: Internal/External
2423*5113495bSYour Name  *
2424*5113495bSYour Name  * </ioctl>
2425*5113495bSYour Name  */
2426*5113495bSYour Name #define WLAN_PRIV_GET_TSPEC (SIOCIWFIRSTPRIV + 13)
2427*5113495bSYour Name 
2428*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 10) is currently unused */
2429*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 12) is currently unused */
2430*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 14) is currently unused */
2431*5113495bSYour Name #define WLAN_PRIV_SET_NONE_GET_THREE_INT   (SIOCIWFIRSTPRIV + 15)
2432*5113495bSYour Name #define WE_GET_TSF      1
2433*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 16) is currently unused */
2434*5113495bSYour Name 
2435*5113495bSYour Name #ifdef FEATURE_WLM_STATS
2436*5113495bSYour Name /*
2437*5113495bSYour Name  * <ioctl>
2438*5113495bSYour Name  *
2439*5113495bSYour Name  * get_wlm_stats - Get stats from FW for game latency
2440*5113495bSYour Name  *
2441*5113495bSYour Name  * @INPUT: BITMASK inform of decimal number
2442*5113495bSYour Name  *
2443*5113495bSYour Name  * @OUTPUT: HEX string given by FW
2444*5113495bSYour Name  *
2445*5113495bSYour Name  * This IOCTL is used to get game latency related STATS from FW
2446*5113495bSYour Name  *
2447*5113495bSYour Name  * @E.g.: iwpriv wlan0 get_wlm_stats 1
2448*5113495bSYour Name  *
2449*5113495bSYour Name  * Usage: internal
2450*5113495bSYour Name  *
2451*5113495bSYour Name  * </ioctl>
2452*5113495bSYour Name  */
2453*5113495bSYour Name #define WLAN_GET_WLM_STATS       (SIOCIWFIRSTPRIV + 17)
2454*5113495bSYour Name #endif
2455*5113495bSYour Name 
2456*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 19) is currently unused */
2457*5113495bSYour Name 
2458*5113495bSYour Name #define WLAN_PRIV_SET_FTIES             (SIOCIWFIRSTPRIV + 20)
2459*5113495bSYour Name 
2460*5113495bSYour Name /* Private ioctl for setting the host offload feature */
2461*5113495bSYour Name #define WLAN_PRIV_SET_HOST_OFFLOAD (SIOCIWFIRSTPRIV + 18)
2462*5113495bSYour Name 
2463*5113495bSYour Name /* Private ioctl to get the statistics */
2464*5113495bSYour Name #define WLAN_GET_WLAN_STATISTICS (SIOCIWFIRSTPRIV + 21)
2465*5113495bSYour Name 
2466*5113495bSYour Name /* Private ioctl to set the Keep Alive Params */
2467*5113495bSYour Name /*
2468*5113495bSYour Name  * <ioctl>
2469*5113495bSYour Name  * setKeepAlive - Set the keep alive feature
2470*5113495bSYour Name  *
2471*5113495bSYour Name  * @INPUT: 28 bytes of information in the order of packet type, time period
2472*5113495bSYour Name  * host IPv4 address, destination IPv4 address, destination MAC address, bssID
2473*5113495bSYour Name  *
2474*5113495bSYour Name  * @OUTPUT: None
2475*5113495bSYour Name  *
2476*5113495bSYour Name  * This IOCTL sets the keep alive feature to send either NULL
2477*5113495bSYour Name  * or unsolicited ARP response packets
2478*5113495bSYour Name  *
2479*5113495bSYour Name  * @E.g: iwpriv wlan0 setKeepAlive
2480*5113495bSYour Name  *
2481*5113495bSYour Name  * Supported Feature: STA
2482*5113495bSYour Name  *
2483*5113495bSYour Name  * Usage: Internal/External
2484*5113495bSYour Name  *
2485*5113495bSYour Name  * </ioctl>
2486*5113495bSYour Name  */
2487*5113495bSYour Name #define WLAN_SET_KEEPALIVE_PARAMS (SIOCIWFIRSTPRIV + 22)
2488*5113495bSYour Name 
2489*5113495bSYour Name #ifdef WLAN_FEATURE_PACKET_FILTERING
2490*5113495bSYour Name /* Private ioctl to set the packet filtering params */
2491*5113495bSYour Name #define WLAN_SET_PACKET_FILTER_PARAMS (SIOCIWFIRSTPRIV + 23)
2492*5113495bSYour Name #endif
2493*5113495bSYour Name 
2494*5113495bSYour Name 
2495*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
2496*5113495bSYour Name /* Private ioctl to get the statistics */
2497*5113495bSYour Name #define WLAN_SET_PNO (SIOCIWFIRSTPRIV + 24)
2498*5113495bSYour Name #endif
2499*5113495bSYour Name /*
2500*5113495bSYour Name  * <ioctl>
2501*5113495bSYour Name  * SETBAND - Set the operational band
2502*5113495bSYour Name  *
2503*5113495bSYour Name  * @INPUT: 0 to Auto, 1 to 5 GHz and 2 to 2.4 GHz
2504*5113495bSYour Name  *
2505*5113495bSYour Name  * @OUTPUT: None
2506*5113495bSYour Name  *
2507*5113495bSYour Name  * This IOCTL Set the operational band If the new band is different from the
2508*5113495bSYour Name  * current operational band, it aborts the pending scan requests, flushes
2509*5113495bSYour Name  * the existing scan results, and then change * the band capability
2510*5113495bSYour Name  *
2511*5113495bSYour Name  * @E.g: iwpriv wlan0 SETBAND <value>
2512*5113495bSYour Name  *
2513*5113495bSYour Name  * Supported Feature: STA
2514*5113495bSYour Name  *
2515*5113495bSYour Name  * Usage: Internal/External
2516*5113495bSYour Name  *
2517*5113495bSYour Name  * </ioctl>
2518*5113495bSYour Name  */
2519*5113495bSYour Name #define WLAN_SET_BAND_CONFIG  (SIOCIWFIRSTPRIV + 25)
2520*5113495bSYour Name 
2521*5113495bSYour Name #define WLAN_PRIV_SET_MCBC_FILTER   (SIOCIWFIRSTPRIV + 26)
2522*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 27) is currently unused */
2523*5113495bSYour Name 
2524*5113495bSYour Name /* Private ioctls and their sub-ioctls */
2525*5113495bSYour Name #define WLAN_PRIV_SET_TWO_INT_GET_NONE   (SIOCIWFIRSTPRIV + 28)
2526*5113495bSYour Name #define WE_SET_SMPS_PARAM    1
2527*5113495bSYour Name #define WE_SET_FW_CRASH_INJECT    2
2528*5113495bSYour Name #define WE_DUMP_DP_TRACE_LEVEL    3
2529*5113495bSYour Name /* Private sub ioctl for enabling and setting histogram interval of profiling */
2530*5113495bSYour Name #define WE_ENABLE_FW_PROFILE    4
2531*5113495bSYour Name #define WE_SET_FW_PROFILE_HIST_INTVL    5
2532*5113495bSYour Name 
2533*5113495bSYour Name /* Private sub-ioctl for initiating WoW suspend without Apps suspend */
2534*5113495bSYour Name #define WE_SET_WLAN_SUSPEND    6
2535*5113495bSYour Name #define WE_SET_WLAN_RESUME    7
2536*5113495bSYour Name 
2537*5113495bSYour Name /*
2538*5113495bSYour Name  * <ioctl>
2539*5113495bSYour Name  * log_buffer - prints host/target related communication logs via dmesg
2540*5113495bSYour Name  *
2541*5113495bSYour Name  * @INPUT: Log Id, Count
2542*5113495bSYour Name  *
2543*5113495bSYour Name  * Log Id:
2544*5113495bSYour Name  *	0) HTC_CREDIT_HISTORY_LOG
2545*5113495bSYour Name  *	1) COMMAND_LOG,
2546*5113495bSYour Name  *	2) COMMAND_TX_CMP_LOG,
2547*5113495bSYour Name  *	3) MGMT_COMMAND_LOG,
2548*5113495bSYour Name  *	4) MGMT_COMMAND_TX_CMP_LOG,
2549*5113495bSYour Name  *	5) EVENT_LOG,
2550*5113495bSYour Name  *	6) RX_EVENT_LOG,
2551*5113495bSYour Name  *	7) MGMT_EVENT_LOG
2552*5113495bSYour Name  *
2553*5113495bSYour Name  * @OUTPUT: None
2554*5113495bSYour Name  *
2555*5113495bSYour Name  * @E.g:
2556*5113495bSYour Name  * # print up to 10 of the most recent records from HTC Credit History
2557*5113495bSYour Name  *	iwpriv wlan0 log_buffer 0 10
2558*5113495bSYour Name  * # print up to 3 of the most recent records from Event Log
2559*5113495bSYour Name  *	iwpriv wlan0 log_buffer 5 3
2560*5113495bSYour Name  *
2561*5113495bSYour Name  * Supported Feature: WLAN Trace
2562*5113495bSYour Name  *
2563*5113495bSYour Name  * Usage: Internal/External
2564*5113495bSYour Name  *
2565*5113495bSYour Name  * </ioctl>
2566*5113495bSYour Name  */
2567*5113495bSYour Name #define WE_LOG_BUFFER			8
2568*5113495bSYour Name 
2569*5113495bSYour Name /*
2570*5113495bSYour Name  * <ioctl>
2571*5113495bSYour Name  * set_ba_timeout - sets Block ACK aging timeout value for each Access class
2572*5113495bSYour Name  *
2573*5113495bSYour Name  * @INPUT: Access Class [0:BK, 1:BE, 2:VI, 3:VO], Timeout value
2574*5113495bSYour Name  *
2575*5113495bSYour Name  * @OUTPUT: None
2576*5113495bSYour Name  *
2577*5113495bSYour Name  * @E.g.:
2578*5113495bSYour Name  * # to set duration of 2 seconds for BE
2579*5113495bSYour Name  *	iwpriv wlan0 set_ba_timeout 1 2
2580*5113495bSYour Name  * # to set duration of 3 seconds for VO
2581*5113495bSYour Name  *	iwpriv wlan0 set_ba_timeout 3 3
2582*5113495bSYour Name  *
2583*5113495bSYour Name  * Usage: Internal
2584*5113495bSYour Name  *
2585*5113495bSYour Name  * </ioctl>
2586*5113495bSYour Name  */
2587*5113495bSYour Name #define WE_SET_BA_AGEING_TIMEOUT		9
2588*5113495bSYour Name 
2589*5113495bSYour Name /* (SIOCIWFIRSTPRIV + 29) is currently unused */
2590*5113495bSYour Name 
2591*5113495bSYour Name /* 802.11p IOCTL */
2592*5113495bSYour Name #define WLAN_SET_DOT11P_CHANNEL_SCHED    (SIOCIWFIRSTPRIV + 30)
2593*5113495bSYour Name 
2594*5113495bSYour Name /*
2595*5113495bSYour Name  * <ioctl>
2596*5113495bSYour Name  * getLinkSpeed - Gets the current link speed in Mbps
2597*5113495bSYour Name  *
2598*5113495bSYour Name  * @INPUT: None
2599*5113495bSYour Name  *
2600*5113495bSYour Name  * @OUTPUT: linkspeed in mbps
2601*5113495bSYour Name  *  wlan0     getLinkSpeed:7
2602*5113495bSYour Name  *
2603*5113495bSYour Name  * This IOCTL is used get the current link speed in Mbps
2604*5113495bSYour Name  *
2605*5113495bSYour Name  * @E.g: iwpriv wlan0 getLinkSpeed
2606*5113495bSYour Name  *
2607*5113495bSYour Name  * Supported Feature: STA
2608*5113495bSYour Name  *
2609*5113495bSYour Name  * Usage: Internal/External
2610*5113495bSYour Name  *
2611*5113495bSYour Name  * </ioctl>
2612*5113495bSYour Name  */
2613*5113495bSYour Name #define WLAN_GET_LINK_SPEED          (SIOCIWFIRSTPRIV + 31)
2614*5113495bSYour Name 
2615*5113495bSYour Name #define WLAN_STATS_INVALID            0
2616*5113495bSYour Name #define WLAN_STATS_RETRY_CNT          1
2617*5113495bSYour Name #define WLAN_STATS_MUL_RETRY_CNT      2
2618*5113495bSYour Name #define WLAN_STATS_TX_FRM_CNT         3
2619*5113495bSYour Name #define WLAN_STATS_RX_FRM_CNT         4
2620*5113495bSYour Name #define WLAN_STATS_FRM_DUP_CNT        5
2621*5113495bSYour Name #define WLAN_STATS_FAIL_CNT           6
2622*5113495bSYour Name #define WLAN_STATS_RTS_FAIL_CNT       7
2623*5113495bSYour Name #define WLAN_STATS_ACK_FAIL_CNT       8
2624*5113495bSYour Name #define WLAN_STATS_RTS_SUC_CNT        9
2625*5113495bSYour Name #define WLAN_STATS_RX_DISCARD_CNT     10
2626*5113495bSYour Name #define WLAN_STATS_RX_ERROR_CNT       11
2627*5113495bSYour Name #define WLAN_STATS_TX_BYTE_CNT        12
2628*5113495bSYour Name 
2629*5113495bSYour Name #define WLAN_STATS_RX_BYTE_CNT        13
2630*5113495bSYour Name #define WLAN_STATS_RX_RATE            14
2631*5113495bSYour Name #define WLAN_STATS_TX_RATE            15
2632*5113495bSYour Name 
2633*5113495bSYour Name #define WLAN_STATS_RX_UC_BYTE_CNT     16
2634*5113495bSYour Name #define WLAN_STATS_RX_MC_BYTE_CNT     17
2635*5113495bSYour Name #define WLAN_STATS_RX_BC_BYTE_CNT     18
2636*5113495bSYour Name #define WLAN_STATS_TX_UC_BYTE_CNT     19
2637*5113495bSYour Name #define WLAN_STATS_TX_MC_BYTE_CNT     20
2638*5113495bSYour Name #define WLAN_STATS_TX_BC_BYTE_CNT     21
2639*5113495bSYour Name 
2640*5113495bSYour Name #define FILL_TLV(__p, __type, __size, __val, __tlen) do {		\
2641*5113495bSYour Name 		if ((__tlen + __size + 2) < WE_MAX_STR_LEN) {		\
2642*5113495bSYour Name 			*__p++ = __type;				\
2643*5113495bSYour Name 			*__p++ = __size;				\
2644*5113495bSYour Name 			memcpy(__p, __val, __size);			\
2645*5113495bSYour Name 			__p += __size;					\
2646*5113495bSYour Name 			__tlen += __size + 2;				\
2647*5113495bSYour Name 		} else {						\
2648*5113495bSYour Name 			hdd_err("FILL_TLV Failed!!!");  \
2649*5113495bSYour Name 		}							\
2650*5113495bSYour Name 	} while (0)
2651*5113495bSYour Name 
2652*5113495bSYour Name #define TX_PER_TRACKING_DEFAULT_RATIO             5
2653*5113495bSYour Name #define TX_PER_TRACKING_MAX_RATIO                10
2654*5113495bSYour Name #define TX_PER_TRACKING_DEFAULT_WATERMARK         5
2655*5113495bSYour Name 
2656*5113495bSYour Name #define WLAN_ADAPTER 0
2657*5113495bSYour Name #define P2P_ADAPTER  1
2658*5113495bSYour Name 
2659*5113495bSYour Name /**
2660*5113495bSYour Name  * mem_alloc_copy_from_user_helper - copy from user helper
2661*5113495bSYour Name  * @wrqu_data: wireless extensions request data
2662*5113495bSYour Name  * @len: length of @wrqu_data
2663*5113495bSYour Name  *
2664*5113495bSYour Name  * Helper function to allocate buffer and copy user data.
2665*5113495bSYour Name  *
2666*5113495bSYour Name  * Return: On success return a pointer to a kernel buffer containing a
2667*5113495bSYour Name  * copy of the userspace data (with an additional NUL character
2668*5113495bSYour Name  * appended for safety). On failure return %NULL.
2669*5113495bSYour Name  */
mem_alloc_copy_from_user_helper(const __user void * wrqu_data,size_t len)2670*5113495bSYour Name void *mem_alloc_copy_from_user_helper(const __user void *wrqu_data, size_t len)
2671*5113495bSYour Name {
2672*5113495bSYour Name 	u8 *ptr = NULL;
2673*5113495bSYour Name 
2674*5113495bSYour Name 	/* in order to protect the code, an extra byte is post
2675*5113495bSYour Name 	 * appended to the buffer and the null termination is added.
2676*5113495bSYour Name 	 * However, when allocating (len+1) byte of memory, we need to
2677*5113495bSYour Name 	 * make sure that there is no uint overflow when doing
2678*5113495bSYour Name 	 * addition. In theory check len < UINT_MAX protects the uint
2679*5113495bSYour Name 	 * overflow. For wlan private ioctl, the buffer size is much
2680*5113495bSYour Name 	 * less than UINT_MAX, as a good guess, now, it is assumed
2681*5113495bSYour Name 	 * that the private command buffer size is no greater than 4K
2682*5113495bSYour Name 	 * (4096 bytes). So we use 4096 as the upper boundary for now.
2683*5113495bSYour Name 	 */
2684*5113495bSYour Name 	if (len > MAX_USER_COMMAND_SIZE) {
2685*5113495bSYour Name 		hdd_err("Invalid length: %zu max: %u",
2686*5113495bSYour Name 			 len, MAX_USER_COMMAND_SIZE);
2687*5113495bSYour Name 		return NULL;
2688*5113495bSYour Name 	}
2689*5113495bSYour Name 
2690*5113495bSYour Name 	ptr = qdf_mem_malloc(len + 1);
2691*5113495bSYour Name 	if (!ptr)
2692*5113495bSYour Name 		return NULL;
2693*5113495bSYour Name 
2694*5113495bSYour Name 	if (copy_from_user(ptr, wrqu_data, len)) {
2695*5113495bSYour Name 		hdd_err("failed to copy data to user buffer");
2696*5113495bSYour Name 		qdf_mem_free(ptr);
2697*5113495bSYour Name 		return NULL;
2698*5113495bSYour Name 	}
2699*5113495bSYour Name 	ptr[len] = '\0';
2700*5113495bSYour Name 	return ptr;
2701*5113495bSYour Name }
2702*5113495bSYour Name 
2703*5113495bSYour Name /**
2704*5113495bSYour Name  * hdd_priv_get_data() - Get pointer to ioctl private data
2705*5113495bSYour Name  * @p_priv_data: pointer to iw_point struct to be filled
2706*5113495bSYour Name  * @wrqu: Pointer to IOCTL Data received from userspace
2707*5113495bSYour Name  *
2708*5113495bSYour Name  * Helper function to get compatible struct iw_point passed to ioctl
2709*5113495bSYour Name  *
2710*5113495bSYour Name  * Return - 0 if p_priv_data successfully filled, error otherwise
2711*5113495bSYour Name  */
hdd_priv_get_data(struct iw_point * p_priv_data,union iwreq_data * wrqu)2712*5113495bSYour Name int hdd_priv_get_data(struct iw_point *p_priv_data, union iwreq_data *wrqu)
2713*5113495bSYour Name {
2714*5113495bSYour Name 	if ((!p_priv_data) || (!wrqu))
2715*5113495bSYour Name 		return -EINVAL;
2716*5113495bSYour Name 
2717*5113495bSYour Name #ifdef CONFIG_COMPAT
2718*5113495bSYour Name 	if (in_compat_syscall()) {
2719*5113495bSYour Name 		struct compat_iw_point *p_compat_priv_data;
2720*5113495bSYour Name 
2721*5113495bSYour Name 		/* Compat task:
2722*5113495bSYour Name 		 * typecast to compat structure and copy the members.
2723*5113495bSYour Name 		 */
2724*5113495bSYour Name 		p_compat_priv_data = (struct compat_iw_point *)&wrqu->data;
2725*5113495bSYour Name 
2726*5113495bSYour Name 		p_priv_data->pointer = compat_ptr(p_compat_priv_data->pointer);
2727*5113495bSYour Name 		p_priv_data->length = p_compat_priv_data->length;
2728*5113495bSYour Name 		p_priv_data->flags = p_compat_priv_data->flags;
2729*5113495bSYour Name 	} else {
2730*5113495bSYour Name #endif /* #ifdef CONFIG_COMPAT */
2731*5113495bSYour Name 
2732*5113495bSYour Name 		/* Non compat task: directly copy the structure. */
2733*5113495bSYour Name 		memcpy(p_priv_data, &wrqu->data, sizeof(struct iw_point));
2734*5113495bSYour Name 
2735*5113495bSYour Name #ifdef CONFIG_COMPAT
2736*5113495bSYour Name 	}
2737*5113495bSYour Name #endif /* #ifdef CONFIG_COMPAT */
2738*5113495bSYour Name 
2739*5113495bSYour Name 	return 0;
2740*5113495bSYour Name }
2741*5113495bSYour Name 
hdd_check_wext_control(enum hdd_wext_control wext_control,struct iw_request_info * info)2742*5113495bSYour Name static int hdd_check_wext_control(enum hdd_wext_control wext_control,
2743*5113495bSYour Name 				  struct iw_request_info *info)
2744*5113495bSYour Name {
2745*5113495bSYour Name 	switch (wext_control) {
2746*5113495bSYour Name 	default:
2747*5113495bSYour Name 	case hdd_wext_disabled:
2748*5113495bSYour Name 		hdd_err_rl("Rejecting disabled ioctl %x", info->cmd);
2749*5113495bSYour Name 		return -ENOTSUPP;
2750*5113495bSYour Name 	case hdd_wext_deprecated:
2751*5113495bSYour Name 		hdd_nofl_debug("Using deprecated ioctl %x", info->cmd);
2752*5113495bSYour Name 		return 0;
2753*5113495bSYour Name 	case hdd_wext_enabled:
2754*5113495bSYour Name 		return 0;
2755*5113495bSYour Name 	}
2756*5113495bSYour Name }
2757*5113495bSYour Name 
hdd_check_private_wext_control(struct hdd_context * hdd_ctx,struct iw_request_info * info)2758*5113495bSYour Name int hdd_check_private_wext_control(struct hdd_context *hdd_ctx,
2759*5113495bSYour Name 				   struct iw_request_info *info)
2760*5113495bSYour Name {
2761*5113495bSYour Name 	return hdd_check_wext_control(hdd_ctx->config->private_wext_control,
2762*5113495bSYour Name 				      info);
2763*5113495bSYour Name }
2764*5113495bSYour Name 
hdd_wlan_get_stats(struct wlan_hdd_link_info * link_info,uint16_t * length,char * buffer,uint16_t buf_len)2765*5113495bSYour Name void hdd_wlan_get_stats(struct wlan_hdd_link_info *link_info, uint16_t *length,
2766*5113495bSYour Name 			char *buffer, uint16_t buf_len)
2767*5113495bSYour Name {
2768*5113495bSYour Name 	struct hdd_tx_rx_stats *stats = &link_info->hdd_stats.tx_rx_stats;
2769*5113495bSYour Name 	struct dp_tx_rx_stats *dp_stats;
2770*5113495bSYour Name 	uint32_t len = 0;
2771*5113495bSYour Name 	uint32_t total_rx_pkt = 0, total_rx_dropped = 0;
2772*5113495bSYour Name 	uint32_t total_rx_delv = 0, total_rx_refused = 0;
2773*5113495bSYour Name 	uint32_t total_tx_pkt = 0;
2774*5113495bSYour Name 	uint32_t total_tx_dropped = 0;
2775*5113495bSYour Name 	uint32_t total_tx_orphaned = 0;
2776*5113495bSYour Name 	uint32_t total_tx_classified_ac[WLAN_MAX_AC] = {0};
2777*5113495bSYour Name 	uint32_t total_tx_dropped_ac[WLAN_MAX_AC] = {0};
2778*5113495bSYour Name 	int i = 0;
2779*5113495bSYour Name 	uint8_t ac, rx_ol_con = 0, rx_ol_low_tput = 0;
2780*5113495bSYour Name 	struct hdd_context *hdd_ctx = link_info->adapter->hdd_ctx;
2781*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
2782*5113495bSYour Name 
2783*5113495bSYour Name 	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_DP_ID);
2784*5113495bSYour Name 	if (!vdev)
2785*5113495bSYour Name 		return;
2786*5113495bSYour Name 
2787*5113495bSYour Name 	dp_stats = qdf_mem_malloc(sizeof(*dp_stats));
2788*5113495bSYour Name 	if (!dp_stats) {
2789*5113495bSYour Name 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
2790*5113495bSYour Name 		return;
2791*5113495bSYour Name 	}
2792*5113495bSYour Name 
2793*5113495bSYour Name 	if (ucfg_dp_get_txrx_stats(vdev, dp_stats)) {
2794*5113495bSYour Name 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
2795*5113495bSYour Name 		hdd_err("Unable to get stats from DP component");
2796*5113495bSYour Name 		qdf_mem_free(dp_stats);
2797*5113495bSYour Name 		return;
2798*5113495bSYour Name 	}
2799*5113495bSYour Name 	hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
2800*5113495bSYour Name 
2801*5113495bSYour Name 	ucfg_dp_get_disable_rx_ol_val(hdd_ctx->psoc,
2802*5113495bSYour Name 				      &rx_ol_con, &rx_ol_low_tput);
2803*5113495bSYour Name 
2804*5113495bSYour Name 	for (; i < NUM_CPUS; i++) {
2805*5113495bSYour Name 		total_rx_pkt += dp_stats->per_cpu[i].rx_packets;
2806*5113495bSYour Name 		total_rx_dropped += dp_stats->per_cpu[i].rx_dropped;
2807*5113495bSYour Name 		total_rx_delv += dp_stats->per_cpu[i].rx_delivered;
2808*5113495bSYour Name 		total_rx_refused += dp_stats->per_cpu[i].rx_refused;
2809*5113495bSYour Name 		total_tx_pkt += dp_stats->per_cpu[i].tx_called;
2810*5113495bSYour Name 		total_tx_dropped += dp_stats->per_cpu[i].tx_dropped;
2811*5113495bSYour Name 		total_tx_orphaned += dp_stats->per_cpu[i].tx_orphaned;
2812*5113495bSYour Name 		for (ac = 0; ac < WLAN_MAX_AC; ac++) {
2813*5113495bSYour Name 			total_tx_classified_ac[ac] +=
2814*5113495bSYour Name 					 stats->per_cpu[i].tx_classified_ac[ac];
2815*5113495bSYour Name 			total_tx_dropped_ac[ac] +=
2816*5113495bSYour Name 					    stats->per_cpu[i].tx_dropped_ac[ac];
2817*5113495bSYour Name 		}
2818*5113495bSYour Name 	}
2819*5113495bSYour Name 
2820*5113495bSYour Name 	len = scnprintf(buffer, buf_len,
2821*5113495bSYour Name 			"\nTransmit[%lu] - "
2822*5113495bSYour Name 			"called %u, dropped %u orphan %u,"
2823*5113495bSYour Name 			"\n[dropped]    BK %u, BE %u, VI %u, VO %u"
2824*5113495bSYour Name 			"\n[classified] BK %u, BE %u, VI %u, VO %u"
2825*5113495bSYour Name 			"\n\nReceive[%lu] - "
2826*5113495bSYour Name 			"packets %u, dropped %u, unsolict_arp_n_mcast_drp %u, delivered %u, refused %u\n"
2827*5113495bSYour Name 			"GRO - agg %u non-agg %u flush_skip %u low_tput_flush %u disabled(conc %u low-tput %u)\n",
2828*5113495bSYour Name 			qdf_system_ticks(),
2829*5113495bSYour Name 			total_tx_pkt,
2830*5113495bSYour Name 			total_tx_dropped,
2831*5113495bSYour Name 			total_tx_orphaned,
2832*5113495bSYour Name 			total_tx_dropped_ac[SME_AC_BK],
2833*5113495bSYour Name 			total_tx_dropped_ac[SME_AC_BE],
2834*5113495bSYour Name 			total_tx_dropped_ac[SME_AC_VI],
2835*5113495bSYour Name 			total_tx_dropped_ac[SME_AC_VO],
2836*5113495bSYour Name 			total_tx_classified_ac[SME_AC_BK],
2837*5113495bSYour Name 			total_tx_classified_ac[SME_AC_BE],
2838*5113495bSYour Name 			total_tx_classified_ac[SME_AC_VI],
2839*5113495bSYour Name 			total_tx_classified_ac[SME_AC_VO],
2840*5113495bSYour Name 			qdf_system_ticks(),
2841*5113495bSYour Name 			total_rx_pkt, total_rx_dropped,
2842*5113495bSYour Name 			qdf_atomic_read(&dp_stats->rx_usolict_arp_n_mcast_drp),
2843*5113495bSYour Name 			total_rx_delv,
2844*5113495bSYour Name 			total_rx_refused,
2845*5113495bSYour Name 			dp_stats->rx_aggregated, dp_stats->rx_non_aggregated,
2846*5113495bSYour Name 			dp_stats->rx_gro_flush_skip,
2847*5113495bSYour Name 			dp_stats->rx_gro_low_tput_flush,
2848*5113495bSYour Name 			rx_ol_con,
2849*5113495bSYour Name 			rx_ol_low_tput);
2850*5113495bSYour Name 
2851*5113495bSYour Name 	for (i = 0; i < NUM_CPUS; i++) {
2852*5113495bSYour Name 		if (dp_stats->per_cpu[i].rx_packets == 0)
2853*5113495bSYour Name 			continue;
2854*5113495bSYour Name 		len += scnprintf(buffer + len, buf_len - len,
2855*5113495bSYour Name 				 "Rx CPU[%d]:"
2856*5113495bSYour Name 				 "packets %u, dropped %u, delivered %u, refused %u\n",
2857*5113495bSYour Name 				 i, dp_stats->per_cpu[i].rx_packets,
2858*5113495bSYour Name 				 dp_stats->per_cpu[i].rx_dropped,
2859*5113495bSYour Name 				 dp_stats->per_cpu[i].rx_delivered,
2860*5113495bSYour Name 				 dp_stats->per_cpu[i].rx_refused);
2861*5113495bSYour Name 	}
2862*5113495bSYour Name 
2863*5113495bSYour Name 	len += scnprintf(buffer + len, buf_len - len,
2864*5113495bSYour Name 		"\nTX_FLOW"
2865*5113495bSYour Name 		"\nCurrent status: %s"
2866*5113495bSYour Name 		"\ntx-flow timer start count %u"
2867*5113495bSYour Name 		"\npause count %u, unpause count %u",
2868*5113495bSYour Name 		(stats->is_txflow_paused == true ? "PAUSED" : "UNPAUSED"),
2869*5113495bSYour Name 		stats->txflow_timer_cnt,
2870*5113495bSYour Name 		stats->txflow_pause_cnt,
2871*5113495bSYour Name 		stats->txflow_unpause_cnt);
2872*5113495bSYour Name 
2873*5113495bSYour Name 	len += cdp_stats(cds_get_context(QDF_MODULE_ID_SOC),
2874*5113495bSYour Name 			 link_info->vdev_id, &buffer[len],
2875*5113495bSYour Name 			 (buf_len - len));
2876*5113495bSYour Name 	*length = len + 1;
2877*5113495bSYour Name 	qdf_mem_free(dp_stats);
2878*5113495bSYour Name }
2879*5113495bSYour Name 
2880*5113495bSYour Name /**
2881*5113495bSYour Name  * wlan_hdd_write_suspend_resume_stats() - Writes suspend/resume stats to buffer
2882*5113495bSYour Name  * @hdd_ctx: The Hdd context owning the stats to be written
2883*5113495bSYour Name  * @buffer: The char buffer to write to
2884*5113495bSYour Name  * @max_len: The maximum number of chars to write
2885*5113495bSYour Name  *
2886*5113495bSYour Name  * This assumes hdd_ctx has already been validated, and buffer is not NULL.
2887*5113495bSYour Name  *
2888*5113495bSYour Name  * Return - length of written content, negative number on error
2889*5113495bSYour Name  */
wlan_hdd_write_suspend_resume_stats(struct hdd_context * hdd_ctx,char * buffer,uint16_t max_len)2890*5113495bSYour Name static int wlan_hdd_write_suspend_resume_stats(struct hdd_context *hdd_ctx,
2891*5113495bSYour Name 					       char *buffer, uint16_t max_len)
2892*5113495bSYour Name {
2893*5113495bSYour Name 	int ret;
2894*5113495bSYour Name 	QDF_STATUS status;
2895*5113495bSYour Name 	struct suspend_resume_stats *sr_stats;
2896*5113495bSYour Name 
2897*5113495bSYour Name 	sr_stats = &hdd_ctx->suspend_resume_stats;
2898*5113495bSYour Name 	ret = scnprintf(buffer, max_len,
2899*5113495bSYour Name 			"\n"
2900*5113495bSYour Name 			"Suspends: %u\n"
2901*5113495bSYour Name 			"Resumes: %u\n"
2902*5113495bSYour Name 			"\n"
2903*5113495bSYour Name 			"Suspend Fail Reasons\n"
2904*5113495bSYour Name 			"\tIPA: %u\n"
2905*5113495bSYour Name 			"\tRadar: %u\n"
2906*5113495bSYour Name 			"\tRoam: %u\n"
2907*5113495bSYour Name 			"\tScan: %u\n"
2908*5113495bSYour Name 			"\tInitial Wakeup: %u\n"
2909*5113495bSYour Name 			"\n",
2910*5113495bSYour Name 			sr_stats->suspends, sr_stats->resumes,
2911*5113495bSYour Name 			sr_stats->suspend_fail[SUSPEND_FAIL_IPA],
2912*5113495bSYour Name 			sr_stats->suspend_fail[SUSPEND_FAIL_RADAR],
2913*5113495bSYour Name 			sr_stats->suspend_fail[SUSPEND_FAIL_ROAM],
2914*5113495bSYour Name 			sr_stats->suspend_fail[SUSPEND_FAIL_SCAN],
2915*5113495bSYour Name 			sr_stats->suspend_fail[SUSPEND_FAIL_INITIAL_WAKEUP]);
2916*5113495bSYour Name 
2917*5113495bSYour Name 	status = ucfg_mc_cp_stats_write_wow_stats(hdd_ctx->psoc,
2918*5113495bSYour Name 						  &buffer[ret], max_len - ret,
2919*5113495bSYour Name 						  &ret);
2920*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2921*5113495bSYour Name 		hdd_err("Failed to get WoW stats");
2922*5113495bSYour Name 		return qdf_status_to_os_return(status);
2923*5113495bSYour Name 	}
2924*5113495bSYour Name 
2925*5113495bSYour Name 	return ret;
2926*5113495bSYour Name }
2927*5113495bSYour Name 
2928*5113495bSYour Name /**
2929*5113495bSYour Name  * hdd_wlan_list_fw_profile() - Get fw profiling points
2930*5113495bSYour Name  * @length:   Size of the data copied
2931*5113495bSYour Name  * @buffer:   Pointer to char buffer.
2932*5113495bSYour Name  * @buf_len:  Length of the char buffer.
2933*5113495bSYour Name  *
2934*5113495bSYour Name  * This function called when the "iwpriv wlan0 listProfile" command is given.
2935*5113495bSYour Name  * It is used to get the supported profiling points in FW.
2936*5113495bSYour Name  *
2937*5113495bSYour Name  * Return - none
2938*5113495bSYour Name  */
hdd_wlan_list_fw_profile(uint16_t * length,char * buffer,uint16_t buf_len)2939*5113495bSYour Name void hdd_wlan_list_fw_profile(uint16_t *length,
2940*5113495bSYour Name 			char *buffer, uint16_t buf_len)
2941*5113495bSYour Name {
2942*5113495bSYour Name 	uint32_t len = 0;
2943*5113495bSYour Name 
2944*5113495bSYour Name 	len = scnprintf(buffer, buf_len,
2945*5113495bSYour Name 		    "PROF_CPU_IDLE: %u\n"
2946*5113495bSYour Name 		    "PROF_PPDU_PROC: %u\n"
2947*5113495bSYour Name 		    "PROF_PPDU_POST: %u\n"
2948*5113495bSYour Name 		    "PROF_HTT_TX_INPUT: %u\n"
2949*5113495bSYour Name 		    "PROF_MSDU_ENQ: %u\n"
2950*5113495bSYour Name 		    "PROF_PPDU_POST_HAL: %u\n"
2951*5113495bSYour Name 		    "PROF_COMPUTE_TX_TIME: %u\n",
2952*5113495bSYour Name 		    PROF_CPU_IDLE,
2953*5113495bSYour Name 		    PROF_PPDU_PROC,
2954*5113495bSYour Name 		    PROF_PPDU_POST,
2955*5113495bSYour Name 		    PROF_HTT_TX_INPUT,
2956*5113495bSYour Name 		    PROF_MSDU_ENQ,
2957*5113495bSYour Name 		    PROF_PPDU_POST_HAL,
2958*5113495bSYour Name 		    PROF_COMPUTE_TX_TIME);
2959*5113495bSYour Name 
2960*5113495bSYour Name 	*length = len + 1;
2961*5113495bSYour Name }
2962*5113495bSYour Name 
hdd_we_dump_stats(struct wlan_hdd_link_info * link_info,int value)2963*5113495bSYour Name static int hdd_we_dump_stats(struct wlan_hdd_link_info *link_info, int value)
2964*5113495bSYour Name {
2965*5113495bSYour Name 	return hdd_wlan_dump_stats(link_info->adapter, value);
2966*5113495bSYour Name }
2967*5113495bSYour Name 
2968*5113495bSYour Name /**
2969*5113495bSYour Name  * __iw_get_linkspeed() - Get current link speed ioctl
2970*5113495bSYour Name  * @dev: device upon which the ioctl was received
2971*5113495bSYour Name  * @info: ioctl request information
2972*5113495bSYour Name  * @wrqu: ioctl request data
2973*5113495bSYour Name  * @extra: extra ioctl buffer
2974*5113495bSYour Name  *
2975*5113495bSYour Name  * Return: 0 on success, non-zero on error
2976*5113495bSYour Name  */
__iw_get_linkspeed(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)2977*5113495bSYour Name static int __iw_get_linkspeed(struct net_device *dev,
2978*5113495bSYour Name 			      struct iw_request_info *info,
2979*5113495bSYour Name 			      union iwreq_data *wrqu, char *extra)
2980*5113495bSYour Name {
2981*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
2982*5113495bSYour Name 	char *out_link_speed = (char *)extra;
2983*5113495bSYour Name 	int len = sizeof(uint32_t) + 1;
2984*5113495bSYour Name 	uint32_t link_speed = 0;
2985*5113495bSYour Name 	struct hdd_context *hdd_ctx;
2986*5113495bSYour Name 	int ret, rc;
2987*5113495bSYour Name 
2988*5113495bSYour Name 	hdd_enter_dev(dev);
2989*5113495bSYour Name 
2990*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
2991*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
2992*5113495bSYour Name 	if (0 != ret)
2993*5113495bSYour Name 		return ret;
2994*5113495bSYour Name 
2995*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
2996*5113495bSYour Name 	if (0 != ret)
2997*5113495bSYour Name 		return ret;
2998*5113495bSYour Name 
2999*5113495bSYour Name 	ret = wlan_hdd_get_link_speed(adapter->deflink, &link_speed);
3000*5113495bSYour Name 	if (0 != ret)
3001*5113495bSYour Name 		return ret;
3002*5113495bSYour Name 
3003*5113495bSYour Name 	wrqu->data.length = len;
3004*5113495bSYour Name 	/* return the linkspeed as a string */
3005*5113495bSYour Name 	rc = snprintf(out_link_speed, len, "%u", link_speed);
3006*5113495bSYour Name 	if ((rc < 0) || (rc >= len)) {
3007*5113495bSYour Name 		/* encoding or length error? */
3008*5113495bSYour Name 		hdd_err("Unable to encode link speed");
3009*5113495bSYour Name 		return -EIO;
3010*5113495bSYour Name 	}
3011*5113495bSYour Name 
3012*5113495bSYour Name 	hdd_exit();
3013*5113495bSYour Name 	/* a value is being successfully returned */
3014*5113495bSYour Name 	return 0;
3015*5113495bSYour Name }
3016*5113495bSYour Name 
3017*5113495bSYour Name /**
3018*5113495bSYour Name  * iw_get_linkspeed() - Get current link speed ioctl
3019*5113495bSYour Name  * @dev: device upon which the ioctl was received
3020*5113495bSYour Name  * @info: ioctl request information
3021*5113495bSYour Name  * @wrqu: ioctl request data
3022*5113495bSYour Name  * @extra: extra ioctl buffer
3023*5113495bSYour Name  *
3024*5113495bSYour Name  * Return: 0 on success, non-zero on error
3025*5113495bSYour Name  */
iw_get_linkspeed(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3026*5113495bSYour Name static int iw_get_linkspeed(struct net_device *dev,
3027*5113495bSYour Name 			    struct iw_request_info *info,
3028*5113495bSYour Name 			    union iwreq_data *wrqu, char *extra)
3029*5113495bSYour Name {
3030*5113495bSYour Name 	int errno;
3031*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
3032*5113495bSYour Name 
3033*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
3034*5113495bSYour Name 	if (errno)
3035*5113495bSYour Name 		return errno;
3036*5113495bSYour Name 
3037*5113495bSYour Name 	errno = __iw_get_linkspeed(dev, info, wrqu, extra);
3038*5113495bSYour Name 
3039*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
3040*5113495bSYour Name 
3041*5113495bSYour Name 	return errno;
3042*5113495bSYour Name }
3043*5113495bSYour Name 
3044*5113495bSYour Name #ifdef FEATURE_WLM_STATS
wlan_get_wlm_stats_cb(void * cookie,const char * data)3045*5113495bSYour Name static void wlan_get_wlm_stats_cb(void *cookie, const char *data)
3046*5113495bSYour Name {
3047*5113495bSYour Name 	struct osif_request *request;
3048*5113495bSYour Name 	char *priv;
3049*5113495bSYour Name 
3050*5113495bSYour Name 	request = osif_request_get(cookie);
3051*5113495bSYour Name 	if (!request) {
3052*5113495bSYour Name 		hdd_err("Obsolete request");
3053*5113495bSYour Name 		return;
3054*5113495bSYour Name 	}
3055*5113495bSYour Name 	priv = osif_request_priv(request);
3056*5113495bSYour Name 	strlcpy(priv, data, WE_MAX_STR_LEN);
3057*5113495bSYour Name 	osif_request_complete(request);
3058*5113495bSYour Name 	osif_request_put(request);
3059*5113495bSYour Name }
3060*5113495bSYour Name 
wlan_get_wlm_stats(struct hdd_adapter * adapter,uint32_t bitmask,char * response)3061*5113495bSYour Name static int wlan_get_wlm_stats(struct hdd_adapter *adapter, uint32_t bitmask,
3062*5113495bSYour Name 			      char *response)
3063*5113495bSYour Name {
3064*5113495bSYour Name 	struct osif_request *request;
3065*5113495bSYour Name 	void *cookie;
3066*5113495bSYour Name 	int errno;
3067*5113495bSYour Name 	char *priv;
3068*5113495bSYour Name 	static const struct osif_request_params params = {
3069*5113495bSYour Name 			.priv_size = WE_MAX_STR_LEN,
3070*5113495bSYour Name 			.timeout_ms = 2000,
3071*5113495bSYour Name 	};
3072*5113495bSYour Name 
3073*5113495bSYour Name 	if (!adapter) {
3074*5113495bSYour Name 		hdd_err("NULL argument");
3075*5113495bSYour Name 		return -EINVAL;
3076*5113495bSYour Name 	}
3077*5113495bSYour Name 	request = osif_request_alloc(&params);
3078*5113495bSYour Name 	if (!request) {
3079*5113495bSYour Name 		hdd_err("Request allocation failure");
3080*5113495bSYour Name 		return -ENOMEM;
3081*5113495bSYour Name 	}
3082*5113495bSYour Name 	cookie = osif_request_cookie(request);
3083*5113495bSYour Name 	errno = wma_wlm_stats_req(adapter->deflink->vdev_id, bitmask,
3084*5113495bSYour Name 				  params.priv_size,
3085*5113495bSYour Name 				  wlan_get_wlm_stats_cb, cookie);
3086*5113495bSYour Name 	if (errno) {
3087*5113495bSYour Name 		hdd_err("Request failed be sent, %d", errno);
3088*5113495bSYour Name 		goto cleanup;
3089*5113495bSYour Name 	}
3090*5113495bSYour Name 	errno = osif_request_wait_for_response(request);
3091*5113495bSYour Name 	if (errno) {
3092*5113495bSYour Name 		hdd_err("Timeout happened, can't complete the req");
3093*5113495bSYour Name 		goto cleanup;
3094*5113495bSYour Name 	}
3095*5113495bSYour Name 	priv = osif_request_priv(request);
3096*5113495bSYour Name 	strlcpy(response, priv, params.priv_size);
3097*5113495bSYour Name 
3098*5113495bSYour Name cleanup:
3099*5113495bSYour Name 	osif_request_put(request);
3100*5113495bSYour Name 
3101*5113495bSYour Name 	return errno;
3102*5113495bSYour Name }
3103*5113495bSYour Name 
3104*5113495bSYour Name /*
3105*5113495bSYour Name  * Due to a limitation in iwpriv the "get_wlm_stats" ioctl is defined
3106*5113495bSYour Name  * to take as input a variable-length string as opposed to taking a
3107*5113495bSYour Name  * single integer "bitmask" value. Hence we must have a buffer large
3108*5113495bSYour Name  * enough to hold a string representing the largest possible
3109*5113495bSYour Name  * value. MAX_INT = 2,147,483,647 which can be fit in 10 chars.
3110*5113495bSYour Name  * Round up to 12 to hold the trailing NUL and be a multiple of 4.
3111*5113495bSYour Name  */
3112*5113495bSYour Name #define WLM_USER_DATA_SIZE 12
3113*5113495bSYour Name 
__iw_get_wlm_stats(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3114*5113495bSYour Name static int __iw_get_wlm_stats(struct net_device *dev,
3115*5113495bSYour Name 			      struct iw_request_info *info,
3116*5113495bSYour Name 			      union iwreq_data *wrqu, char *extra)
3117*5113495bSYour Name {
3118*5113495bSYour Name 	struct iw_point priv_data;
3119*5113495bSYour Name 	char user_data[WLM_USER_DATA_SIZE] = {0};
3120*5113495bSYour Name 	uint32_t bitmask = 0;
3121*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
3122*5113495bSYour Name 	struct hdd_context *hdd_ctx;
3123*5113495bSYour Name 	int errno;
3124*5113495bSYour Name 
3125*5113495bSYour Name 	hdd_enter_dev(dev);
3126*5113495bSYour Name 
3127*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
3128*5113495bSYour Name 	errno = wlan_hdd_validate_context(hdd_ctx);
3129*5113495bSYour Name 	if (errno)
3130*5113495bSYour Name 		return errno;
3131*5113495bSYour Name 
3132*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN)) {
3133*5113495bSYour Name 		hdd_err("permission check failed");
3134*5113495bSYour Name 		return -EPERM;
3135*5113495bSYour Name 	}
3136*5113495bSYour Name 
3137*5113495bSYour Name 	/*
3138*5113495bSYour Name 	 * Since this is GETTER iwpriv ioctl, driver needs to
3139*5113495bSYour Name 	 * copy SET data from user space to kernel space.
3140*5113495bSYour Name 	 * Helper function to get iwreq_data with compat handling.
3141*5113495bSYour Name 	 */
3142*5113495bSYour Name 	if (hdd_priv_get_data(&priv_data, wrqu))
3143*5113495bSYour Name 		return -EINVAL;
3144*5113495bSYour Name 
3145*5113495bSYour Name 	/*
3146*5113495bSYour Name 	 * priv_data.pointer  should be pointing to data given
3147*5113495bSYour Name 	 * to iwpriv command.
3148*5113495bSYour Name 	 *
3149*5113495bSYour Name 	 * For example "iwpriv wlan0 get_wlm_stats 1234"
3150*5113495bSYour Name 	 *
3151*5113495bSYour Name 	 * priv_data.pointer should be pointing to "1234"
3152*5113495bSYour Name 	 * priv_data.length should be zero as this GETTER iwpriv ioctl
3153*5113495bSYour Name 	 */
3154*5113495bSYour Name 	if (!priv_data.pointer) {
3155*5113495bSYour Name 		hdd_err("NULL data pointer");
3156*5113495bSYour Name 		return -EINVAL;
3157*5113495bSYour Name 	}
3158*5113495bSYour Name 
3159*5113495bSYour Name 	/*
3160*5113495bSYour Name 	 * ideally driver should have used priv_data.length to copy
3161*5113495bSYour Name 	 * data from priv_data.pointer but this iwpriv IOCTL has been
3162*5113495bSYour Name 	 * declared as GETTER in nature which makes length field zero
3163*5113495bSYour Name 	 * for input arguments but priv_data.pointer still points to
3164*5113495bSYour Name 	 * user's input argument (just doesn't pass the length of the
3165*5113495bSYour Name 	 * argument)
3166*5113495bSYour Name 	 */
3167*5113495bSYour Name 	if (copy_from_user(user_data, priv_data.pointer,
3168*5113495bSYour Name 			   sizeof(user_data) - 1)) {
3169*5113495bSYour Name 		hdd_err("failed to copy data from user buffer");
3170*5113495bSYour Name 		return -EFAULT;
3171*5113495bSYour Name 	}
3172*5113495bSYour Name 
3173*5113495bSYour Name 	/*
3174*5113495bSYour Name 	 * user data is given in ascii, convert ascii to integer
3175*5113495bSYour Name 	 */
3176*5113495bSYour Name 	if (kstrtou32(user_data, 0, &bitmask)) {
3177*5113495bSYour Name 		hdd_err("failed to parse input %s", user_data);
3178*5113495bSYour Name 		return -EFAULT;
3179*5113495bSYour Name 	}
3180*5113495bSYour Name 
3181*5113495bSYour Name 	if (wlan_get_wlm_stats(adapter, bitmask, extra)) {
3182*5113495bSYour Name 		hdd_err("returning failure");
3183*5113495bSYour Name 		return -EFAULT;
3184*5113495bSYour Name 	}
3185*5113495bSYour Name 	wrqu->data.length = strlen(extra) + 1;
3186*5113495bSYour Name 
3187*5113495bSYour Name 	return 0;
3188*5113495bSYour Name }
3189*5113495bSYour Name 
iw_get_wlm_stats(struct net_device * net_dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)3190*5113495bSYour Name static int iw_get_wlm_stats(struct net_device *net_dev,
3191*5113495bSYour Name 			    struct iw_request_info *info,
3192*5113495bSYour Name 			    union iwreq_data *wrqu, char *extra)
3193*5113495bSYour Name {
3194*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
3195*5113495bSYour Name 	int errno;
3196*5113495bSYour Name 
3197*5113495bSYour Name 	errno = osif_vdev_sync_op_start(net_dev, &vdev_sync);
3198*5113495bSYour Name 	if (errno)
3199*5113495bSYour Name 		return errno;
3200*5113495bSYour Name 
3201*5113495bSYour Name 	errno = __iw_get_wlm_stats(net_dev, info, wrqu, extra);
3202*5113495bSYour Name 
3203*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
3204*5113495bSYour Name 
3205*5113495bSYour Name 	return errno;
3206*5113495bSYour Name }
3207*5113495bSYour Name #endif /* FEATURE_WLM_STATS */
3208*5113495bSYour Name 
hdd_we_ieee_to_phymode(int ieee_mode,eCsrPhyMode * csr_phy_mode)3209*5113495bSYour Name static int hdd_we_ieee_to_phymode(int ieee_mode, eCsrPhyMode *csr_phy_mode)
3210*5113495bSYour Name {
3211*5113495bSYour Name 	switch (ieee_mode) {
3212*5113495bSYour Name 	case IEEE80211_MODE_AUTO:
3213*5113495bSYour Name 	case IEEE80211_MODE_2G_AUTO:
3214*5113495bSYour Name 	case IEEE80211_MODE_5G_AUTO:
3215*5113495bSYour Name 		*csr_phy_mode = eCSR_DOT11_MODE_AUTO;
3216*5113495bSYour Name 		break;
3217*5113495bSYour Name 	case IEEE80211_MODE_11A:
3218*5113495bSYour Name 		*csr_phy_mode = eCSR_DOT11_MODE_11a;
3219*5113495bSYour Name 		break;
3220*5113495bSYour Name 	case IEEE80211_MODE_11B:
3221*5113495bSYour Name 		*csr_phy_mode = eCSR_DOT11_MODE_11b;
3222*5113495bSYour Name 		break;
3223*5113495bSYour Name 	case IEEE80211_MODE_11G:
3224*5113495bSYour Name 		*csr_phy_mode = eCSR_DOT11_MODE_11g;
3225*5113495bSYour Name 		break;
3226*5113495bSYour Name 	case IEEE80211_MODE_11NA_HT20:
3227*5113495bSYour Name 	case IEEE80211_MODE_11NA_HT40:
3228*5113495bSYour Name 	case IEEE80211_MODE_11NG_HT20:
3229*5113495bSYour Name 	case IEEE80211_MODE_11NG_HT40:
3230*5113495bSYour Name 	case IEEE80211_MODE_11AGN:
3231*5113495bSYour Name 		*csr_phy_mode = eCSR_DOT11_MODE_11n;
3232*5113495bSYour Name 		break;
3233*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT20:
3234*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT40:
3235*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT80:
3236*5113495bSYour Name 		*csr_phy_mode = eCSR_DOT11_MODE_11ac;
3237*5113495bSYour Name 		break;
3238*5113495bSYour Name 	default:
3239*5113495bSYour Name 		hdd_err("Not supported mode %d", ieee_mode);
3240*5113495bSYour Name 		return -EINVAL;
3241*5113495bSYour Name 	}
3242*5113495bSYour Name 
3243*5113495bSYour Name 	return 0;
3244*5113495bSYour Name }
3245*5113495bSYour Name 
hdd_we_ieee_to_band(int ieee_mode,uint8_t * supported_band)3246*5113495bSYour Name static int hdd_we_ieee_to_band(int ieee_mode, uint8_t *supported_band)
3247*5113495bSYour Name {
3248*5113495bSYour Name 	switch (ieee_mode) {
3249*5113495bSYour Name 	case IEEE80211_MODE_AUTO:
3250*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT20:
3251*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT40:
3252*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT80:
3253*5113495bSYour Name 	case IEEE80211_MODE_11AGN:
3254*5113495bSYour Name 		*supported_band = BIT(REG_BAND_2G) | BIT(REG_BAND_5G);
3255*5113495bSYour Name 		break;
3256*5113495bSYour Name 	case IEEE80211_MODE_11A:
3257*5113495bSYour Name 	case IEEE80211_MODE_11NA_HT20:
3258*5113495bSYour Name 	case IEEE80211_MODE_11NA_HT40:
3259*5113495bSYour Name 	case IEEE80211_MODE_5G_AUTO:
3260*5113495bSYour Name 		*supported_band = BIT(REG_BAND_5G);
3261*5113495bSYour Name 		break;
3262*5113495bSYour Name 	case IEEE80211_MODE_11B:
3263*5113495bSYour Name 	case IEEE80211_MODE_11G:
3264*5113495bSYour Name 	case IEEE80211_MODE_11NG_HT20:
3265*5113495bSYour Name 	case IEEE80211_MODE_11NG_HT40:
3266*5113495bSYour Name 	case IEEE80211_MODE_2G_AUTO:
3267*5113495bSYour Name 		*supported_band = BIT(REG_BAND_2G);
3268*5113495bSYour Name 		break;
3269*5113495bSYour Name 	default:
3270*5113495bSYour Name 		hdd_err("Not supported mode %d", ieee_mode);
3271*5113495bSYour Name 		return -EINVAL;
3272*5113495bSYour Name 	}
3273*5113495bSYour Name 
3274*5113495bSYour Name 	return 0;
3275*5113495bSYour Name }
3276*5113495bSYour Name 
hdd_we_ieee_to_bonding_mode(int ieee_mode,uint32_t * bonding_mode)3277*5113495bSYour Name static int hdd_we_ieee_to_bonding_mode(int ieee_mode, uint32_t *bonding_mode)
3278*5113495bSYour Name {
3279*5113495bSYour Name 	switch (ieee_mode) {
3280*5113495bSYour Name 	case IEEE80211_MODE_AUTO:
3281*5113495bSYour Name 	case IEEE80211_MODE_11NA_HT40:
3282*5113495bSYour Name 	case IEEE80211_MODE_11NG_HT40:
3283*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT40:
3284*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT80:
3285*5113495bSYour Name 	case IEEE80211_MODE_2G_AUTO:
3286*5113495bSYour Name 	case IEEE80211_MODE_5G_AUTO:
3287*5113495bSYour Name 	case IEEE80211_MODE_11AGN:
3288*5113495bSYour Name 		*bonding_mode = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
3289*5113495bSYour Name 		break;
3290*5113495bSYour Name 	case IEEE80211_MODE_11A:
3291*5113495bSYour Name 	case IEEE80211_MODE_11B:
3292*5113495bSYour Name 	case IEEE80211_MODE_11G:
3293*5113495bSYour Name 	case IEEE80211_MODE_11NA_HT20:
3294*5113495bSYour Name 	case IEEE80211_MODE_11NG_HT20:
3295*5113495bSYour Name 	case IEEE80211_MODE_11AC_VHT20:
3296*5113495bSYour Name 		*bonding_mode = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3297*5113495bSYour Name 		break;
3298*5113495bSYour Name 	default:
3299*5113495bSYour Name 		hdd_err("Not supported mode %d", ieee_mode);
3300*5113495bSYour Name 		return -EINVAL;
3301*5113495bSYour Name 	}
3302*5113495bSYour Name 
3303*5113495bSYour Name 	return 0;
3304*5113495bSYour Name }
3305*5113495bSYour Name 
hdd_we_update_phymode(struct wlan_hdd_link_info * link_info,int new_phymode)3306*5113495bSYour Name int hdd_we_update_phymode(struct wlan_hdd_link_info *link_info,
3307*5113495bSYour Name 			  int new_phymode)
3308*5113495bSYour Name {
3309*5113495bSYour Name 	eCsrPhyMode phymode;
3310*5113495bSYour Name 	uint8_t supported_band;
3311*5113495bSYour Name 	uint32_t bonding_mode;
3312*5113495bSYour Name 	int ret;
3313*5113495bSYour Name 
3314*5113495bSYour Name 	ret = hdd_we_ieee_to_phymode(new_phymode, &phymode);
3315*5113495bSYour Name 	if (ret < 0)
3316*5113495bSYour Name 		return -EINVAL;
3317*5113495bSYour Name 
3318*5113495bSYour Name 	ret = hdd_we_ieee_to_band(new_phymode, &supported_band);
3319*5113495bSYour Name 	if (ret < 0)
3320*5113495bSYour Name 		return ret;
3321*5113495bSYour Name 
3322*5113495bSYour Name 	ret = hdd_we_ieee_to_bonding_mode(new_phymode, &bonding_mode);
3323*5113495bSYour Name 	if (ret < 0)
3324*5113495bSYour Name 		return ret;
3325*5113495bSYour Name 
3326*5113495bSYour Name 	return hdd_update_phymode(link_info->adapter, phymode, supported_band,
3327*5113495bSYour Name 				  bonding_mode);
3328*5113495bSYour Name }
3329*5113495bSYour Name 
hdd_validate_pdev_reset(int value)3330*5113495bSYour Name static int hdd_validate_pdev_reset(int value)
3331*5113495bSYour Name {
3332*5113495bSYour Name 	if ((value < 1) || (value > 5)) {
3333*5113495bSYour Name 		hdd_warn(" Invalid value %d: Use any one of the below values\n"
3334*5113495bSYour Name 			 "    TX_FLUSH = 1\n"
3335*5113495bSYour Name 			 "    WARM_RESET = 2\n"
3336*5113495bSYour Name 			 "    COLD_RESET = 3\n"
3337*5113495bSYour Name 			 "    WARM_RESET_RESTORE_CAL = 4\n"
3338*5113495bSYour Name 			 "    COLD_RESET_RESTORE_CAL = 5", value);
3339*5113495bSYour Name 
3340*5113495bSYour Name 		return -EINVAL;
3341*5113495bSYour Name 	}
3342*5113495bSYour Name 
3343*5113495bSYour Name 	return 0;
3344*5113495bSYour Name }
3345*5113495bSYour Name 
hdd_handle_pdev_reset(struct wlan_hdd_link_info * link_info,int value)3346*5113495bSYour Name static int hdd_handle_pdev_reset(struct wlan_hdd_link_info *link_info,
3347*5113495bSYour Name 				 int value)
3348*5113495bSYour Name {
3349*5113495bSYour Name 	int ret;
3350*5113495bSYour Name 
3351*5113495bSYour Name 	hdd_debug("%d", value);
3352*5113495bSYour Name 
3353*5113495bSYour Name 	ret = hdd_validate_pdev_reset(value);
3354*5113495bSYour Name 	if (ret)
3355*5113495bSYour Name 		return ret;
3356*5113495bSYour Name 
3357*5113495bSYour Name 	ret = wma_cli_set_command(link_info->vdev_id,
3358*5113495bSYour Name 				  wmi_pdev_param_pdev_reset,
3359*5113495bSYour Name 				  value, PDEV_CMD);
3360*5113495bSYour Name 
3361*5113495bSYour Name 	return ret;
3362*5113495bSYour Name }
3363*5113495bSYour Name 
hdd_we_set_11d_state(struct wlan_hdd_link_info * link_info,int state_11d)3364*5113495bSYour Name static int hdd_we_set_11d_state(struct wlan_hdd_link_info *link_info,
3365*5113495bSYour Name 				int state_11d)
3366*5113495bSYour Name {
3367*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3368*5113495bSYour Name 	bool enable_11d;
3369*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3370*5113495bSYour Name 	QDF_STATUS status;
3371*5113495bSYour Name 
3372*5113495bSYour Name 	if (!mac_handle)
3373*5113495bSYour Name 		return -EINVAL;
3374*5113495bSYour Name 
3375*5113495bSYour Name 	switch (state_11d) {
3376*5113495bSYour Name 	case ENABLE_11D:
3377*5113495bSYour Name 		enable_11d = true;
3378*5113495bSYour Name 		break;
3379*5113495bSYour Name 	case DISABLE_11D:
3380*5113495bSYour Name 		enable_11d = false;
3381*5113495bSYour Name 		break;
3382*5113495bSYour Name 	default:
3383*5113495bSYour Name 		return -EINVAL;
3384*5113495bSYour Name 	}
3385*5113495bSYour Name 
3386*5113495bSYour Name 	status = ucfg_mlme_set_11d_enabled(hdd_ctx->psoc, enable_11d);
3387*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(status))
3388*5113495bSYour Name 		hdd_err("Invalid 11d_enable flag");
3389*5113495bSYour Name 
3390*5113495bSYour Name 	hdd_debug("11D state=%d", enable_11d);
3391*5113495bSYour Name 
3392*5113495bSYour Name 	return 0;
3393*5113495bSYour Name }
3394*5113495bSYour Name 
hdd_we_set_power(struct wlan_hdd_link_info * link_info,int value)3395*5113495bSYour Name static int hdd_we_set_power(struct wlan_hdd_link_info *link_info, int value)
3396*5113495bSYour Name {
3397*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3398*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3399*5113495bSYour Name 
3400*5113495bSYour Name 	if (!mac_handle)
3401*5113495bSYour Name 		return -EINVAL;
3402*5113495bSYour Name 
3403*5113495bSYour Name 	switch (value) {
3404*5113495bSYour Name 	case 1:
3405*5113495bSYour Name 		/* Enable PowerSave */
3406*5113495bSYour Name 		sme_ps_set_powersave(hdd_ctx->mac_handle,
3407*5113495bSYour Name 				     link_info->vdev_id,
3408*5113495bSYour Name 				     true, 0, true);
3409*5113495bSYour Name 		return 0;
3410*5113495bSYour Name 	case 2:
3411*5113495bSYour Name 		/* Disable PowerSave */
3412*5113495bSYour Name 		sme_ps_set_powersave(hdd_ctx->mac_handle,
3413*5113495bSYour Name 				     link_info->vdev_id,
3414*5113495bSYour Name 				     false, 0, true);
3415*5113495bSYour Name 		return 0;
3416*5113495bSYour Name 	case 3:
3417*5113495bSYour Name 		/* Enable UASPD */
3418*5113495bSYour Name 		sme_ps_uapsd_enable(mac_handle, link_info->vdev_id);
3419*5113495bSYour Name 		return 0;
3420*5113495bSYour Name 	case 4:
3421*5113495bSYour Name 		/* Disable UASPD */
3422*5113495bSYour Name 		sme_ps_uapsd_disable(mac_handle, link_info->vdev_id);
3423*5113495bSYour Name 		return 0;
3424*5113495bSYour Name 	default:
3425*5113495bSYour Name 		hdd_err("Invalid value %d", value);
3426*5113495bSYour Name 		return -EINVAL;
3427*5113495bSYour Name 	}
3428*5113495bSYour Name }
3429*5113495bSYour Name 
hdd_we_set_max_assoc(struct wlan_hdd_link_info * link_info,int value)3430*5113495bSYour Name static int hdd_we_set_max_assoc(struct wlan_hdd_link_info *link_info, int value)
3431*5113495bSYour Name {
3432*5113495bSYour Name 	struct hdd_context *hdd_ctx;
3433*5113495bSYour Name 	QDF_STATUS status;
3434*5113495bSYour Name 
3435*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3436*5113495bSYour Name 	status = ucfg_mlme_set_assoc_sta_limit(hdd_ctx->psoc, value);
3437*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3438*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", value, status);
3439*5113495bSYour Name 
3440*5113495bSYour Name 	return qdf_status_to_os_return(status);
3441*5113495bSYour Name }
3442*5113495bSYour Name 
3443*5113495bSYour Name static inline int
hdd_we_set_data_inactivity_timeout(struct wlan_hdd_link_info * link_info,int inactivity_timeout)3444*5113495bSYour Name hdd_we_set_data_inactivity_timeout(struct wlan_hdd_link_info *link_info,
3445*5113495bSYour Name 				   int inactivity_timeout)
3446*5113495bSYour Name {
3447*5113495bSYour Name 	/* data inactivity timeout is no longer supported and is not used */
3448*5113495bSYour Name 	return -ENOTSUPP;
3449*5113495bSYour Name }
3450*5113495bSYour Name 
3451*5113495bSYour Name static int
hdd_we_set_wow_data_inactivity_timeout(struct wlan_hdd_link_info * link_info,int value)3452*5113495bSYour Name hdd_we_set_wow_data_inactivity_timeout(struct wlan_hdd_link_info *link_info,
3453*5113495bSYour Name 				       int value)
3454*5113495bSYour Name {
3455*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3456*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3457*5113495bSYour Name 
3458*5113495bSYour Name 	if (!mac_handle)
3459*5113495bSYour Name 		return -EINVAL;
3460*5113495bSYour Name 
3461*5113495bSYour Name 	if (!cfg_in_range(CFG_PMO_WOW_DATA_INACTIVITY_TIMEOUT, value)) {
3462*5113495bSYour Name 		hdd_err_rl("Invalid value %d", value);
3463*5113495bSYour Name 		return -EINVAL;
3464*5113495bSYour Name 	}
3465*5113495bSYour Name 
3466*5113495bSYour Name 	ucfg_pmo_set_wow_data_inactivity_timeout(hdd_ctx->psoc, (uint8_t)value);
3467*5113495bSYour Name 
3468*5113495bSYour Name 	return 0;
3469*5113495bSYour Name }
3470*5113495bSYour Name 
hdd_we_set_tx_power(struct wlan_hdd_link_info * link_info,int value)3471*5113495bSYour Name static int hdd_we_set_tx_power(struct wlan_hdd_link_info *link_info,
3472*5113495bSYour Name 			       int value)
3473*5113495bSYour Name {
3474*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
3475*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
3476*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
3477*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3478*5113495bSYour Name 	QDF_STATUS status;
3479*5113495bSYour Name 
3480*5113495bSYour Name 	if (!mac_handle)
3481*5113495bSYour Name 		return -EINVAL;
3482*5113495bSYour Name 
3483*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
3484*5113495bSYour Name 	status = sme_set_tx_power(mac_handle, link_info->vdev_id,
3485*5113495bSYour Name 				  sta_ctx->conn_info.bssid,
3486*5113495bSYour Name 				  adapter->device_mode, value);
3487*5113495bSYour Name 
3488*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3489*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", value, status);
3490*5113495bSYour Name 
3491*5113495bSYour Name 	return qdf_status_to_os_return(status);
3492*5113495bSYour Name }
3493*5113495bSYour Name 
hdd_we_set_max_tx_power(struct wlan_hdd_link_info * link_info,int value)3494*5113495bSYour Name static int hdd_we_set_max_tx_power(struct wlan_hdd_link_info *link_info,
3495*5113495bSYour Name 				   int value)
3496*5113495bSYour Name {
3497*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3498*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
3499*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3500*5113495bSYour Name 	QDF_STATUS status;
3501*5113495bSYour Name 
3502*5113495bSYour Name 	if (!mac_handle)
3503*5113495bSYour Name 		return -EINVAL;
3504*5113495bSYour Name 
3505*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
3506*5113495bSYour Name 	status = sme_set_max_tx_power(mac_handle,
3507*5113495bSYour Name 				      sta_ctx->conn_info.bssid,
3508*5113495bSYour Name 				      sta_ctx->conn_info.bssid,
3509*5113495bSYour Name 				      value);
3510*5113495bSYour Name 
3511*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3512*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", value, status);
3513*5113495bSYour Name 
3514*5113495bSYour Name 	return qdf_status_to_os_return(status);
3515*5113495bSYour Name }
3516*5113495bSYour Name 
hdd_we_set_max_tx_power_2_4(struct wlan_hdd_link_info * link_info,int power)3517*5113495bSYour Name static int hdd_we_set_max_tx_power_2_4(struct wlan_hdd_link_info *link_info,
3518*5113495bSYour Name 				       int power)
3519*5113495bSYour Name {
3520*5113495bSYour Name 	QDF_STATUS status;
3521*5113495bSYour Name 
3522*5113495bSYour Name 	hdd_debug("power %d dBm", power);
3523*5113495bSYour Name 	status = sme_set_max_tx_power_per_band(BAND_2G, power);
3524*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3525*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", power, status);
3526*5113495bSYour Name 
3527*5113495bSYour Name 	return qdf_status_to_os_return(status);
3528*5113495bSYour Name }
3529*5113495bSYour Name 
hdd_we_set_max_tx_power_5_0(struct wlan_hdd_link_info * link_info,int power)3530*5113495bSYour Name static int hdd_we_set_max_tx_power_5_0(struct wlan_hdd_link_info *link_info,
3531*5113495bSYour Name 				       int power)
3532*5113495bSYour Name {
3533*5113495bSYour Name 	QDF_STATUS status;
3534*5113495bSYour Name 
3535*5113495bSYour Name 	hdd_debug("power %d dBm", power);
3536*5113495bSYour Name 	status = sme_set_max_tx_power_per_band(BAND_5G, power);
3537*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3538*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", power, status);
3539*5113495bSYour Name 
3540*5113495bSYour Name 	return qdf_status_to_os_return(status);
3541*5113495bSYour Name }
3542*5113495bSYour Name 
3543*5113495bSYour Name #ifdef HASTINGS_BT_WAR
3544*5113495bSYour Name 
hdd_hastings_bt_war_applicable(struct hdd_context * hdd_ctx)3545*5113495bSYour Name static bool hdd_hastings_bt_war_applicable(struct hdd_context *hdd_ctx)
3546*5113495bSYour Name {
3547*5113495bSYour Name 	struct pld_soc_info info;
3548*5113495bSYour Name 	int errno;
3549*5113495bSYour Name 
3550*5113495bSYour Name 	errno = pld_get_soc_info(hdd_ctx->parent_dev, &info);
3551*5113495bSYour Name 	if (errno)
3552*5113495bSYour Name 		return false;
3553*5113495bSYour Name 
3554*5113495bSYour Name 	/* check for HST 1.1 values */
3555*5113495bSYour Name 
3556*5113495bSYour Name 	if (info.device_version.family_number != 0x04)
3557*5113495bSYour Name 		return false;
3558*5113495bSYour Name 
3559*5113495bSYour Name 	if (info.device_version.device_number != 0x0A)
3560*5113495bSYour Name 		return false;
3561*5113495bSYour Name 
3562*5113495bSYour Name 	if (info.device_version.major_version != 0x01)
3563*5113495bSYour Name 		return false;
3564*5113495bSYour Name 
3565*5113495bSYour Name 	return true;
3566*5113495bSYour Name }
3567*5113495bSYour Name 
3568*5113495bSYour Name /*
3569*5113495bSYour Name  * replicate logic:
3570*5113495bSYour Name  * iwpriv wlan0 setUnitTestCmd 19 2 23 1 => enable WAR
3571*5113495bSYour Name  * iwpriv wlan0 setUnitTestCmd 19 2 23 0 => disable WAR
3572*5113495bSYour Name  */
3573*5113495bSYour Name 
3574*5113495bSYour Name #define HASTINGS_WAR_FW_PARAM_ID 23
3575*5113495bSYour Name 
hdd_hastings_bt_war_set_fw(struct hdd_context * hdd_ctx,uint32_t value)3576*5113495bSYour Name static int hdd_hastings_bt_war_set_fw(struct hdd_context *hdd_ctx,
3577*5113495bSYour Name 				      uint32_t value)
3578*5113495bSYour Name {
3579*5113495bSYour Name 	uint32_t vdev_id = 0; /* not used */
3580*5113495bSYour Name 	uint32_t module_id = WLAN_MODULE_WAL;
3581*5113495bSYour Name 	uint32_t arg_count = 2;
3582*5113495bSYour Name 	uint32_t arg[2] = {HASTINGS_WAR_FW_PARAM_ID, value};
3583*5113495bSYour Name 	QDF_STATUS status;
3584*5113495bSYour Name 
3585*5113495bSYour Name 	if (!hdd_hastings_bt_war_applicable(hdd_ctx))
3586*5113495bSYour Name 		return 0;
3587*5113495bSYour Name 
3588*5113495bSYour Name 	status = wma_form_unit_test_cmd_and_send(vdev_id, module_id,
3589*5113495bSYour Name 						 arg_count, arg);
3590*5113495bSYour Name 
3591*5113495bSYour Name 	return qdf_status_to_os_return(status);
3592*5113495bSYour Name }
3593*5113495bSYour Name 
hdd_hastings_bt_war_enable_fw(struct hdd_context * hdd_ctx)3594*5113495bSYour Name int hdd_hastings_bt_war_enable_fw(struct hdd_context *hdd_ctx)
3595*5113495bSYour Name {
3596*5113495bSYour Name 	return hdd_hastings_bt_war_set_fw(hdd_ctx, 1);
3597*5113495bSYour Name }
3598*5113495bSYour Name 
hdd_hastings_bt_war_disable_fw(struct hdd_context * hdd_ctx)3599*5113495bSYour Name int hdd_hastings_bt_war_disable_fw(struct hdd_context *hdd_ctx)
3600*5113495bSYour Name {
3601*5113495bSYour Name 	return hdd_hastings_bt_war_set_fw(hdd_ctx, 0);
3602*5113495bSYour Name }
3603*5113495bSYour Name 
3604*5113495bSYour Name /* value to restore the config when the WAR is disabled */
3605*5113495bSYour Name static uint32_t iface_change_wait_time_checkpoint;
checkpoint_iface_change_wait_time(struct hdd_context * hdd_ctx)3606*5113495bSYour Name static void checkpoint_iface_change_wait_time(struct hdd_context *hdd_ctx)
3607*5113495bSYour Name {
3608*5113495bSYour Name 	struct hdd_config *config = hdd_ctx->config;
3609*5113495bSYour Name 
3610*5113495bSYour Name 	/* did we already checkpoint a value ? */
3611*5113495bSYour Name 	if (iface_change_wait_time_checkpoint)
3612*5113495bSYour Name 		return;
3613*5113495bSYour Name 
3614*5113495bSYour Name 	/* checkpoint current value */
3615*5113495bSYour Name 	iface_change_wait_time_checkpoint = config->iface_change_wait_time;
3616*5113495bSYour Name 
3617*5113495bSYour Name 	/* was the timer enabled when we checkpointed? */
3618*5113495bSYour Name 	if (iface_change_wait_time_checkpoint)
3619*5113495bSYour Name 		return;
3620*5113495bSYour Name 
3621*5113495bSYour Name 	/* WAR was enabled at boot, use default when disable */
3622*5113495bSYour Name 	iface_change_wait_time_checkpoint =
3623*5113495bSYour Name 		cfg_default(CFG_INTERFACE_CHANGE_WAIT);
3624*5113495bSYour Name }
3625*5113495bSYour Name 
hdd_hastings_war_enable(struct hdd_context * hdd_ctx)3626*5113495bSYour Name static int hdd_hastings_war_enable(struct hdd_context *hdd_ctx)
3627*5113495bSYour Name {
3628*5113495bSYour Name 	struct hdd_config *config = hdd_ctx->config;
3629*5113495bSYour Name 
3630*5113495bSYour Name 	config->iface_change_wait_time = 0;
3631*5113495bSYour Name 
3632*5113495bSYour Name 	return hdd_hastings_bt_war_enable_fw(hdd_ctx);
3633*5113495bSYour Name }
3634*5113495bSYour Name 
hdd_hastings_war_disable(struct hdd_context * hdd_ctx)3635*5113495bSYour Name static int hdd_hastings_war_disable(struct hdd_context *hdd_ctx)
3636*5113495bSYour Name {
3637*5113495bSYour Name 	struct hdd_config *config = hdd_ctx->config;
3638*5113495bSYour Name 
3639*5113495bSYour Name 	config->iface_change_wait_time = iface_change_wait_time_checkpoint;
3640*5113495bSYour Name 
3641*5113495bSYour Name 	return hdd_hastings_bt_war_disable_fw(hdd_ctx);
3642*5113495bSYour Name }
3643*5113495bSYour Name 
hdd_we_set_hastings_bt_war(struct wlan_hdd_link_info * link_info,int enable)3644*5113495bSYour Name static int hdd_we_set_hastings_bt_war(struct wlan_hdd_link_info *link_info,
3645*5113495bSYour Name 				      int enable)
3646*5113495bSYour Name {
3647*5113495bSYour Name 	int errno;
3648*5113495bSYour Name 	struct hdd_context *hdd_ctx;
3649*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
3650*5113495bSYour Name 
3651*5113495bSYour Name 	errno = hdd_validate_adapter(adapter);
3652*5113495bSYour Name 	if (errno)
3653*5113495bSYour Name 		return errno;
3654*5113495bSYour Name 
3655*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
3656*5113495bSYour Name 	if (!hdd_hastings_bt_war_applicable(hdd_ctx))
3657*5113495bSYour Name 		return 0;
3658*5113495bSYour Name 
3659*5113495bSYour Name 	checkpoint_iface_change_wait_time(hdd_ctx);
3660*5113495bSYour Name 
3661*5113495bSYour Name 	return enable ?
3662*5113495bSYour Name 		hdd_hastings_war_enable(hdd_ctx) :
3663*5113495bSYour Name 		hdd_hastings_war_disable(hdd_ctx);
3664*5113495bSYour Name }
3665*5113495bSYour Name #endif
3666*5113495bSYour Name 
hdd_we_set_tm_level(struct wlan_hdd_link_info * link_info,int level)3667*5113495bSYour Name static int hdd_we_set_tm_level(struct wlan_hdd_link_info *link_info, int level)
3668*5113495bSYour Name {
3669*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3670*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3671*5113495bSYour Name 	QDF_STATUS status;
3672*5113495bSYour Name 
3673*5113495bSYour Name 	if (!mac_handle)
3674*5113495bSYour Name 		return -EINVAL;
3675*5113495bSYour Name 
3676*5113495bSYour Name 	hdd_debug("Thermal Mitigation Level %d", level);
3677*5113495bSYour Name 	status = sme_set_thermal_level(mac_handle, level);
3678*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3679*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", level, status);
3680*5113495bSYour Name 
3681*5113495bSYour Name 	return qdf_status_to_os_return(status);
3682*5113495bSYour Name }
3683*5113495bSYour Name 
hdd_we_set_nss(struct wlan_hdd_link_info * link_info,int nss)3684*5113495bSYour Name static int hdd_we_set_nss(struct wlan_hdd_link_info *link_info, int nss)
3685*5113495bSYour Name {
3686*5113495bSYour Name 	QDF_STATUS status;
3687*5113495bSYour Name 
3688*5113495bSYour Name 	hdd_debug("NSS %d", nss);
3689*5113495bSYour Name 
3690*5113495bSYour Name 	if ((nss > 2) || (nss <= 0)) {
3691*5113495bSYour Name 		hdd_err("Invalid NSS: %d", nss);
3692*5113495bSYour Name 		return -EINVAL;
3693*5113495bSYour Name 	}
3694*5113495bSYour Name 
3695*5113495bSYour Name 	status = hdd_update_nss(link_info, nss, nss);
3696*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
3697*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", nss, status);
3698*5113495bSYour Name 
3699*5113495bSYour Name 	return qdf_status_to_os_return(status);
3700*5113495bSYour Name }
3701*5113495bSYour Name 
hdd_we_set_short_gi(struct wlan_hdd_link_info * link_info,int sgi)3702*5113495bSYour Name int hdd_we_set_short_gi(struct wlan_hdd_link_info *link_info, int sgi)
3703*5113495bSYour Name {
3704*5113495bSYour Name 	int errno;
3705*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3706*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3707*5113495bSYour Name 
3708*5113495bSYour Name 	hdd_debug("Short GI %d", sgi);
3709*5113495bSYour Name 
3710*5113495bSYour Name 	if (!mac_handle) {
3711*5113495bSYour Name 		hdd_err("NULL Mac handle");
3712*5113495bSYour Name 		return -EINVAL;
3713*5113495bSYour Name 	}
3714*5113495bSYour Name 
3715*5113495bSYour Name 	if (sgi & HDD_AUTO_RATE_SGI)
3716*5113495bSYour Name 		errno = sme_set_auto_rate_he_sgi(mac_handle,
3717*5113495bSYour Name 						 link_info->vdev_id,
3718*5113495bSYour Name 						 sgi);
3719*5113495bSYour Name 	else
3720*5113495bSYour Name 		errno = sme_update_ht_config(mac_handle,
3721*5113495bSYour Name 					     link_info->vdev_id,
3722*5113495bSYour Name 					     WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ,
3723*5113495bSYour Name 					     sgi);
3724*5113495bSYour Name 	if (errno)
3725*5113495bSYour Name 		hdd_err("cfg set failed, value %d status %d", sgi, errno);
3726*5113495bSYour Name 
3727*5113495bSYour Name 	return errno;
3728*5113495bSYour Name }
3729*5113495bSYour Name 
hdd_we_set_rtscts(struct wlan_hdd_link_info * link_info,int rtscts)3730*5113495bSYour Name static int hdd_we_set_rtscts(struct wlan_hdd_link_info *link_info, int rtscts)
3731*5113495bSYour Name {
3732*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3733*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3734*5113495bSYour Name 	uint32_t value;
3735*5113495bSYour Name 	uint32_t rts_threshold_val;
3736*5113495bSYour Name 	QDF_STATUS status;
3737*5113495bSYour Name 	int errno;
3738*5113495bSYour Name 
3739*5113495bSYour Name 	hdd_debug("RTSCTS %d", rtscts);
3740*5113495bSYour Name 
3741*5113495bSYour Name 	if (!mac_handle) {
3742*5113495bSYour Name 		hdd_err("NULL Mac handle");
3743*5113495bSYour Name 		return -EINVAL;
3744*5113495bSYour Name 	}
3745*5113495bSYour Name 
3746*5113495bSYour Name 	status = ucfg_mlme_get_rts_threshold(hdd_ctx->psoc,
3747*5113495bSYour Name 					     &rts_threshold_val);
3748*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
3749*5113495bSYour Name 		hdd_err("Get rts threshold failed, status %d", status);
3750*5113495bSYour Name 		return -EINVAL;
3751*5113495bSYour Name 	}
3752*5113495bSYour Name 
3753*5113495bSYour Name 	if ((rtscts & HDD_RTSCTS_EN_MASK) == HDD_RTSCTS_ENABLE) {
3754*5113495bSYour Name 		value = rts_threshold_val;
3755*5113495bSYour Name 	} else if (((rtscts & HDD_RTSCTS_EN_MASK) == 0) ||
3756*5113495bSYour Name 		   ((rtscts & HDD_RTSCTS_EN_MASK) == HDD_CTS_ENABLE)) {
3757*5113495bSYour Name 		value = cfg_max(CFG_RTS_THRESHOLD);
3758*5113495bSYour Name 	} else {
3759*5113495bSYour Name 		hdd_err_rl("Invalid value %d", rtscts);
3760*5113495bSYour Name 		return -EINVAL;
3761*5113495bSYour Name 	}
3762*5113495bSYour Name 
3763*5113495bSYour Name 	errno = wma_cli_set_command(link_info->vdev_id,
3764*5113495bSYour Name 				    wmi_vdev_param_enable_rtscts,
3765*5113495bSYour Name 				    rtscts, VDEV_CMD);
3766*5113495bSYour Name 	if (errno) {
3767*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
3768*5113495bSYour Name 		return errno;
3769*5113495bSYour Name 	}
3770*5113495bSYour Name 
3771*5113495bSYour Name 	status = ucfg_mlme_set_rts_threshold(hdd_ctx->psoc, value);
3772*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
3773*5113495bSYour Name 		hdd_err("Set rts threshold failed, status %d", status);
3774*5113495bSYour Name 		return -EINVAL;
3775*5113495bSYour Name 	}
3776*5113495bSYour Name 
3777*5113495bSYour Name 	return 0;
3778*5113495bSYour Name }
3779*5113495bSYour Name 
hdd_we_set_11n_rate(struct wlan_hdd_link_info * link_info,int rate_code)3780*5113495bSYour Name static int hdd_we_set_11n_rate(struct wlan_hdd_link_info *link_info,
3781*5113495bSYour Name 			       int rate_code)
3782*5113495bSYour Name {
3783*5113495bSYour Name 	uint8_t preamble = 0, nss = 0, rix = 0;
3784*5113495bSYour Name 	int errno;
3785*5113495bSYour Name 	QDF_STATUS status;
3786*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3787*5113495bSYour Name 	enum wlan_phymode peer_phymode;
3788*5113495bSYour Name 	uint8_t *peer_mac;
3789*5113495bSYour Name 
3790*5113495bSYour Name 	peer_mac = link_info->session.station.conn_info.bssid.bytes;
3791*5113495bSYour Name 
3792*5113495bSYour Name 	hdd_debug("Rate code %d", rate_code);
3793*5113495bSYour Name 
3794*5113495bSYour Name 	if (rate_code != 0xffff) {
3795*5113495bSYour Name 		rix = RC_2_RATE_IDX(rate_code);
3796*5113495bSYour Name 		if (rate_code & 0x80) {
3797*5113495bSYour Name 			preamble = WMI_RATE_PREAMBLE_HT;
3798*5113495bSYour Name 			nss = HT_RC_2_STREAMS(rate_code) - 1;
3799*5113495bSYour Name 		} else {
3800*5113495bSYour Name 			status = ucfg_mlme_get_peer_phymode(hdd_ctx->psoc,
3801*5113495bSYour Name 							    peer_mac,
3802*5113495bSYour Name 							    &peer_phymode);
3803*5113495bSYour Name 			if (QDF_IS_STATUS_ERROR(status)) {
3804*5113495bSYour Name 				hdd_err("Failed to set rate");
3805*5113495bSYour Name 				return 0;
3806*5113495bSYour Name 			}
3807*5113495bSYour Name 			if (IS_WLAN_PHYMODE_HE(peer_phymode)) {
3808*5113495bSYour Name 				hdd_err("Do not set legacy rate %d in HE mode",
3809*5113495bSYour Name 					rate_code);
3810*5113495bSYour Name 				return 0;
3811*5113495bSYour Name 			}
3812*5113495bSYour Name 			nss = 0;
3813*5113495bSYour Name 			rix = RC_2_RATE_IDX(rate_code);
3814*5113495bSYour Name 			if (rate_code & 0x10) {
3815*5113495bSYour Name 				preamble = WMI_RATE_PREAMBLE_CCK;
3816*5113495bSYour Name 				if (rix != 0x3)
3817*5113495bSYour Name 					/* Enable Short preamble
3818*5113495bSYour Name 					 * always for CCK except 1mbps
3819*5113495bSYour Name 					 */
3820*5113495bSYour Name 					rix |= 0x4;
3821*5113495bSYour Name 			} else {
3822*5113495bSYour Name 				preamble = WMI_RATE_PREAMBLE_OFDM;
3823*5113495bSYour Name 			}
3824*5113495bSYour Name 		}
3825*5113495bSYour Name 		rate_code = hdd_assemble_rate_code(preamble, nss, rix);
3826*5113495bSYour Name 	}
3827*5113495bSYour Name 
3828*5113495bSYour Name 	hdd_debug("wmi_vdev_param_fixed_rate val %d rix %d preamble %x nss %d",
3829*5113495bSYour Name 		  rate_code, rix, preamble, nss);
3830*5113495bSYour Name 
3831*5113495bSYour Name 	errno = wma_cli_set_command(link_info->vdev_id,
3832*5113495bSYour Name 				    wmi_vdev_param_fixed_rate,
3833*5113495bSYour Name 				    rate_code, VDEV_CMD);
3834*5113495bSYour Name 	if (errno)
3835*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
3836*5113495bSYour Name 
3837*5113495bSYour Name 	return errno;
3838*5113495bSYour Name }
3839*5113495bSYour Name 
hdd_we_set_vht_rate(struct wlan_hdd_link_info * link_info,int rate_code)3840*5113495bSYour Name static int hdd_we_set_vht_rate(struct wlan_hdd_link_info *link_info,
3841*5113495bSYour Name 			       int rate_code)
3842*5113495bSYour Name {
3843*5113495bSYour Name 	uint8_t preamble = 0, nss = 0, rix = 0;
3844*5113495bSYour Name 	int errno;
3845*5113495bSYour Name 
3846*5113495bSYour Name 	hdd_debug("Rate code %d", rate_code);
3847*5113495bSYour Name 
3848*5113495bSYour Name 	if (rate_code != 0xffff) {
3849*5113495bSYour Name 		rix = RC_2_RATE_IDX_11AC(rate_code);
3850*5113495bSYour Name 		preamble = WMI_RATE_PREAMBLE_VHT;
3851*5113495bSYour Name 		nss = HT_RC_2_STREAMS_11AC(rate_code) - 1;
3852*5113495bSYour Name 		rate_code = hdd_assemble_rate_code(preamble, nss, rix);
3853*5113495bSYour Name 	}
3854*5113495bSYour Name 
3855*5113495bSYour Name 	hdd_debug("wmi_vdev_param_fixed_rate val %d rix %d preamble %x nss %d",
3856*5113495bSYour Name 		  rate_code, rix, preamble, nss);
3857*5113495bSYour Name 
3858*5113495bSYour Name 	errno = wma_cli_set_command(link_info->vdev_id,
3859*5113495bSYour Name 				    wmi_vdev_param_fixed_rate,
3860*5113495bSYour Name 				    rate_code, VDEV_CMD);
3861*5113495bSYour Name 	if (errno)
3862*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
3863*5113495bSYour Name 
3864*5113495bSYour Name 	return errno;
3865*5113495bSYour Name }
3866*5113495bSYour Name 
hdd_we_set_ampdu(struct wlan_hdd_link_info * link_info,int ampdu)3867*5113495bSYour Name static int hdd_we_set_ampdu(struct wlan_hdd_link_info *link_info, int ampdu)
3868*5113495bSYour Name {
3869*5113495bSYour Name 	hdd_debug("AMPDU %d", ampdu);
3870*5113495bSYour Name 	return wma_cli_set_command(link_info->vdev_id,
3871*5113495bSYour Name 				   GEN_VDEV_PARAM_AMPDU,
3872*5113495bSYour Name 				   ampdu, GEN_CMD);
3873*5113495bSYour Name }
3874*5113495bSYour Name 
hdd_we_set_amsdu(struct wlan_hdd_link_info * link_info,int amsdu)3875*5113495bSYour Name static int hdd_we_set_amsdu(struct wlan_hdd_link_info *link_info, int amsdu)
3876*5113495bSYour Name {
3877*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
3878*5113495bSYour Name 	mac_handle_t mac_handle = hdd_ctx->mac_handle;
3879*5113495bSYour Name 	int errno;
3880*5113495bSYour Name 	QDF_STATUS status;
3881*5113495bSYour Name 
3882*5113495bSYour Name 	hdd_debug("AMSDU %d", amsdu);
3883*5113495bSYour Name 
3884*5113495bSYour Name 	if (!mac_handle) {
3885*5113495bSYour Name 		hdd_err("NULL Mac handle");
3886*5113495bSYour Name 		return -EINVAL;
3887*5113495bSYour Name 	}
3888*5113495bSYour Name 
3889*5113495bSYour Name 	status = ucfg_mlme_set_max_amsdu_num(hdd_ctx->psoc, amsdu);
3890*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
3891*5113495bSYour Name 		hdd_err("Failed to set Max AMSDU Num to cfg");
3892*5113495bSYour Name 		return -EINVAL;
3893*5113495bSYour Name 	}
3894*5113495bSYour Name 
3895*5113495bSYour Name 	if (amsdu > 1)
3896*5113495bSYour Name 		sme_set_amsdu(mac_handle, true);
3897*5113495bSYour Name 	else
3898*5113495bSYour Name 		sme_set_amsdu(mac_handle, false);
3899*5113495bSYour Name 
3900*5113495bSYour Name 	errno = wma_cli_set_command(link_info->vdev_id, GEN_VDEV_PARAM_AMSDU,
3901*5113495bSYour Name 				    amsdu, GEN_CMD);
3902*5113495bSYour Name 	if (errno) {
3903*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
3904*5113495bSYour Name 		return errno;
3905*5113495bSYour Name 	}
3906*5113495bSYour Name 
3907*5113495bSYour Name 	return 0;
3908*5113495bSYour Name }
3909*5113495bSYour Name 
hdd_we_clear_stats(struct wlan_hdd_link_info * link_info,int option)3910*5113495bSYour Name static int hdd_we_clear_stats(struct wlan_hdd_link_info *link_info, int option)
3911*5113495bSYour Name {
3912*5113495bSYour Name 	return hdd_wlan_clear_stats(link_info->adapter, option);
3913*5113495bSYour Name }
3914*5113495bSYour Name 
hdd_we_set_green_tx_param(struct hdd_adapter * adapter,green_tx_param id,const char * id_string,int value)3915*5113495bSYour Name static int hdd_we_set_green_tx_param(struct hdd_adapter *adapter,
3916*5113495bSYour Name 				     green_tx_param id,
3917*5113495bSYour Name 				     const char *id_string,
3918*5113495bSYour Name 				     int value)
3919*5113495bSYour Name {
3920*5113495bSYour Name 	int errno;
3921*5113495bSYour Name 
3922*5113495bSYour Name 	hdd_debug("%s %d", id_string, value);
3923*5113495bSYour Name 	errno = wma_cli_set_command(adapter->deflink->vdev_id,
3924*5113495bSYour Name 				    id, value, GTX_CMD);
3925*5113495bSYour Name 	if (errno)
3926*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
3927*5113495bSYour Name 
3928*5113495bSYour Name 	return errno;
3929*5113495bSYour Name }
3930*5113495bSYour Name 
3931*5113495bSYour Name #define hdd_we_set_green_tx_param(adapter, id, value) \
3932*5113495bSYour Name 			hdd_we_set_green_tx_param(adapter, id, #id, value)
3933*5113495bSYour Name 
hdd_we_set_gtx_ht_mcs(struct wlan_hdd_link_info * link_info,int value)3934*5113495bSYour Name static int hdd_we_set_gtx_ht_mcs(struct wlan_hdd_link_info *link_info,
3935*5113495bSYour Name 				 int value)
3936*5113495bSYour Name {
3937*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3938*5113495bSYour Name 					 wmi_vdev_param_gtx_ht_mcs,
3939*5113495bSYour Name 					 value);
3940*5113495bSYour Name }
3941*5113495bSYour Name 
hdd_we_set_gtx_vht_mcs(struct wlan_hdd_link_info * link_info,int value)3942*5113495bSYour Name static int hdd_we_set_gtx_vht_mcs(struct wlan_hdd_link_info *link_info,
3943*5113495bSYour Name 				  int value)
3944*5113495bSYour Name {
3945*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3946*5113495bSYour Name 					 wmi_vdev_param_gtx_vht_mcs,
3947*5113495bSYour Name 					 value);
3948*5113495bSYour Name }
3949*5113495bSYour Name 
hdd_we_set_gtx_usrcfg(struct wlan_hdd_link_info * link_info,int value)3950*5113495bSYour Name static int hdd_we_set_gtx_usrcfg(struct wlan_hdd_link_info *link_info,
3951*5113495bSYour Name 				 int value)
3952*5113495bSYour Name {
3953*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3954*5113495bSYour Name 					 wmi_vdev_param_gtx_usr_cfg,
3955*5113495bSYour Name 					 value);
3956*5113495bSYour Name }
3957*5113495bSYour Name 
hdd_we_set_gtx_thre(struct wlan_hdd_link_info * link_info,int value)3958*5113495bSYour Name static int hdd_we_set_gtx_thre(struct wlan_hdd_link_info *link_info,
3959*5113495bSYour Name 			       int value)
3960*5113495bSYour Name {
3961*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3962*5113495bSYour Name 					 wmi_vdev_param_gtx_thre,
3963*5113495bSYour Name 					 value);
3964*5113495bSYour Name }
3965*5113495bSYour Name 
hdd_we_set_gtx_margin(struct wlan_hdd_link_info * link_info,int value)3966*5113495bSYour Name static int hdd_we_set_gtx_margin(struct wlan_hdd_link_info *link_info,
3967*5113495bSYour Name 				 int value)
3968*5113495bSYour Name {
3969*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3970*5113495bSYour Name 					 wmi_vdev_param_gtx_margin,
3971*5113495bSYour Name 					 value);
3972*5113495bSYour Name }
3973*5113495bSYour Name 
hdd_we_set_gtx_step(struct wlan_hdd_link_info * link_info,int value)3974*5113495bSYour Name static int hdd_we_set_gtx_step(struct wlan_hdd_link_info *link_info,
3975*5113495bSYour Name 			       int value)
3976*5113495bSYour Name {
3977*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3978*5113495bSYour Name 					 wmi_vdev_param_gtx_step,
3979*5113495bSYour Name 					 value);
3980*5113495bSYour Name }
3981*5113495bSYour Name 
hdd_we_set_gtx_mintpc(struct wlan_hdd_link_info * link_info,int value)3982*5113495bSYour Name static int hdd_we_set_gtx_mintpc(struct wlan_hdd_link_info *link_info,
3983*5113495bSYour Name 				 int value)
3984*5113495bSYour Name {
3985*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3986*5113495bSYour Name 					 wmi_vdev_param_gtx_mintpc,
3987*5113495bSYour Name 					 value);
3988*5113495bSYour Name }
3989*5113495bSYour Name 
hdd_we_set_gtx_bwmask(struct wlan_hdd_link_info * link_info,int value)3990*5113495bSYour Name static int hdd_we_set_gtx_bwmask(struct wlan_hdd_link_info *link_info,
3991*5113495bSYour Name 				 int value)
3992*5113495bSYour Name {
3993*5113495bSYour Name 	return hdd_we_set_green_tx_param(link_info->adapter,
3994*5113495bSYour Name 					 wmi_vdev_param_gtx_bw_mask,
3995*5113495bSYour Name 					 value);
3996*5113495bSYour Name }
3997*5113495bSYour Name 
hdd_we_packet_power_save(struct hdd_adapter * adapter,packet_power_save id,const char * id_string,int value)3998*5113495bSYour Name static int hdd_we_packet_power_save(struct hdd_adapter *adapter,
3999*5113495bSYour Name 				    packet_power_save id,
4000*5113495bSYour Name 				    const char *id_string,
4001*5113495bSYour Name 				    int value)
4002*5113495bSYour Name {
4003*5113495bSYour Name 	int errno;
4004*5113495bSYour Name 
4005*5113495bSYour Name 	if (adapter->device_mode != QDF_STA_MODE) {
4006*5113495bSYour Name 		hdd_err_rl("Not supported in mode %d", adapter->device_mode);
4007*5113495bSYour Name 		return -EINVAL;
4008*5113495bSYour Name 	}
4009*5113495bSYour Name 
4010*5113495bSYour Name 	hdd_debug("%s %d", id_string, value);
4011*5113495bSYour Name 	errno = wma_cli_set_command(adapter->deflink->vdev_id,
4012*5113495bSYour Name 				    id, value, PPS_CMD);
4013*5113495bSYour Name 	if (errno)
4014*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
4015*5113495bSYour Name 
4016*5113495bSYour Name 	return errno;
4017*5113495bSYour Name }
4018*5113495bSYour Name 
4019*5113495bSYour Name #define hdd_we_packet_power_save(adapter, id, value) \
4020*5113495bSYour Name 			hdd_we_packet_power_save(adapter, id, #id, value)
4021*5113495bSYour Name 
hdd_we_pps_paid_match(struct wlan_hdd_link_info * link_info,int value)4022*5113495bSYour Name static int hdd_we_pps_paid_match(struct wlan_hdd_link_info *link_info,
4023*5113495bSYour Name 				 int value)
4024*5113495bSYour Name {
4025*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4026*5113495bSYour Name 					WMI_VDEV_PPS_PAID_MATCH,
4027*5113495bSYour Name 					value);
4028*5113495bSYour Name }
4029*5113495bSYour Name 
hdd_we_pps_gid_match(struct wlan_hdd_link_info * link_info,int value)4030*5113495bSYour Name static int hdd_we_pps_gid_match(struct wlan_hdd_link_info *link_info,
4031*5113495bSYour Name 				int value)
4032*5113495bSYour Name {
4033*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4034*5113495bSYour Name 					WMI_VDEV_PPS_GID_MATCH,
4035*5113495bSYour Name 					value);
4036*5113495bSYour Name }
4037*5113495bSYour Name 
hdd_we_pps_early_tim_clear(struct wlan_hdd_link_info * link_info,int value)4038*5113495bSYour Name static int hdd_we_pps_early_tim_clear(struct wlan_hdd_link_info *link_info,
4039*5113495bSYour Name 				      int value)
4040*5113495bSYour Name {
4041*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4042*5113495bSYour Name 					WMI_VDEV_PPS_EARLY_TIM_CLEAR,
4043*5113495bSYour Name 					value);
4044*5113495bSYour Name }
4045*5113495bSYour Name 
hdd_we_pps_early_dtim_clear(struct wlan_hdd_link_info * link_info,int value)4046*5113495bSYour Name static int hdd_we_pps_early_dtim_clear(struct wlan_hdd_link_info *link_info,
4047*5113495bSYour Name 				       int value)
4048*5113495bSYour Name {
4049*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4050*5113495bSYour Name 					WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
4051*5113495bSYour Name 					value);
4052*5113495bSYour Name }
4053*5113495bSYour Name 
hdd_we_pps_eof_pad_delim(struct wlan_hdd_link_info * link_info,int value)4054*5113495bSYour Name static int hdd_we_pps_eof_pad_delim(struct wlan_hdd_link_info *link_info,
4055*5113495bSYour Name 				    int value)
4056*5113495bSYour Name {
4057*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4058*5113495bSYour Name 					WMI_VDEV_PPS_EOF_PAD_DELIM,
4059*5113495bSYour Name 					value);
4060*5113495bSYour Name }
4061*5113495bSYour Name 
hdd_we_pps_macaddr_mismatch(struct wlan_hdd_link_info * link_info,int value)4062*5113495bSYour Name static int hdd_we_pps_macaddr_mismatch(struct wlan_hdd_link_info *link_info,
4063*5113495bSYour Name 				       int value)
4064*5113495bSYour Name {
4065*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4066*5113495bSYour Name 					WMI_VDEV_PPS_MACADDR_MISMATCH,
4067*5113495bSYour Name 					value);
4068*5113495bSYour Name }
4069*5113495bSYour Name 
hdd_we_pps_delim_crc_fail(struct wlan_hdd_link_info * link_info,int value)4070*5113495bSYour Name static int hdd_we_pps_delim_crc_fail(struct wlan_hdd_link_info *link_info,
4071*5113495bSYour Name 				     int value)
4072*5113495bSYour Name {
4073*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4074*5113495bSYour Name 					WMI_VDEV_PPS_DELIM_CRC_FAIL,
4075*5113495bSYour Name 					value);
4076*5113495bSYour Name }
4077*5113495bSYour Name 
hdd_we_pps_gid_nsts_zero(struct wlan_hdd_link_info * link_info,int value)4078*5113495bSYour Name static int hdd_we_pps_gid_nsts_zero(struct wlan_hdd_link_info *link_info,
4079*5113495bSYour Name 				    int value)
4080*5113495bSYour Name {
4081*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4082*5113495bSYour Name 					WMI_VDEV_PPS_GID_NSTS_ZERO,
4083*5113495bSYour Name 					value);
4084*5113495bSYour Name }
4085*5113495bSYour Name 
hdd_we_pps_rssi_check(struct wlan_hdd_link_info * link_info,int value)4086*5113495bSYour Name static int hdd_we_pps_rssi_check(struct wlan_hdd_link_info *link_info,
4087*5113495bSYour Name 				 int value)
4088*5113495bSYour Name {
4089*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4090*5113495bSYour Name 					WMI_VDEV_PPS_RSSI_CHECK,
4091*5113495bSYour Name 					value);
4092*5113495bSYour Name }
4093*5113495bSYour Name 
hdd_we_pps_5g_ebt(struct wlan_hdd_link_info * link_info,int value)4094*5113495bSYour Name static int hdd_we_pps_5g_ebt(struct wlan_hdd_link_info *link_info,
4095*5113495bSYour Name 			     int value)
4096*5113495bSYour Name {
4097*5113495bSYour Name 	return hdd_we_packet_power_save(link_info->adapter,
4098*5113495bSYour Name 					WMI_VDEV_PPS_5G_EBT,
4099*5113495bSYour Name 					value);
4100*5113495bSYour Name }
4101*5113495bSYour Name 
hdd_we_set_qpower(struct hdd_adapter * adapter,enum wmi_sta_powersave_param id,const char * id_string,int value)4102*5113495bSYour Name static int hdd_we_set_qpower(struct hdd_adapter *adapter,
4103*5113495bSYour Name 			     enum wmi_sta_powersave_param id,
4104*5113495bSYour Name 			     const char *id_string,
4105*5113495bSYour Name 			     int value)
4106*5113495bSYour Name {
4107*5113495bSYour Name 	int errno;
4108*5113495bSYour Name 
4109*5113495bSYour Name 	hdd_debug("%s %d", id_string, value);
4110*5113495bSYour Name 	errno = wma_cli_set_command(adapter->deflink->vdev_id,
4111*5113495bSYour Name 				    id, value, QPOWER_CMD);
4112*5113495bSYour Name 	if (errno)
4113*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
4114*5113495bSYour Name 
4115*5113495bSYour Name 	return errno;
4116*5113495bSYour Name }
4117*5113495bSYour Name 
4118*5113495bSYour Name #define hdd_we_set_qpower(adapter, id, value) \
4119*5113495bSYour Name 			hdd_we_set_qpower(adapter, id, #id, value)
4120*5113495bSYour Name 
4121*5113495bSYour Name static int
hdd_we_set_qpower_max_pspoll_count(struct wlan_hdd_link_info * link_info,int value)4122*5113495bSYour Name hdd_we_set_qpower_max_pspoll_count(struct wlan_hdd_link_info *link_info,
4123*5113495bSYour Name 				   int value)
4124*5113495bSYour Name {
4125*5113495bSYour Name 	enum wmi_sta_powersave_param id =
4126*5113495bSYour Name 		WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT;
4127*5113495bSYour Name 
4128*5113495bSYour Name 	return hdd_we_set_qpower(link_info->adapter, id, value);
4129*5113495bSYour Name }
4130*5113495bSYour Name 
4131*5113495bSYour Name static int
hdd_we_set_qpower_max_tx_before_wake(struct wlan_hdd_link_info * link_info,int value)4132*5113495bSYour Name hdd_we_set_qpower_max_tx_before_wake(struct wlan_hdd_link_info *link_info,
4133*5113495bSYour Name 				     int value)
4134*5113495bSYour Name {
4135*5113495bSYour Name 	enum wmi_sta_powersave_param id =
4136*5113495bSYour Name 		WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE;
4137*5113495bSYour Name 
4138*5113495bSYour Name 	return hdd_we_set_qpower(link_info->adapter, id, value);
4139*5113495bSYour Name }
4140*5113495bSYour Name 
4141*5113495bSYour Name static int
hdd_we_set_qpower_spec_pspoll_wake_interval(struct wlan_hdd_link_info * link_info,int value)4142*5113495bSYour Name hdd_we_set_qpower_spec_pspoll_wake_interval(struct wlan_hdd_link_info *link_info,
4143*5113495bSYour Name 					    int value)
4144*5113495bSYour Name {
4145*5113495bSYour Name 	enum wmi_sta_powersave_param id =
4146*5113495bSYour Name 		WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL;
4147*5113495bSYour Name 
4148*5113495bSYour Name 	return hdd_we_set_qpower(link_info->adapter, id, value);
4149*5113495bSYour Name }
4150*5113495bSYour Name 
4151*5113495bSYour Name static int
hdd_we_set_qpower_spec_max_spec_nodata_pspoll(struct wlan_hdd_link_info * link_info,int value)4152*5113495bSYour Name hdd_we_set_qpower_spec_max_spec_nodata_pspoll(struct wlan_hdd_link_info *link_info,
4153*5113495bSYour Name 					      int value)
4154*5113495bSYour Name {
4155*5113495bSYour Name 	enum wmi_sta_powersave_param id =
4156*5113495bSYour Name 		WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL;
4157*5113495bSYour Name 
4158*5113495bSYour Name 	return hdd_we_set_qpower(link_info->adapter, id, value);
4159*5113495bSYour Name }
4160*5113495bSYour Name 
hdd_we_set_pdev(struct hdd_adapter * adapter,wmi_conv_pdev_params_id id,const char * id_string,int value)4161*5113495bSYour Name static int hdd_we_set_pdev(struct hdd_adapter *adapter,
4162*5113495bSYour Name 			   wmi_conv_pdev_params_id id,
4163*5113495bSYour Name 			   const char *id_string,
4164*5113495bSYour Name 			   int value)
4165*5113495bSYour Name {
4166*5113495bSYour Name 	int errno;
4167*5113495bSYour Name 
4168*5113495bSYour Name 	hdd_debug("%s %d", id_string, value);
4169*5113495bSYour Name 	errno = wma_cli_set_command(adapter->deflink->vdev_id,
4170*5113495bSYour Name 				    id, value, PDEV_CMD);
4171*5113495bSYour Name 	if (errno)
4172*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
4173*5113495bSYour Name 
4174*5113495bSYour Name 	return errno;
4175*5113495bSYour Name }
4176*5113495bSYour Name 
4177*5113495bSYour Name #define hdd_we_set_pdev(adapter, id, value) \
4178*5113495bSYour Name 			hdd_we_set_pdev(adapter, id, #id, value)
4179*5113495bSYour Name 
hdd_we_set_ani_en_dis(struct wlan_hdd_link_info * link_info,int value)4180*5113495bSYour Name static int hdd_we_set_ani_en_dis(struct wlan_hdd_link_info *link_info,
4181*5113495bSYour Name 				 int value)
4182*5113495bSYour Name {
4183*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4184*5113495bSYour Name 			       wmi_pdev_param_ani_enable,
4185*5113495bSYour Name 			       value);
4186*5113495bSYour Name }
4187*5113495bSYour Name 
hdd_we_set_ani_poll_period(struct wlan_hdd_link_info * link_info,int value)4188*5113495bSYour Name static int hdd_we_set_ani_poll_period(struct wlan_hdd_link_info *link_info,
4189*5113495bSYour Name 				      int value)
4190*5113495bSYour Name {
4191*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4192*5113495bSYour Name 			       wmi_pdev_param_ani_poll_period,
4193*5113495bSYour Name 			       value);
4194*5113495bSYour Name }
4195*5113495bSYour Name 
hdd_we_set_ani_listen_period(struct wlan_hdd_link_info * link_info,int value)4196*5113495bSYour Name static int hdd_we_set_ani_listen_period(struct wlan_hdd_link_info *link_info,
4197*5113495bSYour Name 					int value)
4198*5113495bSYour Name {
4199*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4200*5113495bSYour Name 			       wmi_pdev_param_ani_listen_period,
4201*5113495bSYour Name 			       value);
4202*5113495bSYour Name }
4203*5113495bSYour Name 
hdd_we_set_ani_ofdm_level(struct wlan_hdd_link_info * link_info,int value)4204*5113495bSYour Name static int hdd_we_set_ani_ofdm_level(struct wlan_hdd_link_info *link_info,
4205*5113495bSYour Name 				     int value)
4206*5113495bSYour Name {
4207*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4208*5113495bSYour Name 			       wmi_pdev_param_ani_ofdm_level,
4209*5113495bSYour Name 			       value);
4210*5113495bSYour Name }
4211*5113495bSYour Name 
hdd_we_set_ani_cck_level(struct wlan_hdd_link_info * link_info,int value)4212*5113495bSYour Name static int hdd_we_set_ani_cck_level(struct wlan_hdd_link_info *link_info,
4213*5113495bSYour Name 				    int value)
4214*5113495bSYour Name {
4215*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4216*5113495bSYour Name 			       wmi_pdev_param_ani_cck_level,
4217*5113495bSYour Name 			       value);
4218*5113495bSYour Name }
4219*5113495bSYour Name 
hdd_we_set_dynamic_bw(struct wlan_hdd_link_info * link_info,int value)4220*5113495bSYour Name static int hdd_we_set_dynamic_bw(struct wlan_hdd_link_info *link_info,
4221*5113495bSYour Name 				 int value)
4222*5113495bSYour Name {
4223*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4224*5113495bSYour Name 			       wmi_pdev_param_dynamic_bw,
4225*5113495bSYour Name 			       value);
4226*5113495bSYour Name }
4227*5113495bSYour Name 
hdd_we_set_cts_cbw(struct wlan_hdd_link_info * link_info,int value)4228*5113495bSYour Name static int hdd_we_set_cts_cbw(struct wlan_hdd_link_info *link_info,
4229*5113495bSYour Name 			      int value)
4230*5113495bSYour Name {
4231*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4232*5113495bSYour Name 			       wmi_pdev_param_cts_cbw,
4233*5113495bSYour Name 			       value);
4234*5113495bSYour Name }
4235*5113495bSYour Name 
hdd_we_set_tx_chainmask(struct wlan_hdd_link_info * link_info,int value)4236*5113495bSYour Name static int hdd_we_set_tx_chainmask(struct wlan_hdd_link_info *link_info,
4237*5113495bSYour Name 				   int value)
4238*5113495bSYour Name {
4239*5113495bSYour Name 	int errno;
4240*5113495bSYour Name 
4241*5113495bSYour Name 	errno = hdd_we_set_pdev(link_info->adapter,
4242*5113495bSYour Name 				wmi_pdev_param_tx_chain_mask,
4243*5113495bSYour Name 				value);
4244*5113495bSYour Name 	if (errno)
4245*5113495bSYour Name 		return errno;
4246*5113495bSYour Name 
4247*5113495bSYour Name 	return hdd_set_antenna_mode(link_info, value);
4248*5113495bSYour Name }
4249*5113495bSYour Name 
hdd_we_set_rx_chainmask(struct wlan_hdd_link_info * link_info,int value)4250*5113495bSYour Name static int hdd_we_set_rx_chainmask(struct wlan_hdd_link_info *link_info,
4251*5113495bSYour Name 				   int value)
4252*5113495bSYour Name {
4253*5113495bSYour Name 	int errno;
4254*5113495bSYour Name 
4255*5113495bSYour Name 	errno = hdd_we_set_pdev(link_info->adapter,
4256*5113495bSYour Name 				wmi_pdev_param_rx_chain_mask,
4257*5113495bSYour Name 				value);
4258*5113495bSYour Name 	if (errno)
4259*5113495bSYour Name 		return errno;
4260*5113495bSYour Name 
4261*5113495bSYour Name 	return hdd_set_antenna_mode(link_info, value);
4262*5113495bSYour Name }
4263*5113495bSYour Name 
hdd_we_set_txpow_2g(struct wlan_hdd_link_info * link_info,int value)4264*5113495bSYour Name static int hdd_we_set_txpow_2g(struct wlan_hdd_link_info *link_info,
4265*5113495bSYour Name 			       int value)
4266*5113495bSYour Name {
4267*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4268*5113495bSYour Name 			       wmi_pdev_param_txpower_limit2g,
4269*5113495bSYour Name 			       value);
4270*5113495bSYour Name }
4271*5113495bSYour Name 
hdd_we_set_txpow_5g(struct wlan_hdd_link_info * link_info,int value)4272*5113495bSYour Name static int hdd_we_set_txpow_5g(struct wlan_hdd_link_info *link_info,
4273*5113495bSYour Name 			       int value)
4274*5113495bSYour Name {
4275*5113495bSYour Name 	return hdd_we_set_pdev(link_info->adapter,
4276*5113495bSYour Name 			       wmi_pdev_param_txpower_limit5g,
4277*5113495bSYour Name 			       value);
4278*5113495bSYour Name }
4279*5113495bSYour Name 
hdd_we_set_vdev(struct hdd_adapter * adapter,int id,const char * id_string,int value)4280*5113495bSYour Name static int hdd_we_set_vdev(struct hdd_adapter *adapter,
4281*5113495bSYour Name 			   int id,
4282*5113495bSYour Name 			   const char *id_string,
4283*5113495bSYour Name 			   int value)
4284*5113495bSYour Name {
4285*5113495bSYour Name 	int errno;
4286*5113495bSYour Name 
4287*5113495bSYour Name 	hdd_debug("%s %d", id_string, value);
4288*5113495bSYour Name 	errno = wma_cli_set_command(adapter->deflink->vdev_id,
4289*5113495bSYour Name 				    id, value, VDEV_CMD);
4290*5113495bSYour Name 	if (errno)
4291*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
4292*5113495bSYour Name 
4293*5113495bSYour Name 	return errno;
4294*5113495bSYour Name }
4295*5113495bSYour Name 
4296*5113495bSYour Name #define hdd_we_set_vdev(adapter, id, value) \
4297*5113495bSYour Name 			hdd_we_set_vdev(adapter, id, #id, value)
4298*5113495bSYour Name 
hdd_we_set_txrx_fwstats(struct wlan_hdd_link_info * link_info,int value)4299*5113495bSYour Name static int hdd_we_set_txrx_fwstats(struct wlan_hdd_link_info *link_info,
4300*5113495bSYour Name 				   int value)
4301*5113495bSYour Name {
4302*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4303*5113495bSYour Name 			       WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID,
4304*5113495bSYour Name 			       value);
4305*5113495bSYour Name }
4306*5113495bSYour Name 
hdd_we_txrx_fwstats_reset(struct wlan_hdd_link_info * link_info,int value)4307*5113495bSYour Name static int hdd_we_txrx_fwstats_reset(struct wlan_hdd_link_info *link_info,
4308*5113495bSYour Name 				     int value)
4309*5113495bSYour Name {
4310*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4311*5113495bSYour Name 			       WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
4312*5113495bSYour Name 			       value);
4313*5113495bSYour Name }
4314*5113495bSYour Name 
hdd_we_set_htsmps(struct wlan_hdd_link_info * link_info,int value)4315*5113495bSYour Name static int hdd_we_set_htsmps(struct wlan_hdd_link_info *link_info,
4316*5113495bSYour Name 			     int value)
4317*5113495bSYour Name {
4318*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4319*5113495bSYour Name 			       WMI_STA_SMPS_FORCE_MODE_CMDID,
4320*5113495bSYour Name 			       value);
4321*5113495bSYour Name }
4322*5113495bSYour Name 
4323*5113495bSYour Name static int
hdd_we_set_early_rx_adjust_enable(struct wlan_hdd_link_info * link_info,int value)4324*5113495bSYour Name hdd_we_set_early_rx_adjust_enable(struct wlan_hdd_link_info *link_info,
4325*5113495bSYour Name 				  int value)
4326*5113495bSYour Name {
4327*5113495bSYour Name 	if ((value != 0) && (value != 1))
4328*5113495bSYour Name 		return -EINVAL;
4329*5113495bSYour Name 
4330*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4331*5113495bSYour Name 			       wmi_vdev_param_early_rx_adjust_enable,
4332*5113495bSYour Name 			       value);
4333*5113495bSYour Name }
4334*5113495bSYour Name 
4335*5113495bSYour Name static int
hdd_we_set_early_rx_tgt_bmiss_num(struct wlan_hdd_link_info * link_info,int value)4336*5113495bSYour Name hdd_we_set_early_rx_tgt_bmiss_num(struct wlan_hdd_link_info *link_info,
4337*5113495bSYour Name 				  int value)
4338*5113495bSYour Name {
4339*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4340*5113495bSYour Name 			       wmi_vdev_param_early_rx_tgt_bmiss_num,
4341*5113495bSYour Name 			       value);
4342*5113495bSYour Name }
4343*5113495bSYour Name 
4344*5113495bSYour Name static int
hdd_we_set_early_rx_bmiss_sample_cycle(struct wlan_hdd_link_info * link_info,int value)4345*5113495bSYour Name hdd_we_set_early_rx_bmiss_sample_cycle(struct wlan_hdd_link_info *link_info,
4346*5113495bSYour Name 				       int value)
4347*5113495bSYour Name {
4348*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4349*5113495bSYour Name 			       wmi_vdev_param_early_rx_bmiss_sample_cycle,
4350*5113495bSYour Name 			       value);
4351*5113495bSYour Name }
4352*5113495bSYour Name 
hdd_we_set_early_rx_slop_step(struct wlan_hdd_link_info * link_info,int value)4353*5113495bSYour Name static int hdd_we_set_early_rx_slop_step(struct wlan_hdd_link_info *link_info,
4354*5113495bSYour Name 					 int value)
4355*5113495bSYour Name {
4356*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4357*5113495bSYour Name 			       wmi_vdev_param_early_rx_slop_step,
4358*5113495bSYour Name 			       value);
4359*5113495bSYour Name }
4360*5113495bSYour Name 
hdd_we_set_early_rx_init_slop(struct wlan_hdd_link_info * link_info,int value)4361*5113495bSYour Name static int hdd_we_set_early_rx_init_slop(struct wlan_hdd_link_info *link_info,
4362*5113495bSYour Name 					 int value)
4363*5113495bSYour Name {
4364*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4365*5113495bSYour Name 			       wmi_vdev_param_early_rx_init_slop,
4366*5113495bSYour Name 			       value);
4367*5113495bSYour Name }
4368*5113495bSYour Name 
4369*5113495bSYour Name static int
hdd_we_set_early_rx_adjust_pause(struct wlan_hdd_link_info * link_info,int value)4370*5113495bSYour Name hdd_we_set_early_rx_adjust_pause(struct wlan_hdd_link_info *link_info,
4371*5113495bSYour Name 				 int value)
4372*5113495bSYour Name {
4373*5113495bSYour Name 	if ((value != 0) && (value != 1))
4374*5113495bSYour Name 		return -EINVAL;
4375*5113495bSYour Name 
4376*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4377*5113495bSYour Name 			       wmi_vdev_param_early_rx_adjust_pause,
4378*5113495bSYour Name 			       value);
4379*5113495bSYour Name }
4380*5113495bSYour Name 
4381*5113495bSYour Name static int
hdd_we_set_early_rx_drift_sample(struct wlan_hdd_link_info * link_info,int value)4382*5113495bSYour Name hdd_we_set_early_rx_drift_sample(struct wlan_hdd_link_info *link_info,
4383*5113495bSYour Name 				 int value)
4384*5113495bSYour Name {
4385*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4386*5113495bSYour Name 			       wmi_vdev_param_early_rx_drift_sample,
4387*5113495bSYour Name 			       value);
4388*5113495bSYour Name }
4389*5113495bSYour Name 
hdd_we_set_dcm(struct wlan_hdd_link_info * link_info,int value)4390*5113495bSYour Name static int hdd_we_set_dcm(struct wlan_hdd_link_info *link_info,
4391*5113495bSYour Name 			  int value)
4392*5113495bSYour Name {
4393*5113495bSYour Name 	return hdd_we_set_vdev(link_info->adapter,
4394*5113495bSYour Name 			       wmi_vdev_param_he_dcm_enable,
4395*5113495bSYour Name 			       value);
4396*5113495bSYour Name }
4397*5113495bSYour Name 
4398*5113495bSYour Name #define MAX_VDEV_HE_RANGE_PARAMS 2
4399*5113495bSYour Name /* params being sent:
4400*5113495bSYour Name  * wmi_vdev_param_he_range_ext
4401*5113495bSYour Name  * wmi_vdev_param_non_data_he_range_ext
4402*5113495bSYour Name  */
4403*5113495bSYour Name 
hdd_we_set_range_ext(struct wlan_hdd_link_info * link_info,int value)4404*5113495bSYour Name static int hdd_we_set_range_ext(struct wlan_hdd_link_info *link_info,
4405*5113495bSYour Name 				int value)
4406*5113495bSYour Name {
4407*5113495bSYour Name 	int status;
4408*5113495bSYour Name 	struct dev_set_param setparam[MAX_VDEV_HE_RANGE_PARAMS] = {};
4409*5113495bSYour Name 	uint8_t index = 0;
4410*5113495bSYour Name 
4411*5113495bSYour Name 	status = mlme_check_index_setparam(setparam,
4412*5113495bSYour Name 					   wmi_vdev_param_he_range_ext,
4413*5113495bSYour Name 					   value, index++,
4414*5113495bSYour Name 					   MAX_VDEV_HE_RANGE_PARAMS);
4415*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
4416*5113495bSYour Name 		hdd_err("failed at wmi_vdev_param_he_range_ext");
4417*5113495bSYour Name 		goto error;
4418*5113495bSYour Name 	}
4419*5113495bSYour Name 
4420*5113495bSYour Name 	status = mlme_check_index_setparam(setparam,
4421*5113495bSYour Name 					   wmi_vdev_param_non_data_he_range_ext,
4422*5113495bSYour Name 					   value, index++,
4423*5113495bSYour Name 					   MAX_VDEV_HE_RANGE_PARAMS);
4424*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
4425*5113495bSYour Name 		hdd_err("failed at wmi_vdev_param_non_data_he_range_ext");
4426*5113495bSYour Name 		goto error;
4427*5113495bSYour Name 	}
4428*5113495bSYour Name 
4429*5113495bSYour Name 	status = wma_send_multi_pdev_vdev_set_params(MLME_VDEV_SETPARAM,
4430*5113495bSYour Name 						     link_info->vdev_id,
4431*5113495bSYour Name 						     setparam, index);
4432*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
4433*5113495bSYour Name 		hdd_err("Failed to send vdev set params");
4434*5113495bSYour Name 
4435*5113495bSYour Name error:
4436*5113495bSYour Name 	return status;
4437*5113495bSYour Name }
4438*5113495bSYour Name 
hdd_we_set_dbg(struct hdd_adapter * adapter,int id,const char * id_string,int value)4439*5113495bSYour Name static int hdd_we_set_dbg(struct hdd_adapter *adapter,
4440*5113495bSYour Name 			  int id,
4441*5113495bSYour Name 			  const char *id_string,
4442*5113495bSYour Name 			  int value)
4443*5113495bSYour Name {
4444*5113495bSYour Name 	int errno;
4445*5113495bSYour Name 
4446*5113495bSYour Name 	hdd_debug("%s %d", id_string, value);
4447*5113495bSYour Name 	errno = wma_cli_set_command(adapter->deflink->vdev_id,
4448*5113495bSYour Name 				    id, value, DBG_CMD);
4449*5113495bSYour Name 	if (errno)
4450*5113495bSYour Name 		hdd_err("Failed to set firmware, errno %d", errno);
4451*5113495bSYour Name 
4452*5113495bSYour Name 	return errno;
4453*5113495bSYour Name }
4454*5113495bSYour Name 
4455*5113495bSYour Name #define hdd_we_set_dbg(adapter, id, value) \
4456*5113495bSYour Name 			hdd_we_set_dbg(adapter, id, #id, value)
4457*5113495bSYour Name 
hdd_we_dbglog_log_level(struct wlan_hdd_link_info * link_info,int value)4458*5113495bSYour Name static int hdd_we_dbglog_log_level(struct wlan_hdd_link_info *link_info,
4459*5113495bSYour Name 				   int value)
4460*5113495bSYour Name {
4461*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4462*5113495bSYour Name 			      WMI_DBGLOG_LOG_LEVEL,
4463*5113495bSYour Name 			      value);
4464*5113495bSYour Name }
4465*5113495bSYour Name 
hdd_we_dbglog_vap_enable(struct wlan_hdd_link_info * link_info,int value)4466*5113495bSYour Name static int hdd_we_dbglog_vap_enable(struct wlan_hdd_link_info *link_info,
4467*5113495bSYour Name 				    int value)
4468*5113495bSYour Name {
4469*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4470*5113495bSYour Name 			      WMI_DBGLOG_VAP_ENABLE,
4471*5113495bSYour Name 			      value);
4472*5113495bSYour Name }
4473*5113495bSYour Name 
hdd_we_dbglog_vap_disable(struct wlan_hdd_link_info * link_info,int value)4474*5113495bSYour Name static int hdd_we_dbglog_vap_disable(struct wlan_hdd_link_info *link_info,
4475*5113495bSYour Name 				     int value)
4476*5113495bSYour Name {
4477*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4478*5113495bSYour Name 			      WMI_DBGLOG_VAP_DISABLE,
4479*5113495bSYour Name 			      value);
4480*5113495bSYour Name }
4481*5113495bSYour Name 
hdd_we_dbglog_module_enable(struct wlan_hdd_link_info * link_info,int value)4482*5113495bSYour Name static int hdd_we_dbglog_module_enable(struct wlan_hdd_link_info *link_info,
4483*5113495bSYour Name 				       int value)
4484*5113495bSYour Name {
4485*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4486*5113495bSYour Name 			      WMI_DBGLOG_MODULE_ENABLE,
4487*5113495bSYour Name 			      value);
4488*5113495bSYour Name }
4489*5113495bSYour Name 
hdd_we_dbglog_module_disable(struct wlan_hdd_link_info * link_info,int value)4490*5113495bSYour Name static int hdd_we_dbglog_module_disable(struct wlan_hdd_link_info *link_info,
4491*5113495bSYour Name 					int value)
4492*5113495bSYour Name {
4493*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4494*5113495bSYour Name 			      WMI_DBGLOG_MODULE_DISABLE,
4495*5113495bSYour Name 			      value);
4496*5113495bSYour Name }
4497*5113495bSYour Name 
hdd_we_dbglog_mod_log_level(struct wlan_hdd_link_info * link_info,int value)4498*5113495bSYour Name static int hdd_we_dbglog_mod_log_level(struct wlan_hdd_link_info *link_info,
4499*5113495bSYour Name 				       int value)
4500*5113495bSYour Name {
4501*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4502*5113495bSYour Name 			      WMI_DBGLOG_MOD_LOG_LEVEL,
4503*5113495bSYour Name 			      value);
4504*5113495bSYour Name }
4505*5113495bSYour Name 
hdd_we_dbglog_type(struct wlan_hdd_link_info * link_info,int value)4506*5113495bSYour Name static int hdd_we_dbglog_type(struct wlan_hdd_link_info *link_info,
4507*5113495bSYour Name 			      int value)
4508*5113495bSYour Name {
4509*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4510*5113495bSYour Name 			      WMI_DBGLOG_TYPE,
4511*5113495bSYour Name 			      value);
4512*5113495bSYour Name }
4513*5113495bSYour Name 
hdd_we_dbglog_report_enable(struct wlan_hdd_link_info * link_info,int value)4514*5113495bSYour Name static int hdd_we_dbglog_report_enable(struct wlan_hdd_link_info *link_info,
4515*5113495bSYour Name 				       int value)
4516*5113495bSYour Name {
4517*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4518*5113495bSYour Name 			      WMI_DBGLOG_REPORT_ENABLE,
4519*5113495bSYour Name 			      value);
4520*5113495bSYour Name }
4521*5113495bSYour Name 
hdd_we_start_fw_profile(struct wlan_hdd_link_info * link_info,int value)4522*5113495bSYour Name static int hdd_we_start_fw_profile(struct wlan_hdd_link_info *link_info,
4523*5113495bSYour Name 				   int value)
4524*5113495bSYour Name {
4525*5113495bSYour Name 	return hdd_we_set_dbg(link_info->adapter,
4526*5113495bSYour Name 			      WMI_WLAN_PROFILE_TRIGGER_CMDID,
4527*5113495bSYour Name 			      value);
4528*5113495bSYour Name }
4529*5113495bSYour Name 
hdd_we_set_channel(struct wlan_hdd_link_info * link_info,int channel)4530*5113495bSYour Name static int hdd_we_set_channel(struct wlan_hdd_link_info *link_info,
4531*5113495bSYour Name 			      int channel)
4532*5113495bSYour Name {
4533*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
4534*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4535*5113495bSYour Name 	qdf_freq_t ch_freq;
4536*5113495bSYour Name 	QDF_STATUS status;
4537*5113495bSYour Name 
4538*5113495bSYour Name 	hdd_debug("Set Channel %d Session ID %d mode %d", channel,
4539*5113495bSYour Name 		  link_info->vdev_id, adapter->device_mode);
4540*5113495bSYour Name 
4541*5113495bSYour Name 	if (!hdd_ctx->mac_handle)
4542*5113495bSYour Name 		return -EINVAL;
4543*5113495bSYour Name 
4544*5113495bSYour Name 	switch (adapter->device_mode) {
4545*5113495bSYour Name 	case QDF_STA_MODE:
4546*5113495bSYour Name 	case QDF_P2P_CLIENT_MODE:
4547*5113495bSYour Name 		/* supported */
4548*5113495bSYour Name 		break;
4549*5113495bSYour Name 	default:
4550*5113495bSYour Name 		hdd_err("change channel not supported for device mode %d",
4551*5113495bSYour Name 			adapter->device_mode);
4552*5113495bSYour Name 		return -EINVAL;
4553*5113495bSYour Name 	}
4554*5113495bSYour Name 	ch_freq = wlan_reg_legacy_chan_to_freq(hdd_ctx->pdev,
4555*5113495bSYour Name 					       channel);
4556*5113495bSYour Name 	status = sme_ext_change_freq(hdd_ctx->mac_handle, ch_freq,
4557*5113495bSYour Name 				     link_info->vdev_id);
4558*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
4559*5113495bSYour Name 		hdd_err("Error in change channel status %d", status);
4560*5113495bSYour Name 
4561*5113495bSYour Name 	return qdf_status_to_os_return(status);
4562*5113495bSYour Name }
4563*5113495bSYour Name 
hdd_we_mcc_config_latency(struct wlan_hdd_link_info * link_info,int latency)4564*5113495bSYour Name static int hdd_we_mcc_config_latency(struct wlan_hdd_link_info *link_info,
4565*5113495bSYour Name 				     int latency)
4566*5113495bSYour Name {
4567*5113495bSYour Name 	hdd_debug("MCC latency %d", latency);
4568*5113495bSYour Name 
4569*5113495bSYour Name 	wlan_hdd_set_mcc_latency(link_info->adapter, latency);
4570*5113495bSYour Name 
4571*5113495bSYour Name 	return 0;
4572*5113495bSYour Name }
4573*5113495bSYour Name 
hdd_we_mcc_config_quota(struct wlan_hdd_link_info * link_info,int quota)4574*5113495bSYour Name static int hdd_we_mcc_config_quota(struct wlan_hdd_link_info *link_info,
4575*5113495bSYour Name 				   int quota)
4576*5113495bSYour Name {
4577*5113495bSYour Name 	hdd_debug("MCC quota %dms", quota);
4578*5113495bSYour Name 
4579*5113495bSYour Name 	return wlan_hdd_set_mcc_p2p_quota(link_info->adapter, quota);
4580*5113495bSYour Name }
4581*5113495bSYour Name 
hdd_we_set_debug_log(struct wlan_hdd_link_info * link_info,int value)4582*5113495bSYour Name static int hdd_we_set_debug_log(struct wlan_hdd_link_info *link_info,
4583*5113495bSYour Name 				int value)
4584*5113495bSYour Name {
4585*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
4586*5113495bSYour Name 
4587*5113495bSYour Name 	if (!hdd_ctx->mac_handle)
4588*5113495bSYour Name 		return -EINVAL;
4589*5113495bSYour Name 
4590*5113495bSYour Name 	sme_update_connect_debug(hdd_ctx->mac_handle, value);
4591*5113495bSYour Name 
4592*5113495bSYour Name 	return 0;
4593*5113495bSYour Name }
4594*5113495bSYour Name 
hdd_we_set_scan_disable(struct wlan_hdd_link_info * link_info,int value)4595*5113495bSYour Name static int hdd_we_set_scan_disable(struct wlan_hdd_link_info *link_info,
4596*5113495bSYour Name 				   int value)
4597*5113495bSYour Name {
4598*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
4599*5113495bSYour Name 
4600*5113495bSYour Name 	hdd_debug("%d", value);
4601*5113495bSYour Name 
4602*5113495bSYour Name 	if (!hdd_ctx->psoc)
4603*5113495bSYour Name 		return -EINVAL;
4604*5113495bSYour Name 
4605*5113495bSYour Name 	if (value)
4606*5113495bSYour Name 		ucfg_scan_psoc_set_disable(hdd_ctx->psoc, REASON_USER_SPACE);
4607*5113495bSYour Name 	else
4608*5113495bSYour Name 		ucfg_scan_psoc_set_enable(hdd_ctx->psoc, REASON_USER_SPACE);
4609*5113495bSYour Name 
4610*5113495bSYour Name 	return 0;
4611*5113495bSYour Name }
4612*5113495bSYour Name 
hdd_we_set_conc_system_pref(struct wlan_hdd_link_info * link_info,int preference)4613*5113495bSYour Name static int hdd_we_set_conc_system_pref(struct wlan_hdd_link_info *link_info,
4614*5113495bSYour Name 				       int preference)
4615*5113495bSYour Name {
4616*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
4617*5113495bSYour Name 
4618*5113495bSYour Name 	hdd_debug("%d", preference);
4619*5113495bSYour Name 
4620*5113495bSYour Name 	if (!hdd_ctx->psoc)
4621*5113495bSYour Name 		return -EINVAL;
4622*5113495bSYour Name 
4623*5113495bSYour Name 	ucfg_policy_mgr_set_sys_pref(hdd_ctx->psoc, preference);
4624*5113495bSYour Name 
4625*5113495bSYour Name 	return 0;
4626*5113495bSYour Name }
4627*5113495bSYour Name 
hdd_we_set_11ax_rate(struct wlan_hdd_link_info * link_info,int rate)4628*5113495bSYour Name static int hdd_we_set_11ax_rate(struct wlan_hdd_link_info *link_info,
4629*5113495bSYour Name 				int rate)
4630*5113495bSYour Name {
4631*5113495bSYour Name 	return hdd_set_11ax_rate(link_info->adapter, rate, NULL);
4632*5113495bSYour Name }
4633*5113495bSYour Name 
hdd_we_set_modulated_dtim(struct wlan_hdd_link_info * link_info,int value)4634*5113495bSYour Name static int hdd_we_set_modulated_dtim(struct wlan_hdd_link_info *link_info,
4635*5113495bSYour Name 				     int value)
4636*5113495bSYour Name {
4637*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
4638*5113495bSYour Name 
4639*5113495bSYour Name 	hdd_debug("%d", value);
4640*5113495bSYour Name 
4641*5113495bSYour Name 	if (!hdd_ctx->psoc)
4642*5113495bSYour Name 		return -EINVAL;
4643*5113495bSYour Name 
4644*5113495bSYour Name 	if ((value < cfg_min(CFG_PMO_ENABLE_MODULATED_DTIM)) ||
4645*5113495bSYour Name 	    (value > cfg_max(CFG_PMO_ENABLE_MODULATED_DTIM))) {
4646*5113495bSYour Name 		hdd_err("Invalid value %d", value);
4647*5113495bSYour Name 		return -EINVAL;
4648*5113495bSYour Name 	}
4649*5113495bSYour Name 
4650*5113495bSYour Name 	ucfg_policy_mgr_set_sys_pref(hdd_ctx->psoc, value);
4651*5113495bSYour Name 
4652*5113495bSYour Name 	return 0;
4653*5113495bSYour Name }
4654*5113495bSYour Name 
4655*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
4656*5113495bSYour Name /**
4657*5113495bSYour Name  * hdd_we_motion_det_start_stop - start/stop motion detection
4658*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
4659*5113495bSYour Name  * @value: start/stop value to set
4660*5113495bSYour Name  *
4661*5113495bSYour Name  * Return: 0 on success, error on failure
4662*5113495bSYour Name  */
hdd_we_motion_det_start_stop(struct wlan_hdd_link_info * link_info,int value)4663*5113495bSYour Name static int hdd_we_motion_det_start_stop(struct wlan_hdd_link_info *link_info,
4664*5113495bSYour Name 					int value)
4665*5113495bSYour Name {
4666*5113495bSYour Name 	struct sme_motion_det_en motion_det;
4667*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4668*5113495bSYour Name 
4669*5113495bSYour Name 	if (value < 0 || value > 1) {
4670*5113495bSYour Name 		hdd_err("Invalid value %d in mt_start", value);
4671*5113495bSYour Name 		return -EINVAL;
4672*5113495bSYour Name 	}
4673*5113495bSYour Name 
4674*5113495bSYour Name 	if (!adapter->motion_det_cfg) {
4675*5113495bSYour Name 		hdd_err("Motion Detection config values not available");
4676*5113495bSYour Name 		return -EINVAL;
4677*5113495bSYour Name 	}
4678*5113495bSYour Name 
4679*5113495bSYour Name 	if (!adapter->motion_det_baseline_value) {
4680*5113495bSYour Name 		hdd_err("Motion Detection Baselining not started/completed");
4681*5113495bSYour Name 		return -EAGAIN;
4682*5113495bSYour Name 	}
4683*5113495bSYour Name 
4684*5113495bSYour Name 	motion_det.vdev_id = link_info->vdev_id;
4685*5113495bSYour Name 	motion_det.enable = value;
4686*5113495bSYour Name 
4687*5113495bSYour Name 	if (value) {
4688*5113495bSYour Name 		/* For motion detection start, set motion_det_in_progress */
4689*5113495bSYour Name 		adapter->motion_det_in_progress = true;
4690*5113495bSYour Name 	} else {
4691*5113495bSYour Name 		/* For motion detection stop, reset motion_det_in_progress */
4692*5113495bSYour Name 		adapter->motion_det_in_progress = false;
4693*5113495bSYour Name 		adapter->motion_detection_mode = 0;
4694*5113495bSYour Name 	}
4695*5113495bSYour Name 
4696*5113495bSYour Name 	sme_motion_det_enable(hdd_ctx->mac_handle, &motion_det);
4697*5113495bSYour Name 
4698*5113495bSYour Name 	return 0;
4699*5113495bSYour Name }
4700*5113495bSYour Name 
4701*5113495bSYour Name /**
4702*5113495bSYour Name  * hdd_we_motion_det_base_line_start_stop - start/stop md baselining
4703*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
4704*5113495bSYour Name  * @value: start/stop value to set
4705*5113495bSYour Name  *
4706*5113495bSYour Name  * Return: 0 on success, error on failure
4707*5113495bSYour Name  */
4708*5113495bSYour Name static int
hdd_we_motion_det_base_line_start_stop(struct wlan_hdd_link_info * link_info,int value)4709*5113495bSYour Name hdd_we_motion_det_base_line_start_stop(struct wlan_hdd_link_info *link_info,
4710*5113495bSYour Name 				       int value)
4711*5113495bSYour Name {
4712*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
4713*5113495bSYour Name 	struct sme_motion_det_base_line_en motion_det_base_line;
4714*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4715*5113495bSYour Name 
4716*5113495bSYour Name 	if (value < 0 || value > 1) {
4717*5113495bSYour Name 		hdd_err("Invalid value %d in mt_bl_start", value);
4718*5113495bSYour Name 		return -EINVAL;
4719*5113495bSYour Name 	}
4720*5113495bSYour Name 
4721*5113495bSYour Name 	/* Do not send baselining start/stop during motion detection phase */
4722*5113495bSYour Name 	if (adapter->motion_det_in_progress) {
4723*5113495bSYour Name 		hdd_err("Motion detection still in progress, try later");
4724*5113495bSYour Name 		return -EAGAIN;
4725*5113495bSYour Name 	}
4726*5113495bSYour Name 
4727*5113495bSYour Name 	motion_det_base_line.vdev_id = link_info->vdev_id;
4728*5113495bSYour Name 	motion_det_base_line.enable = value;
4729*5113495bSYour Name 	sme_motion_det_base_line_enable(hdd_ctx->mac_handle,
4730*5113495bSYour Name 					&motion_det_base_line);
4731*5113495bSYour Name 
4732*5113495bSYour Name 	return 0;
4733*5113495bSYour Name }
4734*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
4735*5113495bSYour Name 
wlan_hdd_set_btcoex_mode(struct wlan_hdd_link_info * link_info,int value)4736*5113495bSYour Name int wlan_hdd_set_btcoex_mode(struct wlan_hdd_link_info *link_info, int value)
4737*5113495bSYour Name {
4738*5113495bSYour Name 	struct coex_config_params coex_cfg_params = {0};
4739*5113495bSYour Name 
4740*5113495bSYour Name 	coex_cfg_params.config_type = WMI_COEX_CONFIG_BTC_MODE;
4741*5113495bSYour Name 	coex_cfg_params.config_arg1 = value;
4742*5113495bSYour Name 	coex_cfg_params.vdev_id     = link_info->vdev_id;
4743*5113495bSYour Name 
4744*5113495bSYour Name 	if (value < cfg_min(CFG_BTC_MODE) || value > cfg_max(CFG_BTC_MODE)) {
4745*5113495bSYour Name 		hdd_err_rl("Invalid value %d", value);
4746*5113495bSYour Name 		return -EINVAL;
4747*5113495bSYour Name 	}
4748*5113495bSYour Name 
4749*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(sme_send_coex_config_cmd(&coex_cfg_params))) {
4750*5113495bSYour Name 		hdd_err_rl("Failed to send coex BTC mode");
4751*5113495bSYour Name 		return -EINVAL;
4752*5113495bSYour Name 	}
4753*5113495bSYour Name 
4754*5113495bSYour Name 	return 0;
4755*5113495bSYour Name }
4756*5113495bSYour Name 
wlan_hdd_set_btcoex_rssi_threshold(struct wlan_hdd_link_info * link_info,int value)4757*5113495bSYour Name int wlan_hdd_set_btcoex_rssi_threshold(struct wlan_hdd_link_info *link_info,
4758*5113495bSYour Name 				       int value)
4759*5113495bSYour Name {
4760*5113495bSYour Name 	struct coex_config_params coex_cfg_params = {0};
4761*5113495bSYour Name 
4762*5113495bSYour Name 	coex_cfg_params.config_type =  WMI_COEX_CONFIG_BT_LOW_RSSI_THRESHOLD;
4763*5113495bSYour Name 	coex_cfg_params.config_arg1 = value;
4764*5113495bSYour Name 	coex_cfg_params.vdev_id     = link_info->vdev_id;
4765*5113495bSYour Name 
4766*5113495bSYour Name 	if (value < cfg_min(CFG_WLAN_LOW_RSSI_THRESHOLD) ||
4767*5113495bSYour Name 	    value > cfg_max(CFG_WLAN_LOW_RSSI_THRESHOLD)) {
4768*5113495bSYour Name 		hdd_err_rl("Invalid value %d", value);
4769*5113495bSYour Name 		return -EINVAL;
4770*5113495bSYour Name 	}
4771*5113495bSYour Name 
4772*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(sme_send_coex_config_cmd(&coex_cfg_params))) {
4773*5113495bSYour Name 		hdd_err_rl("Failed to send coex BTC RSSI Threshold");
4774*5113495bSYour Name 		return -EINVAL;
4775*5113495bSYour Name 	}
4776*5113495bSYour Name 	return 0;
4777*5113495bSYour Name }
4778*5113495bSYour Name 
4779*5113495bSYour Name typedef int (*setint_getnone_fn)(struct wlan_hdd_link_info *link_info,
4780*5113495bSYour Name 				 int value);
4781*5113495bSYour Name static const setint_getnone_fn setint_getnone_cb[] = {
4782*5113495bSYour Name 	[WE_SET_11D_STATE] = hdd_we_set_11d_state,
4783*5113495bSYour Name 	[WE_SET_POWER] = hdd_we_set_power,
4784*5113495bSYour Name 	[WE_SET_MAX_ASSOC] = hdd_we_set_max_assoc,
4785*5113495bSYour Name 	[WE_SET_DATA_INACTIVITY_TO] = hdd_we_set_data_inactivity_timeout,
4786*5113495bSYour Name 	[WE_SET_WOW_DATA_INACTIVITY_TO] =
4787*5113495bSYour Name 				hdd_we_set_wow_data_inactivity_timeout,
4788*5113495bSYour Name 	[WE_SET_MC_RATE] = wlan_hdd_set_mc_rate,
4789*5113495bSYour Name 	[WE_SET_TX_POWER] = hdd_we_set_tx_power,
4790*5113495bSYour Name 	[WE_SET_MAX_TX_POWER] = hdd_we_set_max_tx_power,
4791*5113495bSYour Name 	[WE_SET_MAX_TX_POWER_2_4] = hdd_we_set_max_tx_power_2_4,
4792*5113495bSYour Name 	[WE_SET_MAX_TX_POWER_5_0] = hdd_we_set_max_tx_power_5_0,
4793*5113495bSYour Name #ifdef HASTINGS_BT_WAR
4794*5113495bSYour Name 	[WE_SET_HASTINGS_BT_WAR] = hdd_we_set_hastings_bt_war,
4795*5113495bSYour Name #endif
4796*5113495bSYour Name 	[WE_SET_TM_LEVEL] = hdd_we_set_tm_level,
4797*5113495bSYour Name 	[WE_SET_PHYMODE] = hdd_we_update_phymode,
4798*5113495bSYour Name 	[WE_SET_NSS] = hdd_we_set_nss,
4799*5113495bSYour Name 	[WE_SET_GTX_HT_MCS] = hdd_we_set_gtx_ht_mcs,
4800*5113495bSYour Name 	[WE_SET_GTX_VHT_MCS] = hdd_we_set_gtx_vht_mcs,
4801*5113495bSYour Name 	[WE_SET_GTX_USRCFG] = hdd_we_set_gtx_usrcfg,
4802*5113495bSYour Name 	[WE_SET_GTX_THRE] = hdd_we_set_gtx_thre,
4803*5113495bSYour Name 	[WE_SET_GTX_MARGIN] = hdd_we_set_gtx_margin,
4804*5113495bSYour Name 	[WE_SET_GTX_STEP] = hdd_we_set_gtx_step,
4805*5113495bSYour Name 	[WE_SET_GTX_MINTPC] = hdd_we_set_gtx_mintpc,
4806*5113495bSYour Name 	[WE_SET_GTX_BWMASK] = hdd_we_set_gtx_bwmask,
4807*5113495bSYour Name 	[WE_SET_LDPC] = hdd_set_ldpc,
4808*5113495bSYour Name 	[WE_SET_TX_STBC] = hdd_set_tx_stbc,
4809*5113495bSYour Name 	[WE_SET_RX_STBC] = hdd_set_rx_stbc,
4810*5113495bSYour Name 	[WE_SET_SHORT_GI] = hdd_we_set_short_gi,
4811*5113495bSYour Name 	[WE_SET_RTSCTS] = hdd_we_set_rtscts,
4812*5113495bSYour Name 	[WE_SET_CHWIDTH] = hdd_we_set_ch_width,
4813*5113495bSYour Name 	[WE_SET_ANI_EN_DIS] = hdd_we_set_ani_en_dis,
4814*5113495bSYour Name 	[WE_SET_ANI_POLL_PERIOD] = hdd_we_set_ani_poll_period,
4815*5113495bSYour Name 	[WE_SET_ANI_LISTEN_PERIOD] = hdd_we_set_ani_listen_period,
4816*5113495bSYour Name 	[WE_SET_ANI_OFDM_LEVEL] = hdd_we_set_ani_ofdm_level,
4817*5113495bSYour Name 	[WE_SET_ANI_CCK_LEVEL] = hdd_we_set_ani_cck_level,
4818*5113495bSYour Name 	[WE_SET_DYNAMIC_BW] = hdd_we_set_dynamic_bw,
4819*5113495bSYour Name 	[WE_SET_CTS_CBW] = hdd_we_set_cts_cbw,
4820*5113495bSYour Name 	[WE_SET_11N_RATE] = hdd_we_set_11n_rate,
4821*5113495bSYour Name 	[WE_SET_VHT_RATE] = hdd_we_set_vht_rate,
4822*5113495bSYour Name 	[WE_SET_AMPDU] = hdd_we_set_ampdu,
4823*5113495bSYour Name 	[WE_SET_AMSDU] = hdd_we_set_amsdu,
4824*5113495bSYour Name 	[WE_SET_TX_CHAINMASK] = hdd_we_set_tx_chainmask,
4825*5113495bSYour Name 	[WE_SET_RX_CHAINMASK] = hdd_we_set_rx_chainmask,
4826*5113495bSYour Name 	[WE_SET_TXPOW_2G] = hdd_we_set_txpow_2g,
4827*5113495bSYour Name 	[WE_SET_TXPOW_5G] = hdd_we_set_txpow_5g,
4828*5113495bSYour Name 	[WE_DBGLOG_LOG_LEVEL] = hdd_we_dbglog_log_level,
4829*5113495bSYour Name 	[WE_DBGLOG_VAP_ENABLE] = hdd_we_dbglog_vap_enable,
4830*5113495bSYour Name 	[WE_DBGLOG_VAP_DISABLE] = hdd_we_dbglog_vap_disable,
4831*5113495bSYour Name 	[WE_DBGLOG_MODULE_ENABLE] = hdd_we_dbglog_module_enable,
4832*5113495bSYour Name 	[WE_DBGLOG_MODULE_DISABLE] = hdd_we_dbglog_module_disable,
4833*5113495bSYour Name 	[WE_DBGLOG_MOD_LOG_LEVEL] = hdd_we_dbglog_mod_log_level,
4834*5113495bSYour Name 	[WE_DBGLOG_TYPE] = hdd_we_dbglog_type,
4835*5113495bSYour Name 	[WE_DBGLOG_REPORT_ENABLE] = hdd_we_dbglog_report_enable,
4836*5113495bSYour Name 	[WE_SET_TXRX_FWSTATS] = hdd_we_set_txrx_fwstats,
4837*5113495bSYour Name 	[WE_TXRX_FWSTATS_RESET] = hdd_we_txrx_fwstats_reset,
4838*5113495bSYour Name 	[WE_DUMP_STATS] = hdd_we_dump_stats,
4839*5113495bSYour Name 	[WE_CLEAR_STATS] = hdd_we_clear_stats,
4840*5113495bSYour Name 	[WE_PPS_PAID_MATCH] = hdd_we_pps_paid_match,
4841*5113495bSYour Name 	[WE_PPS_GID_MATCH] = hdd_we_pps_gid_match,
4842*5113495bSYour Name 	[WE_PPS_EARLY_TIM_CLEAR] = hdd_we_pps_early_tim_clear,
4843*5113495bSYour Name 	[WE_PPS_EARLY_DTIM_CLEAR] = hdd_we_pps_early_dtim_clear,
4844*5113495bSYour Name 	[WE_PPS_EOF_PAD_DELIM] = hdd_we_pps_eof_pad_delim,
4845*5113495bSYour Name 	[WE_PPS_MACADDR_MISMATCH] = hdd_we_pps_macaddr_mismatch,
4846*5113495bSYour Name 	[WE_PPS_DELIM_CRC_FAIL] = hdd_we_pps_delim_crc_fail,
4847*5113495bSYour Name 	[WE_PPS_GID_NSTS_ZERO] = hdd_we_pps_gid_nsts_zero,
4848*5113495bSYour Name 	[WE_PPS_RSSI_CHECK] = hdd_we_pps_rssi_check,
4849*5113495bSYour Name 	[WE_PPS_5G_EBT] = hdd_we_pps_5g_ebt,
4850*5113495bSYour Name 	[WE_SET_HTSMPS] = hdd_we_set_htsmps,
4851*5113495bSYour Name 	[WE_SET_QPOWER_MAX_PSPOLL_COUNT] = hdd_we_set_qpower_max_pspoll_count,
4852*5113495bSYour Name 	[WE_SET_QPOWER_MAX_TX_BEFORE_WAKE] =
4853*5113495bSYour Name 				hdd_we_set_qpower_max_tx_before_wake,
4854*5113495bSYour Name 	[WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL] =
4855*5113495bSYour Name 				hdd_we_set_qpower_spec_pspoll_wake_interval,
4856*5113495bSYour Name 	[WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL] =
4857*5113495bSYour Name 				hdd_we_set_qpower_spec_max_spec_nodata_pspoll,
4858*5113495bSYour Name 	[WE_MCC_CONFIG_LATENCY] = hdd_we_mcc_config_latency,
4859*5113495bSYour Name 	[WE_MCC_CONFIG_QUOTA] = hdd_we_mcc_config_quota,
4860*5113495bSYour Name 	[WE_SET_DEBUG_LOG] = hdd_we_set_debug_log,
4861*5113495bSYour Name 	[WE_SET_EARLY_RX_ADJUST_ENABLE] = hdd_we_set_early_rx_adjust_enable,
4862*5113495bSYour Name 	[WE_SET_EARLY_RX_TGT_BMISS_NUM] = hdd_we_set_early_rx_tgt_bmiss_num,
4863*5113495bSYour Name 	[WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE] =
4864*5113495bSYour Name 				hdd_we_set_early_rx_bmiss_sample_cycle,
4865*5113495bSYour Name 	[WE_SET_EARLY_RX_SLOP_STEP] = hdd_we_set_early_rx_slop_step,
4866*5113495bSYour Name 	[WE_SET_EARLY_RX_INIT_SLOP] = hdd_we_set_early_rx_init_slop,
4867*5113495bSYour Name 	[WE_SET_EARLY_RX_ADJUST_PAUSE] = hdd_we_set_early_rx_adjust_pause,
4868*5113495bSYour Name 	[WE_SET_EARLY_RX_DRIFT_SAMPLE] = hdd_we_set_early_rx_drift_sample,
4869*5113495bSYour Name 	[WE_SET_SCAN_DISABLE] = hdd_we_set_scan_disable,
4870*5113495bSYour Name 	[WE_START_FW_PROFILE] = hdd_we_start_fw_profile,
4871*5113495bSYour Name 	[WE_SET_CHANNEL] = hdd_we_set_channel,
4872*5113495bSYour Name 	[WE_SET_CONC_SYSTEM_PREF] = hdd_we_set_conc_system_pref,
4873*5113495bSYour Name 	[WE_SET_11AX_RATE] = hdd_we_set_11ax_rate,
4874*5113495bSYour Name 	[WE_SET_DCM] = hdd_we_set_dcm,
4875*5113495bSYour Name 	[WE_SET_RANGE_EXT] = hdd_we_set_range_ext,
4876*5113495bSYour Name 	[WE_SET_PDEV_RESET] = hdd_handle_pdev_reset,
4877*5113495bSYour Name 	[WE_SET_MODULATED_DTIM] = hdd_we_set_modulated_dtim,
4878*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
4879*5113495bSYour Name 	[WE_MOTION_DET_START_STOP] = hdd_we_motion_det_start_stop,
4880*5113495bSYour Name 	[WE_MOTION_DET_BASE_LINE_START_STOP] =
4881*5113495bSYour Name 				hdd_we_motion_det_base_line_start_stop,
4882*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
4883*5113495bSYour Name 	[WE_SET_BTCOEX_MODE] = wlan_hdd_set_btcoex_mode,
4884*5113495bSYour Name 	[WE_SET_BTCOEX_RSSI_THRESHOLD] = wlan_hdd_set_btcoex_rssi_threshold,
4885*5113495bSYour Name };
4886*5113495bSYour Name 
hdd_get_setint_getnone_cb(int param)4887*5113495bSYour Name static setint_getnone_fn hdd_get_setint_getnone_cb(int param)
4888*5113495bSYour Name {
4889*5113495bSYour Name 	if (param < 0)
4890*5113495bSYour Name 		return NULL;
4891*5113495bSYour Name 
4892*5113495bSYour Name 	if (param >= QDF_ARRAY_SIZE(setint_getnone_cb))
4893*5113495bSYour Name 		return NULL;
4894*5113495bSYour Name 
4895*5113495bSYour Name 	return setint_getnone_cb[param];
4896*5113495bSYour Name }
4897*5113495bSYour Name 
4898*5113495bSYour Name /**
4899*5113495bSYour Name  * __iw_setint_getnone() - Generic "set integer" private ioctl handler
4900*5113495bSYour Name  * @dev: device upon which the ioctl was received
4901*5113495bSYour Name  * @info: ioctl request information
4902*5113495bSYour Name  * @wrqu: ioctl request data
4903*5113495bSYour Name  * @extra: ioctl extra data
4904*5113495bSYour Name  *
4905*5113495bSYour Name  * Return: 0 on success, non-zero on error
4906*5113495bSYour Name  */
__iw_setint_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)4907*5113495bSYour Name static int __iw_setint_getnone(struct net_device *dev,
4908*5113495bSYour Name 			       struct iw_request_info *info,
4909*5113495bSYour Name 			       union iwreq_data *wrqu, char *extra)
4910*5113495bSYour Name {
4911*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
4912*5113495bSYour Name 	struct hdd_context *hdd_ctx;
4913*5113495bSYour Name 	setint_getnone_fn cb;
4914*5113495bSYour Name 	int *value = (int *)extra;
4915*5113495bSYour Name 	int sub_cmd = value[0];
4916*5113495bSYour Name 	int set_value = value[1];
4917*5113495bSYour Name 	int ret;
4918*5113495bSYour Name 
4919*5113495bSYour Name 	hdd_enter_dev(dev);
4920*5113495bSYour Name 
4921*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4922*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
4923*5113495bSYour Name 	if (ret)
4924*5113495bSYour Name 		return ret;
4925*5113495bSYour Name 
4926*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
4927*5113495bSYour Name 	if (ret)
4928*5113495bSYour Name 		return ret;
4929*5113495bSYour Name 
4930*5113495bSYour Name 	cb = hdd_get_setint_getnone_cb(sub_cmd);
4931*5113495bSYour Name 	if (!cb) {
4932*5113495bSYour Name 		hdd_debug("Invalid sub command %d", sub_cmd);
4933*5113495bSYour Name 		return -EINVAL;
4934*5113495bSYour Name 	}
4935*5113495bSYour Name 
4936*5113495bSYour Name 	ret = cb(adapter->deflink, set_value);
4937*5113495bSYour Name 
4938*5113495bSYour Name 	hdd_exit();
4939*5113495bSYour Name 
4940*5113495bSYour Name 	return ret;
4941*5113495bSYour Name }
4942*5113495bSYour Name 
4943*5113495bSYour Name /**
4944*5113495bSYour Name  * iw_setint_getnone() - Generic "set integer" private ioctl handler
4945*5113495bSYour Name  * @dev: device upon which the ioctl was received
4946*5113495bSYour Name  * @info: ioctl request information
4947*5113495bSYour Name  * @wrqu: ioctl request data
4948*5113495bSYour Name  * @extra: ioctl extra data
4949*5113495bSYour Name  *
4950*5113495bSYour Name  * Return: 0 on success, non-zero on error
4951*5113495bSYour Name  */
iw_setint_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)4952*5113495bSYour Name static int iw_setint_getnone(struct net_device *dev,
4953*5113495bSYour Name 			     struct iw_request_info *info,
4954*5113495bSYour Name 			     union iwreq_data *wrqu,
4955*5113495bSYour Name 			     char *extra)
4956*5113495bSYour Name {
4957*5113495bSYour Name 	int errno;
4958*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
4959*5113495bSYour Name 
4960*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
4961*5113495bSYour Name 	if (errno)
4962*5113495bSYour Name 		return errno;
4963*5113495bSYour Name 
4964*5113495bSYour Name 	errno = __iw_setint_getnone(dev, info, wrqu, extra);
4965*5113495bSYour Name 
4966*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
4967*5113495bSYour Name 
4968*5113495bSYour Name 	return errno;
4969*5113495bSYour Name }
4970*5113495bSYour Name 
4971*5113495bSYour Name /**
4972*5113495bSYour Name  * __iw_setnone_get_threeint() - return three value to up layer.
4973*5113495bSYour Name  *
4974*5113495bSYour Name  * @dev: pointer of net_device of this wireless card
4975*5113495bSYour Name  * @info: meta data about Request sent
4976*5113495bSYour Name  * @wrqu: include request info
4977*5113495bSYour Name  * @extra: buf used for in/Output
4978*5113495bSYour Name  *
4979*5113495bSYour Name  * Return: execute result
4980*5113495bSYour Name  */
__iw_setnone_get_threeint(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)4981*5113495bSYour Name static int __iw_setnone_get_threeint(struct net_device *dev,
4982*5113495bSYour Name 					struct iw_request_info *info,
4983*5113495bSYour Name 					union iwreq_data *wrqu, char *extra)
4984*5113495bSYour Name {
4985*5113495bSYour Name 	int ret = 0; /* success */
4986*5113495bSYour Name 	uint32_t *value = (int *)extra;
4987*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
4988*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4989*5113495bSYour Name 	struct hdd_tsf_op_response tsf_op_resp;
4990*5113495bSYour Name 
4991*5113495bSYour Name 	hdd_enter_dev(dev);
4992*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
4993*5113495bSYour Name 	if (0 != ret)
4994*5113495bSYour Name 		return ret;
4995*5113495bSYour Name 
4996*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
4997*5113495bSYour Name 	if (0 != ret)
4998*5113495bSYour Name 		return ret;
4999*5113495bSYour Name 
5000*5113495bSYour Name 	hdd_debug("param = %d", value[0]);
5001*5113495bSYour Name 	switch (value[0]) {
5002*5113495bSYour Name 	case WE_GET_TSF:
5003*5113495bSYour Name 		ret = hdd_indicate_tsf(adapter, &tsf_op_resp);
5004*5113495bSYour Name 		if (!ret) {
5005*5113495bSYour Name 			value[0] = tsf_op_resp.status;
5006*5113495bSYour Name 			value[1] = tsf_op_resp.time & 0xffffffff;
5007*5113495bSYour Name 			value[2] = (tsf_op_resp.time >> 32) & 0xffffffff;
5008*5113495bSYour Name 		}
5009*5113495bSYour Name 		break;
5010*5113495bSYour Name 	default:
5011*5113495bSYour Name 		hdd_err("Invalid IOCTL get_value command %d", value[0]);
5012*5113495bSYour Name 		break;
5013*5113495bSYour Name 	}
5014*5113495bSYour Name 	return ret;
5015*5113495bSYour Name }
5016*5113495bSYour Name 
5017*5113495bSYour Name /**
5018*5113495bSYour Name  * iw_setnone_get_threeint() - return three value to up layer.
5019*5113495bSYour Name  *
5020*5113495bSYour Name  * @dev: pointer of net_device of this wireless card
5021*5113495bSYour Name  * @info: meta data about Request sent
5022*5113495bSYour Name  * @wrqu: include request info
5023*5113495bSYour Name  * @extra: buf used for in/Output
5024*5113495bSYour Name  *
5025*5113495bSYour Name  * Return: execute result
5026*5113495bSYour Name  */
iw_setnone_get_threeint(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5027*5113495bSYour Name static int iw_setnone_get_threeint(struct net_device *dev,
5028*5113495bSYour Name 					struct iw_request_info *info,
5029*5113495bSYour Name 					union iwreq_data *wrqu, char *extra)
5030*5113495bSYour Name {
5031*5113495bSYour Name 	int errno;
5032*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
5033*5113495bSYour Name 
5034*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
5035*5113495bSYour Name 	if (errno)
5036*5113495bSYour Name 		return errno;
5037*5113495bSYour Name 
5038*5113495bSYour Name 	errno = __iw_setnone_get_threeint(dev, info, wrqu, extra);
5039*5113495bSYour Name 
5040*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
5041*5113495bSYour Name 
5042*5113495bSYour Name 	return errno;
5043*5113495bSYour Name }
5044*5113495bSYour Name 
5045*5113495bSYour Name /**
5046*5113495bSYour Name  * __iw_setchar_getnone() - Generic "set string" private ioctl handler
5047*5113495bSYour Name  * @dev: device upon which the ioctl was received
5048*5113495bSYour Name  * @info: ioctl request information
5049*5113495bSYour Name  * @wrqu: ioctl request data
5050*5113495bSYour Name  * @extra: ioctl extra data
5051*5113495bSYour Name  *
5052*5113495bSYour Name  * Return: 0 on success, non-zero on error
5053*5113495bSYour Name  */
__iw_setchar_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5054*5113495bSYour Name static int __iw_setchar_getnone(struct net_device *dev,
5055*5113495bSYour Name 				struct iw_request_info *info,
5056*5113495bSYour Name 				union iwreq_data *wrqu, char *extra)
5057*5113495bSYour Name {
5058*5113495bSYour Name 	int sub_cmd;
5059*5113495bSYour Name 	int ret;
5060*5113495bSYour Name 	char *str_arg = NULL;
5061*5113495bSYour Name 	struct hdd_adapter *adapter = (netdev_priv(dev));
5062*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5063*5113495bSYour Name 	struct iw_point s_priv_data;
5064*5113495bSYour Name 	bool neighbor_report_req_support = false;
5065*5113495bSYour Name 
5066*5113495bSYour Name 	hdd_enter_dev(dev);
5067*5113495bSYour Name 
5068*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN)) {
5069*5113495bSYour Name 		hdd_err("permission check failed");
5070*5113495bSYour Name 		return -EPERM;
5071*5113495bSYour Name 	}
5072*5113495bSYour Name 
5073*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
5074*5113495bSYour Name 	if (0 != ret)
5075*5113495bSYour Name 		return ret;
5076*5113495bSYour Name 
5077*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
5078*5113495bSYour Name 	if (0 != ret)
5079*5113495bSYour Name 		return ret;
5080*5113495bSYour Name 
5081*5113495bSYour Name 	/* helper function to get iwreq_data with compat handling. */
5082*5113495bSYour Name 	if (hdd_priv_get_data(&s_priv_data, wrqu))
5083*5113495bSYour Name 		return -EINVAL;
5084*5113495bSYour Name 
5085*5113495bSYour Name 	/* make sure all params are correctly passed to function */
5086*5113495bSYour Name 	if ((!s_priv_data.pointer) || (0 == s_priv_data.length))
5087*5113495bSYour Name 		return -EINVAL;
5088*5113495bSYour Name 
5089*5113495bSYour Name 	sub_cmd = s_priv_data.flags;
5090*5113495bSYour Name 
5091*5113495bSYour Name 	/* ODD number is used for set, copy data using copy_from_user */
5092*5113495bSYour Name 	str_arg = mem_alloc_copy_from_user_helper(s_priv_data.pointer,
5093*5113495bSYour Name 						  s_priv_data.length);
5094*5113495bSYour Name 	if (!str_arg) {
5095*5113495bSYour Name 		hdd_err("mem_alloc_copy_from_user_helper fail");
5096*5113495bSYour Name 		return -ENOMEM;
5097*5113495bSYour Name 	}
5098*5113495bSYour Name 
5099*5113495bSYour Name 	hdd_debug("Received length: %d data: %s",
5100*5113495bSYour Name 			s_priv_data.length, str_arg);
5101*5113495bSYour Name 
5102*5113495bSYour Name 	switch (sub_cmd) {
5103*5113495bSYour Name 	case WE_WOWL_ADD_PTRN:
5104*5113495bSYour Name 		hdd_debug("ADD_PTRN");
5105*5113495bSYour Name 		if (!hdd_add_wowl_ptrn(adapter, str_arg))
5106*5113495bSYour Name 			ret = -EINVAL;
5107*5113495bSYour Name 		break;
5108*5113495bSYour Name 	case WE_WOWL_DEL_PTRN:
5109*5113495bSYour Name 		hdd_debug("DEL_PTRN");
5110*5113495bSYour Name 		if (!hdd_del_wowl_ptrn(adapter, str_arg))
5111*5113495bSYour Name 			ret = -EINVAL;
5112*5113495bSYour Name 		break;
5113*5113495bSYour Name 	case WE_NEIGHBOR_REPORT_REQUEST:
5114*5113495bSYour Name 	{
5115*5113495bSYour Name 		tRrmNeighborReq request;
5116*5113495bSYour Name 		tRrmNeighborRspCallbackInfo callback;
5117*5113495bSYour Name 		bool rrm_enabled = false;
5118*5113495bSYour Name 
5119*5113495bSYour Name 		ucfg_wlan_mlme_get_rrm_enabled(hdd_ctx->psoc,
5120*5113495bSYour Name 					       &rrm_enabled);
5121*5113495bSYour Name 
5122*5113495bSYour Name 		if (rrm_enabled) {
5123*5113495bSYour Name 			request.neighbor_report_offload = false;
5124*5113495bSYour Name 			request.no_ssid =
5125*5113495bSYour Name 				(s_priv_data.length - 1) ? false : true;
5126*5113495bSYour Name 			hdd_debug("Neighbor Request ssid present %d",
5127*5113495bSYour Name 				  request.no_ssid);
5128*5113495bSYour Name 			if (!request.no_ssid) {
5129*5113495bSYour Name 				request.ssid.length =
5130*5113495bSYour Name 					(s_priv_data.length - 1) >
5131*5113495bSYour Name 					32 ? 32 : (s_priv_data.length - 1);
5132*5113495bSYour Name 				qdf_mem_copy(request.ssid.ssId,
5133*5113495bSYour Name 					     str_arg,
5134*5113495bSYour Name 					     request.ssid.length);
5135*5113495bSYour Name 			}
5136*5113495bSYour Name 
5137*5113495bSYour Name 			/*
5138*5113495bSYour Name 			 * If 11k offload is supported by FW and enabled
5139*5113495bSYour Name 			 * in the ini, set the offload to true
5140*5113495bSYour Name 			 */
5141*5113495bSYour Name 			if (QDF_IS_STATUS_ERROR(
5142*5113495bSYour Name 			    ucfg_fwol_is_neighbor_report_req_supported(
5143*5113495bSYour Name 			    hdd_ctx->psoc, &neighbor_report_req_support)))
5144*5113495bSYour Name 				hdd_err("Neighbor report req bit get fail");
5145*5113495bSYour Name 
5146*5113495bSYour Name 			if (hdd_ctx->config->is_11k_offload_supported &&
5147*5113495bSYour Name 			    neighbor_report_req_support) {
5148*5113495bSYour Name 				hdd_debug("Neighbor report offloaded to FW");
5149*5113495bSYour Name 				request.neighbor_report_offload = true;
5150*5113495bSYour Name 			}
5151*5113495bSYour Name 
5152*5113495bSYour Name 			callback.neighborRspCallback = NULL;
5153*5113495bSYour Name 			callback.neighborRspCallbackContext = NULL;
5154*5113495bSYour Name 			callback.timeout = 5000; /* 5 seconds */
5155*5113495bSYour Name 			sme_neighbor_report_request(
5156*5113495bSYour Name 					hdd_ctx->mac_handle,
5157*5113495bSYour Name 					adapter->deflink->vdev_id,
5158*5113495bSYour Name 					&request,
5159*5113495bSYour Name 					&callback);
5160*5113495bSYour Name 		} else {
5161*5113495bSYour Name 			hdd_err("Ignoring neighbor request as RRM not enabled");
5162*5113495bSYour Name 			ret = -EINVAL;
5163*5113495bSYour Name 		}
5164*5113495bSYour Name 	}
5165*5113495bSYour Name 	break;
5166*5113495bSYour Name 	case WE_SET_AP_WPS_IE:
5167*5113495bSYour Name 		hdd_debug("Received WE_SET_AP_WPS_IE, won't process");
5168*5113495bSYour Name 		break;
5169*5113495bSYour Name 	case WE_UNIT_TEST:
5170*5113495bSYour Name 		ret = wlan_hdd_unit_test(hdd_ctx, str_arg);
5171*5113495bSYour Name 		break;
5172*5113495bSYour Name 	default:
5173*5113495bSYour Name 	{
5174*5113495bSYour Name 		hdd_err("Invalid sub command %d", sub_cmd);
5175*5113495bSYour Name 		ret = -EINVAL;
5176*5113495bSYour Name 		break;
5177*5113495bSYour Name 	}
5178*5113495bSYour Name 	}
5179*5113495bSYour Name 
5180*5113495bSYour Name 	qdf_mem_free(str_arg);
5181*5113495bSYour Name 	hdd_exit();
5182*5113495bSYour Name 
5183*5113495bSYour Name 	return ret;
5184*5113495bSYour Name }
5185*5113495bSYour Name 
5186*5113495bSYour Name /**
5187*5113495bSYour Name  * iw_setchar_getnone() - Generic "set string" private ioctl handler
5188*5113495bSYour Name  * @dev: device upon which the ioctl was received
5189*5113495bSYour Name  * @info: ioctl request information
5190*5113495bSYour Name  * @wrqu: ioctl request data
5191*5113495bSYour Name  * @extra: ioctl extra data
5192*5113495bSYour Name  *
5193*5113495bSYour Name  * Return: 0 on success, non-zero on error
5194*5113495bSYour Name  */
iw_setchar_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5195*5113495bSYour Name static int iw_setchar_getnone(struct net_device *dev,
5196*5113495bSYour Name 			      struct iw_request_info *info,
5197*5113495bSYour Name 			      union iwreq_data *wrqu, char *extra)
5198*5113495bSYour Name {
5199*5113495bSYour Name 	int errno;
5200*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
5201*5113495bSYour Name 
5202*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
5203*5113495bSYour Name 	if (errno)
5204*5113495bSYour Name 		return errno;
5205*5113495bSYour Name 
5206*5113495bSYour Name 	errno = __iw_setchar_getnone(dev, info, wrqu, extra);
5207*5113495bSYour Name 
5208*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
5209*5113495bSYour Name 
5210*5113495bSYour Name 	return errno;
5211*5113495bSYour Name }
5212*5113495bSYour Name 
5213*5113495bSYour Name /**
5214*5113495bSYour Name  * __iw_setnone_getint() - Generic "get integer" private ioctl handler
5215*5113495bSYour Name  * @dev: device upon which the ioctl was received
5216*5113495bSYour Name  * @info: ioctl request information
5217*5113495bSYour Name  * @wrqu: ioctl request data
5218*5113495bSYour Name  * @extra: ioctl extra data
5219*5113495bSYour Name  *
5220*5113495bSYour Name  * Return: 0 on success, non-zero on error
5221*5113495bSYour Name  */
__iw_setnone_getint(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5222*5113495bSYour Name static int __iw_setnone_getint(struct net_device *dev,
5223*5113495bSYour Name 			       struct iw_request_info *info,
5224*5113495bSYour Name 			       union iwreq_data *wrqu, char *extra)
5225*5113495bSYour Name {
5226*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5227*5113495bSYour Name 	mac_handle_t mac_handle;
5228*5113495bSYour Name 	int *value = (int *)extra;
5229*5113495bSYour Name 	int ret;
5230*5113495bSYour Name 	struct sme_config_params *sme_config;
5231*5113495bSYour Name 	struct hdd_context *hdd_ctx;
5232*5113495bSYour Name 	QDF_STATUS status;
5233*5113495bSYour Name 	bool bval = false;
5234*5113495bSYour Name 
5235*5113495bSYour Name 	hdd_enter_dev(dev);
5236*5113495bSYour Name 
5237*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5238*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
5239*5113495bSYour Name 	if (0 != ret)
5240*5113495bSYour Name 		return ret;
5241*5113495bSYour Name 
5242*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
5243*5113495bSYour Name 	if (0 != ret)
5244*5113495bSYour Name 		return ret;
5245*5113495bSYour Name 
5246*5113495bSYour Name 	sme_config = qdf_mem_malloc(sizeof(*sme_config));
5247*5113495bSYour Name 	if (!sme_config)
5248*5113495bSYour Name 		return -ENOMEM;
5249*5113495bSYour Name 
5250*5113495bSYour Name 	mac_handle = hdd_ctx->mac_handle;
5251*5113495bSYour Name 	switch (value[0]) {
5252*5113495bSYour Name 	case WE_GET_11D_STATE:
5253*5113495bSYour Name 	{
5254*5113495bSYour Name 		status = ucfg_mlme_is_11d_enabled(hdd_ctx->psoc, &bval);
5255*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status))
5256*5113495bSYour Name 			hdd_err("Invalid 11d_enable flag");
5257*5113495bSYour Name 		*value = bval;
5258*5113495bSYour Name 		hdd_debug("11D state=%d!!", *value);
5259*5113495bSYour Name 
5260*5113495bSYour Name 		break;
5261*5113495bSYour Name 	}
5262*5113495bSYour Name 
5263*5113495bSYour Name 	case WE_GET_WLAN_DBG:
5264*5113495bSYour Name 	{
5265*5113495bSYour Name 		qdf_trace_display();
5266*5113495bSYour Name 		*value = 0;
5267*5113495bSYour Name 		break;
5268*5113495bSYour Name 	}
5269*5113495bSYour Name 	case WE_GET_MAX_ASSOC:
5270*5113495bSYour Name 	{
5271*5113495bSYour Name 		if (ucfg_mlme_get_assoc_sta_limit(hdd_ctx->psoc, value) !=
5272*5113495bSYour Name 		    QDF_STATUS_SUCCESS) {
5273*5113495bSYour Name 			hdd_err("CFG_ASSOC_STA_LIMIT failed");
5274*5113495bSYour Name 			ret = -EIO;
5275*5113495bSYour Name 		}
5276*5113495bSYour Name 
5277*5113495bSYour Name 		break;
5278*5113495bSYour Name 	}
5279*5113495bSYour Name 
5280*5113495bSYour Name 	case WE_GET_CONCURRENCY_MODE:
5281*5113495bSYour Name 	{
5282*5113495bSYour Name 		*value = policy_mgr_get_concurrency_mode(hdd_ctx->psoc);
5283*5113495bSYour Name 
5284*5113495bSYour Name 		hdd_debug("concurrency mode=%d", *value);
5285*5113495bSYour Name 		break;
5286*5113495bSYour Name 	}
5287*5113495bSYour Name 
5288*5113495bSYour Name 	case WE_GET_NSS:
5289*5113495bSYour Name 	{
5290*5113495bSYour Name 		uint8_t nss;
5291*5113495bSYour Name 
5292*5113495bSYour Name 		status = hdd_get_nss(adapter, &nss);
5293*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status)) {
5294*5113495bSYour Name 			hdd_err("unable to get vht_enable2x2");
5295*5113495bSYour Name 			ret = -EIO;
5296*5113495bSYour Name 			break;
5297*5113495bSYour Name 		}
5298*5113495bSYour Name 		*value = nss;
5299*5113495bSYour Name 
5300*5113495bSYour Name 		hdd_debug("GET_NSS: Current NSS:%d", *value);
5301*5113495bSYour Name 		break;
5302*5113495bSYour Name 	}
5303*5113495bSYour Name 
5304*5113495bSYour Name 	case WE_GET_GTX_HT_MCS:
5305*5113495bSYour Name 	{
5306*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_ht_mcs");
5307*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5308*5113495bSYour Name 					     wmi_vdev_param_gtx_ht_mcs,
5309*5113495bSYour Name 					     GTX_CMD);
5310*5113495bSYour Name 		break;
5311*5113495bSYour Name 	}
5312*5113495bSYour Name 
5313*5113495bSYour Name 	case WE_GET_GTX_VHT_MCS:
5314*5113495bSYour Name 	{
5315*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_vht_mcs");
5316*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5317*5113495bSYour Name 					     wmi_vdev_param_gtx_vht_mcs,
5318*5113495bSYour Name 					     GTX_CMD);
5319*5113495bSYour Name 		break;
5320*5113495bSYour Name 	}
5321*5113495bSYour Name 
5322*5113495bSYour Name 	case WE_GET_GTX_USRCFG:
5323*5113495bSYour Name 	{
5324*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_usr_cfg");
5325*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5326*5113495bSYour Name 					     wmi_vdev_param_gtx_usr_cfg,
5327*5113495bSYour Name 					     GTX_CMD);
5328*5113495bSYour Name 		break;
5329*5113495bSYour Name 	}
5330*5113495bSYour Name 
5331*5113495bSYour Name 	case WE_GET_GTX_THRE:
5332*5113495bSYour Name 	{
5333*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_thre");
5334*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5335*5113495bSYour Name 					     wmi_vdev_param_gtx_thre,
5336*5113495bSYour Name 					     GTX_CMD);
5337*5113495bSYour Name 		break;
5338*5113495bSYour Name 	}
5339*5113495bSYour Name 
5340*5113495bSYour Name 	case WE_GET_GTX_MARGIN:
5341*5113495bSYour Name 	{
5342*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_margin");
5343*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5344*5113495bSYour Name 					     wmi_vdev_param_gtx_margin,
5345*5113495bSYour Name 					     GTX_CMD);
5346*5113495bSYour Name 		break;
5347*5113495bSYour Name 	}
5348*5113495bSYour Name 
5349*5113495bSYour Name 	case WE_GET_GTX_STEP:
5350*5113495bSYour Name 	{
5351*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_step");
5352*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5353*5113495bSYour Name 					     wmi_vdev_param_gtx_step,
5354*5113495bSYour Name 					     GTX_CMD);
5355*5113495bSYour Name 		break;
5356*5113495bSYour Name 	}
5357*5113495bSYour Name 
5358*5113495bSYour Name 	case WE_GET_GTX_MINTPC:
5359*5113495bSYour Name 	{
5360*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_mintpc");
5361*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5362*5113495bSYour Name 					     wmi_vdev_param_gtx_mintpc,
5363*5113495bSYour Name 					     GTX_CMD);
5364*5113495bSYour Name 		break;
5365*5113495bSYour Name 	}
5366*5113495bSYour Name 
5367*5113495bSYour Name 	case WE_GET_GTX_BWMASK:
5368*5113495bSYour Name 	{
5369*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_gtx_bw_mask");
5370*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5371*5113495bSYour Name 					     wmi_vdev_param_gtx_bw_mask,
5372*5113495bSYour Name 					     GTX_CMD);
5373*5113495bSYour Name 		break;
5374*5113495bSYour Name 	}
5375*5113495bSYour Name 
5376*5113495bSYour Name 	case WE_GET_LDPC:
5377*5113495bSYour Name 	{
5378*5113495bSYour Name 		ret = hdd_get_ldpc(adapter, value);
5379*5113495bSYour Name 		break;
5380*5113495bSYour Name 	}
5381*5113495bSYour Name 
5382*5113495bSYour Name 	case WE_GET_TX_STBC:
5383*5113495bSYour Name 	{
5384*5113495bSYour Name 		ret = hdd_get_tx_stbc(adapter, value);
5385*5113495bSYour Name 		break;
5386*5113495bSYour Name 	}
5387*5113495bSYour Name 
5388*5113495bSYour Name 	case WE_GET_RX_STBC:
5389*5113495bSYour Name 	{
5390*5113495bSYour Name 		ret = hdd_get_rx_stbc(adapter, value);
5391*5113495bSYour Name 		break;
5392*5113495bSYour Name 	}
5393*5113495bSYour Name 
5394*5113495bSYour Name 	case WE_GET_SHORT_GI:
5395*5113495bSYour Name 	{
5396*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_sgi");
5397*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5398*5113495bSYour Name 					     wmi_vdev_param_sgi,
5399*5113495bSYour Name 					     VDEV_CMD);
5400*5113495bSYour Name 		break;
5401*5113495bSYour Name 	}
5402*5113495bSYour Name 
5403*5113495bSYour Name 	case WE_GET_RTSCTS:
5404*5113495bSYour Name 	{
5405*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_enable_rtscts");
5406*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5407*5113495bSYour Name 					     wmi_vdev_param_enable_rtscts,
5408*5113495bSYour Name 					     VDEV_CMD);
5409*5113495bSYour Name 		break;
5410*5113495bSYour Name 	}
5411*5113495bSYour Name 
5412*5113495bSYour Name 	case WE_GET_CHWIDTH:
5413*5113495bSYour Name 	{
5414*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_chwidth");
5415*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5416*5113495bSYour Name 					     wmi_vdev_param_chwidth,
5417*5113495bSYour Name 					     VDEV_CMD);
5418*5113495bSYour Name 		break;
5419*5113495bSYour Name 	}
5420*5113495bSYour Name 
5421*5113495bSYour Name 	case WE_GET_ANI_EN_DIS:
5422*5113495bSYour Name 	{
5423*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_ani_enable");
5424*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5425*5113495bSYour Name 					     wmi_pdev_param_ani_enable,
5426*5113495bSYour Name 					     PDEV_CMD);
5427*5113495bSYour Name 		break;
5428*5113495bSYour Name 	}
5429*5113495bSYour Name 
5430*5113495bSYour Name 	case WE_GET_ANI_POLL_PERIOD:
5431*5113495bSYour Name 	{
5432*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_ani_poll_period");
5433*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5434*5113495bSYour Name 					     wmi_pdev_param_ani_poll_period,
5435*5113495bSYour Name 					     PDEV_CMD);
5436*5113495bSYour Name 		break;
5437*5113495bSYour Name 	}
5438*5113495bSYour Name 
5439*5113495bSYour Name 	case WE_GET_ANI_LISTEN_PERIOD:
5440*5113495bSYour Name 	{
5441*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_ani_listen_period");
5442*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5443*5113495bSYour Name 					     wmi_pdev_param_ani_listen_period,
5444*5113495bSYour Name 					     PDEV_CMD);
5445*5113495bSYour Name 		break;
5446*5113495bSYour Name 	}
5447*5113495bSYour Name 
5448*5113495bSYour Name 	case WE_GET_ANI_OFDM_LEVEL:
5449*5113495bSYour Name 	{
5450*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_ani_ofdm_level");
5451*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5452*5113495bSYour Name 					     wmi_pdev_param_ani_ofdm_level,
5453*5113495bSYour Name 					     PDEV_CMD);
5454*5113495bSYour Name 		break;
5455*5113495bSYour Name 	}
5456*5113495bSYour Name 
5457*5113495bSYour Name 	case WE_GET_ANI_CCK_LEVEL:
5458*5113495bSYour Name 	{
5459*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_ani_cck_level");
5460*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5461*5113495bSYour Name 					     wmi_pdev_param_ani_cck_level,
5462*5113495bSYour Name 					     PDEV_CMD);
5463*5113495bSYour Name 		break;
5464*5113495bSYour Name 	}
5465*5113495bSYour Name 
5466*5113495bSYour Name 	case WE_GET_DYNAMIC_BW:
5467*5113495bSYour Name 	{
5468*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_ani_cck_level");
5469*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5470*5113495bSYour Name 					     wmi_pdev_param_dynamic_bw,
5471*5113495bSYour Name 					     PDEV_CMD);
5472*5113495bSYour Name 		break;
5473*5113495bSYour Name 	}
5474*5113495bSYour Name 
5475*5113495bSYour Name 	case WE_GET_11N_RATE:
5476*5113495bSYour Name 	{
5477*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_fixed_rate");
5478*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5479*5113495bSYour Name 					     wmi_vdev_param_fixed_rate,
5480*5113495bSYour Name 					     VDEV_CMD);
5481*5113495bSYour Name 		break;
5482*5113495bSYour Name 	}
5483*5113495bSYour Name 
5484*5113495bSYour Name 	case WE_GET_AMPDU:
5485*5113495bSYour Name 	{
5486*5113495bSYour Name 		hdd_debug("GET AMPDU");
5487*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5488*5113495bSYour Name 					     GEN_VDEV_PARAM_AMPDU,
5489*5113495bSYour Name 					     GEN_CMD);
5490*5113495bSYour Name 		break;
5491*5113495bSYour Name 	}
5492*5113495bSYour Name 
5493*5113495bSYour Name 	case WE_GET_AMSDU:
5494*5113495bSYour Name 	{
5495*5113495bSYour Name 		hdd_debug("GET AMSDU");
5496*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5497*5113495bSYour Name 					     GEN_VDEV_PARAM_AMSDU,
5498*5113495bSYour Name 					     GEN_CMD);
5499*5113495bSYour Name 		break;
5500*5113495bSYour Name 	}
5501*5113495bSYour Name 
5502*5113495bSYour Name 	case WE_GET_ROAM_SYNCH_DELAY:
5503*5113495bSYour Name 	{
5504*5113495bSYour Name 		hdd_debug("GET ROAM SYNCH DELAY");
5505*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5506*5113495bSYour Name 					     GEN_VDEV_ROAM_SYNCH_DELAY,
5507*5113495bSYour Name 					     GEN_CMD);
5508*5113495bSYour Name 		break;
5509*5113495bSYour Name 	}
5510*5113495bSYour Name 
5511*5113495bSYour Name 	case WE_GET_TX_CHAINMASK:
5512*5113495bSYour Name 	{
5513*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_tx_chain_mask");
5514*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5515*5113495bSYour Name 					     wmi_pdev_param_tx_chain_mask,
5516*5113495bSYour Name 					     PDEV_CMD);
5517*5113495bSYour Name 		break;
5518*5113495bSYour Name 	}
5519*5113495bSYour Name 
5520*5113495bSYour Name 	case WE_GET_RX_CHAINMASK:
5521*5113495bSYour Name 	{
5522*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_rx_chain_mask");
5523*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5524*5113495bSYour Name 					     wmi_pdev_param_rx_chain_mask,
5525*5113495bSYour Name 					     PDEV_CMD);
5526*5113495bSYour Name 		break;
5527*5113495bSYour Name 	}
5528*5113495bSYour Name 
5529*5113495bSYour Name 	case WE_GET_TXPOW_2G:
5530*5113495bSYour Name 	{
5531*5113495bSYour Name 		uint8_t txpow2g = 0;
5532*5113495bSYour Name 
5533*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_txpower_limit2g");
5534*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5535*5113495bSYour Name 					     wmi_pdev_param_txpower_limit2g,
5536*5113495bSYour Name 					     PDEV_CMD);
5537*5113495bSYour Name 		ucfg_mlme_get_current_tx_power_level(hdd_ctx->psoc, &txpow2g);
5538*5113495bSYour Name 		hdd_debug("2G tx_power %d", txpow2g);
5539*5113495bSYour Name 		break;
5540*5113495bSYour Name 	}
5541*5113495bSYour Name 
5542*5113495bSYour Name 	case WE_GET_TXPOW_5G:
5543*5113495bSYour Name 	{
5544*5113495bSYour Name 		uint8_t txpow5g = 0;
5545*5113495bSYour Name 
5546*5113495bSYour Name 		hdd_debug("GET wmi_pdev_param_txpower_limit5g");
5547*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5548*5113495bSYour Name 					     wmi_pdev_param_txpower_limit5g,
5549*5113495bSYour Name 					     PDEV_CMD);
5550*5113495bSYour Name 		ucfg_mlme_get_current_tx_power_level(hdd_ctx->psoc, &txpow5g);
5551*5113495bSYour Name 		hdd_debug("5G tx_power %d", txpow5g);
5552*5113495bSYour Name 		break;
5553*5113495bSYour Name 	}
5554*5113495bSYour Name 
5555*5113495bSYour Name 	case WE_GET_PPS_PAID_MATCH:
5556*5113495bSYour Name 	{
5557*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_PAID_MATCH");
5558*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5559*5113495bSYour Name 					     WMI_VDEV_PPS_PAID_MATCH,
5560*5113495bSYour Name 					     PPS_CMD);
5561*5113495bSYour Name 		break;
5562*5113495bSYour Name 	}
5563*5113495bSYour Name 
5564*5113495bSYour Name 	case WE_GET_PPS_GID_MATCH:
5565*5113495bSYour Name 	{
5566*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_GID_MATCH");
5567*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5568*5113495bSYour Name 					     WMI_VDEV_PPS_GID_MATCH,
5569*5113495bSYour Name 					     PPS_CMD);
5570*5113495bSYour Name 		break;
5571*5113495bSYour Name 	}
5572*5113495bSYour Name 
5573*5113495bSYour Name 	case WE_GET_PPS_EARLY_TIM_CLEAR:
5574*5113495bSYour Name 	{
5575*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_EARLY_TIM_CLEAR");
5576*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5577*5113495bSYour Name 					     WMI_VDEV_PPS_EARLY_TIM_CLEAR,
5578*5113495bSYour Name 					     PPS_CMD);
5579*5113495bSYour Name 		break;
5580*5113495bSYour Name 	}
5581*5113495bSYour Name 
5582*5113495bSYour Name 	case WE_GET_PPS_EARLY_DTIM_CLEAR:
5583*5113495bSYour Name 	{
5584*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_EARLY_DTIM_CLEAR");
5585*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5586*5113495bSYour Name 					     WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
5587*5113495bSYour Name 					     PPS_CMD);
5588*5113495bSYour Name 		break;
5589*5113495bSYour Name 	}
5590*5113495bSYour Name 
5591*5113495bSYour Name 	case WE_GET_PPS_EOF_PAD_DELIM:
5592*5113495bSYour Name 	{
5593*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_EOF_PAD_DELIM");
5594*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5595*5113495bSYour Name 					     WMI_VDEV_PPS_EOF_PAD_DELIM,
5596*5113495bSYour Name 					     PPS_CMD);
5597*5113495bSYour Name 		break;
5598*5113495bSYour Name 	}
5599*5113495bSYour Name 
5600*5113495bSYour Name 	case WE_GET_PPS_MACADDR_MISMATCH:
5601*5113495bSYour Name 	{
5602*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_MACADDR_MISMATCH");
5603*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5604*5113495bSYour Name 					     WMI_VDEV_PPS_MACADDR_MISMATCH,
5605*5113495bSYour Name 					     PPS_CMD);
5606*5113495bSYour Name 		break;
5607*5113495bSYour Name 	}
5608*5113495bSYour Name 
5609*5113495bSYour Name 	case WE_GET_PPS_DELIM_CRC_FAIL:
5610*5113495bSYour Name 	{
5611*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_DELIM_CRC_FAIL");
5612*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5613*5113495bSYour Name 					     WMI_VDEV_PPS_DELIM_CRC_FAIL,
5614*5113495bSYour Name 					     PPS_CMD);
5615*5113495bSYour Name 		break;
5616*5113495bSYour Name 	}
5617*5113495bSYour Name 
5618*5113495bSYour Name 	case WE_GET_PPS_GID_NSTS_ZERO:
5619*5113495bSYour Name 	{
5620*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_GID_NSTS_ZERO");
5621*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5622*5113495bSYour Name 					     WMI_VDEV_PPS_GID_NSTS_ZERO,
5623*5113495bSYour Name 					     PPS_CMD);
5624*5113495bSYour Name 		break;
5625*5113495bSYour Name 	}
5626*5113495bSYour Name 
5627*5113495bSYour Name 	case WE_GET_PPS_RSSI_CHECK:
5628*5113495bSYour Name 	{
5629*5113495bSYour Name 
5630*5113495bSYour Name 		hdd_debug("GET WMI_VDEV_PPS_RSSI_CHECK");
5631*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5632*5113495bSYour Name 					     WMI_VDEV_PPS_RSSI_CHECK,
5633*5113495bSYour Name 					     PPS_CMD);
5634*5113495bSYour Name 		break;
5635*5113495bSYour Name 	}
5636*5113495bSYour Name 
5637*5113495bSYour Name 	case WE_GET_QPOWER_MAX_PSPOLL_COUNT:
5638*5113495bSYour Name 	{
5639*5113495bSYour Name 		hdd_debug("WE_GET_QPOWER_MAX_PSPOLL_COUNT");
5640*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5641*5113495bSYour Name 					     WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
5642*5113495bSYour Name 					     QPOWER_CMD);
5643*5113495bSYour Name 		break;
5644*5113495bSYour Name 	}
5645*5113495bSYour Name 
5646*5113495bSYour Name 	case WE_GET_QPOWER_MAX_TX_BEFORE_WAKE:
5647*5113495bSYour Name 	{
5648*5113495bSYour Name 		hdd_debug("WE_GET_QPOWER_MAX_TX_BEFORE_WAKE");
5649*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5650*5113495bSYour Name 					     WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
5651*5113495bSYour Name 					     QPOWER_CMD);
5652*5113495bSYour Name 		break;
5653*5113495bSYour Name 	}
5654*5113495bSYour Name 
5655*5113495bSYour Name 	case WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
5656*5113495bSYour Name 	{
5657*5113495bSYour Name 		hdd_debug("WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL");
5658*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5659*5113495bSYour Name 					     WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
5660*5113495bSYour Name 					     QPOWER_CMD);
5661*5113495bSYour Name 		break;
5662*5113495bSYour Name 	}
5663*5113495bSYour Name 
5664*5113495bSYour Name 	case WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
5665*5113495bSYour Name 	{
5666*5113495bSYour Name 		hdd_debug("WE_GET_QPOWER_MAX_PSPOLL_COUNT");
5667*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5668*5113495bSYour Name 					     WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
5669*5113495bSYour Name 					     QPOWER_CMD);
5670*5113495bSYour Name 		break;
5671*5113495bSYour Name 	}
5672*5113495bSYour Name 	case WE_CAP_TSF:
5673*5113495bSYour Name 		ret = hdd_capture_tsf(adapter, (uint32_t *)value, 1);
5674*5113495bSYour Name 		break;
5675*5113495bSYour Name 	case WE_GET_TEMPERATURE:
5676*5113495bSYour Name 	{
5677*5113495bSYour Name 		hdd_debug("WE_GET_TEMPERATURE");
5678*5113495bSYour Name 		ret = wlan_hdd_get_temperature(adapter, value);
5679*5113495bSYour Name 		break;
5680*5113495bSYour Name 	}
5681*5113495bSYour Name 	case WE_GET_DCM:
5682*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_he_dcm");
5683*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5684*5113495bSYour Name 					     wmi_vdev_param_he_dcm_enable,
5685*5113495bSYour Name 					     VDEV_CMD);
5686*5113495bSYour Name 		break;
5687*5113495bSYour Name 	case WE_GET_RANGE_EXT:
5688*5113495bSYour Name 		hdd_debug("GET wmi_vdev_param_he_range_ext");
5689*5113495bSYour Name 		*value = wma_cli_get_command(adapter->deflink->vdev_id,
5690*5113495bSYour Name 					     wmi_vdev_param_he_range_ext,
5691*5113495bSYour Name 					     VDEV_CMD);
5692*5113495bSYour Name 		break;
5693*5113495bSYour Name 	default:
5694*5113495bSYour Name 	{
5695*5113495bSYour Name 		hdd_err("Invalid IOCTL get_value command %d",
5696*5113495bSYour Name 		       value[0]);
5697*5113495bSYour Name 		break;
5698*5113495bSYour Name 	}
5699*5113495bSYour Name 	}
5700*5113495bSYour Name 	hdd_exit();
5701*5113495bSYour Name 	qdf_mem_free(sme_config);
5702*5113495bSYour Name 	return ret;
5703*5113495bSYour Name }
5704*5113495bSYour Name 
5705*5113495bSYour Name /**
5706*5113495bSYour Name  * iw_setnone_getint() - Generic "get integer" private ioctl handler
5707*5113495bSYour Name  * @dev: device upon which the ioctl was received
5708*5113495bSYour Name  * @info: ioctl request information
5709*5113495bSYour Name  * @wrqu: ioctl request data
5710*5113495bSYour Name  * @extra: ioctl extra data
5711*5113495bSYour Name  *
5712*5113495bSYour Name  * Return: 0 on success, non-zero on error
5713*5113495bSYour Name  */
iw_setnone_getint(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5714*5113495bSYour Name static int iw_setnone_getint(struct net_device *dev,
5715*5113495bSYour Name 			     struct iw_request_info *info,
5716*5113495bSYour Name 			     union iwreq_data *wrqu, char *extra)
5717*5113495bSYour Name {
5718*5113495bSYour Name 	int errno;
5719*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
5720*5113495bSYour Name 
5721*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
5722*5113495bSYour Name 	if (errno)
5723*5113495bSYour Name 		return errno;
5724*5113495bSYour Name 
5725*5113495bSYour Name 	errno = __iw_setnone_getint(dev, info, wrqu, extra);
5726*5113495bSYour Name 
5727*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
5728*5113495bSYour Name 
5729*5113495bSYour Name 	return errno;
5730*5113495bSYour Name }
5731*5113495bSYour Name 
hdd_set_fwtest(int argc,int cmd,int value)5732*5113495bSYour Name static int hdd_set_fwtest(int argc, int cmd, int value)
5733*5113495bSYour Name {
5734*5113495bSYour Name 	struct set_fwtest_params *fw_test;
5735*5113495bSYour Name 
5736*5113495bSYour Name 	/* check for max number of arguments */
5737*5113495bSYour Name 	if (argc > WMI_UNIT_TEST_MAX_NUM_ARGS ||
5738*5113495bSYour Name 	    argc != HDD_FWTEST_PARAMS) {
5739*5113495bSYour Name 		hdd_err("Too Many args %d", argc);
5740*5113495bSYour Name 		return -EINVAL;
5741*5113495bSYour Name 	}
5742*5113495bSYour Name 	/*
5743*5113495bSYour Name 	 * check if number of arguments are 3 then, check
5744*5113495bSYour Name 	 * then set the default value for sounding interval.
5745*5113495bSYour Name 	 */
5746*5113495bSYour Name 	if (HDD_FWTEST_PARAMS == argc) {
5747*5113495bSYour Name 		if (HDD_FWTEST_SU_PARAM_ID == cmd && 0 == value)
5748*5113495bSYour Name 			value = HDD_FWTEST_SU_DEFAULT_VALUE;
5749*5113495bSYour Name 		if (HDD_FWTEST_MU_PARAM_ID == cmd && 0 == value)
5750*5113495bSYour Name 			value = HDD_FWTEST_MU_DEFAULT_VALUE;
5751*5113495bSYour Name 	}
5752*5113495bSYour Name 	/* check sounding interval value should not exceed to max */
5753*5113495bSYour Name 	if (value > HDD_FWTEST_MAX_VALUE) {
5754*5113495bSYour Name 		hdd_err("Invalid arguments value should not exceed max: %d",
5755*5113495bSYour Name 			value);
5756*5113495bSYour Name 		return -EINVAL;
5757*5113495bSYour Name 	}
5758*5113495bSYour Name 	fw_test = qdf_mem_malloc(sizeof(*fw_test));
5759*5113495bSYour Name 	if (!fw_test)
5760*5113495bSYour Name 		return -ENOMEM;
5761*5113495bSYour Name 
5762*5113495bSYour Name 	fw_test->arg = cmd;
5763*5113495bSYour Name 	fw_test->value = value;
5764*5113495bSYour Name 	if (QDF_STATUS_SUCCESS != sme_set_fw_test(fw_test)) {
5765*5113495bSYour Name 		qdf_mem_free(fw_test);
5766*5113495bSYour Name 		hdd_err("Not able to post FW_TEST_CMD message to WMA");
5767*5113495bSYour Name 		return -EINVAL;
5768*5113495bSYour Name 	}
5769*5113495bSYour Name 	return 0;
5770*5113495bSYour Name }
5771*5113495bSYour Name 
5772*5113495bSYour Name /**
5773*5113495bSYour Name  * __iw_set_three_ints_getnone() - Generic "set 3 params" private ioctl handler
5774*5113495bSYour Name  * @dev: device upon which the ioctl was received
5775*5113495bSYour Name  * @info: ioctl request information
5776*5113495bSYour Name  * @wrqu: ioctl request data
5777*5113495bSYour Name  * @extra: ioctl extra data
5778*5113495bSYour Name  *
5779*5113495bSYour Name  * Return: 0 on success, non-zero on error
5780*5113495bSYour Name  */
__iw_set_three_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5781*5113495bSYour Name static int __iw_set_three_ints_getnone(struct net_device *dev,
5782*5113495bSYour Name 				       struct iw_request_info *info,
5783*5113495bSYour Name 				       union iwreq_data *wrqu, char *extra)
5784*5113495bSYour Name {
5785*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5786*5113495bSYour Name 	int *value = (int *)extra;
5787*5113495bSYour Name 	int sub_cmd = value[0];
5788*5113495bSYour Name 	int ret;
5789*5113495bSYour Name 	uint8_t dual_mac_feature = DISABLE_DBS_CXN_AND_SCAN;
5790*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5791*5113495bSYour Name 	QDF_STATUS status;
5792*5113495bSYour Name 
5793*5113495bSYour Name 	hdd_enter_dev(dev);
5794*5113495bSYour Name 
5795*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN)) {
5796*5113495bSYour Name 		hdd_err("permission check failed");
5797*5113495bSYour Name 		return -EPERM;
5798*5113495bSYour Name 	}
5799*5113495bSYour Name 
5800*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
5801*5113495bSYour Name 	if (0 != ret)
5802*5113495bSYour Name 		return ret;
5803*5113495bSYour Name 
5804*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
5805*5113495bSYour Name 	if (0 != ret)
5806*5113495bSYour Name 		return ret;
5807*5113495bSYour Name 
5808*5113495bSYour Name 	switch (sub_cmd) {
5809*5113495bSYour Name 
5810*5113495bSYour Name 	case WE_SET_WLAN_DBG:
5811*5113495bSYour Name 		qdf_print_set_category_verbose(qdf_get_pidx(), value[1],
5812*5113495bSYour Name 					       value[2], value[3]);
5813*5113495bSYour Name 		break;
5814*5113495bSYour Name 	case WE_SET_DP_TRACE:
5815*5113495bSYour Name 		qdf_dp_trace_set_value(value[1], value[2], value[3]);
5816*5113495bSYour Name 		break;
5817*5113495bSYour Name 
5818*5113495bSYour Name 	case WE_SET_DUAL_MAC_SCAN_CONFIG:
5819*5113495bSYour Name 		hdd_debug("Ioctl to set dual mac scan config");
5820*5113495bSYour Name 		status =
5821*5113495bSYour Name 		ucfg_policy_mgr_get_dual_mac_feature(hdd_ctx->psoc,
5822*5113495bSYour Name 						     &dual_mac_feature);
5823*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS)
5824*5113495bSYour Name 			hdd_err("can't get dual mac feature val, use def");
5825*5113495bSYour Name 		if (dual_mac_feature == DISABLE_DBS_CXN_AND_SCAN) {
5826*5113495bSYour Name 			hdd_err("Dual mac feature is disabled from INI");
5827*5113495bSYour Name 			return -EPERM;
5828*5113495bSYour Name 		}
5829*5113495bSYour Name 		hdd_debug("%d %d %d", value[1], value[2], value[3]);
5830*5113495bSYour Name 		policy_mgr_set_dual_mac_scan_config(hdd_ctx->psoc,
5831*5113495bSYour Name 			value[1], value[2], value[3]);
5832*5113495bSYour Name 		break;
5833*5113495bSYour Name 	case WE_SET_FW_TEST:
5834*5113495bSYour Name 	{
5835*5113495bSYour Name 		ret = hdd_set_fwtest(value[1], value[2], value[3]);
5836*5113495bSYour Name 		if (ret) {
5837*5113495bSYour Name 			hdd_err("Not able to set fwtest %d", ret);
5838*5113495bSYour Name 			return ret;
5839*5113495bSYour Name 		}
5840*5113495bSYour Name 	}
5841*5113495bSYour Name 	break;
5842*5113495bSYour Name 	default:
5843*5113495bSYour Name 		hdd_err("Invalid IOCTL command %d", sub_cmd);
5844*5113495bSYour Name 		break;
5845*5113495bSYour Name 
5846*5113495bSYour Name 	}
5847*5113495bSYour Name 	hdd_exit();
5848*5113495bSYour Name 	return ret;
5849*5113495bSYour Name }
5850*5113495bSYour Name 
5851*5113495bSYour Name /**
5852*5113495bSYour Name  * iw_set_three_ints_getnone() - Generic "set 3 params" private ioctl handler
5853*5113495bSYour Name  * @dev: device upon which the ioctl was received
5854*5113495bSYour Name  * @info: ioctl request information
5855*5113495bSYour Name  * @wrqu: ioctl request data
5856*5113495bSYour Name  * @extra: ioctl extra data
5857*5113495bSYour Name  *
5858*5113495bSYour Name  * Return: 0 on success, non-zero on error
5859*5113495bSYour Name  */
iw_set_three_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5860*5113495bSYour Name int iw_set_three_ints_getnone(struct net_device *dev,
5861*5113495bSYour Name 			      struct iw_request_info *info,
5862*5113495bSYour Name 			      union iwreq_data *wrqu, char *extra)
5863*5113495bSYour Name {
5864*5113495bSYour Name 	int errno;
5865*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
5866*5113495bSYour Name 
5867*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
5868*5113495bSYour Name 	if (errno)
5869*5113495bSYour Name 		return errno;
5870*5113495bSYour Name 
5871*5113495bSYour Name 	errno = __iw_set_three_ints_getnone(dev, info, wrqu, extra);
5872*5113495bSYour Name 
5873*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
5874*5113495bSYour Name 
5875*5113495bSYour Name 	return errno;
5876*5113495bSYour Name }
5877*5113495bSYour Name 
5878*5113495bSYour Name /**
5879*5113495bSYour Name  * hdd_connection_state_string() - Get connection state string
5880*5113495bSYour Name  * @connection_state: enum to be converted to a string
5881*5113495bSYour Name  *
5882*5113495bSYour Name  * Return: the string equivalent of @connection_state
5883*5113495bSYour Name  */
5884*5113495bSYour Name static const char *
hdd_connection_state_string(eConnectionState connection_state)5885*5113495bSYour Name hdd_connection_state_string(eConnectionState connection_state)
5886*5113495bSYour Name {
5887*5113495bSYour Name 	switch (connection_state) {
5888*5113495bSYour Name 		CASE_RETURN_STRING(eConnectionState_NotConnected);
5889*5113495bSYour Name 		CASE_RETURN_STRING(eConnectionState_NdiDisconnected);
5890*5113495bSYour Name 		CASE_RETURN_STRING(eConnectionState_NdiConnected);
5891*5113495bSYour Name 	default:
5892*5113495bSYour Name 		return "UNKNOWN";
5893*5113495bSYour Name 	}
5894*5113495bSYour Name }
5895*5113495bSYour Name 
5896*5113495bSYour Name #if defined(FEATURE_OEM_DATA_SUPPORT)
5897*5113495bSYour Name /**
5898*5113495bSYour Name  * iw_get_oem_data_cap_wrapper() - wrapper function to call legacy or new
5899*5113495bSYour Name  * wifi_pos api to get oem data caps
5900*5113495bSYour Name  * @dev: net device upon which the request was received
5901*5113495bSYour Name  * @info: ioctl request information
5902*5113495bSYour Name  * @wrqu: ioctl request data
5903*5113495bSYour Name  * @extra: ioctl data payload
5904*5113495bSYour Name  *
5905*5113495bSYour Name  * Return: 0 for success, negative errno value on failure
5906*5113495bSYour Name  */
iw_get_oem_data_cap_wrapper(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5907*5113495bSYour Name static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
5908*5113495bSYour Name 					struct iw_request_info *info,
5909*5113495bSYour Name 					union iwreq_data *wrqu, char *extra)
5910*5113495bSYour Name {
5911*5113495bSYour Name 	return iw_get_oem_data_cap(dev, info, wrqu, extra);
5912*5113495bSYour Name }
5913*5113495bSYour Name #elif defined(WIFI_POS_CONVERGED)
iw_get_oem_data_cap_wrapper(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5914*5113495bSYour Name static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
5915*5113495bSYour Name 					struct iw_request_info *info,
5916*5113495bSYour Name 					union iwreq_data *wrqu, char *extra)
5917*5113495bSYour Name {
5918*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5919*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5920*5113495bSYour Name 
5921*5113495bSYour Name 	return os_if_wifi_pos_populate_caps(hdd_ctx->psoc,
5922*5113495bSYour Name 					(struct wifi_pos_driver_caps *)extra);
5923*5113495bSYour Name }
5924*5113495bSYour Name #else
iw_get_oem_data_cap_wrapper(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5925*5113495bSYour Name static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
5926*5113495bSYour Name 					struct iw_request_info *info,
5927*5113495bSYour Name 					union iwreq_data *wrqu, char *extra)
5928*5113495bSYour Name {
5929*5113495bSYour Name 	return -ENOTSUPP;
5930*5113495bSYour Name }
5931*5113495bSYour Name #endif
5932*5113495bSYour Name 
5933*5113495bSYour Name #ifdef WLAN_UNIT_TEST
hdd_get_sta_cxn_info(struct hdd_context * hdd_ctx,struct hdd_adapter * adapter,char * extra)5934*5113495bSYour Name static int hdd_get_sta_cxn_info(struct hdd_context *hdd_ctx,
5935*5113495bSYour Name 				struct hdd_adapter *adapter,
5936*5113495bSYour Name 				char *extra)
5937*5113495bSYour Name {
5938*5113495bSYour Name 	QDF_STATUS status;
5939*5113495bSYour Name 
5940*5113495bSYour Name 	status = sme_get_sta_cxn_info(hdd_ctx->mac_handle,
5941*5113495bSYour Name 				      adapter->deflink->vdev_id,
5942*5113495bSYour Name 				      extra, WE_MAX_STR_LEN);
5943*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
5944*5113495bSYour Name 		qdf_scnprintf(extra, WE_MAX_STR_LEN,
5945*5113495bSYour Name 			      "\nNo active connection");
5946*5113495bSYour Name 
5947*5113495bSYour Name 	return 0;
5948*5113495bSYour Name }
5949*5113495bSYour Name #else
hdd_get_sta_cxn_info(struct hdd_context * hdd_ctx,struct hdd_adapter * adapter,char * extra)5950*5113495bSYour Name static int hdd_get_sta_cxn_info(struct hdd_context *hdd_ctx,
5951*5113495bSYour Name 				struct hdd_adapter *adapter,
5952*5113495bSYour Name 				char *extra)
5953*5113495bSYour Name {
5954*5113495bSYour Name 	qdf_scnprintf(extra, WE_MAX_STR_LEN,
5955*5113495bSYour Name 		      "\nNot supported");
5956*5113495bSYour Name 	return -ENOTSUPP;
5957*5113495bSYour Name }
5958*5113495bSYour Name #endif
5959*5113495bSYour Name 
5960*5113495bSYour Name /**
5961*5113495bSYour Name  * __iw_get_char_setnone() - Generic "get string" private ioctl handler
5962*5113495bSYour Name  * @dev: device upon which the ioctl was received
5963*5113495bSYour Name  * @info: ioctl request information
5964*5113495bSYour Name  * @wrqu: ioctl request data
5965*5113495bSYour Name  * @extra: ioctl extra data
5966*5113495bSYour Name  *
5967*5113495bSYour Name  * Return: 0 on success, non-zero on error
5968*5113495bSYour Name  */
__iw_get_char_setnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)5969*5113495bSYour Name static int __iw_get_char_setnone(struct net_device *dev,
5970*5113495bSYour Name 				 struct iw_request_info *info,
5971*5113495bSYour Name 				 union iwreq_data *wrqu, char *extra)
5972*5113495bSYour Name {
5973*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5974*5113495bSYour Name 	int sub_cmd = wrqu->data.flags;
5975*5113495bSYour Name 	struct hdd_context *hdd_ctx;
5976*5113495bSYour Name 	mac_handle_t mac_handle;
5977*5113495bSYour Name 	int ret;
5978*5113495bSYour Name 	QDF_STATUS status;
5979*5113495bSYour Name 	uint8_t value;
5980*5113495bSYour Name 	struct wlan_hdd_link_info *link_info = adapter->deflink;
5981*5113495bSYour Name 
5982*5113495bSYour Name 	hdd_enter_dev(dev);
5983*5113495bSYour Name 
5984*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5985*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
5986*5113495bSYour Name 	if (0 != ret)
5987*5113495bSYour Name 		return ret;
5988*5113495bSYour Name 
5989*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
5990*5113495bSYour Name 	if (0 != ret)
5991*5113495bSYour Name 		return ret;
5992*5113495bSYour Name 
5993*5113495bSYour Name 	mac_handle = hdd_ctx->mac_handle;
5994*5113495bSYour Name 	switch (sub_cmd) {
5995*5113495bSYour Name 	case WE_WLAN_VERSION:
5996*5113495bSYour Name 	{
5997*5113495bSYour Name 		wrqu->data.length = hdd_wlan_get_version(hdd_ctx,
5998*5113495bSYour Name 							 WE_MAX_STR_LEN, extra);
5999*5113495bSYour Name 		break;
6000*5113495bSYour Name 	}
6001*5113495bSYour Name 
6002*5113495bSYour Name 	case WE_GET_STATS:
6003*5113495bSYour Name 	{
6004*5113495bSYour Name 		hdd_wlan_get_stats(link_info, &wrqu->data.length,
6005*5113495bSYour Name 				   extra, WE_MAX_STR_LEN);
6006*5113495bSYour Name 		break;
6007*5113495bSYour Name 	}
6008*5113495bSYour Name 
6009*5113495bSYour Name 	case WE_GET_SUSPEND_RESUME_STATS:
6010*5113495bSYour Name 	{
6011*5113495bSYour Name 		ret = wlan_hdd_write_suspend_resume_stats(hdd_ctx, extra,
6012*5113495bSYour Name 							  WE_MAX_STR_LEN);
6013*5113495bSYour Name 		if (ret >= 0) {
6014*5113495bSYour Name 			wrqu->data.length = ret;
6015*5113495bSYour Name 			ret = 0;
6016*5113495bSYour Name 		}
6017*5113495bSYour Name 
6018*5113495bSYour Name 		break;
6019*5113495bSYour Name 	}
6020*5113495bSYour Name 
6021*5113495bSYour Name 	case WE_LIST_FW_PROFILE:
6022*5113495bSYour Name 		hdd_wlan_list_fw_profile(&(wrqu->data.length),
6023*5113495bSYour Name 					extra, WE_MAX_STR_LEN);
6024*5113495bSYour Name 		break;
6025*5113495bSYour Name 
6026*5113495bSYour Name 	/* The case prints the current state of the HDD, SME, CSR, PE,
6027*5113495bSYour Name 	 * TL it can be extended for WDI Global State as well.  And
6028*5113495bSYour Name 	 * currently it only checks P2P_CLIENT adapter.  P2P_DEVICE
6029*5113495bSYour Name 	 * and P2P_GO have not been added as of now.
6030*5113495bSYour Name 	 */
6031*5113495bSYour Name 	case WE_GET_STATES:
6032*5113495bSYour Name 	{
6033*5113495bSYour Name 		int buf = 0, len = 0;
6034*5113495bSYour Name 		int adapter_num = 0;
6035*5113495bSYour Name 		int count = 0, check = 1;
6036*5113495bSYour Name 		uint8_t stat_vdev_id;
6037*5113495bSYour Name 		struct hdd_station_ctx *sta_ctx = NULL;
6038*5113495bSYour Name 		struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6039*5113495bSYour Name 		struct hdd_adapter *stat_adapter = NULL;
6040*5113495bSYour Name 		struct wlan_hdd_link_info *stat_link_info;
6041*5113495bSYour Name 
6042*5113495bSYour Name 		/* Print wlan0 or p2p0 states based on the adapter_num
6043*5113495bSYour Name 		 * by using the correct adapter
6044*5113495bSYour Name 		 */
6045*5113495bSYour Name 		while (adapter_num < 2) {
6046*5113495bSYour Name 			if (WLAN_ADAPTER == adapter_num) {
6047*5113495bSYour Name 				stat_adapter = adapter;
6048*5113495bSYour Name 				buf = scnprintf(extra + len,
6049*5113495bSYour Name 						WE_MAX_STR_LEN - len,
6050*5113495bSYour Name 						"\n\n wlan0 States:-");
6051*5113495bSYour Name 				len += buf;
6052*5113495bSYour Name 			} else if (P2P_ADAPTER == adapter_num) {
6053*5113495bSYour Name 				buf = scnprintf(extra + len,
6054*5113495bSYour Name 						WE_MAX_STR_LEN - len,
6055*5113495bSYour Name 						"\n\n p2p0 States:-");
6056*5113495bSYour Name 				len += buf;
6057*5113495bSYour Name 
6058*5113495bSYour Name 				if (!hdd_ctx) {
6059*5113495bSYour Name 					buf = scnprintf(extra + len,
6060*5113495bSYour Name 							WE_MAX_STR_LEN - len,
6061*5113495bSYour Name 							"\n hdd_ctx is NULL");
6062*5113495bSYour Name 					len += buf;
6063*5113495bSYour Name 					break;
6064*5113495bSYour Name 				}
6065*5113495bSYour Name 
6066*5113495bSYour Name 				/* Printing p2p0 states only in the
6067*5113495bSYour Name 				 * case when the device is configured
6068*5113495bSYour Name 				 * as a p2p_client
6069*5113495bSYour Name 				 */
6070*5113495bSYour Name 				stat_adapter =
6071*5113495bSYour Name 					hdd_get_adapter(hdd_ctx,
6072*5113495bSYour Name 							QDF_P2P_CLIENT_MODE);
6073*5113495bSYour Name 				if (!stat_adapter) {
6074*5113495bSYour Name 					buf =
6075*5113495bSYour Name 						scnprintf(extra + len,
6076*5113495bSYour Name 							  WE_MAX_STR_LEN -
6077*5113495bSYour Name 							  len,
6078*5113495bSYour Name 							  "\n Device not configured as P2P_CLIENT.");
6079*5113495bSYour Name 					len += buf;
6080*5113495bSYour Name 					break;
6081*5113495bSYour Name 				}
6082*5113495bSYour Name 			}
6083*5113495bSYour Name 
6084*5113495bSYour Name 			if (!mac_handle) {
6085*5113495bSYour Name 				buf = scnprintf(extra + len,
6086*5113495bSYour Name 						WE_MAX_STR_LEN - len,
6087*5113495bSYour Name 						"\n mac_handle is NULL");
6088*5113495bSYour Name 				len += buf;
6089*5113495bSYour Name 				break;
6090*5113495bSYour Name 			}
6091*5113495bSYour Name 			stat_link_info = stat_adapter->deflink;
6092*5113495bSYour Name 			sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(stat_link_info);
6093*5113495bSYour Name 
6094*5113495bSYour Name 			stat_vdev_id = stat_link_info->vdev_id;
6095*5113495bSYour Name 			buf = scnprintf(extra + len, WE_MAX_STR_LEN - len,
6096*5113495bSYour Name 					"\n HDD Conn State - %s \n\n SME State:\n CSR State - %s\n CSR Substate - %s",
6097*5113495bSYour Name 					hdd_connection_state_string
6098*5113495bSYour Name 						(sta_ctx->conn_info.conn_state),
6099*5113495bSYour Name 					mac_trace_getcsr_roam_state
6100*5113495bSYour Name 						(sme_get_current_roam_state
6101*5113495bSYour Name 						   (mac_handle, stat_vdev_id)),
6102*5113495bSYour Name 					mac_trace_getcsr_roam_sub_state
6103*5113495bSYour Name 						(sme_get_current_roam_sub_state
6104*5113495bSYour Name 						   (mac_handle, stat_vdev_id))
6105*5113495bSYour Name 					);
6106*5113495bSYour Name 			len += buf;
6107*5113495bSYour Name 			adapter_num++;
6108*5113495bSYour Name 		}
6109*5113495bSYour Name 
6110*5113495bSYour Name 		if (mac_handle) {
6111*5113495bSYour Name 			/* Printing Lim State starting with global lim states */
6112*5113495bSYour Name 			buf =
6113*5113495bSYour Name 				scnprintf(extra + len, WE_MAX_STR_LEN - len,
6114*5113495bSYour Name 					  "\n\n LIM STATES:-"
6115*5113495bSYour Name 					  "\n Global Sme State - %s "
6116*5113495bSYour Name 					  "\n Global mlm State - %s " "\n",
6117*5113495bSYour Name 					  mac_trace_get_lim_sme_state
6118*5113495bSYour Name 						  (sme_get_lim_sme_state(mac_handle)),
6119*5113495bSYour Name 					  mac_trace_get_lim_mlm_state
6120*5113495bSYour Name 						  (sme_get_lim_mlm_state(mac_handle))
6121*5113495bSYour Name 					  );
6122*5113495bSYour Name 			len += buf;
6123*5113495bSYour Name 
6124*5113495bSYour Name 			while (check < 3 && count < 255) {
6125*5113495bSYour Name 				if (sme_is_lim_session_valid(mac_handle, count)) {
6126*5113495bSYour Name 					buf =
6127*5113495bSYour Name 						scnprintf(extra + len,
6128*5113495bSYour Name 							  WE_MAX_STR_LEN -
6129*5113495bSYour Name 							  len,
6130*5113495bSYour Name 							  "\n Lim Valid Session %d:-"
6131*5113495bSYour Name 							  "\n PE Sme State - %s "
6132*5113495bSYour Name 							  "\n PE Mlm State - %s "
6133*5113495bSYour Name 							  "\n", check,
6134*5113495bSYour Name 							  mac_trace_get_lim_sme_state
6135*5113495bSYour Name 								  (sme_get_lim_sme_session_state
6136*5113495bSYour Name 									  (mac_handle, count)),
6137*5113495bSYour Name 							  mac_trace_get_lim_mlm_state
6138*5113495bSYour Name 								  (sme_get_lim_mlm_session_state
6139*5113495bSYour Name 									  (mac_handle, count))
6140*5113495bSYour Name 							  );
6141*5113495bSYour Name 
6142*5113495bSYour Name 					len += buf;
6143*5113495bSYour Name 					check++;
6144*5113495bSYour Name 				}
6145*5113495bSYour Name 				count++;
6146*5113495bSYour Name 			}
6147*5113495bSYour Name 		}
6148*5113495bSYour Name 
6149*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6150*5113495bSYour Name 		break;
6151*5113495bSYour Name 	}
6152*5113495bSYour Name 
6153*5113495bSYour Name 	case WE_GET_CFG:
6154*5113495bSYour Name 	{
6155*5113495bSYour Name 		hdd_debug("Printing CLD global INI Config");
6156*5113495bSYour Name 		hdd_cfg_get_global_config(WLAN_HDD_GET_CTX(adapter),
6157*5113495bSYour Name 					  extra,
6158*5113495bSYour Name 					  QCSAP_IOCTL_MAX_STR_LEN);
6159*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6160*5113495bSYour Name 		break;
6161*5113495bSYour Name 	}
6162*5113495bSYour Name 	case WE_GET_RSSI:
6163*5113495bSYour Name 	{
6164*5113495bSYour Name 		int8_t s7Rssi = 0;
6165*5113495bSYour Name 
6166*5113495bSYour Name 		wlan_hdd_get_rssi(link_info, &s7Rssi);
6167*5113495bSYour Name 		snprintf(extra, WE_MAX_STR_LEN, "rssi=%d", s7Rssi);
6168*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6169*5113495bSYour Name 		break;
6170*5113495bSYour Name 	}
6171*5113495bSYour Name 
6172*5113495bSYour Name 	case WE_GET_WMM_STATUS:
6173*5113495bSYour Name 	{
6174*5113495bSYour Name 		snprintf(extra, WE_MAX_STR_LEN,
6175*5113495bSYour Name 			 "\nDir: 0=up, 1=down, 3=both\n"
6176*5113495bSYour Name 			 "|------------------------|\n"
6177*5113495bSYour Name 			 "|AC | ACM |Admitted| Dir |\n"
6178*5113495bSYour Name 			 "|------------------------|\n"
6179*5113495bSYour Name 			 "|VO |  %d  |  %3s   |  %d  |\n"
6180*5113495bSYour Name 			 "|VI |  %d  |  %3s   |  %d  |\n"
6181*5113495bSYour Name 			 "|BE |  %d  |  %3s   |  %d  |\n"
6182*5113495bSYour Name 			 "|BK |  %d  |  %3s   |  %d  |\n"
6183*5113495bSYour Name 			 "|------------------------|\n",
6184*5113495bSYour Name 			 adapter->hdd_wmm_status.
6185*5113495bSYour Name 			 ac_status[SME_AC_VO].is_access_required,
6186*5113495bSYour Name 			 adapter->hdd_wmm_status.
6187*5113495bSYour Name 			 ac_status[SME_AC_VO].
6188*5113495bSYour Name 			 is_access_allowed ? "YES" : "NO",
6189*5113495bSYour Name 			 adapter->hdd_wmm_status.
6190*5113495bSYour Name 			 ac_status[SME_AC_VO].tspec.
6191*5113495bSYour Name 			 ts_info.direction,
6192*5113495bSYour Name 			 adapter->hdd_wmm_status.
6193*5113495bSYour Name 			 ac_status[SME_AC_VI].is_access_required,
6194*5113495bSYour Name 			 adapter->hdd_wmm_status.
6195*5113495bSYour Name 			 ac_status[SME_AC_VI].
6196*5113495bSYour Name 			 is_access_allowed ? "YES" : "NO",
6197*5113495bSYour Name 			 adapter->hdd_wmm_status.
6198*5113495bSYour Name 			 ac_status[SME_AC_VI].tspec.
6199*5113495bSYour Name 			 ts_info.direction,
6200*5113495bSYour Name 			 adapter->hdd_wmm_status.
6201*5113495bSYour Name 			 ac_status[SME_AC_BE].is_access_required,
6202*5113495bSYour Name 			 adapter->hdd_wmm_status.
6203*5113495bSYour Name 			 ac_status[SME_AC_BE].
6204*5113495bSYour Name 			 is_access_allowed ? "YES" : "NO",
6205*5113495bSYour Name 			 adapter->hdd_wmm_status.
6206*5113495bSYour Name 			 ac_status[SME_AC_BE].tspec.
6207*5113495bSYour Name 			 ts_info.direction,
6208*5113495bSYour Name 			 adapter->hdd_wmm_status.
6209*5113495bSYour Name 			 ac_status[SME_AC_BK].is_access_required,
6210*5113495bSYour Name 			 adapter->hdd_wmm_status.
6211*5113495bSYour Name 			 ac_status[SME_AC_BK].
6212*5113495bSYour Name 			 is_access_allowed ? "YES" : "NO",
6213*5113495bSYour Name 			 adapter->hdd_wmm_status.
6214*5113495bSYour Name 			 ac_status[SME_AC_BK].tspec.
6215*5113495bSYour Name 			 ts_info.direction);
6216*5113495bSYour Name 
6217*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6218*5113495bSYour Name 		break;
6219*5113495bSYour Name 	}
6220*5113495bSYour Name 
6221*5113495bSYour Name 	case WE_GET_BA_AGEING_TIMEOUT:
6222*5113495bSYour Name 	{
6223*5113495bSYour Name 		uint32_t i;
6224*5113495bSYour Name 		enum qca_wlan_ac_type duration[QCA_WLAN_AC_ALL];
6225*5113495bSYour Name 		void *soc = cds_get_context(QDF_MODULE_ID_SOC);
6226*5113495bSYour Name 
6227*5113495bSYour Name 		if (!soc)
6228*5113495bSYour Name 			break;
6229*5113495bSYour Name 
6230*5113495bSYour Name 		for (i = 0; i < QCA_WLAN_AC_ALL; i++)
6231*5113495bSYour Name 			cdp_get_ba_timeout(soc, i, &duration[i]);
6232*5113495bSYour Name 
6233*5113495bSYour Name 		snprintf(extra, WE_MAX_STR_LEN,
6234*5113495bSYour Name 			 "\n|------------------------------|\n"
6235*5113495bSYour Name 			 "|AC | BA aging timeout duration |\n"
6236*5113495bSYour Name 			 "|--------------------------------|\n"
6237*5113495bSYour Name 			 "|VO |  %d        |\n"
6238*5113495bSYour Name 			 "|VI |  %d        |\n"
6239*5113495bSYour Name 			 "|BK |  %d        |\n"
6240*5113495bSYour Name 			 "|BE |  %d        |\n"
6241*5113495bSYour Name 			 "|--------------------------------|\n",
6242*5113495bSYour Name 			duration[QCA_WLAN_AC_VO], duration[QCA_WLAN_AC_VI],
6243*5113495bSYour Name 			duration[QCA_WLAN_AC_BK], duration[QCA_WLAN_AC_BE]);
6244*5113495bSYour Name 
6245*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6246*5113495bSYour Name 		break;
6247*5113495bSYour Name 	}
6248*5113495bSYour Name 
6249*5113495bSYour Name 	case WE_GET_CHANNEL_LIST:
6250*5113495bSYour Name 	{
6251*5113495bSYour Name 		if (0 !=
6252*5113495bSYour Name 		    iw_get_channel_list_with_cc(dev, mac_handle,
6253*5113495bSYour Name 						info, wrqu, extra))
6254*5113495bSYour Name 			return -EINVAL;
6255*5113495bSYour Name 		break;
6256*5113495bSYour Name 	}
6257*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
6258*5113495bSYour Name 	case WE_GET_TDLS_PEERS:
6259*5113495bSYour Name 	{
6260*5113495bSYour Name 		wrqu->data.length =
6261*5113495bSYour Name 			wlan_hdd_tdls_get_all_peers(adapter, extra,
6262*5113495bSYour Name 						    WE_MAX_STR_LEN) + 1;
6263*5113495bSYour Name 		break;
6264*5113495bSYour Name 	}
6265*5113495bSYour Name #endif
6266*5113495bSYour Name 	case WE_GET_11W_INFO:
6267*5113495bSYour Name 	{
6268*5113495bSYour Name 		struct qdf_mac_addr connected_bssid;
6269*5113495bSYour Name 
6270*5113495bSYour Name 		wlan_mlme_get_bssid_vdev_id(hdd_ctx->pdev,
6271*5113495bSYour Name 					    link_info->vdev_id,
6272*5113495bSYour Name 					    &connected_bssid);
6273*5113495bSYour Name 		snprintf(extra, WE_MAX_STR_LEN,
6274*5113495bSYour Name 			 "\n BSSID %02X:%02X:%02X:%02X:%02X:%02X"
6275*5113495bSYour Name 			 "\n Number of Unprotected Disassocs %d"
6276*5113495bSYour Name 			 "\n Number of Unprotected Deauths %d",
6277*5113495bSYour Name 			 connected_bssid.bytes[0],
6278*5113495bSYour Name 			 connected_bssid.bytes[1],
6279*5113495bSYour Name 			 connected_bssid.bytes[2],
6280*5113495bSYour Name 			 connected_bssid.bytes[3],
6281*5113495bSYour Name 			 connected_bssid.bytes[4],
6282*5113495bSYour Name 			 connected_bssid.bytes[5],
6283*5113495bSYour Name 			 link_info->hdd_stats.hdd_pmf_stats.
6284*5113495bSYour Name 			 num_unprot_disassoc_rx,
6285*5113495bSYour Name 			 link_info->hdd_stats.hdd_pmf_stats.
6286*5113495bSYour Name 			 num_unprot_deauth_rx);
6287*5113495bSYour Name 
6288*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6289*5113495bSYour Name 		break;
6290*5113495bSYour Name 	}
6291*5113495bSYour Name 	case WE_GET_PHYMODE:
6292*5113495bSYour Name 	{
6293*5113495bSYour Name 		bool ch_bond24 = false, ch_bond5g = false;
6294*5113495bSYour Name 		struct hdd_context *hddctx = WLAN_HDD_GET_CTX(adapter);
6295*5113495bSYour Name 		eCsrPhyMode phymode;
6296*5113495bSYour Name 		enum band_info current_band;
6297*5113495bSYour Name 		struct sme_config_params *sme_config;
6298*5113495bSYour Name 
6299*5113495bSYour Name 		sme_config = qdf_mem_malloc(sizeof(*sme_config));
6300*5113495bSYour Name 		if (!sme_config) {
6301*5113495bSYour Name 			ret = -ENOMEM;
6302*5113495bSYour Name 			break;
6303*5113495bSYour Name 		}
6304*5113495bSYour Name 
6305*5113495bSYour Name 		sme_get_config_param(mac_handle, sme_config);
6306*5113495bSYour Name 		if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
6307*5113495bSYour Name 		    sme_config->csr_config.channelBondingMode24GHz)
6308*5113495bSYour Name 			ch_bond24 = true;
6309*5113495bSYour Name 
6310*5113495bSYour Name 		if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
6311*5113495bSYour Name 		    sme_config->csr_config.channelBondingMode5GHz)
6312*5113495bSYour Name 			ch_bond5g = true;
6313*5113495bSYour Name 
6314*5113495bSYour Name 		qdf_mem_free(sme_config);
6315*5113495bSYour Name 
6316*5113495bSYour Name 		phymode = sme_get_phy_mode(mac_handle);
6317*5113495bSYour Name 		if ((QDF_STATUS_SUCCESS !=
6318*5113495bSYour Name 		     ucfg_reg_get_band(hddctx->pdev, &current_band))) {
6319*5113495bSYour Name 			hdd_err("Failed to get current band config");
6320*5113495bSYour Name 			return -EIO;
6321*5113495bSYour Name 		}
6322*5113495bSYour Name 
6323*5113495bSYour Name 		switch (phymode) {
6324*5113495bSYour Name 		case eCSR_DOT11_MODE_AUTO:
6325*5113495bSYour Name 			snprintf(extra, WE_MAX_STR_LEN, "AUTO MODE");
6326*5113495bSYour Name 			break;
6327*5113495bSYour Name 		case eCSR_DOT11_MODE_11n:
6328*5113495bSYour Name 		case eCSR_DOT11_MODE_11n_ONLY:
6329*5113495bSYour Name 			if (current_band == BAND_2G) {
6330*5113495bSYour Name 				if (ch_bond24)
6331*5113495bSYour Name 					snprintf(extra, WE_MAX_STR_LEN,
6332*5113495bSYour Name 						 "11NGHT40");
6333*5113495bSYour Name 				else
6334*5113495bSYour Name 					snprintf(extra, WE_MAX_STR_LEN,
6335*5113495bSYour Name 						 "11NGHT20");
6336*5113495bSYour Name 			} else if (current_band == BAND_5G) {
6337*5113495bSYour Name 				if (ch_bond5g)
6338*5113495bSYour Name 					snprintf(extra, WE_MAX_STR_LEN,
6339*5113495bSYour Name 						 "11NAHT40");
6340*5113495bSYour Name 				else
6341*5113495bSYour Name 					snprintf(extra, WE_MAX_STR_LEN,
6342*5113495bSYour Name 						 "11NAHT20");
6343*5113495bSYour Name 			} else {
6344*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN, "11N");
6345*5113495bSYour Name 			}
6346*5113495bSYour Name 			break;
6347*5113495bSYour Name 		case eCSR_DOT11_MODE_abg:
6348*5113495bSYour Name 			snprintf(extra, WE_MAX_STR_LEN, "11ABG");
6349*5113495bSYour Name 			break;
6350*5113495bSYour Name 		case eCSR_DOT11_MODE_11a:
6351*5113495bSYour Name 			snprintf(extra, WE_MAX_STR_LEN, "11A");
6352*5113495bSYour Name 			break;
6353*5113495bSYour Name 		case eCSR_DOT11_MODE_11b:
6354*5113495bSYour Name 		case eCSR_DOT11_MODE_11b_ONLY:
6355*5113495bSYour Name 			snprintf(extra, WE_MAX_STR_LEN, "11B");
6356*5113495bSYour Name 			break;
6357*5113495bSYour Name 		case eCSR_DOT11_MODE_11g:
6358*5113495bSYour Name 		case eCSR_DOT11_MODE_11g_ONLY:
6359*5113495bSYour Name 			snprintf(extra, WE_MAX_STR_LEN, "11G");
6360*5113495bSYour Name 			break;
6361*5113495bSYour Name 		case eCSR_DOT11_MODE_11ac:
6362*5113495bSYour Name 		case eCSR_DOT11_MODE_11ac_ONLY:
6363*5113495bSYour Name 			status =
6364*5113495bSYour Name 			   ucfg_mlme_get_vht_channel_width(hddctx->psoc,
6365*5113495bSYour Name 							   &value);
6366*5113495bSYour Name 			if (!QDF_IS_STATUS_SUCCESS(status))
6367*5113495bSYour Name 				hdd_err("Failed to set channel_width");
6368*5113495bSYour Name 			if (value == eHT_CHANNEL_WIDTH_20MHZ)
6369*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6370*5113495bSYour Name 					 "11ACVHT20");
6371*5113495bSYour Name 			else if (value == eHT_CHANNEL_WIDTH_40MHZ)
6372*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6373*5113495bSYour Name 					 "11ACVHT40");
6374*5113495bSYour Name 			else if (value == eHT_CHANNEL_WIDTH_80MHZ)
6375*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6376*5113495bSYour Name 					 "11ACVHT80");
6377*5113495bSYour Name 			else if (value == eHT_CHANNEL_WIDTH_160MHZ)
6378*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6379*5113495bSYour Name 					 "11ACVHT160");
6380*5113495bSYour Name 			break;
6381*5113495bSYour Name 		case eCSR_DOT11_MODE_11ax:
6382*5113495bSYour Name 		case eCSR_DOT11_MODE_11ax_ONLY:
6383*5113495bSYour Name 			status =
6384*5113495bSYour Name 			ucfg_mlme_get_vht_channel_width(hddctx->psoc,
6385*5113495bSYour Name 							&value);
6386*5113495bSYour Name 			if (!QDF_IS_STATUS_SUCCESS(status))
6387*5113495bSYour Name 				hdd_err("Failed to set channel_width");
6388*5113495bSYour Name 
6389*5113495bSYour Name 			/* currently using vhtChannelWidth */
6390*5113495bSYour Name 			if (value == eHT_CHANNEL_WIDTH_20MHZ)
6391*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6392*5113495bSYour Name 					 "11AX_HE_20");
6393*5113495bSYour Name 			else if (value == eHT_CHANNEL_WIDTH_40MHZ)
6394*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6395*5113495bSYour Name 					 "11AX_HE_40");
6396*5113495bSYour Name 			else if (value == eHT_CHANNEL_WIDTH_80MHZ)
6397*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6398*5113495bSYour Name 					 "11AX_HE_80");
6399*5113495bSYour Name 			else if (value == eHT_CHANNEL_WIDTH_160MHZ)
6400*5113495bSYour Name 				snprintf(extra, WE_MAX_STR_LEN,
6401*5113495bSYour Name 					 "11AX_HE_160");
6402*5113495bSYour Name 			break;
6403*5113495bSYour Name 		default:
6404*5113495bSYour Name 			break;
6405*5113495bSYour Name 		}
6406*5113495bSYour Name 
6407*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6408*5113495bSYour Name 		break;
6409*5113495bSYour Name 	}
6410*5113495bSYour Name 
6411*5113495bSYour Name 	case WE_GET_OEM_DATA_CAP:
6412*5113495bSYour Name 		return iw_get_oem_data_cap_wrapper(dev, info, wrqu, extra);
6413*5113495bSYour Name 	case WE_GET_SNR:
6414*5113495bSYour Name 	{
6415*5113495bSYour Name 		int8_t s7snr = 0;
6416*5113495bSYour Name 		int status = 0;
6417*5113495bSYour Name 		bool enable_snr_monitoring;
6418*5113495bSYour Name 		struct hdd_context *hdd_ctx;
6419*5113495bSYour Name 
6420*5113495bSYour Name 		hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6421*5113495bSYour Name 		status = wlan_hdd_validate_context(hdd_ctx);
6422*5113495bSYour Name 		if (status)
6423*5113495bSYour Name 			return status;
6424*5113495bSYour Name 
6425*5113495bSYour Name 		enable_snr_monitoring =
6426*5113495bSYour Name 				ucfg_scan_is_snr_monitor_enabled(hdd_ctx->psoc);
6427*5113495bSYour Name 		if (!enable_snr_monitoring ||
6428*5113495bSYour Name 		    !hdd_cm_is_vdev_associated(link_info)) {
6429*5113495bSYour Name 			hdd_err("getSNR failed: Enable SNR Monitoring-%d",
6430*5113495bSYour Name 				enable_snr_monitoring);
6431*5113495bSYour Name 			return -ENONET;
6432*5113495bSYour Name 		}
6433*5113495bSYour Name 		wlan_hdd_get_snr(link_info, &s7snr);
6434*5113495bSYour Name 		snprintf(extra, WE_MAX_STR_LEN, "snr=%d", s7snr);
6435*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6436*5113495bSYour Name 		break;
6437*5113495bSYour Name 	}
6438*5113495bSYour Name 
6439*5113495bSYour Name 	case WE_GET_STA_CXN_INFO:
6440*5113495bSYour Name 		ret = hdd_get_sta_cxn_info(hdd_ctx, adapter, extra);
6441*5113495bSYour Name 		wrqu->data.length = strlen(extra) + 1;
6442*5113495bSYour Name 		break;
6443*5113495bSYour Name 
6444*5113495bSYour Name 	default:
6445*5113495bSYour Name 		hdd_err("Invalid IOCTL command %d", sub_cmd);
6446*5113495bSYour Name 		break;
6447*5113495bSYour Name 	}
6448*5113495bSYour Name 
6449*5113495bSYour Name 	hdd_exit();
6450*5113495bSYour Name 	return ret;
6451*5113495bSYour Name }
6452*5113495bSYour Name 
6453*5113495bSYour Name /**
6454*5113495bSYour Name  * iw_get_char_setnone() - Generic "get string" private ioctl handler
6455*5113495bSYour Name  * @dev: device upon which the ioctl was received
6456*5113495bSYour Name  * @info: ioctl request information
6457*5113495bSYour Name  * @wrqu: ioctl request data
6458*5113495bSYour Name  * @extra: ioctl extra data
6459*5113495bSYour Name  *
6460*5113495bSYour Name  * Return: 0 on success, non-zero on error
6461*5113495bSYour Name  */
iw_get_char_setnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6462*5113495bSYour Name static int iw_get_char_setnone(struct net_device *dev,
6463*5113495bSYour Name 			       struct iw_request_info *info,
6464*5113495bSYour Name 			       union iwreq_data *wrqu, char *extra)
6465*5113495bSYour Name {
6466*5113495bSYour Name 	int errno;
6467*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
6468*5113495bSYour Name 
6469*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
6470*5113495bSYour Name 	if (errno)
6471*5113495bSYour Name 		return errno;
6472*5113495bSYour Name 
6473*5113495bSYour Name 	errno = __iw_get_char_setnone(dev, info, wrqu, extra);
6474*5113495bSYour Name 
6475*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
6476*5113495bSYour Name 
6477*5113495bSYour Name 	return errno;
6478*5113495bSYour Name }
6479*5113495bSYour Name 
6480*5113495bSYour Name /**
6481*5113495bSYour Name  * __iw_setnone_getnone() - Generic "action" private ioctl handler
6482*5113495bSYour Name  * @dev: device upon which the ioctl was received
6483*5113495bSYour Name  * @info: ioctl request information
6484*5113495bSYour Name  * @wrqu: ioctl request data
6485*5113495bSYour Name  * @extra: ioctl extra data
6486*5113495bSYour Name  *
6487*5113495bSYour Name  * Return: 0 on success, non-zero on error
6488*5113495bSYour Name  */
__iw_setnone_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6489*5113495bSYour Name static int __iw_setnone_getnone(struct net_device *dev,
6490*5113495bSYour Name 				struct iw_request_info *info,
6491*5113495bSYour Name 				union iwreq_data *wrqu, char *extra)
6492*5113495bSYour Name {
6493*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6494*5113495bSYour Name 	struct hdd_context *hdd_ctx;
6495*5113495bSYour Name 	mac_handle_t mac_handle;
6496*5113495bSYour Name 	int ret;
6497*5113495bSYour Name 	int sub_cmd;
6498*5113495bSYour Name 
6499*5113495bSYour Name 	hdd_enter_dev(dev);
6500*5113495bSYour Name 
6501*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6502*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
6503*5113495bSYour Name 	if (0 != ret)
6504*5113495bSYour Name 		return ret;
6505*5113495bSYour Name 
6506*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
6507*5113495bSYour Name 	if (0 != ret)
6508*5113495bSYour Name 		return ret;
6509*5113495bSYour Name 
6510*5113495bSYour Name #ifdef CONFIG_COMPAT
6511*5113495bSYour Name 	/* this ioctl is a special case where a sub-ioctl is used and both
6512*5113495bSYour Name 	 * the number of get and set args is 0.  in this specific case the
6513*5113495bSYour Name 	 * logic in iwpriv places the sub_cmd in the data.flags portion of
6514*5113495bSYour Name 	 * the iwreq.  unfortunately the location of this field will be
6515*5113495bSYour Name 	 * different between 32-bit and 64-bit userspace, and the standard
6516*5113495bSYour Name 	 * compat support in the kernel does not handle this case.  so we
6517*5113495bSYour Name 	 * need to explicitly handle it here.
6518*5113495bSYour Name 	 */
6519*5113495bSYour Name 	if (in_compat_syscall()) {
6520*5113495bSYour Name 		struct compat_iw_point *compat_iw_point =
6521*5113495bSYour Name 			(struct compat_iw_point *)&wrqu->data;
6522*5113495bSYour Name 		sub_cmd = compat_iw_point->flags;
6523*5113495bSYour Name 	} else {
6524*5113495bSYour Name 		sub_cmd = wrqu->data.flags;
6525*5113495bSYour Name 	}
6526*5113495bSYour Name #else
6527*5113495bSYour Name 	sub_cmd = wrqu->data.flags;
6528*5113495bSYour Name #endif
6529*5113495bSYour Name 
6530*5113495bSYour Name 	mac_handle = hdd_ctx->mac_handle;
6531*5113495bSYour Name 	switch (sub_cmd) {
6532*5113495bSYour Name 	case WE_GET_FW_PROFILE_DATA:
6533*5113495bSYour Name 		ret = wma_cli_set_command(
6534*5113495bSYour Name 				adapter->deflink->vdev_id,
6535*5113495bSYour Name 				WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
6536*5113495bSYour Name 				0, DBG_CMD);
6537*5113495bSYour Name 		break;
6538*5113495bSYour Name 
6539*5113495bSYour Name 	case WE_SET_REASSOC_TRIGGER:
6540*5113495bSYour Name 	{
6541*5113495bSYour Name 		struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6542*5113495bSYour Name 		qdf_freq_t chan_freq =
6543*5113495bSYour Name 			wlan_get_operation_chan_freq(adapter->deflink->vdev);
6544*5113495bSYour Name 		struct qdf_mac_addr target_bssid;
6545*5113495bSYour Name 
6546*5113495bSYour Name 		wlan_mlme_get_bssid_vdev_id(hdd_ctx->pdev,
6547*5113495bSYour Name 					    adapter->deflink->vdev_id,
6548*5113495bSYour Name 					    &target_bssid);
6549*5113495bSYour Name 		ucfg_wlan_cm_roam_invoke(hdd_ctx->pdev,
6550*5113495bSYour Name 					 adapter->deflink->vdev_id,
6551*5113495bSYour Name 					 &target_bssid, chan_freq,
6552*5113495bSYour Name 					 CM_ROAMING_USER);
6553*5113495bSYour Name 		return 0;
6554*5113495bSYour Name 	}
6555*5113495bSYour Name 
6556*5113495bSYour Name 	case WE_STOP_OBSS_SCAN:
6557*5113495bSYour Name 		/*
6558*5113495bSYour Name 		 * 1.OBSS Scan is mandatory while operating in 2.4GHz
6559*5113495bSYour Name 		 * 2.OBSS scan is stopped by Firmware during the disassociation
6560*5113495bSYour Name 		 * 3.OBSS stop command is added for debugging purpose
6561*5113495bSYour Name 		 */
6562*5113495bSYour Name 		if (!mac_handle) {
6563*5113495bSYour Name 			hdd_err("mac_handle context is NULL");
6564*5113495bSYour Name 			return -EINVAL;
6565*5113495bSYour Name 		}
6566*5113495bSYour Name 		sme_ht40_stop_obss_scan(mac_handle, adapter->deflink->vdev_id);
6567*5113495bSYour Name 		break;
6568*5113495bSYour Name 
6569*5113495bSYour Name 	default:
6570*5113495bSYour Name 		hdd_err("unknown ioctl %d", sub_cmd);
6571*5113495bSYour Name 		break;
6572*5113495bSYour Name 	}
6573*5113495bSYour Name 	hdd_exit();
6574*5113495bSYour Name 	return ret;
6575*5113495bSYour Name }
6576*5113495bSYour Name 
6577*5113495bSYour Name /**
6578*5113495bSYour Name  * iw_setnone_getnone() - Generic "action" private ioctl handler
6579*5113495bSYour Name  * @dev: device upon which the ioctl was received
6580*5113495bSYour Name  * @info: ioctl request information
6581*5113495bSYour Name  * @wrqu: ioctl request data
6582*5113495bSYour Name  * @extra: ioctl extra data
6583*5113495bSYour Name  *
6584*5113495bSYour Name  * Return: 0 on success, non-zero on error
6585*5113495bSYour Name  */
iw_setnone_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6586*5113495bSYour Name static int iw_setnone_getnone(struct net_device *dev,
6587*5113495bSYour Name 			      struct iw_request_info *info,
6588*5113495bSYour Name 			      union iwreq_data *wrqu, char *extra)
6589*5113495bSYour Name {
6590*5113495bSYour Name 	int errno;
6591*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
6592*5113495bSYour Name 
6593*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
6594*5113495bSYour Name 	if (errno)
6595*5113495bSYour Name 		return errno;
6596*5113495bSYour Name 
6597*5113495bSYour Name 	errno = __iw_setnone_getnone(dev, info, wrqu, extra);
6598*5113495bSYour Name 
6599*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
6600*5113495bSYour Name 
6601*5113495bSYour Name 	return errno;
6602*5113495bSYour Name }
6603*5113495bSYour Name 
6604*5113495bSYour Name /**
6605*5113495bSYour Name  * hdd_ch_avoid_unit_cmd - unit test ch avoidance
6606*5113495bSYour Name  * @hdd_ctx: hdd_context
6607*5113495bSYour Name  * @num_args: input args number
6608*5113495bSYour Name  * @apps_args: args data ptr
6609*5113495bSYour Name  *
6610*5113495bSYour Name  * This is to inject a ch avoid event to do unit test SAP chan avoidance.
6611*5113495bSYour Name  *
6612*5113495bSYour Name  * Return: void
6613*5113495bSYour Name  */
6614*5113495bSYour Name #ifdef WLAN_DEBUG
hdd_ch_avoid_unit_cmd(struct hdd_context * hdd_ctx,int num_args,int * apps_args)6615*5113495bSYour Name static void hdd_ch_avoid_unit_cmd(struct hdd_context *hdd_ctx,
6616*5113495bSYour Name 				  int num_args, int *apps_args)
6617*5113495bSYour Name {
6618*5113495bSYour Name 	struct ch_avoid_ind_type ch_avoid;
6619*5113495bSYour Name 	int cnt = 0, i;
6620*5113495bSYour Name 
6621*5113495bSYour Name 	if (num_args < 2 || num_args > CH_AVOID_MAX_RANGE * 2 ||
6622*5113495bSYour Name 	    num_args % 2 != 0)
6623*5113495bSYour Name 		return;
6624*5113495bSYour Name 	hdd_info("simulate ch avoid num_args %d", num_args);
6625*5113495bSYour Name 	for (i = 0; i < num_args && i < CH_AVOID_MAX_RANGE * 2; i++) {
6626*5113495bSYour Name 		ch_avoid.avoid_freq_range[cnt].start_freq =
6627*5113495bSYour Name 			apps_args[i];
6628*5113495bSYour Name 		ch_avoid.avoid_freq_range[cnt].end_freq =
6629*5113495bSYour Name 			apps_args[++i];
6630*5113495bSYour Name 
6631*5113495bSYour Name 		hdd_info("simulate ch avoid [%d %d]",
6632*5113495bSYour Name 			 ch_avoid.avoid_freq_range[cnt].start_freq,
6633*5113495bSYour Name 			 ch_avoid.avoid_freq_range[cnt].end_freq);
6634*5113495bSYour Name 		cnt++;
6635*5113495bSYour Name 	}
6636*5113495bSYour Name 	ch_avoid.ch_avoid_range_cnt = cnt;
6637*5113495bSYour Name 	ucfg_reg_unit_simulate_ch_avoid(hdd_ctx->psoc, &ch_avoid);
6638*5113495bSYour Name }
6639*5113495bSYour Name #else
hdd_ch_avoid_unit_cmd(struct hdd_context * hdd_ctx,int num_args,int * apps_args)6640*5113495bSYour Name static void hdd_ch_avoid_unit_cmd(struct hdd_context *hdd_ctx,
6641*5113495bSYour Name 				  int num_args, int *apps_args)
6642*5113495bSYour Name {
6643*5113495bSYour Name }
6644*5113495bSYour Name #endif
6645*5113495bSYour Name 
6646*5113495bSYour Name #ifdef FW_THERMAL_THROTTLE_SUPPORT
6647*5113495bSYour Name /**
6648*5113495bSYour Name  * hdd_send_thermal_mgmt_cmd - Send thermal management params
6649*5113495bSYour Name  * @mac_handle: Opaque handle to the global MAC context
6650*5113495bSYour Name  * @lower_thresh_deg: Lower threshold value of Temperature
6651*5113495bSYour Name  * @higher_thresh_deg: Higher threshold value of Temperature
6652*5113495bSYour Name  *
6653*5113495bSYour Name  * Return: QDF_STATUS
6654*5113495bSYour Name  */
6655*5113495bSYour Name #ifndef QCN7605_SUPPORT
hdd_send_thermal_mgmt_cmd(mac_handle_t mac_handle,uint16_t lower_thresh_deg,uint16_t higher_thresh_deg)6656*5113495bSYour Name static QDF_STATUS hdd_send_thermal_mgmt_cmd(mac_handle_t mac_handle,
6657*5113495bSYour Name 					    uint16_t lower_thresh_deg,
6658*5113495bSYour Name 					    uint16_t higher_thresh_deg)
6659*5113495bSYour Name {
6660*5113495bSYour Name 	return sme_set_thermal_mgmt(mac_handle, lower_thresh_deg,
6661*5113495bSYour Name 				    higher_thresh_deg);
6662*5113495bSYour Name }
6663*5113495bSYour Name #else
hdd_send_thermal_mgmt_cmd(mac_handle_t mac_handle,uint16_t lower_thresh_deg,uint16_t higher_thresh_deg)6664*5113495bSYour Name static QDF_STATUS hdd_send_thermal_mgmt_cmd(mac_handle_t mac_handle,
6665*5113495bSYour Name 					    uint16_t lower_thresh_deg,
6666*5113495bSYour Name 					    uint16_t higher_thresh_deg)
6667*5113495bSYour Name {
6668*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
6669*5113495bSYour Name }
6670*5113495bSYour Name #endif
6671*5113495bSYour Name #endif /* FW_THERMAL_THROTTLE_SUPPORT */
6672*5113495bSYour Name 
6673*5113495bSYour Name /**
6674*5113495bSYour Name  * __iw_set_var_ints_getnone - Generic "set many" private ioctl handler
6675*5113495bSYour Name  * @dev: device upon which the ioctl was received
6676*5113495bSYour Name  * @info: ioctl request information
6677*5113495bSYour Name  * @wrqu: ioctl request data
6678*5113495bSYour Name  * @extra: ioctl extra data
6679*5113495bSYour Name  *
6680*5113495bSYour Name  * This is an SSR-protected generic handler for private ioctls which
6681*5113495bSYour Name  * take multiple arguments.  Note that this implementation is also
6682*5113495bSYour Name  * somewhat unique in that it is shared by both STA-mode and SAP-mode
6683*5113495bSYour Name  * interfaces.
6684*5113495bSYour Name  *
6685*5113495bSYour Name  * Return: 0 on success, non-zero on error
6686*5113495bSYour Name  */
__iw_set_var_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6687*5113495bSYour Name static int __iw_set_var_ints_getnone(struct net_device *dev,
6688*5113495bSYour Name 				     struct iw_request_info *info,
6689*5113495bSYour Name 				     union iwreq_data *wrqu, char *extra)
6690*5113495bSYour Name {
6691*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6692*5113495bSYour Name 	mac_handle_t mac_handle;
6693*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
6694*5113495bSYour Name 	int sub_cmd;
6695*5113495bSYour Name 	int *apps_args = (int *) extra;
6696*5113495bSYour Name 	struct hdd_context *hdd_ctx;
6697*5113495bSYour Name 	int ret, num_args;
6698*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
6699*5113495bSYour Name 	struct cdp_txrx_stats_req req = {0};
6700*5113495bSYour Name 
6701*5113495bSYour Name 	hdd_enter_dev(dev);
6702*5113495bSYour Name 
6703*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6704*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
6705*5113495bSYour Name 	if (0 != ret)
6706*5113495bSYour Name 		return ret;
6707*5113495bSYour Name 
6708*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
6709*5113495bSYour Name 	if (0 != ret)
6710*5113495bSYour Name 		return ret;
6711*5113495bSYour Name 
6712*5113495bSYour Name 	mac_handle = hdd_ctx->mac_handle;
6713*5113495bSYour Name 	sub_cmd = wrqu->data.flags;
6714*5113495bSYour Name 	num_args = wrqu->data.length;
6715*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink);
6716*5113495bSYour Name 
6717*5113495bSYour Name 	hdd_debug("Received length %d", wrqu->data.length);
6718*5113495bSYour Name 
6719*5113495bSYour Name 	switch (sub_cmd) {
6720*5113495bSYour Name 	case WE_P2P_NOA_CMD:
6721*5113495bSYour Name 	{
6722*5113495bSYour Name 		struct p2p_app_set_ps p2p_noa;
6723*5113495bSYour Name 
6724*5113495bSYour Name 		if (adapter->device_mode != QDF_P2P_GO_MODE) {
6725*5113495bSYour Name 			hdd_err("Setting NoA is not allowed in Device mode %s(%d)",
6726*5113495bSYour Name 				qdf_opmode_str(adapter->device_mode),
6727*5113495bSYour Name 				adapter->device_mode);
6728*5113495bSYour Name 			return -EINVAL;
6729*5113495bSYour Name 		}
6730*5113495bSYour Name 
6731*5113495bSYour Name 		p2p_noa.opp_ps = apps_args[0];
6732*5113495bSYour Name 		p2p_noa.ct_window = apps_args[1];
6733*5113495bSYour Name 		p2p_noa.duration = apps_args[2];
6734*5113495bSYour Name 		p2p_noa.interval = apps_args[3];
6735*5113495bSYour Name 		p2p_noa.count = apps_args[4];
6736*5113495bSYour Name 		p2p_noa.single_noa_duration = apps_args[5];
6737*5113495bSYour Name 		p2p_noa.ps_selection = apps_args[6];
6738*5113495bSYour Name 
6739*5113495bSYour Name 		hdd_debug("P2P_NOA_ATTR:opp ps %d ct window %d duration %d interval %d count %d single noa duration %d ps selection %x",
6740*5113495bSYour Name 			   apps_args[0], apps_args[1], apps_args[2],
6741*5113495bSYour Name 			   apps_args[3], apps_args[4],
6742*5113495bSYour Name 			   apps_args[5], apps_args[6]);
6743*5113495bSYour Name 
6744*5113495bSYour Name 		hdd_set_p2p_ps(dev, &p2p_noa);
6745*5113495bSYour Name 
6746*5113495bSYour Name 	}
6747*5113495bSYour Name 	break;
6748*5113495bSYour Name 
6749*5113495bSYour Name 	case WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD:
6750*5113495bSYour Name 	{
6751*5113495bSYour Name 		hdd_debug("SELECTIVE_MODULE_LOG %d arg1 %d arg2",
6752*5113495bSYour Name 			   apps_args[0], apps_args[1]);
6753*5113495bSYour Name 		qdf_trace_enable(apps_args[0], apps_args[1]);
6754*5113495bSYour Name 	}
6755*5113495bSYour Name 	break;
6756*5113495bSYour Name 
6757*5113495bSYour Name 	case WE_MTRACE_DUMP_CMD:
6758*5113495bSYour Name 	{
6759*5113495bSYour Name 		hdd_debug("MTRACE_DUMP code %d session %d count %d bitmask_of_module %d ",
6760*5113495bSYour Name 			   apps_args[0], apps_args[1],
6761*5113495bSYour Name 			   apps_args[2], apps_args[3]);
6762*5113495bSYour Name 		qdf_trace_dump_all((void *)mac_handle, apps_args[0],
6763*5113495bSYour Name 				   apps_args[1], apps_args[2],
6764*5113495bSYour Name 				   apps_args[3]);
6765*5113495bSYour Name 
6766*5113495bSYour Name 	}
6767*5113495bSYour Name 	break;
6768*5113495bSYour Name 
6769*5113495bSYour Name 	case WE_POLICY_MANAGER_CINFO_CMD:
6770*5113495bSYour Name 	{
6771*5113495bSYour Name 		struct policy_mgr_conc_connection_info *conn_info;
6772*5113495bSYour Name 		uint32_t i = 0, len = 0;
6773*5113495bSYour Name 
6774*5113495bSYour Name 		hdd_info("<iwpriv wlan0 pm_cinfo> is called");
6775*5113495bSYour Name 		conn_info = policy_mgr_get_conn_info(&len);
6776*5113495bSYour Name 		pr_info("+--------------------------+\n");
6777*5113495bSYour Name 		for (i = 0; i < len; i++) {
6778*5113495bSYour Name 			if (!conn_info->in_use)
6779*5113495bSYour Name 				continue;
6780*5113495bSYour Name 
6781*5113495bSYour Name 			pr_info("|table_index[%d]\t\t\n", i);
6782*5113495bSYour Name 			pr_info("|\t|vdev_id - %-10d|\n", conn_info->vdev_id);
6783*5113495bSYour Name 			pr_info("|\t|freq    - %-10d|\n", conn_info->freq);
6784*5113495bSYour Name 			pr_info("|\t|bw      - %-10d|\n", conn_info->bw);
6785*5113495bSYour Name 			pr_info("|\t|mode    - %-10d|\n", conn_info->mode);
6786*5113495bSYour Name 			pr_info("|\t|mac_id  - %-10d|\n", conn_info->mac);
6787*5113495bSYour Name 			pr_info("|\t|in_use  - %-10d|\n", conn_info->in_use);
6788*5113495bSYour Name 			pr_info("+--------------------------+\n");
6789*5113495bSYour Name 			conn_info++;
6790*5113495bSYour Name 		}
6791*5113495bSYour Name 
6792*5113495bSYour Name 		pr_info("|\t|current state dbs - %-10d, sbs - %-10d|\n",
6793*5113495bSYour Name 			policy_mgr_is_current_hwmode_dbs(hdd_ctx->psoc),
6794*5113495bSYour Name 			policy_mgr_is_current_hwmode_sbs(hdd_ctx->psoc));
6795*5113495bSYour Name 	}
6796*5113495bSYour Name 	break;
6797*5113495bSYour Name 
6798*5113495bSYour Name 	case WE_UNIT_TEST_CMD:
6799*5113495bSYour Name 	{
6800*5113495bSYour Name 		QDF_STATUS status;
6801*5113495bSYour Name 		uint8_t vdev_id = 0;
6802*5113495bSYour Name 
6803*5113495bSYour Name 		if ((apps_args[0] < WLAN_MODULE_ID_MIN) ||
6804*5113495bSYour Name 		    (apps_args[0] >= WLAN_MODULE_ID_MAX)) {
6805*5113495bSYour Name 			hdd_err_rl("Invalid MODULE ID %d", apps_args[0]);
6806*5113495bSYour Name 			return -EINVAL;
6807*5113495bSYour Name 		}
6808*5113495bSYour Name 		if (apps_args[1] > WMI_UNIT_TEST_MAX_NUM_ARGS ||
6809*5113495bSYour Name 		    apps_args[1] < 0) {
6810*5113495bSYour Name 			hdd_err_rl("Too Many/Few args %d", apps_args[1]);
6811*5113495bSYour Name 			return -EINVAL;
6812*5113495bSYour Name 		}
6813*5113495bSYour Name 
6814*5113495bSYour Name 		if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam())
6815*5113495bSYour Name 			vdev_id = 0;
6816*5113495bSYour Name 		else
6817*5113495bSYour Name 			vdev_id = adapter->deflink->vdev_id;
6818*5113495bSYour Name 
6819*5113495bSYour Name 		if (vdev_id >= WLAN_MAX_VDEVS) {
6820*5113495bSYour Name 			hdd_err_rl("Invalid vdev id %d", vdev_id);
6821*5113495bSYour Name 			return -EINVAL;
6822*5113495bSYour Name 		}
6823*5113495bSYour Name 
6824*5113495bSYour Name 		status = sme_send_unit_test_cmd(vdev_id,
6825*5113495bSYour Name 						apps_args[0],
6826*5113495bSYour Name 						apps_args[1],
6827*5113495bSYour Name 						&apps_args[2]);
6828*5113495bSYour Name 		if (QDF_STATUS_SUCCESS != status) {
6829*5113495bSYour Name 			hdd_err("sme_send_unit_test_cmd returned %d", status);
6830*5113495bSYour Name 			return -EINVAL;
6831*5113495bSYour Name 		}
6832*5113495bSYour Name 	}
6833*5113495bSYour Name 	break;
6834*5113495bSYour Name #ifdef WLAN_FEATURE_GPIO_LED_FLASHING
6835*5113495bSYour Name 	case WE_LED_FLASHING_PARAM:
6836*5113495bSYour Name 	{
6837*5113495bSYour Name 		int i;
6838*5113495bSYour Name 
6839*5113495bSYour Name 		if (num_args != 4) {
6840*5113495bSYour Name 			hdd_err("gpio_control: 4 parameters are required");
6841*5113495bSYour Name 			return -EINVAL;
6842*5113495bSYour Name 		}
6843*5113495bSYour Name 		for (i = 0; i < num_args; i++) {
6844*5113495bSYour Name 			if (apps_args[i] >= 0x7fffffff) {
6845*5113495bSYour Name 				hdd_err("gpio_control: parameter should be less than 0x7fffffff");
6846*5113495bSYour Name 				return -EINVAL;
6847*5113495bSYour Name 			}
6848*5113495bSYour Name 		}
6849*5113495bSYour Name 		sme_set_led_flashing(mac_handle,
6850*5113495bSYour Name 				     0, apps_args[0], apps_args[1]);
6851*5113495bSYour Name 		sme_set_led_flashing(mac_handle,
6852*5113495bSYour Name 				     1, apps_args[2], apps_args[3]);
6853*5113495bSYour Name 	}
6854*5113495bSYour Name 	break;
6855*5113495bSYour Name #endif
6856*5113495bSYour Name 	case WE_SET_PKTLOG:
6857*5113495bSYour Name 	{
6858*5113495bSYour Name 		int ret;
6859*5113495bSYour Name 
6860*5113495bSYour Name 		if (num_args < 1 || num_args > 2) {
6861*5113495bSYour Name 			hdd_err("pktlog: either 1 or 2 parameters are required");
6862*5113495bSYour Name 			return -EINVAL;
6863*5113495bSYour Name 		}
6864*5113495bSYour Name 
6865*5113495bSYour Name 		ret = hdd_process_pktlog_command(hdd_ctx, apps_args[0],
6866*5113495bSYour Name 						   apps_args[1]);
6867*5113495bSYour Name 		if (ret)
6868*5113495bSYour Name 			return ret;
6869*5113495bSYour Name 		break;
6870*5113495bSYour Name 	}
6871*5113495bSYour Name 	case WE_MAC_PWR_DEBUG_CMD:
6872*5113495bSYour Name 	{
6873*5113495bSYour Name 		struct sir_mac_pwr_dbg_cmd mac_pwr_dbg_args;
6874*5113495bSYour Name 		int i, j;
6875*5113495bSYour Name 
6876*5113495bSYour Name 		if (num_args < 3) {
6877*5113495bSYour Name 			hdd_err("number of arguments can't be null %d",
6878*5113495bSYour Name 				num_args);
6879*5113495bSYour Name 			return -EINVAL;
6880*5113495bSYour Name 		}
6881*5113495bSYour Name 		if (num_args - 3 != apps_args[2]) {
6882*5113495bSYour Name 			hdd_err("arg list of size %d doesn't match num_args %d",
6883*5113495bSYour Name 				num_args-3, apps_args[2]);
6884*5113495bSYour Name 			return -EINVAL;
6885*5113495bSYour Name 		}
6886*5113495bSYour Name 		if ((apps_args[1] < WLAN_MODULE_ID_MIN) ||
6887*5113495bSYour Name 		    (apps_args[1] >= WLAN_MODULE_ID_MAX)) {
6888*5113495bSYour Name 			hdd_err("Invalid MODULE ID %d", apps_args[1]);
6889*5113495bSYour Name 			return -EINVAL;
6890*5113495bSYour Name 		}
6891*5113495bSYour Name 		if (apps_args[2] > (MAX_POWER_DBG_ARGS_SUPPORTED)) {
6892*5113495bSYour Name 			hdd_err("Too Many args %d", apps_args[2]);
6893*5113495bSYour Name 			return -EINVAL;
6894*5113495bSYour Name 		}
6895*5113495bSYour Name 		mac_pwr_dbg_args.pdev_id = apps_args[0];
6896*5113495bSYour Name 		mac_pwr_dbg_args.module_id = apps_args[1];
6897*5113495bSYour Name 		mac_pwr_dbg_args.num_args = apps_args[2];
6898*5113495bSYour Name 
6899*5113495bSYour Name 		for (i = 0, j = 3; i < mac_pwr_dbg_args.num_args; i++, j++)
6900*5113495bSYour Name 			mac_pwr_dbg_args.args[i] = apps_args[j];
6901*5113495bSYour Name 
6902*5113495bSYour Name 		if (QDF_STATUS_SUCCESS !=
6903*5113495bSYour Name 			sme_process_mac_pwr_dbg_cmd(mac_handle,
6904*5113495bSYour Name 						    adapter->deflink->vdev_id,
6905*5113495bSYour Name 						    &mac_pwr_dbg_args)) {
6906*5113495bSYour Name 			return -EINVAL;
6907*5113495bSYour Name 		}
6908*5113495bSYour Name 	}
6909*5113495bSYour Name 	break;
6910*5113495bSYour Name 	case WE_SET_CHAN_AVOID:
6911*5113495bSYour Name 	{
6912*5113495bSYour Name 		hdd_ch_avoid_unit_cmd(hdd_ctx, num_args, apps_args);
6913*5113495bSYour Name 	}
6914*5113495bSYour Name 	break;
6915*5113495bSYour Name 	case WE_SET_TXRX_STATS:
6916*5113495bSYour Name 	{
6917*5113495bSYour Name 		req.stats = apps_args[0];
6918*5113495bSYour Name 		/* default value of secondary parameter is 0(mac_id) */
6919*5113495bSYour Name 		req.mac_id = apps_args[1];
6920*5113495bSYour Name 
6921*5113495bSYour Name 		hdd_debug("WE_SET_TXRX_STATS stats cmd: %d mac_id: %d",
6922*5113495bSYour Name 				req.stats, req.mac_id);
6923*5113495bSYour Name 		if (qdf_unlikely(!soc)) {
6924*5113495bSYour Name 			hdd_err("soc is NULL");
6925*5113495bSYour Name 			return -EINVAL;
6926*5113495bSYour Name 		}
6927*5113495bSYour Name 
6928*5113495bSYour Name 		if (apps_args[0] == CDP_TXRX_STATS_28) {
6929*5113495bSYour Name 			if (sta_ctx->conn_info.is_authenticated) {
6930*5113495bSYour Name 				hdd_debug("ap mac addr: "QDF_MAC_ADDR_FMT,
6931*5113495bSYour Name 					  QDF_MAC_ADDR_REF(sta_ctx->conn_info.bssid.bytes));
6932*5113495bSYour Name 				req.peer_addr =
6933*5113495bSYour Name 					(char *)&sta_ctx->conn_info.bssid;
6934*5113495bSYour Name 			}
6935*5113495bSYour Name 		}
6936*5113495bSYour Name 		ret = cdp_txrx_stats_request(soc, adapter->deflink->vdev_id,
6937*5113495bSYour Name 					     &req);
6938*5113495bSYour Name 		break;
6939*5113495bSYour Name 	}
6940*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
6941*5113495bSYour Name 	case WE_MOTION_DET_CONFIG_PARAM:
6942*5113495bSYour Name 	{
6943*5113495bSYour Name 		struct sme_motion_det_cfg motion_det_cfg;
6944*5113495bSYour Name 
6945*5113495bSYour Name 		if (num_args != 15) {
6946*5113495bSYour Name 			hdd_err_rl("mt_config: Invalid no of args");
6947*5113495bSYour Name 			return -EINVAL;
6948*5113495bSYour Name 		}
6949*5113495bSYour Name 
6950*5113495bSYour Name 		motion_det_cfg.vdev_id = adapter->deflink->vdev_id;
6951*5113495bSYour Name 		motion_det_cfg.time_t1 = apps_args[0];
6952*5113495bSYour Name 		motion_det_cfg.time_t2 = apps_args[1];
6953*5113495bSYour Name 		motion_det_cfg.n1 = apps_args[2];
6954*5113495bSYour Name 		motion_det_cfg.n2 = apps_args[3];
6955*5113495bSYour Name 		motion_det_cfg.time_t1_gap = apps_args[4];
6956*5113495bSYour Name 		motion_det_cfg.time_t2_gap = apps_args[5];
6957*5113495bSYour Name 		motion_det_cfg.coarse_K = apps_args[6];
6958*5113495bSYour Name 		motion_det_cfg.fine_K = apps_args[7];
6959*5113495bSYour Name 		motion_det_cfg.coarse_Q = apps_args[8];
6960*5113495bSYour Name 		motion_det_cfg.fine_Q = apps_args[9];
6961*5113495bSYour Name 		motion_det_cfg.md_coarse_thr_high = apps_args[10];
6962*5113495bSYour Name 		motion_det_cfg.md_fine_thr_high = apps_args[11];
6963*5113495bSYour Name 		motion_det_cfg.md_coarse_thr_low = apps_args[12];
6964*5113495bSYour Name 		motion_det_cfg.md_fine_thr_low = apps_args[13];
6965*5113495bSYour Name 		adapter->motion_detection_mode = apps_args[14];
6966*5113495bSYour Name 		sme_motion_det_config(hdd_ctx->mac_handle, &motion_det_cfg);
6967*5113495bSYour Name 		adapter->motion_det_cfg =  true;
6968*5113495bSYour Name 	}
6969*5113495bSYour Name 	break;
6970*5113495bSYour Name 	case WE_MOTION_DET_BASE_LINE_CONFIG_PARAM:
6971*5113495bSYour Name 	{
6972*5113495bSYour Name 		struct sme_motion_det_base_line_cfg motion_det_base_line_cfg;
6973*5113495bSYour Name 
6974*5113495bSYour Name 		if (num_args != 4) {
6975*5113495bSYour Name 			hdd_err_rl("mt_bl_config: Invalid no of args");
6976*5113495bSYour Name 			return -EINVAL;
6977*5113495bSYour Name 		}
6978*5113495bSYour Name 
6979*5113495bSYour Name 		motion_det_base_line_cfg.vdev_id = adapter->deflink->vdev_id;
6980*5113495bSYour Name 		motion_det_base_line_cfg.bl_time_t = apps_args[0];
6981*5113495bSYour Name 		motion_det_base_line_cfg.bl_packet_gap = apps_args[1];
6982*5113495bSYour Name 		motion_det_base_line_cfg.bl_n = apps_args[2];
6983*5113495bSYour Name 		motion_det_base_line_cfg.bl_num_meas = apps_args[3];
6984*5113495bSYour Name 		sme_motion_det_base_line_config(hdd_ctx->mac_handle,
6985*5113495bSYour Name 						&motion_det_base_line_cfg);
6986*5113495bSYour Name 	}
6987*5113495bSYour Name 	break;
6988*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
6989*5113495bSYour Name #ifdef FW_THERMAL_THROTTLE_SUPPORT
6990*5113495bSYour Name 	case WE_SET_THERMAL_THROTTLE_CFG:
6991*5113495bSYour Name 	{
6992*5113495bSYour Name 		QDF_STATUS status;
6993*5113495bSYour Name 		struct thermal_mitigation_params therm_cfg_params;
6994*5113495bSYour Name 		struct wlan_fwol_thermal_temp thermal_temp = {0};
6995*5113495bSYour Name 		if (num_args != 7) {
6996*5113495bSYour Name 			hdd_err_rl("set_thermal_cfg: Invalid no of args");
6997*5113495bSYour Name 			return -EINVAL;
6998*5113495bSYour Name 		}
6999*5113495bSYour Name 		status = ucfg_fwol_get_thermal_temp(hdd_ctx->psoc,
7000*5113495bSYour Name 						    &thermal_temp);
7001*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
7002*5113495bSYour Name 			hdd_err_rl("Failed to get fwol thermal obj");
7003*5113495bSYour Name 			return qdf_status_to_os_return(status);
7004*5113495bSYour Name 		}
7005*5113495bSYour Name 
7006*5113495bSYour Name 		/* Check for valid inputs */
7007*5113495bSYour Name 		if (apps_args[0] < 0 || apps_args[0] > 1 || apps_args[1] < 0 ||
7008*5113495bSYour Name 		    apps_args[2] < 0 || apps_args[2] > 100 ||
7009*5113495bSYour Name 		    apps_args[3] < 0 || apps_args[3] > 3 ||  apps_args[4] < 0 ||
7010*5113495bSYour Name 		    apps_args[5] < 0 || apps_args[6] < 0 ||
7011*5113495bSYour Name 		    apps_args[5] <= apps_args[4])
7012*5113495bSYour Name 			return -EINVAL;
7013*5113495bSYour Name 
7014*5113495bSYour Name 		therm_cfg_params.enable = apps_args[0];
7015*5113495bSYour Name 		therm_cfg_params.dc = apps_args[1];
7016*5113495bSYour Name 		therm_cfg_params.levelconf[0].dcoffpercent = apps_args[2];
7017*5113495bSYour Name 		therm_cfg_params.levelconf[0].priority = apps_args[3];
7018*5113495bSYour Name 		therm_cfg_params.levelconf[0].tmplwm = apps_args[6];
7019*5113495bSYour Name 		hdd_thermal_fill_clientid_priority(hdd_ctx,
7020*5113495bSYour Name 						   THERMAL_MONITOR_APPS,
7021*5113495bSYour Name 						   thermal_temp.priority_apps,
7022*5113495bSYour Name 						   thermal_temp.priority_wpps,
7023*5113495bSYour Name 						   &therm_cfg_params);
7024*5113495bSYour Name 		therm_cfg_params.num_thermal_conf = 1;
7025*5113495bSYour Name 		status = sme_set_thermal_throttle_cfg(hdd_ctx->mac_handle,
7026*5113495bSYour Name 						      &therm_cfg_params);
7027*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
7028*5113495bSYour Name 			return qdf_status_to_os_return(status);
7029*5113495bSYour Name 
7030*5113495bSYour Name 		if (!apps_args[6]) {
7031*5113495bSYour Name 			status = hdd_send_thermal_mgmt_cmd(hdd_ctx->mac_handle,
7032*5113495bSYour Name 							   apps_args[4],
7033*5113495bSYour Name 							   apps_args[5]);
7034*5113495bSYour Name 			if (QDF_IS_STATUS_ERROR(status))
7035*5113495bSYour Name 				return qdf_status_to_os_return(status);
7036*5113495bSYour Name 		}
7037*5113495bSYour Name 		break;
7038*5113495bSYour Name 	}
7039*5113495bSYour Name #endif /* FW_THERMAL_THROTTLE_SUPPORT */
7040*5113495bSYour Name 	default:
7041*5113495bSYour Name 	{
7042*5113495bSYour Name 		hdd_err("Invalid IOCTL command %d", sub_cmd);
7043*5113495bSYour Name 	}
7044*5113495bSYour Name 	break;
7045*5113495bSYour Name 	}
7046*5113495bSYour Name 	hdd_exit();
7047*5113495bSYour Name 	return 0;
7048*5113495bSYour Name }
7049*5113495bSYour Name 
7050*5113495bSYour Name /**
7051*5113495bSYour Name  * iw_hdd_set_var_ints_getnone() - set var ints getnone callback
7052*5113495bSYour Name  * @dev: pointer to net_device structure
7053*5113495bSYour Name  * @info: pointer to iw_request_info structure
7054*5113495bSYour Name  * @wrqu: pointer to iwreq_data
7055*5113495bSYour Name  * @extra: extra
7056*5113495bSYour Name  *
7057*5113495bSYour Name  * Return: 0 on success, error number otherwise
7058*5113495bSYour Name  *
7059*5113495bSYour Name  */
iw_hdd_set_var_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7060*5113495bSYour Name static int iw_hdd_set_var_ints_getnone(struct net_device *dev,
7061*5113495bSYour Name 				       struct iw_request_info *info,
7062*5113495bSYour Name 				       union iwreq_data *wrqu, char *extra)
7063*5113495bSYour Name {
7064*5113495bSYour Name 	union iwreq_data u_priv_wrqu;
7065*5113495bSYour Name 	int apps_args[MAX_VAR_ARGS] = {0};
7066*5113495bSYour Name 	int errno, num_args;
7067*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7068*5113495bSYour Name 
7069*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN)) {
7070*5113495bSYour Name 		hdd_err("permission check failed");
7071*5113495bSYour Name 		return -EPERM;
7072*5113495bSYour Name 	}
7073*5113495bSYour Name 
7074*5113495bSYour Name 	/* Helper function to get iwreq_data with compat handling. */
7075*5113495bSYour Name 	if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
7076*5113495bSYour Name 		return -EINVAL;
7077*5113495bSYour Name 
7078*5113495bSYour Name 	if (!u_priv_wrqu.data.pointer) {
7079*5113495bSYour Name 		hdd_err("NULL data pointer");
7080*5113495bSYour Name 		return -EINVAL;
7081*5113495bSYour Name 	}
7082*5113495bSYour Name 
7083*5113495bSYour Name 	num_args = u_priv_wrqu.data.length;
7084*5113495bSYour Name 	if (num_args > MAX_VAR_ARGS)
7085*5113495bSYour Name 		num_args = MAX_VAR_ARGS;
7086*5113495bSYour Name 
7087*5113495bSYour Name 	if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
7088*5113495bSYour Name 			   sizeof(int) * num_args)) {
7089*5113495bSYour Name 		hdd_err("failed to copy data from user buffer");
7090*5113495bSYour Name 		return -EFAULT;
7091*5113495bSYour Name 	}
7092*5113495bSYour Name 
7093*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7094*5113495bSYour Name 	if (errno)
7095*5113495bSYour Name 		return errno;
7096*5113495bSYour Name 
7097*5113495bSYour Name 	errno = __iw_set_var_ints_getnone(dev, info, &u_priv_wrqu,
7098*5113495bSYour Name 					  (char *)&apps_args);
7099*5113495bSYour Name 
7100*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7101*5113495bSYour Name 
7102*5113495bSYour Name 	return errno;
7103*5113495bSYour Name }
7104*5113495bSYour Name 
7105*5113495bSYour Name /**
7106*5113495bSYour Name  * iw_set_var_ints_getnone - Generic "set many" private ioctl handler
7107*5113495bSYour Name  * @dev: device upon which the ioctl was received
7108*5113495bSYour Name  * @info: ioctl request information
7109*5113495bSYour Name  * @wrqu: ioctl request data
7110*5113495bSYour Name  * @extra: ioctl extra data
7111*5113495bSYour Name  *
7112*5113495bSYour Name  * This is a generic handler for private ioctls which take multiple
7113*5113495bSYour Name  * arguments.  Note that this implementation is also somewhat unique
7114*5113495bSYour Name  * in that it is shared by both STA-mode and SAP-mode interfaces.
7115*5113495bSYour Name  *
7116*5113495bSYour Name  * Return: 0 on success, non-zero on error
7117*5113495bSYour Name  */
iw_set_var_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7118*5113495bSYour Name int iw_set_var_ints_getnone(struct net_device *dev,
7119*5113495bSYour Name 			    struct iw_request_info *info,
7120*5113495bSYour Name 			    union iwreq_data *wrqu, char *extra)
7121*5113495bSYour Name {
7122*5113495bSYour Name 	int errno;
7123*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7124*5113495bSYour Name 
7125*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7126*5113495bSYour Name 	if (errno)
7127*5113495bSYour Name 		return errno;
7128*5113495bSYour Name 
7129*5113495bSYour Name 	errno = __iw_set_var_ints_getnone(dev, info, wrqu, extra);
7130*5113495bSYour Name 
7131*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7132*5113495bSYour Name 
7133*5113495bSYour Name 	return errno;
7134*5113495bSYour Name }
7135*5113495bSYour Name 
7136*5113495bSYour Name /**
7137*5113495bSYour Name  * __iw_add_tspec - Add TSpec private ioctl handler
7138*5113495bSYour Name  * @dev: device upon which the ioctl was received
7139*5113495bSYour Name  * @info: ioctl request information
7140*5113495bSYour Name  * @wrqu: ioctl request data
7141*5113495bSYour Name  * @extra: ioctl extra data
7142*5113495bSYour Name  *
7143*5113495bSYour Name  * Return: 0 on success, non-zero on error
7144*5113495bSYour Name  */
__iw_add_tspec(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7145*5113495bSYour Name static int __iw_add_tspec(struct net_device *dev, struct iw_request_info *info,
7146*5113495bSYour Name 			  union iwreq_data *wrqu, char *extra)
7147*5113495bSYour Name {
7148*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7149*5113495bSYour Name 	hdd_wlan_wmm_status_e *wmm_status = (hdd_wlan_wmm_status_e *) extra;
7150*5113495bSYour Name 	int params[HDD_WLAN_WMM_PARAM_COUNT];
7151*5113495bSYour Name 	struct sme_qos_wmmtspecinfo tspec;
7152*5113495bSYour Name 	uint32_t handle;
7153*5113495bSYour Name 	struct iw_point s_priv_data;
7154*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7155*5113495bSYour Name 	int ret;
7156*5113495bSYour Name 
7157*5113495bSYour Name 	hdd_enter_dev(dev);
7158*5113495bSYour Name 
7159*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7160*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7161*5113495bSYour Name 	if (0 != ret)
7162*5113495bSYour Name 		return ret;
7163*5113495bSYour Name 
7164*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7165*5113495bSYour Name 	if (0 != ret)
7166*5113495bSYour Name 		return ret;
7167*5113495bSYour Name 
7168*5113495bSYour Name 	/* make sure the application is sufficiently privileged */
7169*5113495bSYour Name 	/* note that the kernel will do this for "set" ioctls, but since */
7170*5113495bSYour Name 	/* this ioctl wants to return status to user space it must be */
7171*5113495bSYour Name 	/* defined as a "get" ioctl */
7172*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN))
7173*5113495bSYour Name 		return -EPERM;
7174*5113495bSYour Name 
7175*5113495bSYour Name 	/* we must be associated in order to add a tspec */
7176*5113495bSYour Name 	if (!hdd_cm_is_vdev_associated(adapter->deflink)) {
7177*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7178*5113495bSYour Name 		return 0;
7179*5113495bSYour Name 	}
7180*5113495bSYour Name 	/* since we are defined to be a "get" ioctl, and since the number */
7181*5113495bSYour Name 	/* of params exceeds the number of params that wireless extensions */
7182*5113495bSYour Name 	/* will pass down in the iwreq_data, we must copy the "set" params. */
7183*5113495bSYour Name 	/* We must handle the compat for iwreq_data in 32U/64K environment. */
7184*5113495bSYour Name 
7185*5113495bSYour Name 	/* helper function to get iwreq_data with compat handling. */
7186*5113495bSYour Name 	if (hdd_priv_get_data(&s_priv_data, wrqu)) {
7187*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7188*5113495bSYour Name 		return 0;
7189*5113495bSYour Name 	}
7190*5113495bSYour Name 	/* make sure all params are correctly passed to function */
7191*5113495bSYour Name 	if ((!s_priv_data.pointer) ||
7192*5113495bSYour Name 	    (HDD_WLAN_WMM_PARAM_COUNT != s_priv_data.length)) {
7193*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7194*5113495bSYour Name 		return 0;
7195*5113495bSYour Name 	}
7196*5113495bSYour Name 	/* from user space ourselves */
7197*5113495bSYour Name 	if (copy_from_user(&params, s_priv_data.pointer, sizeof(params))) {
7198*5113495bSYour Name 		/* hmmm, can't get them */
7199*5113495bSYour Name 		return -EIO;
7200*5113495bSYour Name 	}
7201*5113495bSYour Name 	/* clear the tspec */
7202*5113495bSYour Name 	memset(&tspec, 0, sizeof(tspec));
7203*5113495bSYour Name 
7204*5113495bSYour Name 	/* validate the handle */
7205*5113495bSYour Name 	handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
7206*5113495bSYour Name 	if (HDD_WMM_HANDLE_IMPLICIT == handle) {
7207*5113495bSYour Name 		/* that one is reserved */
7208*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7209*5113495bSYour Name 		return 0;
7210*5113495bSYour Name 	}
7211*5113495bSYour Name 	/* validate the TID */
7212*5113495bSYour Name 	if (params[HDD_WLAN_WMM_PARAM_TID] > 7) {
7213*5113495bSYour Name 		/* out of range */
7214*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7215*5113495bSYour Name 		return 0;
7216*5113495bSYour Name 	}
7217*5113495bSYour Name 	tspec.ts_info.tid = params[HDD_WLAN_WMM_PARAM_TID];
7218*5113495bSYour Name 
7219*5113495bSYour Name 	/* validate the direction */
7220*5113495bSYour Name 	switch (params[HDD_WLAN_WMM_PARAM_DIRECTION]) {
7221*5113495bSYour Name 	case HDD_WLAN_WMM_DIRECTION_UPSTREAM:
7222*5113495bSYour Name 		tspec.ts_info.direction = SME_QOS_WMM_TS_DIR_UPLINK;
7223*5113495bSYour Name 		break;
7224*5113495bSYour Name 
7225*5113495bSYour Name 	case HDD_WLAN_WMM_DIRECTION_DOWNSTREAM:
7226*5113495bSYour Name 		tspec.ts_info.direction = SME_QOS_WMM_TS_DIR_DOWNLINK;
7227*5113495bSYour Name 		break;
7228*5113495bSYour Name 
7229*5113495bSYour Name 	case HDD_WLAN_WMM_DIRECTION_BIDIRECTIONAL:
7230*5113495bSYour Name 		tspec.ts_info.direction = SME_QOS_WMM_TS_DIR_BOTH;
7231*5113495bSYour Name 		break;
7232*5113495bSYour Name 
7233*5113495bSYour Name 	default:
7234*5113495bSYour Name 		/* unknown */
7235*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7236*5113495bSYour Name 		return 0;
7237*5113495bSYour Name 	}
7238*5113495bSYour Name 
7239*5113495bSYour Name 	tspec.ts_info.psb = params[HDD_WLAN_WMM_PARAM_APSD];
7240*5113495bSYour Name 
7241*5113495bSYour Name 	/* validate the user priority */
7242*5113495bSYour Name 	if (params[HDD_WLAN_WMM_PARAM_USER_PRIORITY] >= SME_QOS_WMM_UP_MAX) {
7243*5113495bSYour Name 		/* out of range */
7244*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7245*5113495bSYour Name 		return 0;
7246*5113495bSYour Name 	}
7247*5113495bSYour Name 	tspec.ts_info.up = params[HDD_WLAN_WMM_PARAM_USER_PRIORITY];
7248*5113495bSYour Name 	if (0 > tspec.ts_info.up || SME_QOS_WMM_UP_MAX < tspec.ts_info.up) {
7249*5113495bSYour Name 		hdd_err("***ts_info.up out of bounds***");
7250*5113495bSYour Name 		return 0;
7251*5113495bSYour Name 	}
7252*5113495bSYour Name 
7253*5113495bSYour Name 	hdd_debug("TS_INFO PSB %d UP %d !!!",
7254*5113495bSYour Name 		  tspec.ts_info.psb, tspec.ts_info.up);
7255*5113495bSYour Name 
7256*5113495bSYour Name 	tspec.nominal_msdu_size = params[HDD_WLAN_WMM_PARAM_NOMINAL_MSDU_SIZE];
7257*5113495bSYour Name 	tspec.maximum_msdu_size = params[HDD_WLAN_WMM_PARAM_MAXIMUM_MSDU_SIZE];
7258*5113495bSYour Name 	tspec.min_data_rate = params[HDD_WLAN_WMM_PARAM_MINIMUM_DATA_RATE];
7259*5113495bSYour Name 	tspec.mean_data_rate = params[HDD_WLAN_WMM_PARAM_MEAN_DATA_RATE];
7260*5113495bSYour Name 	tspec.peak_data_rate = params[HDD_WLAN_WMM_PARAM_PEAK_DATA_RATE];
7261*5113495bSYour Name 	tspec.max_burst_size = params[HDD_WLAN_WMM_PARAM_MAX_BURST_SIZE];
7262*5113495bSYour Name 	tspec.min_phy_rate = params[HDD_WLAN_WMM_PARAM_MINIMUM_PHY_RATE];
7263*5113495bSYour Name 	tspec.surplus_bw_allowance =
7264*5113495bSYour Name 		params[HDD_WLAN_WMM_PARAM_SURPLUS_BANDWIDTH_ALLOWANCE];
7265*5113495bSYour Name 	tspec.min_service_interval =
7266*5113495bSYour Name 		params[HDD_WLAN_WMM_PARAM_SERVICE_INTERVAL];
7267*5113495bSYour Name 	tspec.max_service_interval =
7268*5113495bSYour Name 		params[HDD_WLAN_WMM_PARAM_MAX_SERVICE_INTERVAL];
7269*5113495bSYour Name 	tspec.suspension_interval =
7270*5113495bSYour Name 		params[HDD_WLAN_WMM_PARAM_SUSPENSION_INTERVAL];
7271*5113495bSYour Name 	tspec.inactivity_interval =
7272*5113495bSYour Name 		params[HDD_WLAN_WMM_PARAM_INACTIVITY_INTERVAL];
7273*5113495bSYour Name 
7274*5113495bSYour Name 	tspec.ts_info.burst_size_defn =
7275*5113495bSYour Name 		params[HDD_WLAN_WMM_PARAM_BURST_SIZE_DEFN];
7276*5113495bSYour Name 
7277*5113495bSYour Name 	/* validate the ts info ack policy */
7278*5113495bSYour Name 	switch (params[HDD_WLAN_WMM_PARAM_ACK_POLICY]) {
7279*5113495bSYour Name 	case TS_INFO_ACK_POLICY_NORMAL_ACK:
7280*5113495bSYour Name 		tspec.ts_info.ack_policy = SME_QOS_WMM_TS_ACK_POLICY_NORMAL_ACK;
7281*5113495bSYour Name 		break;
7282*5113495bSYour Name 
7283*5113495bSYour Name 	case TS_INFO_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK:
7284*5113495bSYour Name 		tspec.ts_info.ack_policy =
7285*5113495bSYour Name 			SME_QOS_WMM_TS_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK;
7286*5113495bSYour Name 		break;
7287*5113495bSYour Name 
7288*5113495bSYour Name 	default:
7289*5113495bSYour Name 		/* unknown */
7290*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7291*5113495bSYour Name 		return 0;
7292*5113495bSYour Name 	}
7293*5113495bSYour Name 
7294*5113495bSYour Name 	*wmm_status = hdd_wmm_addts(adapter, handle, &tspec);
7295*5113495bSYour Name 	hdd_exit();
7296*5113495bSYour Name 	return 0;
7297*5113495bSYour Name }
7298*5113495bSYour Name 
7299*5113495bSYour Name /**
7300*5113495bSYour Name  * iw_add_tspec - Add TSpec private ioctl handler
7301*5113495bSYour Name  * @dev: device upon which the ioctl was received
7302*5113495bSYour Name  * @info: ioctl request information
7303*5113495bSYour Name  * @wrqu: ioctl request data
7304*5113495bSYour Name  * @extra: ioctl extra data
7305*5113495bSYour Name  *
7306*5113495bSYour Name  * Return: 0 on success, non-zero on error
7307*5113495bSYour Name  */
iw_add_tspec(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7308*5113495bSYour Name static int iw_add_tspec(struct net_device *dev,
7309*5113495bSYour Name 			struct iw_request_info *info,
7310*5113495bSYour Name 			union iwreq_data *wrqu, char *extra)
7311*5113495bSYour Name {
7312*5113495bSYour Name 	int errno;
7313*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7314*5113495bSYour Name 
7315*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7316*5113495bSYour Name 	if (errno)
7317*5113495bSYour Name 		return errno;
7318*5113495bSYour Name 
7319*5113495bSYour Name 	errno = __iw_add_tspec(dev, info, wrqu, extra);
7320*5113495bSYour Name 
7321*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7322*5113495bSYour Name 
7323*5113495bSYour Name 	return errno;
7324*5113495bSYour Name }
7325*5113495bSYour Name 
7326*5113495bSYour Name /**
7327*5113495bSYour Name  * __iw_del_tspec - Delete TSpec private ioctl handler
7328*5113495bSYour Name  * @dev: device upon which the ioctl was received
7329*5113495bSYour Name  * @info: ioctl request information
7330*5113495bSYour Name  * @wrqu: ioctl request data
7331*5113495bSYour Name  * @extra: ioctl extra data
7332*5113495bSYour Name  *
7333*5113495bSYour Name  * Return: 0 on success, non-zero on error
7334*5113495bSYour Name  */
__iw_del_tspec(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7335*5113495bSYour Name static int __iw_del_tspec(struct net_device *dev, struct iw_request_info *info,
7336*5113495bSYour Name 			  union iwreq_data *wrqu, char *extra)
7337*5113495bSYour Name {
7338*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7339*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7340*5113495bSYour Name 	int *params = (int *)extra;
7341*5113495bSYour Name 	hdd_wlan_wmm_status_e *wmm_status = (hdd_wlan_wmm_status_e *) extra;
7342*5113495bSYour Name 	uint32_t handle;
7343*5113495bSYour Name 	int ret;
7344*5113495bSYour Name 
7345*5113495bSYour Name 	hdd_enter_dev(dev);
7346*5113495bSYour Name 
7347*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7348*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7349*5113495bSYour Name 	if (0 != ret)
7350*5113495bSYour Name 		return ret;
7351*5113495bSYour Name 
7352*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7353*5113495bSYour Name 	if (0 != ret)
7354*5113495bSYour Name 		return ret;
7355*5113495bSYour Name 
7356*5113495bSYour Name 	/* make sure the application is sufficiently privileged */
7357*5113495bSYour Name 	/* note that the kernel will do this for "set" ioctls, but since */
7358*5113495bSYour Name 	/* this ioctl wants to return status to user space it must be */
7359*5113495bSYour Name 	/* defined as a "get" ioctl */
7360*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN))
7361*5113495bSYour Name 		return -EPERM;
7362*5113495bSYour Name 
7363*5113495bSYour Name 	/* although we are defined to be a "get" ioctl, the params we require */
7364*5113495bSYour Name 	/* will fit in the iwreq_data, therefore unlike iw_add_tspec() there */
7365*5113495bSYour Name 	/* is no need to copy the params from user space */
7366*5113495bSYour Name 
7367*5113495bSYour Name 	/* validate the handle */
7368*5113495bSYour Name 	handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
7369*5113495bSYour Name 	if (HDD_WMM_HANDLE_IMPLICIT == handle) {
7370*5113495bSYour Name 		/* that one is reserved */
7371*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7372*5113495bSYour Name 		return 0;
7373*5113495bSYour Name 	}
7374*5113495bSYour Name 
7375*5113495bSYour Name 	*wmm_status = hdd_wmm_delts(adapter, handle);
7376*5113495bSYour Name 	hdd_exit();
7377*5113495bSYour Name 	return 0;
7378*5113495bSYour Name }
7379*5113495bSYour Name 
7380*5113495bSYour Name /**
7381*5113495bSYour Name  * iw_del_tspec - Delete TSpec private ioctl handler
7382*5113495bSYour Name  * @dev: device upon which the ioctl was received
7383*5113495bSYour Name  * @info: ioctl request information
7384*5113495bSYour Name  * @wrqu: ioctl request data
7385*5113495bSYour Name  * @extra: ioctl extra data
7386*5113495bSYour Name  *
7387*5113495bSYour Name  * Return: 0 on success, non-zero on error
7388*5113495bSYour Name  */
iw_del_tspec(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7389*5113495bSYour Name static int iw_del_tspec(struct net_device *dev,
7390*5113495bSYour Name 			struct iw_request_info *info,
7391*5113495bSYour Name 			union iwreq_data *wrqu, char *extra)
7392*5113495bSYour Name {
7393*5113495bSYour Name 	int errno;
7394*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7395*5113495bSYour Name 
7396*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7397*5113495bSYour Name 	if (errno)
7398*5113495bSYour Name 		return errno;
7399*5113495bSYour Name 
7400*5113495bSYour Name 	errno = __iw_del_tspec(dev, info, wrqu, extra);
7401*5113495bSYour Name 
7402*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7403*5113495bSYour Name 
7404*5113495bSYour Name 	return errno;
7405*5113495bSYour Name }
7406*5113495bSYour Name 
7407*5113495bSYour Name /**
7408*5113495bSYour Name  * __iw_get_tspec - Get TSpec private ioctl handler
7409*5113495bSYour Name  * @dev: device upon which the ioctl was received
7410*5113495bSYour Name  * @info: ioctl request information
7411*5113495bSYour Name  * @wrqu: ioctl request data
7412*5113495bSYour Name  * @extra: ioctl extra data
7413*5113495bSYour Name  *
7414*5113495bSYour Name  * Return: 0 on success, non-zero on error
7415*5113495bSYour Name  */
__iw_get_tspec(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7416*5113495bSYour Name static int __iw_get_tspec(struct net_device *dev, struct iw_request_info *info,
7417*5113495bSYour Name 			  union iwreq_data *wrqu, char *extra)
7418*5113495bSYour Name {
7419*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7420*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7421*5113495bSYour Name 	int *params = (int *)extra;
7422*5113495bSYour Name 	hdd_wlan_wmm_status_e *wmm_status = (hdd_wlan_wmm_status_e *) extra;
7423*5113495bSYour Name 	uint32_t handle;
7424*5113495bSYour Name 	int ret;
7425*5113495bSYour Name 
7426*5113495bSYour Name 	hdd_enter_dev(dev);
7427*5113495bSYour Name 
7428*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7429*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7430*5113495bSYour Name 	if (0 != ret)
7431*5113495bSYour Name 		return ret;
7432*5113495bSYour Name 
7433*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7434*5113495bSYour Name 	if (0 != ret)
7435*5113495bSYour Name 		return ret;
7436*5113495bSYour Name 
7437*5113495bSYour Name 	/* although we are defined to be a "get" ioctl, the params we require */
7438*5113495bSYour Name 	/* will fit in the iwreq_data, therefore unlike iw_add_tspec() there */
7439*5113495bSYour Name 	/* is no need to copy the params from user space */
7440*5113495bSYour Name 
7441*5113495bSYour Name 	/* validate the handle */
7442*5113495bSYour Name 	handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
7443*5113495bSYour Name 	if (HDD_WMM_HANDLE_IMPLICIT == handle) {
7444*5113495bSYour Name 		/* that one is reserved */
7445*5113495bSYour Name 		*wmm_status = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
7446*5113495bSYour Name 		return 0;
7447*5113495bSYour Name 	}
7448*5113495bSYour Name 
7449*5113495bSYour Name 	*wmm_status = hdd_wmm_checkts(adapter, handle);
7450*5113495bSYour Name 	hdd_exit();
7451*5113495bSYour Name 	return 0;
7452*5113495bSYour Name }
7453*5113495bSYour Name 
7454*5113495bSYour Name /**
7455*5113495bSYour Name  * iw_get_tspec - Get TSpec private ioctl handler
7456*5113495bSYour Name  * @dev: device upon which the ioctl was received
7457*5113495bSYour Name  * @info: ioctl request information
7458*5113495bSYour Name  * @wrqu: ioctl request data
7459*5113495bSYour Name  * @extra: ioctl extra data
7460*5113495bSYour Name  *
7461*5113495bSYour Name  * Return: 0 on success, non-zero on error
7462*5113495bSYour Name  */
iw_get_tspec(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7463*5113495bSYour Name static int iw_get_tspec(struct net_device *dev,
7464*5113495bSYour Name 			struct iw_request_info *info,
7465*5113495bSYour Name 			union iwreq_data *wrqu, char *extra)
7466*5113495bSYour Name {
7467*5113495bSYour Name 	int errno;
7468*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7469*5113495bSYour Name 
7470*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7471*5113495bSYour Name 	if (errno)
7472*5113495bSYour Name 		return errno;
7473*5113495bSYour Name 
7474*5113495bSYour Name 	errno = __iw_get_tspec(dev, info, wrqu, extra);
7475*5113495bSYour Name 
7476*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7477*5113495bSYour Name 
7478*5113495bSYour Name 	return errno;
7479*5113495bSYour Name }
7480*5113495bSYour Name 
7481*5113495bSYour Name /**
7482*5113495bSYour Name  * __iw_set_fties - Set FT IEs private ioctl handler
7483*5113495bSYour Name  * @dev: device upon which the ioctl was received
7484*5113495bSYour Name  * @info: ioctl request information
7485*5113495bSYour Name  * @wrqu: ioctl request data
7486*5113495bSYour Name  * @extra: ioctl extra data
7487*5113495bSYour Name  *
7488*5113495bSYour Name  * Each time the supplicant has the auth_request or reassoc request
7489*5113495bSYour Name  * IEs ready they are pushed to the driver. The driver will in turn
7490*5113495bSYour Name  * use it to send out the auth req and reassoc req for 11r FT Assoc.
7491*5113495bSYour Name  *
7492*5113495bSYour Name  * Return: 0 on success, non-zero on error
7493*5113495bSYour Name  */
__iw_set_fties(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7494*5113495bSYour Name static int __iw_set_fties(struct net_device *dev, struct iw_request_info *info,
7495*5113495bSYour Name 			  union iwreq_data *wrqu, char *extra)
7496*5113495bSYour Name {
7497*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7498*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7499*5113495bSYour Name 	int ret;
7500*5113495bSYour Name 
7501*5113495bSYour Name 	hdd_enter_dev(dev);
7502*5113495bSYour Name 
7503*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7504*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7505*5113495bSYour Name 	if (0 != ret)
7506*5113495bSYour Name 		return ret;
7507*5113495bSYour Name 
7508*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7509*5113495bSYour Name 	if (0 != ret)
7510*5113495bSYour Name 		return ret;
7511*5113495bSYour Name 
7512*5113495bSYour Name 	if (!wrqu->data.length) {
7513*5113495bSYour Name 		hdd_err("called with 0 length IEs");
7514*5113495bSYour Name 		return -EINVAL;
7515*5113495bSYour Name 	}
7516*5113495bSYour Name 	if (!wrqu->data.pointer) {
7517*5113495bSYour Name 		hdd_err("called with NULL IE");
7518*5113495bSYour Name 		return -EINVAL;
7519*5113495bSYour Name 	}
7520*5113495bSYour Name 	/* Added for debug on reception of Re-assoc Req. */
7521*5113495bSYour Name 	if (!hdd_cm_is_vdev_associated(adapter->deflink)) {
7522*5113495bSYour Name 		hdd_debug("Called with Ie of length = %d when not associated",
7523*5113495bSYour Name 		       wrqu->data.length);
7524*5113495bSYour Name 		hdd_debug("Should be Re-assoc Req IEs");
7525*5113495bSYour Name 	}
7526*5113495bSYour Name 	hdd_debug("called with Ie of length = %d", wrqu->data.length);
7527*5113495bSYour Name 
7528*5113495bSYour Name 	/* Pass the received FT IEs to SME */
7529*5113495bSYour Name 	ucfg_cm_set_ft_ies(hdd_ctx->pdev, adapter->deflink->vdev_id,
7530*5113495bSYour Name 			   extra, wrqu->data.length);
7531*5113495bSYour Name 	hdd_exit();
7532*5113495bSYour Name 	return 0;
7533*5113495bSYour Name }
7534*5113495bSYour Name 
7535*5113495bSYour Name /**
7536*5113495bSYour Name  * iw_set_fties - Set FT IEs private ioctl handler
7537*5113495bSYour Name  * @dev: device upon which the ioctl was received
7538*5113495bSYour Name  * @info: ioctl request information
7539*5113495bSYour Name  * @wrqu: ioctl request data
7540*5113495bSYour Name  * @extra: ioctl extra data
7541*5113495bSYour Name  *
7542*5113495bSYour Name  * Each time the supplicant has the auth_request or reassoc request
7543*5113495bSYour Name  * IEs ready they are pushed to the driver. The driver will in turn
7544*5113495bSYour Name  * use it to send out the auth req and reassoc req for 11r FT Assoc.
7545*5113495bSYour Name  *
7546*5113495bSYour Name  * Return: 0 on success, non-zero on error
7547*5113495bSYour Name  */
iw_set_fties(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7548*5113495bSYour Name static int iw_set_fties(struct net_device *dev,
7549*5113495bSYour Name 			struct iw_request_info *info,
7550*5113495bSYour Name 			union iwreq_data *wrqu, char *extra)
7551*5113495bSYour Name {
7552*5113495bSYour Name 	int errno;
7553*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7554*5113495bSYour Name 
7555*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7556*5113495bSYour Name 	if (errno)
7557*5113495bSYour Name 		return errno;
7558*5113495bSYour Name 
7559*5113495bSYour Name 	errno = __iw_set_fties(dev, info, wrqu, extra);
7560*5113495bSYour Name 
7561*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7562*5113495bSYour Name 
7563*5113495bSYour Name 	return errno;
7564*5113495bSYour Name }
7565*5113495bSYour Name 
7566*5113495bSYour Name /**
7567*5113495bSYour Name  * iw_set_dynamic_mcbc_filter() - Set Dynamic MCBC Filter ioctl handler
7568*5113495bSYour Name  * @dev: device upon which the ioctl was received
7569*5113495bSYour Name  * @info: ioctl request information
7570*5113495bSYour Name  * @wrqu: ioctl request data
7571*5113495bSYour Name  * @extra: ioctl extra data
7572*5113495bSYour Name  *
7573*5113495bSYour Name  * This IOCTL is OBSOLETE as of Jan 30, 2017. We are leaving it here for the
7574*5113495bSYour Name  * time being to provide guidance in migrating to standard APIs.
7575*5113495bSYour Name  *
7576*5113495bSYour Name  * Return: 0 on success, non-zero on error
7577*5113495bSYour Name  */
iw_set_dynamic_mcbc_filter(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7578*5113495bSYour Name static int iw_set_dynamic_mcbc_filter(struct net_device *dev,
7579*5113495bSYour Name 				      struct iw_request_info *info,
7580*5113495bSYour Name 				      union iwreq_data *wrqu,
7581*5113495bSYour Name 				      char *extra)
7582*5113495bSYour Name {
7583*5113495bSYour Name 	hdd_err("\n"
7584*5113495bSYour Name 		"setMCBCFilter is obsolete. Use the following instead:\n"
7585*5113495bSYour Name 		"Configure multicast filtering via the ‘ip’ command.\n"
7586*5113495bSYour Name 		"\tip maddr add 11:22:33:44:55:66 dev wlan0 # allow traffic to address\n"
7587*5113495bSYour Name 		"\tip maddr del 11:22:33:44:55:66 dev wlan0 # undo allow\n"
7588*5113495bSYour Name 		"Configure broadcast filtering via ini item, 'g_enable_non_arp_bc_hw_filter.'\n"
7589*5113495bSYour Name 		"\tg_enable_non_arp_bc_hw_filter=1 # drop all non-ARP broadcast traffic\n"
7590*5113495bSYour Name 		"\tg_enable_non_arp_bc_hw_filter=0 # allow all broadcast traffic");
7591*5113495bSYour Name 	return -EINVAL;
7592*5113495bSYour Name }
7593*5113495bSYour Name 
7594*5113495bSYour Name /**
7595*5113495bSYour Name  * __iw_set_host_offload - Set host offload ioctl handler
7596*5113495bSYour Name  * @dev: device upon which the ioctl was received
7597*5113495bSYour Name  * @info: ioctl request information
7598*5113495bSYour Name  * @wrqu: ioctl request data
7599*5113495bSYour Name  * @extra: ioctl extra data
7600*5113495bSYour Name  *
7601*5113495bSYour Name  * Return: 0 on success, non-zero on error
7602*5113495bSYour Name  */
__iw_set_host_offload(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7603*5113495bSYour Name static int __iw_set_host_offload(struct net_device *dev,
7604*5113495bSYour Name 				 struct iw_request_info *info,
7605*5113495bSYour Name 				 union iwreq_data *wrqu, char *extra)
7606*5113495bSYour Name {
7607*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7608*5113495bSYour Name 	struct host_offload_req *user_request =
7609*5113495bSYour Name 					(struct host_offload_req *) extra;
7610*5113495bSYour Name 	struct sir_host_offload_req offload_request;
7611*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7612*5113495bSYour Name 	int ret;
7613*5113495bSYour Name 
7614*5113495bSYour Name 	hdd_enter_dev(dev);
7615*5113495bSYour Name 
7616*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7617*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7618*5113495bSYour Name 	if (0 != ret)
7619*5113495bSYour Name 		return ret;
7620*5113495bSYour Name 
7621*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7622*5113495bSYour Name 	if (0 != ret)
7623*5113495bSYour Name 		return ret;
7624*5113495bSYour Name 
7625*5113495bSYour Name 	if (!hdd_cm_is_vdev_associated(adapter->deflink)) {
7626*5113495bSYour Name 		hdd_err("dev is not in CONNECTED state, ignore!!!");
7627*5113495bSYour Name 		return -EINVAL;
7628*5113495bSYour Name 	}
7629*5113495bSYour Name 
7630*5113495bSYour Name 	/* Debug display of request components. */
7631*5113495bSYour Name 	switch (user_request->offloadType) {
7632*5113495bSYour Name 	case WLAN_IPV4_ARP_REPLY_OFFLOAD:
7633*5113495bSYour Name 		hdd_debug("Host offload request: ARP reply");
7634*5113495bSYour Name 		switch (user_request->enableOrDisable) {
7635*5113495bSYour Name 		case WLAN_OFFLOAD_DISABLE:
7636*5113495bSYour Name 			hdd_debug("   disable");
7637*5113495bSYour Name 			break;
7638*5113495bSYour Name 		case WLAN_OFFLOAD_ARP_AND_BC_FILTER_ENABLE:
7639*5113495bSYour Name 			hdd_debug("   BC Filtering enable");
7640*5113495bSYour Name 			fallthrough;
7641*5113495bSYour Name 		case WLAN_OFFLOAD_ENABLE:
7642*5113495bSYour Name 			hdd_debug("   ARP offload enable");
7643*5113495bSYour Name 			hdd_debug("   IP address: %pI4",
7644*5113495bSYour Name 				  user_request->params.hostIpv4Addr);
7645*5113495bSYour Name 		}
7646*5113495bSYour Name 		break;
7647*5113495bSYour Name 
7648*5113495bSYour Name 	case WLAN_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
7649*5113495bSYour Name 		hdd_debug("Host offload request: neighbor discovery");
7650*5113495bSYour Name 		switch (user_request->enableOrDisable) {
7651*5113495bSYour Name 		case WLAN_OFFLOAD_DISABLE:
7652*5113495bSYour Name 			hdd_debug("   disable");
7653*5113495bSYour Name 			break;
7654*5113495bSYour Name 		case WLAN_OFFLOAD_ENABLE:
7655*5113495bSYour Name 			hdd_debug("   enable");
7656*5113495bSYour Name 			hdd_debug("   IP address: %pI6c",
7657*5113495bSYour Name 				  user_request->params.hostIpv6Addr);
7658*5113495bSYour Name 		}
7659*5113495bSYour Name 	}
7660*5113495bSYour Name 
7661*5113495bSYour Name 	qdf_mem_zero(&offload_request, sizeof(offload_request));
7662*5113495bSYour Name 	offload_request.offloadType = user_request->offloadType;
7663*5113495bSYour Name 	offload_request.enableOrDisable = user_request->enableOrDisable;
7664*5113495bSYour Name 	qdf_mem_copy(&offload_request.params, &user_request->params,
7665*5113495bSYour Name 		     sizeof(user_request->params));
7666*5113495bSYour Name 	qdf_mem_copy(&offload_request.bssid, &user_request->bssId.bytes,
7667*5113495bSYour Name 		     QDF_MAC_ADDR_SIZE);
7668*5113495bSYour Name 
7669*5113495bSYour Name 	if (QDF_STATUS_SUCCESS !=
7670*5113495bSYour Name 	    sme_set_host_offload(hdd_ctx->mac_handle,
7671*5113495bSYour Name 				 adapter->deflink->vdev_id, &offload_request)) {
7672*5113495bSYour Name 		hdd_err("Failure to execute host offload request");
7673*5113495bSYour Name 		return -EINVAL;
7674*5113495bSYour Name 	}
7675*5113495bSYour Name 	hdd_exit();
7676*5113495bSYour Name 	return 0;
7677*5113495bSYour Name }
7678*5113495bSYour Name 
7679*5113495bSYour Name /**
7680*5113495bSYour Name  * iw_set_host_offload - Set host offload ioctl handler
7681*5113495bSYour Name  * @dev: device upon which the ioctl was received
7682*5113495bSYour Name  * @info: ioctl request information
7683*5113495bSYour Name  * @wrqu: ioctl request data
7684*5113495bSYour Name  * @extra: ioctl extra data
7685*5113495bSYour Name  *
7686*5113495bSYour Name  * Return: 0 on success, non-zero on error
7687*5113495bSYour Name  */
iw_set_host_offload(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7688*5113495bSYour Name static int iw_set_host_offload(struct net_device *dev,
7689*5113495bSYour Name 			       struct iw_request_info *info,
7690*5113495bSYour Name 			       union iwreq_data *wrqu, char *extra)
7691*5113495bSYour Name {
7692*5113495bSYour Name 	int errno;
7693*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7694*5113495bSYour Name 
7695*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7696*5113495bSYour Name 	if (errno)
7697*5113495bSYour Name 		return errno;
7698*5113495bSYour Name 
7699*5113495bSYour Name 	errno = __iw_set_host_offload(dev, info, wrqu, extra);
7700*5113495bSYour Name 
7701*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7702*5113495bSYour Name 
7703*5113495bSYour Name 	return errno;
7704*5113495bSYour Name }
7705*5113495bSYour Name 
7706*5113495bSYour Name /**
7707*5113495bSYour Name  * __iw_set_keepalive_params - Set keepalive params ioctl handler
7708*5113495bSYour Name  * @dev: device upon which the ioctl was received
7709*5113495bSYour Name  * @info: ioctl request information
7710*5113495bSYour Name  * @wrqu: ioctl request data
7711*5113495bSYour Name  * @extra: ioctl extra data
7712*5113495bSYour Name  *
7713*5113495bSYour Name  * Return: 0 on success, non-zero on error
7714*5113495bSYour Name  */
__iw_set_keepalive_params(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7715*5113495bSYour Name static int __iw_set_keepalive_params(struct net_device *dev,
7716*5113495bSYour Name 				     struct iw_request_info *info,
7717*5113495bSYour Name 				     union iwreq_data *wrqu, char *extra)
7718*5113495bSYour Name {
7719*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7720*5113495bSYour Name 	struct keep_alive_req *request = (struct keep_alive_req *)extra;
7721*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7722*5113495bSYour Name 	int ret;
7723*5113495bSYour Name 
7724*5113495bSYour Name 	hdd_enter_dev(dev);
7725*5113495bSYour Name 
7726*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7727*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7728*5113495bSYour Name 	if (0 != ret)
7729*5113495bSYour Name 		return ret;
7730*5113495bSYour Name 
7731*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7732*5113495bSYour Name 	if (0 != ret)
7733*5113495bSYour Name 		return ret;
7734*5113495bSYour Name 
7735*5113495bSYour Name 	if (wrqu->data.length != sizeof(*request)) {
7736*5113495bSYour Name 		hdd_err("Invalid length %d", wrqu->data.length);
7737*5113495bSYour Name 		return -EINVAL;
7738*5113495bSYour Name 	}
7739*5113495bSYour Name 
7740*5113495bSYour Name 	if (request->timePeriod > cfg_max(CFG_INFRA_STA_KEEP_ALIVE_PERIOD)) {
7741*5113495bSYour Name 		hdd_err("Value of timePeriod %d exceed Max limit %d",
7742*5113495bSYour Name 			request->timePeriod,
7743*5113495bSYour Name 			cfg_max(CFG_INFRA_STA_KEEP_ALIVE_PERIOD));
7744*5113495bSYour Name 		return -EINVAL;
7745*5113495bSYour Name 	}
7746*5113495bSYour Name 
7747*5113495bSYour Name 	/* Debug display of request components. */
7748*5113495bSYour Name 	hdd_debug("Set Keep Alive Request : TimePeriod %d size %zu",
7749*5113495bSYour Name 		request->timePeriod, sizeof(struct keep_alive_req));
7750*5113495bSYour Name 
7751*5113495bSYour Name 	switch (request->packetType) {
7752*5113495bSYour Name 	case WLAN_KEEP_ALIVE_NULL_PKT:
7753*5113495bSYour Name 		hdd_debug("Keep Alive Request: Tx NULL");
7754*5113495bSYour Name 		break;
7755*5113495bSYour Name 
7756*5113495bSYour Name 	case WLAN_KEEP_ALIVE_UNSOLICIT_ARP_RSP:
7757*5113495bSYour Name 		hdd_debug("Keep Alive Request: Tx UnSolicited ARP RSP");
7758*5113495bSYour Name 
7759*5113495bSYour Name 		hdd_debug("Host IP address: %d.%d.%d.%d",
7760*5113495bSYour Name 		       request->hostIpv4Addr[0], request->hostIpv4Addr[1],
7761*5113495bSYour Name 		       request->hostIpv4Addr[2], request->hostIpv4Addr[3]);
7762*5113495bSYour Name 
7763*5113495bSYour Name 		hdd_debug("Dest IP address: %d.%d.%d.%d",
7764*5113495bSYour Name 		       request->destIpv4Addr[0], request->destIpv4Addr[1],
7765*5113495bSYour Name 		       request->destIpv4Addr[2], request->destIpv4Addr[3]);
7766*5113495bSYour Name 
7767*5113495bSYour Name 		hdd_debug("Dest MAC address: "QDF_MAC_ADDR_FMT,
7768*5113495bSYour Name 		       QDF_MAC_ADDR_REF(request->dest_macaddr.bytes));
7769*5113495bSYour Name 		break;
7770*5113495bSYour Name 	}
7771*5113495bSYour Name 
7772*5113495bSYour Name 	hdd_debug("Keep alive period  %d", request->timePeriod);
7773*5113495bSYour Name 
7774*5113495bSYour Name 	if (QDF_STATUS_SUCCESS !=
7775*5113495bSYour Name 	    sme_set_keep_alive(hdd_ctx->mac_handle,
7776*5113495bSYour Name 			       adapter->deflink->vdev_id, request)) {
7777*5113495bSYour Name 		hdd_err("Failure to execute Keep Alive");
7778*5113495bSYour Name 		return -EINVAL;
7779*5113495bSYour Name 	}
7780*5113495bSYour Name 	hdd_exit();
7781*5113495bSYour Name 	return 0;
7782*5113495bSYour Name }
7783*5113495bSYour Name 
7784*5113495bSYour Name /**
7785*5113495bSYour Name  * iw_set_keepalive_params - Set keepalive params ioctl handler
7786*5113495bSYour Name  * @dev: device upon which the ioctl was received
7787*5113495bSYour Name  * @info: ioctl request information
7788*5113495bSYour Name  * @wrqu: ioctl request data
7789*5113495bSYour Name  * @extra: ioctl extra data
7790*5113495bSYour Name  *
7791*5113495bSYour Name  * Return: 0 on success, non-zero on error
7792*5113495bSYour Name  */
iw_set_keepalive_params(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7793*5113495bSYour Name static int iw_set_keepalive_params(struct net_device *dev,
7794*5113495bSYour Name 				   struct iw_request_info *info,
7795*5113495bSYour Name 				   union iwreq_data *wrqu,
7796*5113495bSYour Name 				   char *extra)
7797*5113495bSYour Name {
7798*5113495bSYour Name 	int errno;
7799*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7800*5113495bSYour Name 
7801*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7802*5113495bSYour Name 	if (errno)
7803*5113495bSYour Name 		return errno;
7804*5113495bSYour Name 
7805*5113495bSYour Name 	errno = __iw_set_keepalive_params(dev, info, wrqu, extra);
7806*5113495bSYour Name 
7807*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7808*5113495bSYour Name 
7809*5113495bSYour Name 	return errno;
7810*5113495bSYour Name }
7811*5113495bSYour Name 
7812*5113495bSYour Name #ifdef WLAN_FEATURE_PACKET_FILTERING
7813*5113495bSYour Name /**
7814*5113495bSYour Name  * validate_packet_filter_params_size() - Validate the size of the params rcvd
7815*5113495bSYour Name  * @request: Pointer to the struct containing the copied data from user space
7816*5113495bSYour Name  * @length: length of the request
7817*5113495bSYour Name  *
7818*5113495bSYour Name  * Return: False on invalid length, true otherwise
7819*5113495bSYour Name  */
validate_packet_filter_params_size(struct pkt_filter_cfg * request,uint16_t length)7820*5113495bSYour Name static bool validate_packet_filter_params_size(struct pkt_filter_cfg *request,
7821*5113495bSYour Name 					       uint16_t length)
7822*5113495bSYour Name {
7823*5113495bSYour Name 	int max_params_size, rcvd_params_size;
7824*5113495bSYour Name 
7825*5113495bSYour Name 	max_params_size = HDD_MAX_CMP_PER_PACKET_FILTER *
7826*5113495bSYour Name 					sizeof(struct pkt_filter_param_cfg);
7827*5113495bSYour Name 
7828*5113495bSYour Name 	if (length < sizeof(struct pkt_filter_cfg) - max_params_size) {
7829*5113495bSYour Name 		hdd_err("Less than minimum number of arguments needed");
7830*5113495bSYour Name 		return false;
7831*5113495bSYour Name 	}
7832*5113495bSYour Name 
7833*5113495bSYour Name 	rcvd_params_size = request->num_params *
7834*5113495bSYour Name 					sizeof(struct pkt_filter_param_cfg);
7835*5113495bSYour Name 
7836*5113495bSYour Name 	if (length != sizeof(struct pkt_filter_cfg) -
7837*5113495bSYour Name 					max_params_size + rcvd_params_size) {
7838*5113495bSYour Name 		hdd_err("Arguments do not match the number of params provided");
7839*5113495bSYour Name 		return false;
7840*5113495bSYour Name 	}
7841*5113495bSYour Name 
7842*5113495bSYour Name 	return true;
7843*5113495bSYour Name }
7844*5113495bSYour Name 
7845*5113495bSYour Name /**
7846*5113495bSYour Name  * __iw_set_packet_filter_params() - set packet filter parameters in target
7847*5113495bSYour Name  * @dev: Pointer to netdev
7848*5113495bSYour Name  * @info: Pointer to iw request info
7849*5113495bSYour Name  * @wrqu: Pointer to data
7850*5113495bSYour Name  * @extra: Pointer to extra data
7851*5113495bSYour Name  *
7852*5113495bSYour Name  * Return: 0 on success, non-zero on error
7853*5113495bSYour Name  */
__iw_set_packet_filter_params(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7854*5113495bSYour Name static int __iw_set_packet_filter_params(struct net_device *dev,
7855*5113495bSYour Name 				       struct iw_request_info *info,
7856*5113495bSYour Name 				       union iwreq_data *wrqu, char *extra)
7857*5113495bSYour Name {
7858*5113495bSYour Name 	int ret;
7859*5113495bSYour Name 	struct hdd_context *hdd_ctx;
7860*5113495bSYour Name 	struct iw_point priv_data;
7861*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7862*5113495bSYour Name 	struct pkt_filter_cfg *request = NULL;
7863*5113495bSYour Name 
7864*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN)) {
7865*5113495bSYour Name 		hdd_err("permission check failed");
7866*5113495bSYour Name 		return -EPERM;
7867*5113495bSYour Name 	}
7868*5113495bSYour Name 
7869*5113495bSYour Name 	hdd_enter_dev(dev);
7870*5113495bSYour Name 
7871*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7872*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7873*5113495bSYour Name 	if (0 != ret)
7874*5113495bSYour Name 		return ret;
7875*5113495bSYour Name 
7876*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7877*5113495bSYour Name 	if (0 != ret)
7878*5113495bSYour Name 		return ret;
7879*5113495bSYour Name 
7880*5113495bSYour Name 	if (hdd_priv_get_data(&priv_data, wrqu)) {
7881*5113495bSYour Name 		hdd_err("failed to get priv data");
7882*5113495bSYour Name 		return -EINVAL;
7883*5113495bSYour Name 	}
7884*5113495bSYour Name 
7885*5113495bSYour Name 	if ((!priv_data.pointer) || (0 == priv_data.length)) {
7886*5113495bSYour Name 		hdd_err("invalid priv data %pK or invalid priv data length %d",
7887*5113495bSYour Name 			priv_data.pointer, priv_data.length);
7888*5113495bSYour Name 		return -EINVAL;
7889*5113495bSYour Name 	}
7890*5113495bSYour Name 
7891*5113495bSYour Name 	if (adapter->device_mode != QDF_STA_MODE) {
7892*5113495bSYour Name 		hdd_err("Packet filter not supported for this mode :%d",
7893*5113495bSYour Name 			adapter->device_mode);
7894*5113495bSYour Name 		return -ENOTSUPP;
7895*5113495bSYour Name 	}
7896*5113495bSYour Name 
7897*5113495bSYour Name 	if (!hdd_cm_is_vdev_associated(adapter->deflink)) {
7898*5113495bSYour Name 		hdd_err("Packet filter not supported in disconnected state");
7899*5113495bSYour Name 		return -ENOTSUPP;
7900*5113495bSYour Name 	}
7901*5113495bSYour Name 
7902*5113495bSYour Name 	/* copy data using copy_from_user */
7903*5113495bSYour Name 	request = mem_alloc_copy_from_user_helper(priv_data.pointer,
7904*5113495bSYour Name 						   priv_data.length);
7905*5113495bSYour Name 
7906*5113495bSYour Name 	if (!request) {
7907*5113495bSYour Name 		hdd_err("mem_alloc_copy_from_user_helper fail");
7908*5113495bSYour Name 		return -ENOMEM;
7909*5113495bSYour Name 	}
7910*5113495bSYour Name 
7911*5113495bSYour Name 	if (!validate_packet_filter_params_size(request, priv_data.length)) {
7912*5113495bSYour Name 		hdd_err("Invalid priv data length %d", priv_data.length);
7913*5113495bSYour Name 		qdf_mem_free(request);
7914*5113495bSYour Name 		return -EINVAL;
7915*5113495bSYour Name 	}
7916*5113495bSYour Name 
7917*5113495bSYour Name 	if (request->filter_action == HDD_RCV_FILTER_SET)
7918*5113495bSYour Name 		hdd_ctx->user_configured_pkt_filter_rules |=
7919*5113495bSYour Name 					1 << request->filter_id;
7920*5113495bSYour Name 	else if (request->filter_action == HDD_RCV_FILTER_CLEAR)
7921*5113495bSYour Name 		hdd_ctx->user_configured_pkt_filter_rules &=
7922*5113495bSYour Name 					~(1 << request->filter_id);
7923*5113495bSYour Name 
7924*5113495bSYour Name 	ret = wlan_hdd_set_filter(hdd_ctx, request, adapter->deflink->vdev_id);
7925*5113495bSYour Name 
7926*5113495bSYour Name 	qdf_mem_free(request);
7927*5113495bSYour Name 	hdd_exit();
7928*5113495bSYour Name 	return ret;
7929*5113495bSYour Name }
7930*5113495bSYour Name 
7931*5113495bSYour Name /**
7932*5113495bSYour Name  * iw_set_packet_filter_params() - set packet filter parameters in target
7933*5113495bSYour Name  * @dev: Pointer to netdev
7934*5113495bSYour Name  * @info: Pointer to iw request info
7935*5113495bSYour Name  * @wrqu: Pointer to data
7936*5113495bSYour Name  * @extra: Pointer to extra data
7937*5113495bSYour Name  *
7938*5113495bSYour Name  * Return: 0 on success, non-zero on error
7939*5113495bSYour Name  */
iw_set_packet_filter_params(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7940*5113495bSYour Name static int iw_set_packet_filter_params(struct net_device *dev,
7941*5113495bSYour Name 				       struct iw_request_info *info,
7942*5113495bSYour Name 				       union iwreq_data *wrqu, char *extra)
7943*5113495bSYour Name {
7944*5113495bSYour Name 	int errno;
7945*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
7946*5113495bSYour Name 
7947*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
7948*5113495bSYour Name 	if (errno)
7949*5113495bSYour Name 		return errno;
7950*5113495bSYour Name 
7951*5113495bSYour Name 	errno = __iw_set_packet_filter_params(dev, info, wrqu, extra);
7952*5113495bSYour Name 
7953*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
7954*5113495bSYour Name 
7955*5113495bSYour Name 	return errno;
7956*5113495bSYour Name }
7957*5113495bSYour Name #endif
7958*5113495bSYour Name 
hdd_get_wlan_stats(struct hdd_adapter * adapter)7959*5113495bSYour Name static int hdd_get_wlan_stats(struct hdd_adapter *adapter)
7960*5113495bSYour Name {
7961*5113495bSYour Name 	int stats = wlan_hdd_get_station_stats(adapter->deflink);
7962*5113495bSYour Name 
7963*5113495bSYour Name 	wlan_hdd_get_peer_rx_rate_stats(adapter->deflink);
7964*5113495bSYour Name 
7965*5113495bSYour Name 	return stats;
7966*5113495bSYour Name }
7967*5113495bSYour Name 
__iw_get_statistics(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)7968*5113495bSYour Name static int __iw_get_statistics(struct net_device *dev,
7969*5113495bSYour Name 			       struct iw_request_info *info,
7970*5113495bSYour Name 			       union iwreq_data *wrqu, char *extra)
7971*5113495bSYour Name {
7972*5113495bSYour Name 	int ret;
7973*5113495bSYour Name 	char *p;
7974*5113495bSYour Name 	int tlen;
7975*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
7976*5113495bSYour Name 	tCsrSummaryStatsInfo *summary_stats;
7977*5113495bSYour Name 	tCsrGlobalClassAStatsInfo *class_a_stats;
7978*5113495bSYour Name 	tCsrGlobalClassDStatsInfo *class_d_stats;
7979*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
7980*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
7981*5113495bSYour Name 
7982*5113495bSYour Name 	hdd_enter_dev(dev);
7983*5113495bSYour Name 
7984*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
7985*5113495bSYour Name 	if (0 != ret)
7986*5113495bSYour Name 		return ret;
7987*5113495bSYour Name 
7988*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
7989*5113495bSYour Name 	if (0 != ret)
7990*5113495bSYour Name 		return ret;
7991*5113495bSYour Name 
7992*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink);
7993*5113495bSYour Name 	if (!hdd_cm_is_vdev_associated(adapter->deflink)) {
7994*5113495bSYour Name 		wrqu->data.length = 0;
7995*5113495bSYour Name 		return 0;
7996*5113495bSYour Name 	}
7997*5113495bSYour Name 
7998*5113495bSYour Name 	hdd_get_wlan_stats(adapter);
7999*5113495bSYour Name 
8000*5113495bSYour Name 	summary_stats = &adapter->deflink->hdd_stats.summary_stat;
8001*5113495bSYour Name 	class_a_stats = &adapter->deflink->hdd_stats.class_a_stat;
8002*5113495bSYour Name 	class_d_stats = &adapter->deflink->hdd_stats.class_d_stat;
8003*5113495bSYour Name 
8004*5113495bSYour Name 	p = extra;
8005*5113495bSYour Name 	tlen = 0;
8006*5113495bSYour Name 
8007*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RETRY_CNT,
8008*5113495bSYour Name 		 sizeof(summary_stats->retry_cnt),
8009*5113495bSYour Name 		 &(summary_stats->retry_cnt[0]), tlen);
8010*5113495bSYour Name 
8011*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_MUL_RETRY_CNT,
8012*5113495bSYour Name 		 sizeof(summary_stats->multiple_retry_cnt),
8013*5113495bSYour Name 		 &(summary_stats->multiple_retry_cnt[0]), tlen);
8014*5113495bSYour Name 
8015*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_TX_FRM_CNT,
8016*5113495bSYour Name 		 sizeof(summary_stats->tx_frm_cnt),
8017*5113495bSYour Name 		 &(summary_stats->tx_frm_cnt[0]), tlen);
8018*5113495bSYour Name 
8019*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_FRM_CNT,
8020*5113495bSYour Name 		 sizeof(summary_stats->rx_frm_cnt),
8021*5113495bSYour Name 		 &(summary_stats->rx_frm_cnt), tlen);
8022*5113495bSYour Name 
8023*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_FRM_DUP_CNT,
8024*5113495bSYour Name 		 sizeof(summary_stats->frm_dup_cnt),
8025*5113495bSYour Name 		 &(summary_stats->frm_dup_cnt), tlen);
8026*5113495bSYour Name 
8027*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_FAIL_CNT,
8028*5113495bSYour Name 		 sizeof(summary_stats->fail_cnt),
8029*5113495bSYour Name 		 &(summary_stats->fail_cnt[0]), tlen);
8030*5113495bSYour Name 
8031*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RTS_FAIL_CNT,
8032*5113495bSYour Name 		 sizeof(summary_stats->rts_fail_cnt),
8033*5113495bSYour Name 		 &(summary_stats->rts_fail_cnt), tlen);
8034*5113495bSYour Name 
8035*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_ACK_FAIL_CNT,
8036*5113495bSYour Name 		 sizeof(summary_stats->ack_fail_cnt),
8037*5113495bSYour Name 		 &(summary_stats->ack_fail_cnt), tlen);
8038*5113495bSYour Name 
8039*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RTS_SUC_CNT,
8040*5113495bSYour Name 		 sizeof(summary_stats->rts_succ_cnt),
8041*5113495bSYour Name 		 &(summary_stats->rts_succ_cnt), tlen);
8042*5113495bSYour Name 
8043*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_DISCARD_CNT,
8044*5113495bSYour Name 		 sizeof(summary_stats->rx_discard_cnt),
8045*5113495bSYour Name 		 &(summary_stats->rx_discard_cnt), tlen);
8046*5113495bSYour Name 
8047*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_ERROR_CNT,
8048*5113495bSYour Name 		 sizeof(summary_stats->rx_error_cnt),
8049*5113495bSYour Name 		 &(summary_stats->rx_error_cnt), tlen);
8050*5113495bSYour Name 
8051*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_TX_BYTE_CNT,
8052*5113495bSYour Name 		 sizeof(class_d_stats->tx_uc_byte_cnt[0]),
8053*5113495bSYour Name 		 &(class_d_stats->tx_uc_byte_cnt[0]), tlen);
8054*5113495bSYour Name 
8055*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_BYTE_CNT,
8056*5113495bSYour Name 		 sizeof(class_d_stats->rx_byte_cnt),
8057*5113495bSYour Name 		 &(class_d_stats->rx_byte_cnt), tlen);
8058*5113495bSYour Name 
8059*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_RATE,
8060*5113495bSYour Name 		 sizeof(class_d_stats->rx_rate),
8061*5113495bSYour Name 		 &(class_d_stats->rx_rate), tlen);
8062*5113495bSYour Name 
8063*5113495bSYour Name 	/* Transmit rate, in units of 500 kbit/sec */
8064*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_TX_RATE,
8065*5113495bSYour Name 		 sizeof(class_a_stats->tx_rate),
8066*5113495bSYour Name 		 &(class_a_stats->tx_rate), tlen);
8067*5113495bSYour Name 
8068*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_UC_BYTE_CNT,
8069*5113495bSYour Name 		 sizeof(class_d_stats->rx_uc_byte_cnt[0]),
8070*5113495bSYour Name 		 &(class_d_stats->rx_uc_byte_cnt[0]), tlen);
8071*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_MC_BYTE_CNT,
8072*5113495bSYour Name 		 sizeof(class_d_stats->rx_mc_byte_cnt),
8073*5113495bSYour Name 		 &(class_d_stats->rx_mc_byte_cnt), tlen);
8074*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_RX_BC_BYTE_CNT,
8075*5113495bSYour Name 		 sizeof(class_d_stats->rx_bc_byte_cnt),
8076*5113495bSYour Name 		 &(class_d_stats->rx_bc_byte_cnt), tlen);
8077*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_TX_UC_BYTE_CNT,
8078*5113495bSYour Name 		 sizeof(class_d_stats->tx_uc_byte_cnt[0]),
8079*5113495bSYour Name 		 &(class_d_stats->tx_uc_byte_cnt[0]), tlen);
8080*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_TX_MC_BYTE_CNT,
8081*5113495bSYour Name 		 sizeof(class_d_stats->tx_mc_byte_cnt),
8082*5113495bSYour Name 		 &(class_d_stats->tx_mc_byte_cnt), tlen);
8083*5113495bSYour Name 	FILL_TLV(p, WLAN_STATS_TX_BC_BYTE_CNT,
8084*5113495bSYour Name 		 sizeof(class_d_stats->tx_bc_byte_cnt),
8085*5113495bSYour Name 		 &(class_d_stats->tx_bc_byte_cnt), tlen);
8086*5113495bSYour Name 
8087*5113495bSYour Name 	wrqu->data.length = tlen;
8088*5113495bSYour Name 
8089*5113495bSYour Name 	hdd_exit();
8090*5113495bSYour Name 
8091*5113495bSYour Name 	return 0;
8092*5113495bSYour Name }
8093*5113495bSYour Name 
iw_get_statistics(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8094*5113495bSYour Name static int iw_get_statistics(struct net_device *dev,
8095*5113495bSYour Name 			     struct iw_request_info *info,
8096*5113495bSYour Name 			     union iwreq_data *wrqu, char *extra)
8097*5113495bSYour Name {
8098*5113495bSYour Name 	int errno;
8099*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
8100*5113495bSYour Name 
8101*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
8102*5113495bSYour Name 	if (errno)
8103*5113495bSYour Name 		return errno;
8104*5113495bSYour Name 
8105*5113495bSYour Name 	errno = wlan_hdd_qmi_get_sync_resume();
8106*5113495bSYour Name 	if (errno) {
8107*5113495bSYour Name 		hdd_err("qmi sync resume failed: %d", errno);
8108*5113495bSYour Name 		goto end;
8109*5113495bSYour Name 	}
8110*5113495bSYour Name 
8111*5113495bSYour Name 	errno = __iw_get_statistics(dev, info, wrqu, extra);
8112*5113495bSYour Name 
8113*5113495bSYour Name 	wlan_hdd_qmi_put_suspend();
8114*5113495bSYour Name 
8115*5113495bSYour Name end:
8116*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
8117*5113495bSYour Name 
8118*5113495bSYour Name 	return errno;
8119*5113495bSYour Name }
8120*5113495bSYour Name 
8121*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
8122*5113495bSYour Name /*Max Len for PNO notification*/
8123*5113495bSYour Name #define MAX_PNO_NOTIFY_LEN 100
found_pref_network_cb(struct wlan_objmgr_vdev * vdev,struct scan_event * event,void * args)8124*5113495bSYour Name static void found_pref_network_cb(struct wlan_objmgr_vdev *vdev,
8125*5113495bSYour Name 	struct scan_event *event, void *args)
8126*5113495bSYour Name {
8127*5113495bSYour Name 	struct vdev_osif_priv *osif_priv;
8128*5113495bSYour Name 	struct wireless_dev *wdev;
8129*5113495bSYour Name 	union iwreq_data wrqu;
8130*5113495bSYour Name 	char buf[MAX_PNO_NOTIFY_LEN + 1];
8131*5113495bSYour Name 
8132*5113495bSYour Name 	wlan_vdev_obj_lock(vdev);
8133*5113495bSYour Name 	osif_priv = wlan_vdev_get_ospriv(vdev);
8134*5113495bSYour Name 	wlan_vdev_obj_unlock(vdev);
8135*5113495bSYour Name 	if (!osif_priv) {
8136*5113495bSYour Name 		hdd_err("osif_priv is null");
8137*5113495bSYour Name 		return;
8138*5113495bSYour Name 	}
8139*5113495bSYour Name 
8140*5113495bSYour Name 	wdev = osif_priv->wdev;
8141*5113495bSYour Name 	if (!wdev) {
8142*5113495bSYour Name 		hdd_err("wdev is null");
8143*5113495bSYour Name 		return;
8144*5113495bSYour Name 	}
8145*5113495bSYour Name 
8146*5113495bSYour Name 	hdd_debug("A preferred network was found");
8147*5113495bSYour Name 
8148*5113495bSYour Name 	/* create the event */
8149*5113495bSYour Name 	qdf_mem_zero(&wrqu, sizeof(wrqu));
8150*5113495bSYour Name 	qdf_mem_zero(buf, sizeof(buf));
8151*5113495bSYour Name 
8152*5113495bSYour Name 	snprintf(buf, MAX_PNO_NOTIFY_LEN,
8153*5113495bSYour Name 		 "QCOM: Found preferred network:");
8154*5113495bSYour Name 
8155*5113495bSYour Name 	wrqu.data.pointer = buf;
8156*5113495bSYour Name 	wrqu.data.length = strlen(buf);
8157*5113495bSYour Name 
8158*5113495bSYour Name 	/* send the event */
8159*5113495bSYour Name 
8160*5113495bSYour Name 	hdd_wext_send_event(wdev->netdev, IWEVCUSTOM, &wrqu, buf);
8161*5113495bSYour Name }
8162*5113495bSYour Name 
8163*5113495bSYour Name /**
8164*5113495bSYour Name  * __iw_set_pno() - Preferred Network Offload ioctl handler
8165*5113495bSYour Name  * @dev: device upon which the ioctl was received
8166*5113495bSYour Name  * @info: ioctl request information
8167*5113495bSYour Name  * @wrqu: ioctl request data
8168*5113495bSYour Name  * @extra: ioctl extra data
8169*5113495bSYour Name  *
8170*5113495bSYour Name  * This function parses a Preferred Network Offload command
8171*5113495bSYour Name  * Input is string based and expected to be of the form:
8172*5113495bSYour Name  *
8173*5113495bSYour Name  * <enable(1) | disable(0)>
8174*5113495bSYour Name  * when enabling:
8175*5113495bSYour Name  * <number of networks>
8176*5113495bSYour Name  * for each network:
8177*5113495bSYour Name  *    <ssid_len> <ssid> <authentication> <encryption>
8178*5113495bSYour Name  *    <ch_num> <channel_list optional> <bcast_type> <rssi_threshold>
8179*5113495bSYour Name  * <scan_time (seconds)>
8180*5113495bSYour Name  * <scan_repeat_count (0 means indefinite)>
8181*5113495bSYour Name  * <suspend mode>
8182*5113495bSYour Name  *
8183*5113495bSYour Name  * e.g:
8184*5113495bSYour Name  * 1 2 4 test 0 0 3 1 6 11 2 40 5 test2 4 4 6 1 2 3 4 5 6 1 0 5 2 1
8185*5113495bSYour Name  *
8186*5113495bSYour Name  * this translates into:
8187*5113495bSYour Name  * -----------------------------
8188*5113495bSYour Name  * enable PNO
8189*5113495bSYour Name  * 2 networks
8190*5113495bSYour Name  * Network 1:
8191*5113495bSYour Name  *   test - with authentication type 0 and encryption type 0,
8192*5113495bSYour Name  *   search on 3 channels: 1 6 and 11,
8193*5113495bSYour Name  *   SSID bcast type is unknown (directed probe will be sent if
8194*5113495bSYour Name  *   AP not found) and must meet -40dBm RSSI
8195*5113495bSYour Name  * Network 2:
8196*5113495bSYour Name  *   test2 - with authentication type 4 and encryption type 4,
8197*5113495bSYour Name  *   search on 6 channels 1, 2, 3, 4, 5 and 6
8198*5113495bSYour Name  *   bcast type is non-bcast (directed probe will be sent)
8199*5113495bSYour Name  *   and must not meet any RSSI threshold
8200*5113495bSYour Name  *   scan every 5 seconds 2 times
8201*5113495bSYour Name  *   enable on suspend
8202*5113495bSYour Name  */
__iw_set_pno(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8203*5113495bSYour Name static int __iw_set_pno(struct net_device *dev,
8204*5113495bSYour Name 			struct iw_request_info *info,
8205*5113495bSYour Name 			union iwreq_data *wrqu, char *extra)
8206*5113495bSYour Name {
8207*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
8208*5113495bSYour Name 	struct hdd_context *hdd_ctx;
8209*5113495bSYour Name 	uint8_t value;
8210*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
8211*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
8212*5113495bSYour Name 	int ret = 0;
8213*5113495bSYour Name 	int offset;
8214*5113495bSYour Name 	char *ptr, *data;
8215*5113495bSYour Name 	uint8_t i, j, params;
8216*5113495bSYour Name 	QDF_STATUS status;
8217*5113495bSYour Name 	size_t len;
8218*5113495bSYour Name 
8219*5113495bSYour Name 	/* request is a large struct, so we make it static to avoid
8220*5113495bSYour Name 	 * stack overflow.  This API is only invoked via ioctl, so it
8221*5113495bSYour Name 	 * is serialized by the kernel rtnl_lock and hence does not
8222*5113495bSYour Name 	 * need to be reentrant
8223*5113495bSYour Name 	 */
8224*5113495bSYour Name 	static struct pno_scan_req_params req;
8225*5113495bSYour Name 
8226*5113495bSYour Name 	hdd_enter_dev(dev);
8227*5113495bSYour Name 
8228*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
8229*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
8230*5113495bSYour Name 	if (ret)
8231*5113495bSYour Name 		return ret;
8232*5113495bSYour Name 
8233*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
8234*5113495bSYour Name 	if (0 != ret)
8235*5113495bSYour Name 		return ret;
8236*5113495bSYour Name 
8237*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(hdd_ctx->pdev,
8238*5113495bSYour Name 							 dev->dev_addr,
8239*5113495bSYour Name 							 WLAN_OSIF_SCAN_ID);
8240*5113495bSYour Name 	if (!vdev) {
8241*5113495bSYour Name 		hdd_err("vdev object is NULL");
8242*5113495bSYour Name 		return -EIO;
8243*5113495bSYour Name 	}
8244*5113495bSYour Name 
8245*5113495bSYour Name 	/* making sure argument string ends with '\0' */
8246*5113495bSYour Name 	len = (wrqu->data.length + 1);
8247*5113495bSYour Name 	data = qdf_mem_malloc(len);
8248*5113495bSYour Name 	if (!data) {
8249*5113495bSYour Name 		ret = -EINVAL;
8250*5113495bSYour Name 		goto exit;
8251*5113495bSYour Name 	}
8252*5113495bSYour Name 
8253*5113495bSYour Name 	qdf_mem_copy(data, extra, (len-1));
8254*5113495bSYour Name 	ptr = data;
8255*5113495bSYour Name 
8256*5113495bSYour Name 	hdd_debug("PNO data len %d data %s", wrqu->data.length, data);
8257*5113495bSYour Name 
8258*5113495bSYour Name 	if (1 != sscanf(ptr, " %hhu %n", &value, &offset)) {
8259*5113495bSYour Name 		hdd_err("PNO enable input is not valid %s", ptr);
8260*5113495bSYour Name 		ret = -EINVAL;
8261*5113495bSYour Name 		goto exit;
8262*5113495bSYour Name 	}
8263*5113495bSYour Name 
8264*5113495bSYour Name 	if (!value) {
8265*5113495bSYour Name 		status = ucfg_scan_pno_stop(vdev);
8266*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
8267*5113495bSYour Name 			hdd_err("Failed to disabled PNO");
8268*5113495bSYour Name 			ret = -EINVAL;
8269*5113495bSYour Name 		} else {
8270*5113495bSYour Name 			hdd_debug("PNO scan disabled");
8271*5113495bSYour Name 		}
8272*5113495bSYour Name 		goto exit;
8273*5113495bSYour Name 	}
8274*5113495bSYour Name 
8275*5113495bSYour Name 	if (ucfg_scan_get_pno_in_progress(vdev)) {
8276*5113495bSYour Name 		hdd_debug("pno is already in progress");
8277*5113495bSYour Name 		ret = -EBUSY;
8278*5113495bSYour Name 		goto exit;
8279*5113495bSYour Name 	}
8280*5113495bSYour Name 
8281*5113495bSYour Name 	ptr += offset;
8282*5113495bSYour Name 
8283*5113495bSYour Name 	if (1 != sscanf(ptr, " %hhu %n", &value, &offset)) {
8284*5113495bSYour Name 		hdd_err("PNO count input not valid %s", ptr);
8285*5113495bSYour Name 		ret = -EINVAL;
8286*5113495bSYour Name 		goto exit;
8287*5113495bSYour Name 	}
8288*5113495bSYour Name 	req.networks_cnt = value;
8289*5113495bSYour Name 
8290*5113495bSYour Name 	hdd_debug("PNO enable networks count %d offset %d",
8291*5113495bSYour Name 		 req.networks_cnt, offset);
8292*5113495bSYour Name 
8293*5113495bSYour Name 	if ((0 == req.networks_cnt) ||
8294*5113495bSYour Name 	    (req.networks_cnt > SCAN_PNO_MAX_SUPP_NETWORKS)) {
8295*5113495bSYour Name 		hdd_err("Network count %d invalid",
8296*5113495bSYour Name 			req.networks_cnt);
8297*5113495bSYour Name 		ret = -EINVAL;
8298*5113495bSYour Name 		goto exit;
8299*5113495bSYour Name 	}
8300*5113495bSYour Name 
8301*5113495bSYour Name 	ptr += offset;
8302*5113495bSYour Name 
8303*5113495bSYour Name 	for (i = 0; i < req.networks_cnt; i++) {
8304*5113495bSYour Name 
8305*5113495bSYour Name 		req.networks_list[i].ssid.length = 0;
8306*5113495bSYour Name 
8307*5113495bSYour Name 		params = sscanf(ptr, " %hhu %n",
8308*5113495bSYour Name 				  &(req.networks_list[i].ssid.length),
8309*5113495bSYour Name 				  &offset);
8310*5113495bSYour Name 
8311*5113495bSYour Name 		if (1 != params) {
8312*5113495bSYour Name 			hdd_err("PNO ssid length input is not valid %s", ptr);
8313*5113495bSYour Name 			ret = -EINVAL;
8314*5113495bSYour Name 			goto exit;
8315*5113495bSYour Name 		}
8316*5113495bSYour Name 
8317*5113495bSYour Name 		if ((0 == req.networks_list[i].ssid.length) ||
8318*5113495bSYour Name 		    (req.networks_list[i].ssid.length > 32)) {
8319*5113495bSYour Name 			hdd_err("SSID Len %d is not correct for network %d",
8320*5113495bSYour Name 				  req.networks_list[i].ssid.length, i);
8321*5113495bSYour Name 			ret = -EINVAL;
8322*5113495bSYour Name 			goto exit;
8323*5113495bSYour Name 		}
8324*5113495bSYour Name 
8325*5113495bSYour Name 		/* Advance to SSID */
8326*5113495bSYour Name 		ptr += offset;
8327*5113495bSYour Name 
8328*5113495bSYour Name 		memcpy(req.networks_list[i].ssid.ssid, ptr,
8329*5113495bSYour Name 		       req.networks_list[i].ssid.length);
8330*5113495bSYour Name 		ptr += req.networks_list[i].ssid.length;
8331*5113495bSYour Name 
8332*5113495bSYour Name 		params = sscanf(ptr, " %u %u %hhu %n",
8333*5113495bSYour Name 				&(req.networks_list[i].authentication),
8334*5113495bSYour Name 				&(req.networks_list[i].encryption),
8335*5113495bSYour Name 				&(req.networks_list[i].pno_chan_list.num_chan),
8336*5113495bSYour Name 				&offset);
8337*5113495bSYour Name 
8338*5113495bSYour Name 		if (3 != params) {
8339*5113495bSYour Name 			hdd_err("Incorrect cmd %s", ptr);
8340*5113495bSYour Name 			ret = -EINVAL;
8341*5113495bSYour Name 			goto exit;
8342*5113495bSYour Name 		}
8343*5113495bSYour Name 
8344*5113495bSYour Name 		hdd_debug("PNO ssid " QDF_SSID_FMT " auth %d encry %d channel count %d offset %d",
8345*5113495bSYour Name 			  QDF_SSID_REF(req.networks_list[i].ssid.length,
8346*5113495bSYour Name 				       req.networks_list[i].ssid.ssid),
8347*5113495bSYour Name 			  req.networks_list[i].authentication,
8348*5113495bSYour Name 			  req.networks_list[i].encryption,
8349*5113495bSYour Name 			  req.networks_list[i].pno_chan_list.num_chan, offset);
8350*5113495bSYour Name 
8351*5113495bSYour Name 		/* Advance to channel list */
8352*5113495bSYour Name 		ptr += offset;
8353*5113495bSYour Name 
8354*5113495bSYour Name 		if (SCAN_PNO_MAX_NETW_CHANNELS_EX <
8355*5113495bSYour Name 		    req.networks_list[i].pno_chan_list.num_chan) {
8356*5113495bSYour Name 			hdd_err("Incorrect number of channels");
8357*5113495bSYour Name 			ret = -EINVAL;
8358*5113495bSYour Name 			goto exit;
8359*5113495bSYour Name 		}
8360*5113495bSYour Name 
8361*5113495bSYour Name 		if (0 != req.networks_list[i].pno_chan_list.num_chan) {
8362*5113495bSYour Name 			for (j = 0;
8363*5113495bSYour Name 			     j < req.networks_list[i].pno_chan_list.num_chan;
8364*5113495bSYour Name 			     j++) {
8365*5113495bSYour Name 				if (1 != sscanf(ptr, " %hhu %n", &value,
8366*5113495bSYour Name 				   &offset)) {
8367*5113495bSYour Name 					hdd_err("PNO network channel is not valid %s",
8368*5113495bSYour Name 						  ptr);
8369*5113495bSYour Name 					ret = -EINVAL;
8370*5113495bSYour Name 					goto exit;
8371*5113495bSYour Name 				}
8372*5113495bSYour Name 				if (!IS_CHANNEL_VALID(value)) {
8373*5113495bSYour Name 					hdd_err("invalid channel: %hhu", value);
8374*5113495bSYour Name 					ret = -EINVAL;
8375*5113495bSYour Name 					goto exit;
8376*5113495bSYour Name 				}
8377*5113495bSYour Name 				req.networks_list[i].pno_chan_list.chan[j].freq =
8378*5113495bSYour Name 					cds_chan_to_freq(value);
8379*5113495bSYour Name 				/* Advance to next channel number */
8380*5113495bSYour Name 				ptr += offset;
8381*5113495bSYour Name 			}
8382*5113495bSYour Name 		}
8383*5113495bSYour Name 
8384*5113495bSYour Name 		if (1 != sscanf(ptr, " %u %n",
8385*5113495bSYour Name 				&(req.networks_list[i].bc_new_type),
8386*5113495bSYour Name 				&offset)) {
8387*5113495bSYour Name 			hdd_err("PNO broadcast network type is not valid %s",
8388*5113495bSYour Name 				  ptr);
8389*5113495bSYour Name 			ret = -EINVAL;
8390*5113495bSYour Name 			goto exit;
8391*5113495bSYour Name 		}
8392*5113495bSYour Name 		if (req.networks_list[i].bc_new_type > 2) {
8393*5113495bSYour Name 			hdd_err("invalid bcast nw type: %u",
8394*5113495bSYour Name 				req.networks_list[i].bc_new_type);
8395*5113495bSYour Name 			ret = -EINVAL;
8396*5113495bSYour Name 			goto exit;
8397*5113495bSYour Name 		}
8398*5113495bSYour Name 
8399*5113495bSYour Name 		hdd_debug("PNO bcastNetwType %d offset %d",
8400*5113495bSYour Name 			  req.networks_list[i].bc_new_type, offset);
8401*5113495bSYour Name 
8402*5113495bSYour Name 		/* Advance to rssi Threshold */
8403*5113495bSYour Name 		ptr += offset;
8404*5113495bSYour Name 		if (1 != sscanf(ptr, " %d %n",
8405*5113495bSYour Name 				&(req.networks_list[i].rssi_thresh),
8406*5113495bSYour Name 				&offset)) {
8407*5113495bSYour Name 			hdd_err("PNO rssi threshold input is not valid %s",
8408*5113495bSYour Name 				  ptr);
8409*5113495bSYour Name 			ret = -EINVAL;
8410*5113495bSYour Name 			goto exit;
8411*5113495bSYour Name 		}
8412*5113495bSYour Name 		hdd_debug("PNO rssi %d offset %d",
8413*5113495bSYour Name 			  req.networks_list[i].rssi_thresh, offset);
8414*5113495bSYour Name 		/* Advance to next network */
8415*5113495bSYour Name 		ptr += offset;
8416*5113495bSYour Name 	} /* For ucNetworkCount */
8417*5113495bSYour Name 
8418*5113495bSYour Name 	req.fast_scan_period = 0;
8419*5113495bSYour Name 	if (sscanf(ptr, " %u %n", &(req.fast_scan_period), &offset) > 0) {
8420*5113495bSYour Name 		req.fast_scan_period *= MSEC_PER_SEC;
8421*5113495bSYour Name 		ptr += offset;
8422*5113495bSYour Name 	}
8423*5113495bSYour Name 	if (req.fast_scan_period == 0) {
8424*5113495bSYour Name 		hdd_err("invalid fast scan period %u",
8425*5113495bSYour Name 			req.fast_scan_period);
8426*5113495bSYour Name 			ret = -EINVAL;
8427*5113495bSYour Name 			goto exit;
8428*5113495bSYour Name 	}
8429*5113495bSYour Name 
8430*5113495bSYour Name 	req.fast_scan_max_cycles = 0;
8431*5113495bSYour Name 	if (sscanf(ptr, " %hhu %n", &value,
8432*5113495bSYour Name 		   &offset) > 0)
8433*5113495bSYour Name 		ptr += offset;
8434*5113495bSYour Name 	req.fast_scan_max_cycles = value;
8435*5113495bSYour Name 
8436*5113495bSYour Name 	wlan_pdev_obj_lock(hdd_ctx->pdev);
8437*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(hdd_ctx->pdev);
8438*5113495bSYour Name 	wlan_pdev_obj_unlock(hdd_ctx->pdev);
8439*5113495bSYour Name 	ucfg_scan_register_pno_cb(psoc,
8440*5113495bSYour Name 		found_pref_network_cb, NULL);
8441*5113495bSYour Name 
8442*5113495bSYour Name 	ucfg_scan_get_pno_def_params(vdev, &req);
8443*5113495bSYour Name 	status = ucfg_scan_pno_start(vdev, &req);
8444*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
8445*5113495bSYour Name 		hdd_err("Failed to enable PNO");
8446*5113495bSYour Name 		ret = -EINVAL;
8447*5113495bSYour Name 	}
8448*5113495bSYour Name 
8449*5113495bSYour Name exit:
8450*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_SCAN_ID);
8451*5113495bSYour Name 
8452*5113495bSYour Name 	qdf_mem_free(data);
8453*5113495bSYour Name 	return ret;
8454*5113495bSYour Name }
8455*5113495bSYour Name 
iw_set_pno(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8456*5113495bSYour Name static int iw_set_pno(struct net_device *dev,
8457*5113495bSYour Name 		      struct iw_request_info *info,
8458*5113495bSYour Name 		      union iwreq_data *wrqu, char *extra)
8459*5113495bSYour Name {
8460*5113495bSYour Name 	int errno;
8461*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
8462*5113495bSYour Name 
8463*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
8464*5113495bSYour Name 	if (errno)
8465*5113495bSYour Name 		return errno;
8466*5113495bSYour Name 
8467*5113495bSYour Name 	errno = __iw_set_pno(dev, info, wrqu, extra);
8468*5113495bSYour Name 
8469*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
8470*5113495bSYour Name 
8471*5113495bSYour Name 	return errno;
8472*5113495bSYour Name }
8473*5113495bSYour Name #endif /* FEATURE_WLAN_SCAN_PNO */
8474*5113495bSYour Name 
__iw_set_band_config(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8475*5113495bSYour Name static int __iw_set_band_config(struct net_device *dev,
8476*5113495bSYour Name 				struct iw_request_info *info,
8477*5113495bSYour Name 				union iwreq_data *wrqu, char *extra)
8478*5113495bSYour Name {
8479*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
8480*5113495bSYour Name 	struct hdd_context *hdd_ctx;
8481*5113495bSYour Name 	int ret;
8482*5113495bSYour Name 	int *value = (int *)extra;
8483*5113495bSYour Name 
8484*5113495bSYour Name 	hdd_enter_dev(dev);
8485*5113495bSYour Name 
8486*5113495bSYour Name 	if (!capable(CAP_NET_ADMIN)) {
8487*5113495bSYour Name 		hdd_err("permission check failed");
8488*5113495bSYour Name 		return -EPERM;
8489*5113495bSYour Name 	}
8490*5113495bSYour Name 
8491*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
8492*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
8493*5113495bSYour Name 	if (0 != ret)
8494*5113495bSYour Name 		return ret;
8495*5113495bSYour Name 
8496*5113495bSYour Name 	return hdd_reg_set_band(dev, value[0]);
8497*5113495bSYour Name }
8498*5113495bSYour Name 
iw_set_band_config(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8499*5113495bSYour Name static int iw_set_band_config(struct net_device *dev,
8500*5113495bSYour Name 			      struct iw_request_info *info,
8501*5113495bSYour Name 			      union iwreq_data *wrqu, char *extra)
8502*5113495bSYour Name {
8503*5113495bSYour Name 	int errno;
8504*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
8505*5113495bSYour Name 
8506*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
8507*5113495bSYour Name 	if (errno)
8508*5113495bSYour Name 		return errno;
8509*5113495bSYour Name 
8510*5113495bSYour Name 	errno = __iw_set_band_config(dev, info, wrqu, extra);
8511*5113495bSYour Name 
8512*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
8513*5113495bSYour Name 
8514*5113495bSYour Name 	return errno;
8515*5113495bSYour Name }
8516*5113495bSYour Name 
8517*5113495bSYour Name 
8518*5113495bSYour Name 
8519*5113495bSYour Name #ifdef CONFIG_DP_TRACE
hdd_set_dump_dp_trace(uint16_t cmd_type,uint16_t count)8520*5113495bSYour Name void hdd_set_dump_dp_trace(uint16_t cmd_type, uint16_t count)
8521*5113495bSYour Name {
8522*5113495bSYour Name 	hdd_debug("WE_DUMP_DP_TRACE_LEVEL: %d %d",
8523*5113495bSYour Name 		  cmd_type, count);
8524*5113495bSYour Name 	if (cmd_type == DUMP_DP_TRACE)
8525*5113495bSYour Name 		qdf_dp_trace_dump_all(count, QDF_TRACE_DEFAULT_PDEV_ID);
8526*5113495bSYour Name 	else if (cmd_type == ENABLE_DP_TRACE_LIVE_MODE)
8527*5113495bSYour Name 		qdf_dp_trace_enable_live_mode();
8528*5113495bSYour Name 	else if (cmd_type == CLEAR_DP_TRACE_BUFFER)
8529*5113495bSYour Name 		qdf_dp_trace_clear_buffer();
8530*5113495bSYour Name 	else if (cmd_type == DISABLE_DP_TRACE_LIVE_MODE)
8531*5113495bSYour Name 		qdf_dp_trace_disable_live_mode();
8532*5113495bSYour Name }
8533*5113495bSYour Name #endif
8534*5113495bSYour Name 
__iw_set_two_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8535*5113495bSYour Name static int __iw_set_two_ints_getnone(struct net_device *dev,
8536*5113495bSYour Name 				     struct iw_request_info *info,
8537*5113495bSYour Name 				     union iwreq_data *wrqu, char *extra)
8538*5113495bSYour Name {
8539*5113495bSYour Name 	struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
8540*5113495bSYour Name 	int *value = (int *)extra;
8541*5113495bSYour Name 	int sub_cmd = value[0];
8542*5113495bSYour Name 	int ret;
8543*5113495bSYour Name 	uint8_t dual_mac_feature = DISABLE_DBS_CXN_AND_SCAN;
8544*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
8545*5113495bSYour Name 	QDF_STATUS status;
8546*5113495bSYour Name 
8547*5113495bSYour Name 	hdd_enter_dev(dev);
8548*5113495bSYour Name 
8549*5113495bSYour Name 	ret = wlan_hdd_validate_context(hdd_ctx);
8550*5113495bSYour Name 	if (0 != ret)
8551*5113495bSYour Name 		return ret;
8552*5113495bSYour Name 
8553*5113495bSYour Name 	ret = hdd_check_private_wext_control(hdd_ctx, info);
8554*5113495bSYour Name 	if (0 != ret)
8555*5113495bSYour Name 		return ret;
8556*5113495bSYour Name 
8557*5113495bSYour Name 	switch (sub_cmd) {
8558*5113495bSYour Name 	case WE_SET_SMPS_PARAM:
8559*5113495bSYour Name 		hdd_debug("WE_SET_SMPS_PARAM val %d %d", value[1], value[2]);
8560*5113495bSYour Name 		ret = wma_cli_set_command(adapter->deflink->vdev_id,
8561*5113495bSYour Name 					  WMI_STA_SMPS_PARAM_CMDID,
8562*5113495bSYour Name 					  value[1] << WMA_SMPS_PARAM_VALUE_S
8563*5113495bSYour Name 					      | value[2],
8564*5113495bSYour Name 					  VDEV_CMD);
8565*5113495bSYour Name 		break;
8566*5113495bSYour Name 	case WE_SET_FW_CRASH_INJECT:
8567*5113495bSYour Name 		ret = hdd_crash_inject(adapter, value[1], value[2]);
8568*5113495bSYour Name 		break;
8569*5113495bSYour Name 	case WE_ENABLE_FW_PROFILE:
8570*5113495bSYour Name 		hdd_err("WE_ENABLE_FW_PROFILE: %d %d",
8571*5113495bSYour Name 		       value[1], value[2]);
8572*5113495bSYour Name 		ret = wma_cli_set2_command(
8573*5113495bSYour Name 				adapter->deflink->vdev_id,
8574*5113495bSYour Name 				WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
8575*5113495bSYour Name 				value[1], value[2], DBG_CMD);
8576*5113495bSYour Name 		break;
8577*5113495bSYour Name 	case WE_SET_FW_PROFILE_HIST_INTVL:
8578*5113495bSYour Name 		hdd_err("WE_SET_FW_PROFILE_HIST_INTVL: %d %d",
8579*5113495bSYour Name 		       value[1], value[2]);
8580*5113495bSYour Name 		ret = wma_cli_set2_command(
8581*5113495bSYour Name 					adapter->deflink->vdev_id,
8582*5113495bSYour Name 					WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
8583*5113495bSYour Name 					value[1], value[2], DBG_CMD);
8584*5113495bSYour Name 		break;
8585*5113495bSYour Name 	case WE_SET_DUAL_MAC_FW_MODE_CONFIG:
8586*5113495bSYour Name 		hdd_debug("Ioctl to set dual fw mode config");
8587*5113495bSYour Name 		status =
8588*5113495bSYour Name 		ucfg_policy_mgr_get_dual_mac_feature(hdd_ctx->psoc,
8589*5113495bSYour Name 						     &dual_mac_feature);
8590*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS)
8591*5113495bSYour Name 			hdd_err("can't get dual mac feature val, use def");
8592*5113495bSYour Name 		if (dual_mac_feature == DISABLE_DBS_CXN_AND_SCAN) {
8593*5113495bSYour Name 			hdd_err("Dual mac feature is disabled from INI");
8594*5113495bSYour Name 			return -EPERM;
8595*5113495bSYour Name 		}
8596*5113495bSYour Name 		hdd_debug("%d %d", value[1], value[2]);
8597*5113495bSYour Name 		policy_mgr_set_dual_mac_fw_mode_config(hdd_ctx->psoc,
8598*5113495bSYour Name 			value[1], value[2]);
8599*5113495bSYour Name 		break;
8600*5113495bSYour Name 	case WE_DUMP_DP_TRACE_LEVEL:
8601*5113495bSYour Name 		hdd_set_dump_dp_trace(value[1], value[2]);
8602*5113495bSYour Name 		break;
8603*5113495bSYour Name 	case WE_SET_MON_MODE_CHAN:
8604*5113495bSYour Name 		if (value[1] > 256)
8605*5113495bSYour Name 			ret = wlan_hdd_set_mon_chan(adapter, value[1],
8606*5113495bSYour Name 						    value[2]);
8607*5113495bSYour Name 		else
8608*5113495bSYour Name 			ret = wlan_hdd_set_mon_chan(
8609*5113495bSYour Name 						adapter,
8610*5113495bSYour Name 						wlan_reg_legacy_chan_to_freq(
8611*5113495bSYour Name 						hdd_ctx->pdev, value[1]),
8612*5113495bSYour Name 						value[2]);
8613*5113495bSYour Name 		break;
8614*5113495bSYour Name 	case WE_SET_WLAN_SUSPEND:
8615*5113495bSYour Name 		ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy, dev,
8616*5113495bSYour Name 						 value[1], value[2]);
8617*5113495bSYour Name 		break;
8618*5113495bSYour Name 	case WE_SET_WLAN_RESUME:
8619*5113495bSYour Name 		ret = hdd_wlan_fake_apps_resume(hdd_ctx->wiphy, dev);
8620*5113495bSYour Name 		break;
8621*5113495bSYour Name 	case WE_LOG_BUFFER: {
8622*5113495bSYour Name 		int log_id = value[1];
8623*5113495bSYour Name 		uint32_t count = value[2] < 0 ? 0 : value[2];
8624*5113495bSYour Name 
8625*5113495bSYour Name 		hdd_ioctl_log_buffer(log_id, count, NULL, NULL);
8626*5113495bSYour Name 
8627*5113495bSYour Name 		break;
8628*5113495bSYour Name 	}
8629*5113495bSYour Name 	case WE_SET_BA_AGEING_TIMEOUT:
8630*5113495bSYour Name 	{
8631*5113495bSYour Name 		void *soc = cds_get_context(QDF_MODULE_ID_SOC);
8632*5113495bSYour Name 
8633*5113495bSYour Name 		if (!soc)
8634*5113495bSYour Name 			break;
8635*5113495bSYour Name 
8636*5113495bSYour Name 		cdp_set_ba_timeout(soc, value[1], value[2]);
8637*5113495bSYour Name 		break;
8638*5113495bSYour Name 	}
8639*5113495bSYour Name 	default:
8640*5113495bSYour Name 		hdd_err("Invalid IOCTL command %d", sub_cmd);
8641*5113495bSYour Name 		break;
8642*5113495bSYour Name 	}
8643*5113495bSYour Name 
8644*5113495bSYour Name 	return ret;
8645*5113495bSYour Name }
8646*5113495bSYour Name 
iw_set_two_ints_getnone(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)8647*5113495bSYour Name static int iw_set_two_ints_getnone(struct net_device *dev,
8648*5113495bSYour Name 				   struct iw_request_info *info,
8649*5113495bSYour Name 				   union iwreq_data *wrqu, char *extra)
8650*5113495bSYour Name {
8651*5113495bSYour Name 	int errno;
8652*5113495bSYour Name 	struct osif_vdev_sync *vdev_sync;
8653*5113495bSYour Name 
8654*5113495bSYour Name 	errno = osif_vdev_sync_op_start(dev, &vdev_sync);
8655*5113495bSYour Name 	if (errno)
8656*5113495bSYour Name 		return errno;
8657*5113495bSYour Name 
8658*5113495bSYour Name 	errno = __iw_set_two_ints_getnone(dev, info, wrqu, extra);
8659*5113495bSYour Name 
8660*5113495bSYour Name 	osif_vdev_sync_op_stop(vdev_sync);
8661*5113495bSYour Name 
8662*5113495bSYour Name 	return errno;
8663*5113495bSYour Name }
8664*5113495bSYour Name 
8665*5113495bSYour Name /* Define the Wireless Extensions to the Linux Network Device structure */
8666*5113495bSYour Name 
8667*5113495bSYour Name static const iw_handler we_private[] = {
8668*5113495bSYour Name 
8669*5113495bSYour Name 	[WLAN_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_setint_getnone,
8670*5113495bSYour Name 	[WLAN_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_setnone_getint,
8671*5113495bSYour Name 	[WLAN_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_setchar_getnone,
8672*5113495bSYour Name 	[WLAN_PRIV_SET_THREE_INT_GET_NONE - SIOCIWFIRSTPRIV] =
8673*5113495bSYour Name 		iw_set_three_ints_getnone,
8674*5113495bSYour Name 	[WLAN_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_get_char_setnone,
8675*5113495bSYour Name 	[WLAN_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_setnone_getnone,
8676*5113495bSYour Name 	[WLAN_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] =
8677*5113495bSYour Name 		iw_hdd_set_var_ints_getnone,
8678*5113495bSYour Name 	[WLAN_PRIV_SET_NONE_GET_THREE_INT - SIOCIWFIRSTPRIV] =
8679*5113495bSYour Name 							iw_setnone_get_threeint,
8680*5113495bSYour Name #ifdef WLAN_FEATURE_FIPS
8681*5113495bSYour Name 	[WLAN_PRIV_FIPS_TEST - SIOCIWFIRSTPRIV] = hdd_fips_test,
8682*5113495bSYour Name #endif
8683*5113495bSYour Name 	[WLAN_PRIV_ADD_TSPEC - SIOCIWFIRSTPRIV] = iw_add_tspec,
8684*5113495bSYour Name 	[WLAN_PRIV_DEL_TSPEC - SIOCIWFIRSTPRIV] = iw_del_tspec,
8685*5113495bSYour Name 	[WLAN_PRIV_GET_TSPEC - SIOCIWFIRSTPRIV] = iw_get_tspec,
8686*5113495bSYour Name 	[WLAN_PRIV_SET_FTIES - SIOCIWFIRSTPRIV] = iw_set_fties,
8687*5113495bSYour Name 	[WLAN_PRIV_SET_HOST_OFFLOAD - SIOCIWFIRSTPRIV] = iw_set_host_offload,
8688*5113495bSYour Name 	[WLAN_GET_WLAN_STATISTICS - SIOCIWFIRSTPRIV] = iw_get_statistics,
8689*5113495bSYour Name 	[WLAN_SET_KEEPALIVE_PARAMS - SIOCIWFIRSTPRIV] =
8690*5113495bSYour Name 		iw_set_keepalive_params,
8691*5113495bSYour Name #ifdef WLAN_FEATURE_PACKET_FILTERING
8692*5113495bSYour Name 	[WLAN_SET_PACKET_FILTER_PARAMS - SIOCIWFIRSTPRIV] =
8693*5113495bSYour Name 		iw_set_packet_filter_params,
8694*5113495bSYour Name #endif
8695*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
8696*5113495bSYour Name 	[WLAN_SET_PNO - SIOCIWFIRSTPRIV] = iw_set_pno,
8697*5113495bSYour Name #endif
8698*5113495bSYour Name 	[WLAN_SET_BAND_CONFIG - SIOCIWFIRSTPRIV] = iw_set_band_config,
8699*5113495bSYour Name 	[WLAN_PRIV_SET_MCBC_FILTER - SIOCIWFIRSTPRIV] =
8700*5113495bSYour Name 		iw_set_dynamic_mcbc_filter,
8701*5113495bSYour Name 	[WLAN_GET_LINK_SPEED - SIOCIWFIRSTPRIV] = iw_get_linkspeed,
8702*5113495bSYour Name #ifdef FEATURE_WLM_STATS
8703*5113495bSYour Name 	[WLAN_GET_WLM_STATS - SIOCIWFIRSTPRIV] = iw_get_wlm_stats,
8704*5113495bSYour Name #endif
8705*5113495bSYour Name 	[WLAN_PRIV_SET_TWO_INT_GET_NONE - SIOCIWFIRSTPRIV] =
8706*5113495bSYour Name 		iw_set_two_ints_getnone,
8707*5113495bSYour Name 	[WLAN_SET_DOT11P_CHANNEL_SCHED - SIOCIWFIRSTPRIV] =
8708*5113495bSYour Name 		iw_set_dot11p_channel_sched,
8709*5113495bSYour Name };
8710*5113495bSYour Name 
8711*5113495bSYour Name /*Maximum command length can be only 15 */
8712*5113495bSYour Name static const struct iw_priv_args we_private_args[] = {
8713*5113495bSYour Name 
8714*5113495bSYour Name 	/* handlers for main ioctl */
8715*5113495bSYour Name 	{WLAN_PRIV_SET_INT_GET_NONE,
8716*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8717*5113495bSYour Name 	 0,
8718*5113495bSYour Name 	 ""},
8719*5113495bSYour Name 
8720*5113495bSYour Name 	/* handlers for sub-ioctl */
8721*5113495bSYour Name 	{WE_SET_11D_STATE,
8722*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8723*5113495bSYour Name 	 0,
8724*5113495bSYour Name 	 "set11Dstate"},
8725*5113495bSYour Name 
8726*5113495bSYour Name 	{WE_WOWL,
8727*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8728*5113495bSYour Name 	 0,
8729*5113495bSYour Name 	 "wowl"},
8730*5113495bSYour Name 
8731*5113495bSYour Name 	{WE_SET_POWER,
8732*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8733*5113495bSYour Name 	 0,
8734*5113495bSYour Name 	 "setPower"},
8735*5113495bSYour Name 
8736*5113495bSYour Name 	{WE_SET_MAX_ASSOC,
8737*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8738*5113495bSYour Name 	 0,
8739*5113495bSYour Name 	 "setMaxAssoc"},
8740*5113495bSYour Name 
8741*5113495bSYour Name 	{WE_SET_SCAN_DISABLE,
8742*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8743*5113495bSYour Name 	 0,
8744*5113495bSYour Name 	 "scan_disable"},
8745*5113495bSYour Name 
8746*5113495bSYour Name 	{WE_SET_DATA_INACTIVITY_TO,
8747*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8748*5113495bSYour Name 	 0,
8749*5113495bSYour Name 	 "inactivityTO"},
8750*5113495bSYour Name 
8751*5113495bSYour Name 	{WE_SET_WOW_DATA_INACTIVITY_TO,
8752*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8753*5113495bSYour Name 	 0,
8754*5113495bSYour Name 	 "wow_ito"},
8755*5113495bSYour Name 
8756*5113495bSYour Name 	{WE_SET_MAX_TX_POWER,
8757*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8758*5113495bSYour Name 	 0,
8759*5113495bSYour Name 	 "setMaxTxPower"},
8760*5113495bSYour Name 
8761*5113495bSYour Name 	{WE_SET_TX_POWER,
8762*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8763*5113495bSYour Name 	 0,
8764*5113495bSYour Name 	 "setTxPower"},
8765*5113495bSYour Name 
8766*5113495bSYour Name 	{WE_SET_MC_RATE,
8767*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8768*5113495bSYour Name 	 0,
8769*5113495bSYour Name 	 "setMcRate"},
8770*5113495bSYour Name 
8771*5113495bSYour Name 	{WE_SET_MAX_TX_POWER_2_4,
8772*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8773*5113495bSYour Name 	 0,
8774*5113495bSYour Name 	 "setTxMaxPower2G"},
8775*5113495bSYour Name 
8776*5113495bSYour Name 	{WE_SET_MAX_TX_POWER_5_0,
8777*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8778*5113495bSYour Name 	 0,
8779*5113495bSYour Name 	 "setTxMaxPower5G"},
8780*5113495bSYour Name 
8781*5113495bSYour Name #ifndef REMOVE_PKT_LOG
8782*5113495bSYour Name 	{WE_SET_PKTLOG,
8783*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
8784*5113495bSYour Name 	 0,
8785*5113495bSYour Name 	 "pktlog"},
8786*5113495bSYour Name #endif
8787*5113495bSYour Name 
8788*5113495bSYour Name 	/* SAP has TxMax whereas STA has MaxTx, adding TxMax for STA
8789*5113495bSYour Name 	 * as well to keep same syntax as in SAP. Now onwards, STA
8790*5113495bSYour Name 	 * will support both
8791*5113495bSYour Name 	 */
8792*5113495bSYour Name 	{WE_SET_MAX_TX_POWER,
8793*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8794*5113495bSYour Name 	 0,
8795*5113495bSYour Name 	 "setTxMaxPower"},
8796*5113495bSYour Name 
8797*5113495bSYour Name #ifdef HASTINGS_BT_WAR
8798*5113495bSYour Name 	{WE_SET_HASTINGS_BT_WAR,
8799*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8800*5113495bSYour Name 	 0,
8801*5113495bSYour Name 	 "hastings_bt_war"},
8802*5113495bSYour Name #endif
8803*5113495bSYour Name 
8804*5113495bSYour Name 	{WE_SET_TM_LEVEL,
8805*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8806*5113495bSYour Name 	 0,
8807*5113495bSYour Name 	 "setTmLevel"},
8808*5113495bSYour Name 
8809*5113495bSYour Name 	{WE_SET_PHYMODE,
8810*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8811*5113495bSYour Name 	 0,
8812*5113495bSYour Name 	 "setphymode"},
8813*5113495bSYour Name 
8814*5113495bSYour Name 	{WE_SET_NSS,
8815*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8816*5113495bSYour Name 	 0,
8817*5113495bSYour Name 	 "nss"},
8818*5113495bSYour Name 
8819*5113495bSYour Name 	{WE_SET_LDPC,
8820*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8821*5113495bSYour Name 	 0,
8822*5113495bSYour Name 	 "ldpc"},
8823*5113495bSYour Name 
8824*5113495bSYour Name 	{WE_SET_TX_STBC,
8825*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8826*5113495bSYour Name 	 0,
8827*5113495bSYour Name 	 "tx_stbc"},
8828*5113495bSYour Name 
8829*5113495bSYour Name 	{WE_SET_RX_STBC,
8830*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8831*5113495bSYour Name 	 0,
8832*5113495bSYour Name 	 "rx_stbc"},
8833*5113495bSYour Name 
8834*5113495bSYour Name 	{WE_SET_SHORT_GI,
8835*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8836*5113495bSYour Name 	 0,
8837*5113495bSYour Name 	 "shortgi"},
8838*5113495bSYour Name 
8839*5113495bSYour Name 	{WE_SET_RTSCTS,
8840*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8841*5113495bSYour Name 	 0,
8842*5113495bSYour Name 	 "enablertscts"},
8843*5113495bSYour Name 
8844*5113495bSYour Name 	{WE_SET_CHWIDTH,
8845*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8846*5113495bSYour Name 	 0,
8847*5113495bSYour Name 	 "chwidth"},
8848*5113495bSYour Name 
8849*5113495bSYour Name 	{WE_SET_ANI_EN_DIS,
8850*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8851*5113495bSYour Name 	 0,
8852*5113495bSYour Name 	 "anienable"},
8853*5113495bSYour Name 
8854*5113495bSYour Name 	{WE_SET_ANI_POLL_PERIOD,
8855*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8856*5113495bSYour Name 	 0,
8857*5113495bSYour Name 	 "aniplen"},
8858*5113495bSYour Name 
8859*5113495bSYour Name 	{WE_SET_ANI_LISTEN_PERIOD,
8860*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8861*5113495bSYour Name 	 0,
8862*5113495bSYour Name 	 "anilislen"},
8863*5113495bSYour Name 
8864*5113495bSYour Name 	{WE_SET_ANI_OFDM_LEVEL,
8865*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8866*5113495bSYour Name 	 0,
8867*5113495bSYour Name 	 "aniofdmlvl"},
8868*5113495bSYour Name 
8869*5113495bSYour Name 	{WE_SET_ANI_CCK_LEVEL,
8870*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8871*5113495bSYour Name 	 0,
8872*5113495bSYour Name 	 "aniccklvl"},
8873*5113495bSYour Name 
8874*5113495bSYour Name 	{WE_SET_DYNAMIC_BW,
8875*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8876*5113495bSYour Name 	 0,
8877*5113495bSYour Name 	 "cwmenable"},
8878*5113495bSYour Name 
8879*5113495bSYour Name 	{WE_SET_CTS_CBW,
8880*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8881*5113495bSYour Name 	 0,
8882*5113495bSYour Name 	 "cts_cbw" },
8883*5113495bSYour Name 
8884*5113495bSYour Name 	{WE_SET_GTX_HT_MCS,
8885*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8886*5113495bSYour Name 	 0,
8887*5113495bSYour Name 	 "gtxHTMcs"},
8888*5113495bSYour Name 
8889*5113495bSYour Name 	{WE_SET_GTX_VHT_MCS,
8890*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8891*5113495bSYour Name 	 0,
8892*5113495bSYour Name 	 "gtxVHTMcs"},
8893*5113495bSYour Name 
8894*5113495bSYour Name 	{WE_SET_GTX_USRCFG,
8895*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8896*5113495bSYour Name 	 0,
8897*5113495bSYour Name 	 "gtxUsrCfg"},
8898*5113495bSYour Name 
8899*5113495bSYour Name 	{WE_SET_GTX_THRE,
8900*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8901*5113495bSYour Name 	 0,
8902*5113495bSYour Name 	 "gtxThre"},
8903*5113495bSYour Name 
8904*5113495bSYour Name 	{WE_SET_GTX_MARGIN,
8905*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8906*5113495bSYour Name 	 0,
8907*5113495bSYour Name 	 "gtxMargin"},
8908*5113495bSYour Name 
8909*5113495bSYour Name 	{WE_SET_GTX_STEP,
8910*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8911*5113495bSYour Name 	 0,
8912*5113495bSYour Name 	 "gtxStep"},
8913*5113495bSYour Name 
8914*5113495bSYour Name 	{WE_SET_GTX_MINTPC,
8915*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8916*5113495bSYour Name 	 0,
8917*5113495bSYour Name 	 "gtxMinTpc"},
8918*5113495bSYour Name 
8919*5113495bSYour Name 	{WE_SET_GTX_BWMASK,
8920*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8921*5113495bSYour Name 	 0,
8922*5113495bSYour Name 	 "gtxBWMask"},
8923*5113495bSYour Name 
8924*5113495bSYour Name 	{WE_SET_TX_CHAINMASK,
8925*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8926*5113495bSYour Name 	 0,
8927*5113495bSYour Name 	 "txchainmask"},
8928*5113495bSYour Name 
8929*5113495bSYour Name 	{WE_SET_RX_CHAINMASK,
8930*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8931*5113495bSYour Name 	 0,
8932*5113495bSYour Name 	 "rxchainmask"},
8933*5113495bSYour Name 
8934*5113495bSYour Name 	{WE_SET_11N_RATE,
8935*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8936*5113495bSYour Name 	 0,
8937*5113495bSYour Name 	 "set11NRates"},
8938*5113495bSYour Name 
8939*5113495bSYour Name 	{WE_SET_VHT_RATE,
8940*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8941*5113495bSYour Name 	 0,
8942*5113495bSYour Name 	 "set11ACRates"},
8943*5113495bSYour Name 
8944*5113495bSYour Name 	{WE_SET_AMPDU,
8945*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8946*5113495bSYour Name 	 0,
8947*5113495bSYour Name 	 "ampdu"},
8948*5113495bSYour Name 
8949*5113495bSYour Name 	{WE_SET_AMSDU,
8950*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8951*5113495bSYour Name 	 0,
8952*5113495bSYour Name 	 "amsdu"},
8953*5113495bSYour Name 
8954*5113495bSYour Name 	{WE_SET_TXPOW_2G,
8955*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8956*5113495bSYour Name 	 0,
8957*5113495bSYour Name 	 "txpow2g"},
8958*5113495bSYour Name 
8959*5113495bSYour Name 	{WE_SET_TXPOW_5G,
8960*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8961*5113495bSYour Name 	 0,
8962*5113495bSYour Name 	 "txpow5g"},
8963*5113495bSYour Name 
8964*5113495bSYour Name #ifdef FEATURE_FW_LOG_PARSING
8965*5113495bSYour Name 	/* Sub-cmds DBGLOG specific commands */
8966*5113495bSYour Name 	{WE_DBGLOG_LOG_LEVEL,
8967*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8968*5113495bSYour Name 	 0,
8969*5113495bSYour Name 	 "dl_loglevel"},
8970*5113495bSYour Name 
8971*5113495bSYour Name 	{WE_DBGLOG_VAP_ENABLE,
8972*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8973*5113495bSYour Name 	 0,
8974*5113495bSYour Name 	 "dl_vapon"},
8975*5113495bSYour Name 
8976*5113495bSYour Name 	{WE_DBGLOG_VAP_DISABLE,
8977*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8978*5113495bSYour Name 	 0,
8979*5113495bSYour Name 	 "dl_vapoff"},
8980*5113495bSYour Name 
8981*5113495bSYour Name 	{WE_DBGLOG_MODULE_ENABLE,
8982*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8983*5113495bSYour Name 	 0,
8984*5113495bSYour Name 	 "dl_modon"},
8985*5113495bSYour Name 
8986*5113495bSYour Name 	{WE_DBGLOG_MODULE_DISABLE,
8987*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8988*5113495bSYour Name 	 0,
8989*5113495bSYour Name 	 "dl_modoff"},
8990*5113495bSYour Name 
8991*5113495bSYour Name 	{WE_DBGLOG_MOD_LOG_LEVEL,
8992*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8993*5113495bSYour Name 	 0,
8994*5113495bSYour Name 	 "dl_mod_loglevel"},
8995*5113495bSYour Name 
8996*5113495bSYour Name 	{WE_DBGLOG_TYPE,
8997*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
8998*5113495bSYour Name 	 0,
8999*5113495bSYour Name 	 "dl_type"},
9000*5113495bSYour Name 
9001*5113495bSYour Name 	{WE_DBGLOG_REPORT_ENABLE,
9002*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9003*5113495bSYour Name 	 0,
9004*5113495bSYour Name 	 "dl_report"},
9005*5113495bSYour Name #endif /* FEATURE_FW_LOG_PARSING */
9006*5113495bSYour Name 
9007*5113495bSYour Name 	{WE_SET_TXRX_FWSTATS,
9008*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9009*5113495bSYour Name 	 0,
9010*5113495bSYour Name 	 "txrx_fw_stats"},
9011*5113495bSYour Name 
9012*5113495bSYour Name 	{WE_SET_TXRX_STATS,
9013*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9014*5113495bSYour Name 	 0,
9015*5113495bSYour Name 	 "txrx_stats"},
9016*5113495bSYour Name #ifdef FW_THERMAL_THROTTLE_SUPPORT
9017*5113495bSYour Name 	{WE_SET_THERMAL_THROTTLE_CFG,
9018*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9019*5113495bSYour Name 	 0,
9020*5113495bSYour Name 	 "set_thermal_cfg"},
9021*5113495bSYour Name #endif /* FW_THERMAL_THROTTLE_SUPPORT */
9022*5113495bSYour Name 	{WE_SET_BTCOEX_MODE,
9023*5113495bSYour Name 	IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9024*5113495bSYour Name 	0, "set_btc_mode" },
9025*5113495bSYour Name 	{WE_SET_BTCOEX_RSSI_THRESHOLD,
9026*5113495bSYour Name 	IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9027*5113495bSYour Name 	0, "set_btc_rssi" },
9028*5113495bSYour Name 	{WE_TXRX_FWSTATS_RESET,
9029*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9030*5113495bSYour Name 	 0,
9031*5113495bSYour Name 	 "txrx_fw_st_rst"},
9032*5113495bSYour Name 
9033*5113495bSYour Name 	{WE_PPS_PAID_MATCH,
9034*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9035*5113495bSYour Name 	 0, "paid_match"},
9036*5113495bSYour Name 
9037*5113495bSYour Name 	{WE_PPS_GID_MATCH,
9038*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9039*5113495bSYour Name 	 0, "gid_match"},
9040*5113495bSYour Name 
9041*5113495bSYour Name 	{WE_PPS_EARLY_TIM_CLEAR,
9042*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9043*5113495bSYour Name 	 0, "tim_clear"},
9044*5113495bSYour Name 
9045*5113495bSYour Name 	{WE_PPS_EARLY_DTIM_CLEAR,
9046*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9047*5113495bSYour Name 	 0, "dtim_clear"},
9048*5113495bSYour Name 
9049*5113495bSYour Name 	{WE_PPS_EOF_PAD_DELIM,
9050*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9051*5113495bSYour Name 	 0, "eof_delim"},
9052*5113495bSYour Name 
9053*5113495bSYour Name 	{WE_PPS_MACADDR_MISMATCH,
9054*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9055*5113495bSYour Name 	 0, "mac_match"},
9056*5113495bSYour Name 
9057*5113495bSYour Name 	{WE_PPS_DELIM_CRC_FAIL,
9058*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9059*5113495bSYour Name 	 0, "delim_fail"},
9060*5113495bSYour Name 
9061*5113495bSYour Name 	{WE_PPS_GID_NSTS_ZERO,
9062*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9063*5113495bSYour Name 	 0, "nsts_zero"},
9064*5113495bSYour Name 
9065*5113495bSYour Name 	{WE_PPS_RSSI_CHECK,
9066*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9067*5113495bSYour Name 	 0, "rssi_chk"},
9068*5113495bSYour Name 
9069*5113495bSYour Name 	{WE_PPS_5G_EBT,
9070*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9071*5113495bSYour Name 	 0, "5g_ebt"},
9072*5113495bSYour Name 
9073*5113495bSYour Name 	{WE_SET_HTSMPS,
9074*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9075*5113495bSYour Name 	 0, "htsmps"},
9076*5113495bSYour Name 
9077*5113495bSYour Name 	{WE_SET_QPOWER_MAX_PSPOLL_COUNT,
9078*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9079*5113495bSYour Name 	 0, "set_qpspollcnt"},
9080*5113495bSYour Name 
9081*5113495bSYour Name 	{WE_SET_QPOWER_MAX_TX_BEFORE_WAKE,
9082*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9083*5113495bSYour Name 	 0, "set_qtxwake"},
9084*5113495bSYour Name 
9085*5113495bSYour Name 	{WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
9086*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9087*5113495bSYour Name 	 0, "set_qwakeintv"},
9088*5113495bSYour Name 
9089*5113495bSYour Name 	{WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
9090*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9091*5113495bSYour Name 	 0, "set_qnodatapoll"},
9092*5113495bSYour Name 
9093*5113495bSYour Name 	/* handlers for MCC time quota and latency sub ioctls */
9094*5113495bSYour Name 	{WE_MCC_CONFIG_LATENCY,
9095*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9096*5113495bSYour Name 	 0, "setMccLatency"},
9097*5113495bSYour Name 
9098*5113495bSYour Name 	{WE_MCC_CONFIG_QUOTA,
9099*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9100*5113495bSYour Name 	 0, "setMccQuota"},
9101*5113495bSYour Name 
9102*5113495bSYour Name 	{WE_SET_DEBUG_LOG,
9103*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9104*5113495bSYour Name 	 0, "setDbgLvl"},
9105*5113495bSYour Name 
9106*5113495bSYour Name 	/* handlers for early_rx power save */
9107*5113495bSYour Name 	{WE_SET_EARLY_RX_ADJUST_ENABLE,
9108*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9109*5113495bSYour Name 	 0, "erx_enable"},
9110*5113495bSYour Name 
9111*5113495bSYour Name 	{WE_SET_EARLY_RX_TGT_BMISS_NUM,
9112*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9113*5113495bSYour Name 	 0, "erx_bmiss_val"},
9114*5113495bSYour Name 
9115*5113495bSYour Name 	{WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE,
9116*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9117*5113495bSYour Name 	 0, "erx_bmiss_smpl"},
9118*5113495bSYour Name 
9119*5113495bSYour Name 	{WE_SET_EARLY_RX_SLOP_STEP,
9120*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9121*5113495bSYour Name 	 0, "erx_slop_step"},
9122*5113495bSYour Name 
9123*5113495bSYour Name 	{WE_SET_EARLY_RX_INIT_SLOP,
9124*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9125*5113495bSYour Name 	 0, "erx_init_slop"},
9126*5113495bSYour Name 
9127*5113495bSYour Name 	{WE_SET_EARLY_RX_ADJUST_PAUSE,
9128*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9129*5113495bSYour Name 	 0, "erx_adj_pause"},
9130*5113495bSYour Name 
9131*5113495bSYour Name 	{WE_SET_EARLY_RX_DRIFT_SAMPLE,
9132*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9133*5113495bSYour Name 	 0, "erx_dri_sample"},
9134*5113495bSYour Name 
9135*5113495bSYour Name 	{WE_DUMP_STATS,
9136*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9137*5113495bSYour Name 	 0, "dumpStats"},
9138*5113495bSYour Name 
9139*5113495bSYour Name 	{WE_CLEAR_STATS,
9140*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9141*5113495bSYour Name 	 0, "clearStats"},
9142*5113495bSYour Name 
9143*5113495bSYour Name 	{WE_START_FW_PROFILE,
9144*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9145*5113495bSYour Name 	 0, "startProfile"},
9146*5113495bSYour Name 
9147*5113495bSYour Name 	{WE_SET_CHANNEL,
9148*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9149*5113495bSYour Name 	 0, "setChanChange" },
9150*5113495bSYour Name 
9151*5113495bSYour Name 	{WE_SET_CONC_SYSTEM_PREF,
9152*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9153*5113495bSYour Name 	 0, "setConcSysPref" },
9154*5113495bSYour Name 
9155*5113495bSYour Name 	{WE_SET_PDEV_RESET,
9156*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9157*5113495bSYour Name 	 0, "pdev_reset" },
9158*5113495bSYour Name 
9159*5113495bSYour Name 	{WE_SET_MODULATED_DTIM,
9160*5113495bSYour Name 	IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9161*5113495bSYour Name 	0, "setModDTIM" },
9162*5113495bSYour Name 
9163*5113495bSYour Name 	{WLAN_PRIV_SET_NONE_GET_INT,
9164*5113495bSYour Name 	 0,
9165*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9166*5113495bSYour Name 	 ""},
9167*5113495bSYour Name 
9168*5113495bSYour Name 	/* handlers for sub-ioctl */
9169*5113495bSYour Name 	{WE_GET_11D_STATE,
9170*5113495bSYour Name 	 0,
9171*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9172*5113495bSYour Name 	 "get11Dstate"},
9173*5113495bSYour Name 
9174*5113495bSYour Name 	{WE_GET_WLAN_DBG,
9175*5113495bSYour Name 	 0,
9176*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9177*5113495bSYour Name 	 "getwlandbg"},
9178*5113495bSYour Name 
9179*5113495bSYour Name 	{WE_GET_MAX_ASSOC,
9180*5113495bSYour Name 	 0,
9181*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9182*5113495bSYour Name 	 "getMaxAssoc"},
9183*5113495bSYour Name 
9184*5113495bSYour Name 	{WE_GET_SAP_AUTO_CHANNEL_SELECTION,
9185*5113495bSYour Name 	 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9186*5113495bSYour Name 	 "getAutoChannel"},
9187*5113495bSYour Name 
9188*5113495bSYour Name 	{WE_GET_CONCURRENCY_MODE,
9189*5113495bSYour Name 	 0,
9190*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9191*5113495bSYour Name 	 "getconcurrency"},
9192*5113495bSYour Name 
9193*5113495bSYour Name 	{WE_GET_NSS,
9194*5113495bSYour Name 	 0,
9195*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9196*5113495bSYour Name 	 "get_nss"},
9197*5113495bSYour Name 
9198*5113495bSYour Name 	{WE_GET_LDPC,
9199*5113495bSYour Name 	 0,
9200*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9201*5113495bSYour Name 	 "get_ldpc"},
9202*5113495bSYour Name 
9203*5113495bSYour Name 	{WE_GET_TX_STBC,
9204*5113495bSYour Name 	 0,
9205*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9206*5113495bSYour Name 	 "get_tx_stbc"},
9207*5113495bSYour Name 
9208*5113495bSYour Name 	{WE_GET_RX_STBC,
9209*5113495bSYour Name 	 0,
9210*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9211*5113495bSYour Name 	 "get_rx_stbc"},
9212*5113495bSYour Name 
9213*5113495bSYour Name 	{WE_GET_SHORT_GI,
9214*5113495bSYour Name 	 0,
9215*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9216*5113495bSYour Name 	 "get_shortgi"},
9217*5113495bSYour Name 
9218*5113495bSYour Name 	{WE_GET_RTSCTS,
9219*5113495bSYour Name 	 0,
9220*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9221*5113495bSYour Name 	 "get_rtscts"},
9222*5113495bSYour Name 
9223*5113495bSYour Name 	{WE_GET_CHWIDTH,
9224*5113495bSYour Name 	 0,
9225*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9226*5113495bSYour Name 	 "get_chwidth"},
9227*5113495bSYour Name 
9228*5113495bSYour Name 	{WE_GET_ANI_EN_DIS,
9229*5113495bSYour Name 	 0,
9230*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9231*5113495bSYour Name 	 "get_anienable"},
9232*5113495bSYour Name 
9233*5113495bSYour Name 	{WE_GET_ANI_POLL_PERIOD,
9234*5113495bSYour Name 	 0,
9235*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9236*5113495bSYour Name 	 "get_aniplen"},
9237*5113495bSYour Name 
9238*5113495bSYour Name 	{WE_GET_ANI_LISTEN_PERIOD,
9239*5113495bSYour Name 	 0,
9240*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9241*5113495bSYour Name 	 "get_anilislen"},
9242*5113495bSYour Name 
9243*5113495bSYour Name 	{WE_GET_ANI_OFDM_LEVEL,
9244*5113495bSYour Name 	 0,
9245*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9246*5113495bSYour Name 	 "get_aniofdmlvl"},
9247*5113495bSYour Name 
9248*5113495bSYour Name 	{WE_GET_ANI_CCK_LEVEL,
9249*5113495bSYour Name 	 0,
9250*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9251*5113495bSYour Name 	 "get_aniccklvl"},
9252*5113495bSYour Name 
9253*5113495bSYour Name 	{WE_GET_DYNAMIC_BW,
9254*5113495bSYour Name 	 0,
9255*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9256*5113495bSYour Name 	 "get_cwmenable"},
9257*5113495bSYour Name 
9258*5113495bSYour Name 	{WE_GET_GTX_HT_MCS,
9259*5113495bSYour Name 	 0,
9260*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9261*5113495bSYour Name 	 "get_gtxHTMcs"},
9262*5113495bSYour Name 
9263*5113495bSYour Name 	{WE_GET_GTX_VHT_MCS,
9264*5113495bSYour Name 	 0,
9265*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9266*5113495bSYour Name 	 "get_gtxVHTMcs"},
9267*5113495bSYour Name 
9268*5113495bSYour Name 	{WE_GET_GTX_USRCFG,
9269*5113495bSYour Name 	 0,
9270*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9271*5113495bSYour Name 	 "get_gtxUsrCfg"},
9272*5113495bSYour Name 
9273*5113495bSYour Name 	{WE_GET_GTX_THRE,
9274*5113495bSYour Name 	 0,
9275*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9276*5113495bSYour Name 	 "get_gtxThre"},
9277*5113495bSYour Name 
9278*5113495bSYour Name 	{WE_GET_GTX_MARGIN,
9279*5113495bSYour Name 	 0,
9280*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9281*5113495bSYour Name 	 "get_gtxMargin"},
9282*5113495bSYour Name 
9283*5113495bSYour Name 	{WE_GET_GTX_STEP,
9284*5113495bSYour Name 	 0,
9285*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9286*5113495bSYour Name 	 "get_gtxStep"},
9287*5113495bSYour Name 
9288*5113495bSYour Name 	{WE_GET_GTX_MINTPC,
9289*5113495bSYour Name 	 0,
9290*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9291*5113495bSYour Name 	 "get_gtxMinTpc"},
9292*5113495bSYour Name 
9293*5113495bSYour Name 	{WE_GET_GTX_BWMASK,
9294*5113495bSYour Name 	 0,
9295*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9296*5113495bSYour Name 	 "get_gtxBWMask"},
9297*5113495bSYour Name 
9298*5113495bSYour Name 	{WE_GET_TX_CHAINMASK,
9299*5113495bSYour Name 	 0,
9300*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9301*5113495bSYour Name 	 "get_txchainmask"},
9302*5113495bSYour Name 
9303*5113495bSYour Name 	{WE_GET_RX_CHAINMASK,
9304*5113495bSYour Name 	 0,
9305*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9306*5113495bSYour Name 	 "get_rxchainmask"},
9307*5113495bSYour Name 
9308*5113495bSYour Name 	{WE_GET_11N_RATE,
9309*5113495bSYour Name 	 0,
9310*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9311*5113495bSYour Name 	 "get_11nrate"},
9312*5113495bSYour Name 
9313*5113495bSYour Name 	{WE_GET_AMPDU,
9314*5113495bSYour Name 	 0,
9315*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9316*5113495bSYour Name 	 "get_ampdu"},
9317*5113495bSYour Name 
9318*5113495bSYour Name 	{WE_GET_AMSDU,
9319*5113495bSYour Name 	 0,
9320*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9321*5113495bSYour Name 	 "get_amsdu"},
9322*5113495bSYour Name 
9323*5113495bSYour Name 	{WE_GET_TXPOW_2G,
9324*5113495bSYour Name 	 0,
9325*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9326*5113495bSYour Name 	 "get_txpow2g"},
9327*5113495bSYour Name 
9328*5113495bSYour Name 	{WE_GET_TXPOW_5G,
9329*5113495bSYour Name 	 0,
9330*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9331*5113495bSYour Name 	 "get_txpow5g"},
9332*5113495bSYour Name 
9333*5113495bSYour Name 	{WE_GET_PPS_PAID_MATCH,
9334*5113495bSYour Name 	 0,
9335*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9336*5113495bSYour Name 	 "get_paid_match"},
9337*5113495bSYour Name 
9338*5113495bSYour Name 	{WE_GET_PPS_GID_MATCH,
9339*5113495bSYour Name 	 0,
9340*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9341*5113495bSYour Name 	 "get_gid_match"},
9342*5113495bSYour Name 
9343*5113495bSYour Name 	{WE_GET_PPS_EARLY_TIM_CLEAR,
9344*5113495bSYour Name 	 0,
9345*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9346*5113495bSYour Name 	 "get_tim_clear"},
9347*5113495bSYour Name 
9348*5113495bSYour Name 	{WE_GET_PPS_EARLY_DTIM_CLEAR,
9349*5113495bSYour Name 	 0,
9350*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9351*5113495bSYour Name 	 "get_dtim_clear"},
9352*5113495bSYour Name 
9353*5113495bSYour Name 	{WE_GET_PPS_EOF_PAD_DELIM,
9354*5113495bSYour Name 	 0,
9355*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9356*5113495bSYour Name 	 "get_eof_delim"},
9357*5113495bSYour Name 
9358*5113495bSYour Name 	{WE_GET_PPS_MACADDR_MISMATCH,
9359*5113495bSYour Name 	 0,
9360*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9361*5113495bSYour Name 	 "get_mac_match"},
9362*5113495bSYour Name 
9363*5113495bSYour Name 	{WE_GET_PPS_DELIM_CRC_FAIL,
9364*5113495bSYour Name 	 0,
9365*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9366*5113495bSYour Name 	 "get_delim_fail"},
9367*5113495bSYour Name 
9368*5113495bSYour Name 	{WE_GET_PPS_GID_NSTS_ZERO,
9369*5113495bSYour Name 	 0,
9370*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9371*5113495bSYour Name 	 "get_nsts_zero"},
9372*5113495bSYour Name 
9373*5113495bSYour Name 	{WE_GET_PPS_RSSI_CHECK,
9374*5113495bSYour Name 	 0,
9375*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9376*5113495bSYour Name 	 "get_rssi_chk"},
9377*5113495bSYour Name 
9378*5113495bSYour Name 	{WE_GET_QPOWER_MAX_PSPOLL_COUNT,
9379*5113495bSYour Name 	 0,
9380*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9381*5113495bSYour Name 	 "get_qpspollcnt"},
9382*5113495bSYour Name 
9383*5113495bSYour Name 	{WE_GET_QPOWER_MAX_TX_BEFORE_WAKE,
9384*5113495bSYour Name 	 0,
9385*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9386*5113495bSYour Name 	 "get_qtxwake"},
9387*5113495bSYour Name 
9388*5113495bSYour Name 	{WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
9389*5113495bSYour Name 	 0,
9390*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9391*5113495bSYour Name 	 "get_qwakeintv"},
9392*5113495bSYour Name 
9393*5113495bSYour Name 	{WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
9394*5113495bSYour Name 	 0,
9395*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9396*5113495bSYour Name 	 "get_qnodatapoll"},
9397*5113495bSYour Name 
9398*5113495bSYour Name 	{WE_CAP_TSF,
9399*5113495bSYour Name 	 0,
9400*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9401*5113495bSYour Name 	 "cap_tsf"},
9402*5113495bSYour Name 
9403*5113495bSYour Name 	{WE_GET_TEMPERATURE,
9404*5113495bSYour Name 	 0,
9405*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9406*5113495bSYour Name 	 "get_temp"},
9407*5113495bSYour Name 
9408*5113495bSYour Name 	{WE_GET_DCM,
9409*5113495bSYour Name 	 0,
9410*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9411*5113495bSYour Name 	 "get_dcm"},
9412*5113495bSYour Name 
9413*5113495bSYour Name 	{WE_GET_RANGE_EXT,
9414*5113495bSYour Name 	 0,
9415*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9416*5113495bSYour Name 	 "get_range_ext"},
9417*5113495bSYour Name 
9418*5113495bSYour Name 	/* handlers for main ioctl */
9419*5113495bSYour Name 	{WLAN_PRIV_SET_CHAR_GET_NONE,
9420*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 512,
9421*5113495bSYour Name 	 0,
9422*5113495bSYour Name 	 ""},
9423*5113495bSYour Name 
9424*5113495bSYour Name 	/* handlers for sub-ioctl */
9425*5113495bSYour Name 	{WE_WOWL_ADD_PTRN,
9426*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 512,
9427*5113495bSYour Name 	 0,
9428*5113495bSYour Name 	 "wowlAddPtrn"},
9429*5113495bSYour Name 
9430*5113495bSYour Name 	{WE_WOWL_DEL_PTRN,
9431*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 512,
9432*5113495bSYour Name 	 0,
9433*5113495bSYour Name 	 "wowlDelPtrn"},
9434*5113495bSYour Name 
9435*5113495bSYour Name 	/* handlers for sub-ioctl */
9436*5113495bSYour Name 	{WE_NEIGHBOR_REPORT_REQUEST,
9437*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 512,
9438*5113495bSYour Name 	 0,
9439*5113495bSYour Name 	 "neighbor"},
9440*5113495bSYour Name 
9441*5113495bSYour Name 	{WE_SET_AP_WPS_IE,
9442*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 512,
9443*5113495bSYour Name 	 0,
9444*5113495bSYour Name 	 "set_ap_wps_ie"},
9445*5113495bSYour Name 
9446*5113495bSYour Name #ifdef WLAN_UNIT_TEST
9447*5113495bSYour Name 	{WE_UNIT_TEST,
9448*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 512,
9449*5113495bSYour Name 	 0,
9450*5113495bSYour Name 	 "unit_test"},
9451*5113495bSYour Name #endif
9452*5113495bSYour Name 
9453*5113495bSYour Name 	/* handlers for main ioctl */
9454*5113495bSYour Name 	{WLAN_PRIV_SET_THREE_INT_GET_NONE,
9455*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9456*5113495bSYour Name 	 0,
9457*5113495bSYour Name 	 ""},
9458*5113495bSYour Name 
9459*5113495bSYour Name 	/* handlers for sub-ioctl */
9460*5113495bSYour Name 	{WE_SET_WLAN_DBG,
9461*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9462*5113495bSYour Name 	 0,
9463*5113495bSYour Name 	 "setwlandbg"},
9464*5113495bSYour Name 
9465*5113495bSYour Name #ifdef CONFIG_DP_TRACE
9466*5113495bSYour Name 	/* handlers for sub-ioctl */
9467*5113495bSYour Name 	{WE_SET_DP_TRACE,
9468*5113495bSYour Name 	IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9469*5113495bSYour Name 	0,
9470*5113495bSYour Name 	"set_dp_trace"},
9471*5113495bSYour Name #endif
9472*5113495bSYour Name 
9473*5113495bSYour Name 	{WE_SET_FW_TEST,
9474*5113495bSYour Name 	IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9475*5113495bSYour Name 	0, "fw_test"},
9476*5113495bSYour Name 
9477*5113495bSYour Name 	/* handlers for main ioctl */
9478*5113495bSYour Name 	{WLAN_PRIV_SET_NONE_GET_THREE_INT,
9479*5113495bSYour Name 	 0,
9480*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9481*5113495bSYour Name 	 ""},
9482*5113495bSYour Name 
9483*5113495bSYour Name 	{WE_GET_TSF,
9484*5113495bSYour Name 	 0,
9485*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9486*5113495bSYour Name 	 "get_tsf"},
9487*5113495bSYour Name 
9488*5113495bSYour Name 	{WE_SET_DUAL_MAC_SCAN_CONFIG,
9489*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
9490*5113495bSYour Name 	 0,
9491*5113495bSYour Name 	 "set_scan_cfg"},
9492*5113495bSYour Name 
9493*5113495bSYour Name 	/* handlers for main ioctl */
9494*5113495bSYour Name 	{WLAN_PRIV_GET_CHAR_SET_NONE,
9495*5113495bSYour Name 	 0,
9496*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9497*5113495bSYour Name 	 ""},
9498*5113495bSYour Name 
9499*5113495bSYour Name 	/* handlers for sub-ioctl */
9500*5113495bSYour Name 	{WE_WLAN_VERSION,
9501*5113495bSYour Name 	 0,
9502*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9503*5113495bSYour Name 	 "version"},
9504*5113495bSYour Name 
9505*5113495bSYour Name 	{WE_GET_STATS,
9506*5113495bSYour Name 	 0,
9507*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9508*5113495bSYour Name 	 "getStats"},
9509*5113495bSYour Name 
9510*5113495bSYour Name 	{WE_GET_SUSPEND_RESUME_STATS,
9511*5113495bSYour Name 	 0,
9512*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9513*5113495bSYour Name 	 "getSuspendStats"},
9514*5113495bSYour Name 
9515*5113495bSYour Name 	{WE_LIST_FW_PROFILE,
9516*5113495bSYour Name 	 0,
9517*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9518*5113495bSYour Name 	 "listProfile"},
9519*5113495bSYour Name 
9520*5113495bSYour Name 	{WE_GET_STATES,
9521*5113495bSYour Name 	 0,
9522*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9523*5113495bSYour Name 	 "getHostStates"},
9524*5113495bSYour Name 
9525*5113495bSYour Name 	{WE_GET_CFG,
9526*5113495bSYour Name 	 0,
9527*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9528*5113495bSYour Name 	 "getConfig"},
9529*5113495bSYour Name 
9530*5113495bSYour Name 	{WE_GET_RSSI,
9531*5113495bSYour Name 	 0,
9532*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9533*5113495bSYour Name 	 "getRSSI"},
9534*5113495bSYour Name 
9535*5113495bSYour Name 	{WE_GET_WMM_STATUS,
9536*5113495bSYour Name 	 0,
9537*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9538*5113495bSYour Name 	 "getWmmStatus"},
9539*5113495bSYour Name 
9540*5113495bSYour Name 	{WE_GET_CHANNEL_LIST,
9541*5113495bSYour Name 	 0,
9542*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9543*5113495bSYour Name 	 "getChannelList"},
9544*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
9545*5113495bSYour Name 	{WE_GET_TDLS_PEERS,
9546*5113495bSYour Name 	 0,
9547*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9548*5113495bSYour Name 	 "getTdlsPeers"},
9549*5113495bSYour Name #endif
9550*5113495bSYour Name 	{WE_GET_11W_INFO,
9551*5113495bSYour Name 	 0,
9552*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9553*5113495bSYour Name 	 "getPMFInfo"},
9554*5113495bSYour Name 
9555*5113495bSYour Name 	{WE_GET_STA_CXN_INFO,
9556*5113495bSYour Name 	 0,
9557*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9558*5113495bSYour Name 	 "get_cxn_info"	},
9559*5113495bSYour Name 
9560*5113495bSYour Name 	{WE_GET_PHYMODE,
9561*5113495bSYour Name 	 0,
9562*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9563*5113495bSYour Name 	 "getphymode"},
9564*5113495bSYour Name #if defined(FEATURE_OEM_DATA_SUPPORT) || defined(WIFI_POS_CONVERGED)
9565*5113495bSYour Name 	{WE_GET_OEM_DATA_CAP,
9566*5113495bSYour Name 	 0,
9567*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9568*5113495bSYour Name 	 "getOemDataCap"},
9569*5113495bSYour Name #endif
9570*5113495bSYour Name 	{WE_GET_SNR,
9571*5113495bSYour Name 	 0,
9572*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9573*5113495bSYour Name 	 "getSNR"},
9574*5113495bSYour Name 
9575*5113495bSYour Name 	{WE_GET_BA_AGEING_TIMEOUT,
9576*5113495bSYour Name 	 0,
9577*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9578*5113495bSYour Name 	 "get_ba_timeout"},
9579*5113495bSYour Name 
9580*5113495bSYour Name 	/* handlers for main ioctl */
9581*5113495bSYour Name 	{WLAN_PRIV_SET_NONE_GET_NONE,
9582*5113495bSYour Name 	 0,
9583*5113495bSYour Name 	 0,
9584*5113495bSYour Name 	 ""},
9585*5113495bSYour Name 
9586*5113495bSYour Name 	{WE_GET_FW_PROFILE_DATA,
9587*5113495bSYour Name 	 0,
9588*5113495bSYour Name 	 0,
9589*5113495bSYour Name 	 "getProfileData"},
9590*5113495bSYour Name 
9591*5113495bSYour Name 	{WE_SET_REASSOC_TRIGGER,
9592*5113495bSYour Name 	0,
9593*5113495bSYour Name 	0,
9594*5113495bSYour Name 	"reassoc"},
9595*5113495bSYour Name 
9596*5113495bSYour Name 	{WE_STOP_OBSS_SCAN,
9597*5113495bSYour Name 	 0,
9598*5113495bSYour Name 	 0,
9599*5113495bSYour Name 	 "stop_obss_scan"},
9600*5113495bSYour Name 	/* handlers for main ioctl */
9601*5113495bSYour Name 	{WLAN_PRIV_SET_VAR_INT_GET_NONE,
9602*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9603*5113495bSYour Name 	 0,
9604*5113495bSYour Name 	 ""},
9605*5113495bSYour Name 
9606*5113495bSYour Name #ifdef TRACE_RECORD
9607*5113495bSYour Name 	/* handlers for sub-ioctl */
9608*5113495bSYour Name 	{WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD,
9609*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9610*5113495bSYour Name 	 0,
9611*5113495bSYour Name 	 "setdumplog"},
9612*5113495bSYour Name 
9613*5113495bSYour Name 	{WE_MTRACE_DUMP_CMD,
9614*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9615*5113495bSYour Name 	 0,
9616*5113495bSYour Name 	 "dumplog"},
9617*5113495bSYour Name #endif
9618*5113495bSYour Name 
9619*5113495bSYour Name 	{WE_POLICY_MANAGER_CINFO_CMD,
9620*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9621*5113495bSYour Name 	 0,
9622*5113495bSYour Name 	 "pm_cinfo"},
9623*5113495bSYour Name 
9624*5113495bSYour Name 	{WE_UNIT_TEST_CMD,
9625*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9626*5113495bSYour Name 	 0,
9627*5113495bSYour Name 	 "setUnitTestCmd"},
9628*5113495bSYour Name 
9629*5113495bSYour Name 	{WE_MAC_PWR_DEBUG_CMD,
9630*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9631*5113495bSYour Name 	 0,
9632*5113495bSYour Name 	 "halPwrDebug"},
9633*5113495bSYour Name #ifdef WLAN_FEATURE_GPIO_LED_FLASHING
9634*5113495bSYour Name 	{WE_LED_FLASHING_PARAM,
9635*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9636*5113495bSYour Name 	 0,
9637*5113495bSYour Name 	 "gpio_control"},
9638*5113495bSYour Name #endif
9639*5113495bSYour Name #ifdef WLAN_DEBUG
9640*5113495bSYour Name 	{WE_SET_CHAN_AVOID,
9641*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9642*5113495bSYour Name 	 0,
9643*5113495bSYour Name 	 "ch_avoid"},
9644*5113495bSYour Name #endif
9645*5113495bSYour Name 	/* handlers for main ioctl */
9646*5113495bSYour Name 	{WLAN_PRIV_FIPS_TEST,
9647*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
9648*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
9649*5113495bSYour Name 	 "fips_test"},
9650*5113495bSYour Name 
9651*5113495bSYour Name 	/* handlers for main ioctl */
9652*5113495bSYour Name 	{WLAN_PRIV_ADD_TSPEC,
9653*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | HDD_WLAN_WMM_PARAM_COUNT,
9654*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9655*5113495bSYour Name 	 "addTspec"},
9656*5113495bSYour Name 
9657*5113495bSYour Name 	/* handlers for main ioctl */
9658*5113495bSYour Name 	{WLAN_PRIV_DEL_TSPEC,
9659*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9660*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9661*5113495bSYour Name 	 "delTspec"},
9662*5113495bSYour Name 
9663*5113495bSYour Name 	/* handlers for main ioctl */
9664*5113495bSYour Name 	{WLAN_PRIV_GET_TSPEC,
9665*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9666*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9667*5113495bSYour Name 	 "getTspec"},
9668*5113495bSYour Name 
9669*5113495bSYour Name 	/* handlers for main ioctl - host offload */
9670*5113495bSYour Name 	{WLAN_PRIV_SET_HOST_OFFLOAD,
9671*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE | sizeof(struct host_offload_req),
9672*5113495bSYour Name 	 0,
9673*5113495bSYour Name 	 "setHostOffload"},
9674*5113495bSYour Name 
9675*5113495bSYour Name 	{WLAN_GET_WLAN_STATISTICS,
9676*5113495bSYour Name 	 0,
9677*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
9678*5113495bSYour Name 	 "getWlanStats"},
9679*5113495bSYour Name 
9680*5113495bSYour Name 	{WLAN_SET_KEEPALIVE_PARAMS,
9681*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE | sizeof(struct keep_alive_req) |
9682*5113495bSYour Name 	 IW_PRIV_SIZE_FIXED,
9683*5113495bSYour Name 	 0,
9684*5113495bSYour Name 	 "setKeepAlive"},
9685*5113495bSYour Name #ifdef WLAN_FEATURE_PACKET_FILTERING
9686*5113495bSYour Name 	{WLAN_SET_PACKET_FILTER_PARAMS,
9687*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE |
9688*5113495bSYour Name 	 sizeof(struct pkt_filter_cfg),
9689*5113495bSYour Name 	 0,
9690*5113495bSYour Name 	 "setPktFilter"},
9691*5113495bSYour Name #endif
9692*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
9693*5113495bSYour Name 	{WLAN_SET_PNO,
9694*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9695*5113495bSYour Name 	 0,
9696*5113495bSYour Name 	 "setpno"},
9697*5113495bSYour Name #endif
9698*5113495bSYour Name 	{WLAN_SET_BAND_CONFIG,
9699*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9700*5113495bSYour Name 	 0,
9701*5113495bSYour Name 	 "SETBAND"},
9702*5113495bSYour Name 
9703*5113495bSYour Name 	{WLAN_PRIV_SET_MCBC_FILTER,
9704*5113495bSYour Name 	 0,
9705*5113495bSYour Name 	 0,
9706*5113495bSYour Name 	 "setMCBCFilter"},
9707*5113495bSYour Name 
9708*5113495bSYour Name 	{WLAN_GET_LINK_SPEED,
9709*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 18,
9710*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | 5,
9711*5113495bSYour Name 	 "getLinkSpeed"},
9712*5113495bSYour Name 
9713*5113495bSYour Name #ifdef FEATURE_WLM_STATS
9714*5113495bSYour Name 	{WLAN_GET_WLM_STATS,
9715*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9716*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
9717*5113495bSYour Name 	 "get_wlm_stats"},
9718*5113495bSYour Name #endif
9719*5113495bSYour Name 
9720*5113495bSYour Name 	/* handlers for main ioctl */
9721*5113495bSYour Name 	{WLAN_PRIV_SET_TWO_INT_GET_NONE,
9722*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9723*5113495bSYour Name 	 0,
9724*5113495bSYour Name 	 ""},
9725*5113495bSYour Name 
9726*5113495bSYour Name 	{WE_SET_SMPS_PARAM,
9727*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9728*5113495bSYour Name 	 0, "set_smps_param"},
9729*5113495bSYour Name 
9730*5113495bSYour Name 	{WLAN_SET_DOT11P_CHANNEL_SCHED,
9731*5113495bSYour Name 	 IW_PRIV_TYPE_BYTE | sizeof(struct dot11p_channel_sched),
9732*5113495bSYour Name 	 0, "set_dot11p" },
9733*5113495bSYour Name 
9734*5113495bSYour Name #ifdef CONFIG_WLAN_DEBUG_CRASH_INJECT
9735*5113495bSYour Name 	{WE_SET_FW_CRASH_INJECT,
9736*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9737*5113495bSYour Name 	 0, "crash_inject"},
9738*5113495bSYour Name 
9739*5113495bSYour Name #endif
9740*5113495bSYour Name #if defined(WMI_INTERFACE_EVENT_LOGGING) || defined(FEATURE_HTC_CREDIT_HISTORY)
9741*5113495bSYour Name 	{WE_LOG_BUFFER,
9742*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9743*5113495bSYour Name 	 0, "log_buffer"},
9744*5113495bSYour Name 
9745*5113495bSYour Name #endif
9746*5113495bSYour Name 	{WE_SET_BA_AGEING_TIMEOUT,
9747*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9748*5113495bSYour Name 	 0, "set_ba_timeout"},
9749*5113495bSYour Name 
9750*5113495bSYour Name #ifdef WLAN_SUSPEND_RESUME_TEST
9751*5113495bSYour Name 	{WE_SET_WLAN_SUSPEND,
9752*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9753*5113495bSYour Name 	 0, "wlan_suspend"},
9754*5113495bSYour Name 
9755*5113495bSYour Name 	{WE_SET_WLAN_RESUME,
9756*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9757*5113495bSYour Name 	 0, "wlan_resume"},
9758*5113495bSYour Name #endif
9759*5113495bSYour Name 	{WE_ENABLE_FW_PROFILE,
9760*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9761*5113495bSYour Name 	 0, "enableProfile"},
9762*5113495bSYour Name 
9763*5113495bSYour Name 	{WE_SET_FW_PROFILE_HIST_INTVL,
9764*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9765*5113495bSYour Name 	 0, "set_hist_intvl"},
9766*5113495bSYour Name 
9767*5113495bSYour Name 	{WE_SET_DUAL_MAC_FW_MODE_CONFIG,
9768*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9769*5113495bSYour Name 	 0, "set_fw_mode_cfg"},
9770*5113495bSYour Name #ifdef CONFIG_DP_TRACE
9771*5113495bSYour Name 	{WE_DUMP_DP_TRACE_LEVEL,
9772*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9773*5113495bSYour Name 	 0, "dump_dp_trace"},
9774*5113495bSYour Name #endif
9775*5113495bSYour Name #ifdef FEATURE_MONITOR_MODE_SUPPORT
9776*5113495bSYour Name 	{WE_SET_MON_MODE_CHAN,
9777*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
9778*5113495bSYour Name 	 0, "setMonChan"},
9779*5113495bSYour Name #endif
9780*5113495bSYour Name 	{WE_GET_ROAM_SYNCH_DELAY,
9781*5113495bSYour Name 	 0,
9782*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9783*5113495bSYour Name 	 "hostroamdelay"},
9784*5113495bSYour Name 
9785*5113495bSYour Name 	{WE_SET_11AX_RATE,
9786*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9787*5113495bSYour Name 	 0,
9788*5113495bSYour Name 	 "set_11ax_rate"},
9789*5113495bSYour Name 
9790*5113495bSYour Name 	{WE_SET_DCM,
9791*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9792*5113495bSYour Name 	 0,
9793*5113495bSYour Name 	 "enable_dcm"},
9794*5113495bSYour Name 
9795*5113495bSYour Name 	{WE_SET_RANGE_EXT,
9796*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9797*5113495bSYour Name 	 0,
9798*5113495bSYour Name 	 "range_ext"},
9799*5113495bSYour Name 
9800*5113495bSYour Name 	{WLAN_PRIV_SET_FTIES,
9801*5113495bSYour Name 	 IW_PRIV_TYPE_CHAR | MAX_FTIE_SIZE,
9802*5113495bSYour Name 	 0,
9803*5113495bSYour Name 	 "set_ft_ies"},
9804*5113495bSYour Name 
9805*5113495bSYour Name #ifdef WLAN_FEATURE_MOTION_DETECTION
9806*5113495bSYour Name 	{WE_MOTION_DET_START_STOP,
9807*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9808*5113495bSYour Name 	 0,
9809*5113495bSYour Name 	 "mt_start"},
9810*5113495bSYour Name 
9811*5113495bSYour Name 	{WE_MOTION_DET_BASE_LINE_START_STOP,
9812*5113495bSYour Name 	 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9813*5113495bSYour Name 	 0,
9814*5113495bSYour Name 	 "mt_bl_start"},
9815*5113495bSYour Name 
9816*5113495bSYour Name 	{WE_MOTION_DET_CONFIG_PARAM,
9817*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9818*5113495bSYour Name 	 0,
9819*5113495bSYour Name 	 "mt_config"},
9820*5113495bSYour Name 
9821*5113495bSYour Name 	{WE_MOTION_DET_BASE_LINE_CONFIG_PARAM,
9822*5113495bSYour Name 	 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
9823*5113495bSYour Name 	 0,
9824*5113495bSYour Name 	 "mt_bl_config"},
9825*5113495bSYour Name #endif /* WLAN_FEATURE_MOTION_DETECTION */
9826*5113495bSYour Name };
9827*5113495bSYour Name 
9828*5113495bSYour Name const struct iw_handler_def we_handler_def = {
9829*5113495bSYour Name 	.num_standard = 0,
9830*5113495bSYour Name 	.num_private = QDF_ARRAY_SIZE(we_private),
9831*5113495bSYour Name 	.num_private_args = QDF_ARRAY_SIZE(we_private_args),
9832*5113495bSYour Name 
9833*5113495bSYour Name 	.standard = NULL,
9834*5113495bSYour Name 	.private = (iw_handler *) we_private,
9835*5113495bSYour Name 	.private_args = we_private_args,
9836*5113495bSYour Name 	.get_wireless_stats = NULL,
9837*5113495bSYour Name };
9838*5113495bSYour Name 
hdd_register_wext(struct net_device * dev)9839*5113495bSYour Name void hdd_register_wext(struct net_device *dev)
9840*5113495bSYour Name {
9841*5113495bSYour Name 	hdd_enter_dev(dev);
9842*5113495bSYour Name 
9843*5113495bSYour Name 	dev->wireless_handlers = &we_handler_def;
9844*5113495bSYour Name 
9845*5113495bSYour Name 	hdd_exit();
9846*5113495bSYour Name }
9847*5113495bSYour Name 
hdd_wext_unregister(struct net_device * dev,bool rtnl_held)9848*5113495bSYour Name void hdd_wext_unregister(struct net_device *dev,
9849*5113495bSYour Name 			 bool rtnl_held)
9850*5113495bSYour Name {
9851*5113495bSYour Name 	if (!dev)
9852*5113495bSYour Name 		return;
9853*5113495bSYour Name 
9854*5113495bSYour Name 	if (!rtnl_held)
9855*5113495bSYour Name 		rtnl_lock();
9856*5113495bSYour Name 	dev->wireless_handlers = NULL;
9857*5113495bSYour Name 	if (!rtnl_held)
9858*5113495bSYour Name 		rtnl_unlock();
9859*5113495bSYour Name }
9860*5113495bSYour Name 
9861