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